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.
@@ -28,7 +28,7 @@ Host ${s}
28
28
  IdentitiesOnly yes`;await Ie.pathExists(l)?await Ie.appendFile(l,`
29
29
  `+u):await Ie.outputFile(l,u);let d="";if(await Ie.pathExists(Qo)||(await Ie.writeFile(Qo,""),await Ie.chmod(Qo,"0600")),i=="github.com"&&!(await Ie.readFile(Qo,"utf8")).includes("github.com"))try{let _=(await(await fetch("https://api.github.com/meta")).json()).ssh_keys;for(let g of _)Ie.appendFile(Qo,"github.com "+g+`
30
30
  `)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(Qo,a);let f=await Si(e);return f.message=`Added ssh key: ${r}${d}`,f}o(Rpe,"addSSHKey");async function ype(e){let t=Fn.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(dc,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 Si(e);return i.message=`Updated ssh key: ${r}`,i}o(ype,"updateSSHKey");async function Ape(e){let t=Fn.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(dc,r+".key"),s=Oe.join(dc,"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 Si(e);return c.message=`Deleted ssh key: ${r}`,c}o(Ape,"deleteSSHKey");async function bpe(e){let t=[];return await Ie.pathExists(dc)&&(await Ie.readdir(dc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(bpe,"listSSHKeys");async function Ipe(e){let t=Fn.setSSHKnownHostsValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(Qo,r);let n=await Si(e);return n.message="Known hosts successfully set",n}o(Ipe,"setSSHKnownHosts");async function Npe(e){return await Ie.pathExists(Qo)?{known_hosts:await Ie.readFile(Qo,"utf8")}:{known_hosts:null}}o(Npe,"getSSHKnownHosts");sr.customFunctionsStatus=ape;sr.getCustomFunctions=cpe;sr.getCustomFunction=lpe;sr.setCustomFunction=upe;sr.dropCustomFunction=dpe;sr.addComponent=fpe;sr.dropCustomFunctionProject=mpe;sr.packageComponent=hpe;sr.deployComponent=ppe;sr.getComponents=_pe;sr.getComponentFile=gpe;sr.setComponentFile=Spe;sr.dropComponent=Tpe;sr.addSSHKey=Rpe;sr.updateSSHKey=ype;sr.deleteSSHKey=Ape;sr.listSSHKeys=bpe;sr.setSSHKnownHosts=Ipe;sr.getSSHKnownHosts=Npe});var gC=M((N0e,tY)=>{"use strict";var Bs=require("joi"),eY=ut();tY.exports={readTransactionLogValidator:wpe,deleteTransactionLogsBeforeValidator:Ope};function wpe(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 eY.validateBySchema(e,t)}o(wpe,"readTransactionLogValidator");function Ope(e){let t=Bs.object({schema:Bs.string(),database:Bs.string(),table:Bs.string().required(),timestamp:Bs.date().timestamp().required()});return eY.validateBySchema(e,t)}o(Ope,"deleteTransactionLogsBeforeValidator")});var OT=M((O0e,aY)=>{"use strict";var SC=(k(),v(W)),gp=pr(),rY=ie(),nY=oe(),sY=Vi(),iY=Q(),{handleHDBError:NT,hdbErrors:Cpe}=ge(),{HTTP_STATUS_CODES:wT}=Cpe,{readTransactionLogValidator:Ppe,deleteTransactionLogsBeforeValidator:Lpe}=gC(),oY=Xn(),Dpe="Logs successfully deleted from transaction log.",Mpe="All logs successfully deleted from transaction log.";aY.exports={readTransactionLog:vpe,deleteTransactionLogsBefore:xpe};async function vpe(e){let t=Ppe(e);if(t)throw NT(t,t.message,wT.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=rY.checkSchemaTableExist(e.database,e.table);if(r)throw NT(new Error,r,wT.NOT_FOUND,void 0,void 0,!0);return nY.get(SC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await Upe(e):(iY.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)),oY.readAuditLog(e))}o(vpe,"readTransactionLog");async function*Upe(e){let t=sY.createNatsTableStreamName(e.database,e.table),r=await gp.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===SC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(Upe,"readTransactionLogNats");async function xpe(e){let t=Lpe(e);if(t)throw NT(t,t.message,wT.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!nY.get(SC.CONFIG_PARAMS.CLUSTERING_ENABLED))return iY.info("Delete transaction logs called for Plexus"),oY.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=rY.checkSchemaTableExist(r,n);if(i)throw NT(new Error,i,wT.NOT_FOUND,void 0,void 0,!0);let a=sY.createNatsTableStreamName(r,n),{jsm:c}=await gp.getNATSReferences(),l=await gp.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=Dpe,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=Mpe):f=(await gp.viewStream(a,parseInt(s),1))[0].nats_sequence,await gp.purgeTableStream(r,n,{seq:f}),d}o(xpe,"deleteTransactionLogsBefore")});var AC={};we(AC,{describeMetric:()=>mY,describeMetricOp:()=>yC,get:()=>dY,getOp:()=>TC,listMetrics:()=>fY,listMetricsOp:()=>RC});async function Fpe(e){return(await bg().get(e)).hostname}function cY(e,t){return e.length===0||e.includes(t)}function TC(e){return Sp.trace?.("get_analytics request:",e),dY(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function uY(e){return"conditions"in e?{...e,conditions:e.conditions.map(uY)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function dY(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(uY));let a=t??[];cY(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),Sp.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],cY(a,"node")&&(Sp.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await Fpe(d)),Sp.trace?.("get_analytics result:",JSON.stringify(u)),u})}function RC(e){return fY(e.metric_types,e.custom_metrics_window)}async function fY(e=["builtin"],t=Bpe){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 yC(e){return mY(e.metric)}async function mY(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 Sp.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var lY,Bpe,Sp,bC=ce(()=>{lY=w(Q());dN();fN();Bpe=1e3*60*60*24*7,Sp=(0,lY.forComponent)("analytics").conditional;o(Fpe,"lookupHostname");o(cY,"isSelected");o(TC,"getOp");o(uY,"conformCondition");o(dY,"get");o(RC,"listMetricsOp");o(fY,"listMetrics");o(yC,"describeMetricOp");o(mY,"describeMetric")});var CT,PT,Tp,LT=ce(()=>{CT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},PT=Object.keys(CT),Tp="primary"});function pY(e){return hY.validateBySchema(e,qpe)}var Rp,hY,Hpe,kpe,Gpe,qpe,EY=ce(()=>{Rp=w(require("joi")),hY=w(ut());LT();Hpe=PT,kpe=Object.entries(CT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),Gpe=o(()=>{let e=Rp.default.string().min(1).max(512);return Object.entries(CT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Rp.default.string().valid(...r.allowedValues).messages({"any.only":kpe[t]})}))}),e.required()},"createStatusValidationSchema"),qpe=Rp.default.object({id:Rp.default.string().valid(...Hpe).required(),status:Gpe()});o(pY,"validateStatus")});var CC={};we(CC,{DEFAULT_STATUS_ID:()=>Tp,STATUS_IDS:()=>PT,Status:()=>Jo,clear:()=>NC,get:()=>wC,set:()=>OC});function Ap(){return IC||(IC=ze({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),IC}function NC({id:e}){return yp.debug?.("clearStatus",e),Ap().delete(e)}function Vpe(){return yp.debug?.("getAllStatus"),Ap().get({})}function wC({id:e}){return e?(yp.debug?.("getStatus",e),Ap().get(e)):(yp.debug?.("getStatus","all"),Vpe())}function OC({status:e,id:t=Tp}){let r=pY({status:e,id:t});if(r)throw(0,DT.handleHDBError)(r,r.message,$pe.BAD_REQUEST);return yp.debug?.("setStatus",t,e),Ap().put(t,{status:e})}var DT,_Y,$pe,IC,Jo,yp,bp=ce(()=>{Me();DT=w(ge()),_Y=w(ei());EY();LT();LT();({HTTP_STATUS_CODES:$pe}=DT.hdbErrors);o(Ap,"getStatusTable");Jo={get primaryStore(){return Ap().primaryStore}},yp=(0,_Y.loggerWithTag)("status");o(NC,"clearStatus");o(Vpe,"getAllStatus");o(wC,"getStatus");o(OC,"setStatus")});var SY=M((Y0e,gY)=>{"use strict";var PC=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}};gY.exports=PC});var RY=M((z0e,TY)=>{"use strict";var LC=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};TY.exports=LC});var MC=M((Q0e,AY)=>{"use strict";var yY=SY(),Kpe=RY(),{HDB_ERROR_MSGS:Ype}=tn(),DC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=Ype.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 yY(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new Kpe(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 yY(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}};AY.exports=DC});var xT=M((X0e,kY)=>{"use strict";var vC=Mn(),MT=sn(),Fs=Gh(),wp=xa(),UC=El(),Wpe=Fw(),zpe=w$(),Op=rs(),vT=Rh(),Nr=Q(),jpe=$w(),Qpe=WS(),Jpe=EO(),Xpe=jS(),Zpe=SO(),eEe=TO(),tEe=AO(),rEe=IO(),xC=eT(),Xo=ie(),nEe=i1(),BC=FO(),NY=Zd(),pn=(k(),v(W)),wY=SK(),sEe=Fd(),OY=(gd(),v(wh)),CY=(TT(),v(up)),PY=wt(),Er=pC(),iEe=require("alasql"),LY=OT(),DY=hp(),sf=as(),MY=(kd(),v(Hd)),FC=(bC(),v(AC)),HC=(bp(),v(CC)),vY=MC(),{handleHDBError:Hn,hdbErrors:UY}=ge(),{HDB_ERROR_MSGS:Qr,HTTP_STATUS_CODES:Ip}=UY,{cleanupOrphanBlobs:oEe}=Gh(),X=new Map,xY="delete",fc="insert",Hs="read",Yl="update",Np="describe",bY=wp.describeSchema.name,IY=wp.describeTable.name,BY={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},aEe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},cEe="catchup",lEe="handleGetJob",uEe="handleGetJobsByStartDate",UT={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},dEe=[Fs.createTable.name,Fs.createAttribute.name,Fs.dropTable.name,Fs.dropAttribute.name],FY={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(vC.insert.name,new te(!1,[fc]));X.set(vC.update.name,new te(!1,[Yl]));X.set(vC.upsert.name,new te(!1,[fc,Yl]));X.set(MT.searchByConditions.name,new te(!1,[Hs]));X.set(MT.searchByHash.name,new te(!1,[Hs]));X.set(MT.searchByValue.name,new te(!1,[Hs]));X.set(MT.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,[fc]));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(wp.describeSchema.name,new te(!1,[Hs]));X.set(wp.describeTable.name,new te(!1,[Hs]));X.set(UC.deleteRecord.name,new te(!1,[xY]));X.set(Op.addUser.name,new te(!0,[]));X.set(Op.alterUser.name,new te(!0,[]));X.set(Op.dropUser.name,new te(!0,[]));X.set(Op.listUsersExternal.name,new te(!0,[]));X.set(vT.listRoles.name,new te(!0,[]));X.set(vT.addRole.name,new te(!0,[]));X.set(vT.alterRole.name,new te(!0,[]));X.set(vT.dropRole.name,new te(!0,[]));X.set(jpe.name,new te(!0,[]));X.set(Qpe.name,new te(!0,[]));X.set(Jpe.name,new te(!0,[]));X.set(Xpe.name,new te(!0,[]));X.set(Zpe.name,new te(!0,[]));X.set(eEe.name,new te(!0,[]));X.set(xC.setRoutes.name,new te(!0,[]));X.set(xC.getRoutes.name,new te(!0,[]));X.set(xC.deleteRoutes.name,new te(!0,[]));X.set(PY.setConfiguration.name,new te(!0,[]));X.set(tEe.clusterStatus.name,new te(!0,[]));X.set(rEe.name,new te(!0,[]));X.set(BC.getFingerprint.name,new te(!0,[]));X.set(BC.setLicense.name,new te(!0,[]));X.set(UC.deleteFilesBefore.name,new te(!0,[]));X.set(UC.deleteAuditLogsBefore.name,new te(!0,[]));X.set(NY.restart.name,new te(!0,[]));X.set(NY.restartService.name,new te(!0,[]));X.set(Wpe.name,new te(!0,[]));X.set(zpe.name,new te(!0,[Hs]));X.set(oEe.name,new te(!0,[]));X.set(sEe.systemInformation.name,new te(!0,[]));X.set(PY.getConfiguration.name,new te(!0,[]));X.set(LY.readTransactionLog.name,new te(!0,[]));X.set(LY.deleteTransactionLogsBefore.name,new te(!0,[]));X.set(DY.installModules.name,new te(!0,[]));X.set(DY.auditModules.name,new te(!0,[]));X.set(sf.createCsr.name,new te(!0,[]));X.set(sf.signCertificate.name,new te(!0,[]));X.set(sf.listCertificates.name,new te(!0,[]));X.set(sf.addCertificate.name,new te(!0,[]));X.set(sf.removeCertificate.name,new te(!0,[]));X.set(sf.getKey.name,new te(!0,[]));X.set(MY.addNodeBack.name,new te(!0,[]));X.set(MY.removeNodeBack.name,new te(!0,[]));X.set(FC.getOp.name,new te(!1,[Hs]));X.set(FC.listMetricsOp.name,new te(!1,[Hs]));X.set(FC.describeMetricOp.name,new te(!1,[Hs]));X.set(HC.clear.name,new te(!0,[]));X.set(HC.get.name,new te(!0,[]));X.set(HC.set.name,new te(!0,[]));X.set(OY.createTokens.name,new te(!1,[]));X.set(OY.refreshOperationToken.name,new te(!1,[]));X.set(CY.login.name,new te(!1,[]));X.set(CY.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(BC.getRegistrationInfo.name,new te(!1,[]));X.set(Op.userInfo.name,new te(!1,[]));X.set(wp.describeAll.name,new te(!1,[]));X.set(lEe,new te(!1,[]));X.set(uEe,new te(!0,[]));X.set(cEe,new te(!0,[]));X.set(UT.CSV_DATA_LOAD,new te(!1,[fc,Yl]));X.set(UT.CSV_URL_LOAD,new te(!1,[fc,Yl]));X.set(UT.CSV_FILE_LOAD,new te(!1,[fc,Yl]));X.set(UT.IMPORT_FROM_S3,new te(!1,[fc,Yl]));X.set(FY.EXPORT_TO_S3,new te(!0,[]));X.set(FY.EXPORT_LOCAL,new te(!0,[]));X.set(pn.VALID_SQL_OPS_ENUM.DELETE,new te(!1,[xY]));X.set(pn.VALID_SQL_OPS_ENUM.SELECT,new te(!1,[Hs]));X.set(pn.VALID_SQL_OPS_ENUM.INSERT,new te(!1,[fc]));X.set(pn.VALID_SQL_OPS_ENUM.UPDATE,new te(!1,[Yl]));kY.exports={verifyPerms:mEe,verifyPermsAst:fEe,verifyBulkLoadAttributePerms:pEe};function fEe(e,t,r){if(Xo.isEmptyOrZeroLength(e))throw Nr.info("verify_perms_ast has an empty user parameter"),Hn(new Error);if(Xo.isEmptyOrZeroLength(t))throw Nr.info("verify_perms_ast has an empty user parameter"),Hn(new Error);if(Xo.isEmptyOrZeroLength(r))throw Nr.info("verify_perms_ast has a null operation parameter"),Hn(new Error);try{let n=new vY,s=new nEe(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."),Hn(new Error);let c=!!t.role.permission.super_user,l=i.includes("system");if(l&&BY[r])throw Hn(new Error,Qr.DROP_SYSTEM,Ip.FORBIDDEN);if(c&&!l)return null;let u=wY.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof iEe.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=HY(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]),_=GC(t.role.permission,m,f[h]);kC(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw Hn(n)}}o(fEe,"verifyPermsAst");function mEe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Nr.info("null required parameter in verifyPerms"),Hn(new Error,Qr.DEFAULT_INVALID_REQUEST,Ip.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 vY;if(Xo.isEmptyOrZeroLength(e.hdb_user?.role)||Xo.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(Qr.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(pn.SYSTEM_SCHEMA_NAME)||s===pn.SYSTEM_SCHEMA_NAME;if(l&&d&&aEe[e.operation]&&(i===pn.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===pn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===pn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&BY[r])throw Hn(new Error,Qr.DROP_SYSTEM,Ip.FORBIDDEN);if(l&&!d||u===!0&&(r===Fs.createSchema.name||r===Fs.dropSchema.name))return null;if(dEe.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=wY.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===bY||r===IY)&&!f.super_user){if(s===pn.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Qr.SCHEMA_PERM_ERROR(s));if(r===bY&&(!f[s]||!f[s][Np]))return c.handleInvalidItem(Qr.SCHEMA_NOT_FOUND(s));if(r===IY&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][Np]))return c.handleInvalidItem(Qr.TABLE_NOT_FOUND(s,i))}let m=HY(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&&pn.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[pn.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[pn.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=hEe(e),p=GC(e.hdb_user?.role?.permission,s,i);return kC(h,p,r,i,s,c,n),c.getPermsResponse()}o(mEe,"verifyPerms");function HY(e,t,r,n,s){if(Xo.arrayHasEmptyValues([e,t,r]))throw Nr.info("hasPermissions has an invalid parameter"),Hn(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.`),Hn(new Error,Qr.OP_NOT_FOUND(t),Ip.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return Nr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(Qr.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][Np]===!1){n.addInvalidItem(Qr.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(Qr.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[Np]===!1)n.addInvalidItem(Qr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!Xo.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=Qr.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Nr.error(h),Nr.error(m),Hn(UY.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(HY,"hasPermissions");function kC(e,t,r,n,s,i,a){if(!e||!t)throw Nr.info("no attributes specified in checkAttributePerms."),Hn(new Error);let c=X.get(r).perms;if(!c||c==="")throw Nr.info(`no permissions found for ${r} in checkAttributePerms().`),Hn(new Error);if(Xo.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[Np]===!1){i.addInvalidItem(Qr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(pn.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==Hs)throw Hn(new Error,Qr.SYSTEM_TIMESTAMP_PERMS_ERR,Ip.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(Qr.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(kC,"checkAttributePerms");function hEe(e){let t=new Set;try{if(e.action)return t;if(e.operation===pn.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(hEe,"getRecordAttributes");function GC(e,t,r){let n=new Map;if(Xo.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(GC,"getAttributePermissions");function pEe(e,t,r,n,s,i,a){let c=new Set(i),l=GC(e,n,s);kC(c,l,t,s,n,a,r)}o(pEe,"verifyBulkLoadAttributePerms")});var FT=M((exe,KY)=>{"use strict";KY.exports={evaluateSQL:OEe,processAST:VY,convertSQLToAST:$Y,checkASTPermissions:qY};var EEe=Mn(),GY=require("util"),_Ee=GY.callbackify(EEe.insert),gEe=sn().search,SEe=WG().update,TEe=GY.callbackify(SEe),REe=jG().convertDelete,mc=require("alasql"),yEe=xT(),BT=Q(),AEe=sg(),bEe=ie(),Cp=(k(),v(W)),{hdbErrors:IEe,handleHDBError:qC}=ge(),{HTTP_STATUS_CODES:$C}=IEe;AEe(mc);var NEe=403,wEe="There was a problem performing this insert. Please check the logs and try again.",VC=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function OEe(e,t){let r=e.parsed_sql_object;if(!r){r=$Y(e.sql);let n,s=r.ast.statements[0];if(s instanceof mc.yy.Insert?n=s.into.databaseid:s instanceof mc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof mc.yy.Update||s instanceof mc.yy.Delete?n=s.table.databaseid:BT.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof mc.yy.Select)&&bEe.isEmptyOrZeroLength(n))return t("No schema specified",null)}VY(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(OEe,"evaluateSQL");function qY(e,t){let r;try{r=yEe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(qY,"checkASTPermissions");function $Y(e){let t=new VC;if(!e)throw qC(new Error,"The 'sql' parameter is missing from the request body",$C.BAD_REQUEST);try{let r=e.trim(),n=mc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
31
- `);throw n[1]?qC(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,$C.BAD_REQUEST):qC(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",$C.BAD_REQUEST)}return t}o($Y,"convertSQLToAST");function VY(e,t,r){try{let n=CEe;if(!e.bypass_auth&&!t.permissions_checked){let i=qY(e,t);if(i&&i.length>0)return r(NEe,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case Cp.VALID_SQL_OPS_ENUM.SELECT:n=gEe,s=t.ast.statements[0];break;case Cp.VALID_SQL_OPS_ENUM.INSERT:n=PEe;break;case Cp.VALID_SQL_OPS_ENUM.UPDATE:n=TEe;break;case Cp.VALID_SQL_OPS_ENUM.DELETE:n=REe;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(VY,"processAST");function CEe(e,t){BT.info(e),t("unknown sql statement")}o(CEe,"nullFunction");function PEe({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=LEe(i,e.values)}catch(a){return r(a)}_Ee(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){BT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(PEe,"convertInsert");function LEe(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]]=mc.compile(`SELECT ${s.toString()} AS [${Cp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw BT.error(r),new Error(wEe)}}o(LEe,"createDataObjects")});var QC=M((sxe,jY)=>{var qT=require("clone"),$T=ut(),DEe=ie(),kT=(k(),v(W)),rxe=Q(),KC=require("fs"),WC=require("joi"),{string:GT}=WC.types(),{hdbErrors:MEe,handleHDBError:HT}=ge(),{HDB_ERROR_MSGS:nxe,HTTP_STATUS_CODES:YC}=MEe,{commonValidators:of}=ki(),YY=" is required",vEe=["insert","update","upsert"],zC={database:{presence:!1,format:of.schema_format,length:of.schema_length},schema:{presence:!1,format:of.schema_format,length:of.schema_length},table:{presence:!0,format:of.schema_format,length:of.schema_length},action:{inclusion:{within:vEe,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},UEe={schema:GT.required(),table:GT.required(),action:GT.valid("insert","update","upsert")},{AWS_ACCESS_KEY:xEe,AWS_SECRET:BEe,AWS_BUCKET:FEe,AWS_FILE_KEY:HEe,REGION:kEe}=kT.S3_BUCKET_AUTH_KEYS,GEe={s3:{presence:!0},[`s3.${xEe}`]:{presence:!0,type:"String"},[`s3.${BEe}`]:{presence:!0,type:"String"},[`s3.${FEe}`]:{presence:!0,type:"String"},[`s3.${HEe}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${kEe}`]:{presence:!0,type:"String"}},WY=qT(zC);WY.data.presence={message:YY};var zY=qT(zC);zY.file_path.presence={message:YY};var qEe=Object.assign(qT(zC),GEe),jC=qT(UEe);jC.csv_url=GT.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();jC.passthrough_headers=WC.object();function $Ee(e){let t=$T.validateObject(e,WY);return VT(e,t)}o($Ee,"dataObject");function VEe(e){let t=$T.validateBySchema(e,WC.object(jC));return VT(e,t)}o(VEe,"urlObject");function KEe(e){let t=$T.validateObject(e,zY);return VT(e,t)}o(KEe,"fileObject");function YEe(e){let t=$T.validateObject(e,qEe);return VT(e,t)}o(YEe,"s3FileObject");function VT(e,t){if(!t){let r=DEe.checkGlobalSchemaTable(e.schema,e.table);if(r)return HT(new Error,r,YC.BAD_REQUEST);if(e.operation===kT.OPERATIONS_ENUM.CSV_FILE_LOAD)try{KC.accessSync(e.file_path,KC.constants.R_OK|KC.constants.F_OK)}catch(n){return n.code===kT.NODE_ERROR_CODES.ENOENT?HT(n,`No such file or directory ${n.path}`,YC.BAD_REQUEST):n.code===kT.NODE_ERROR_CODES.EACCES?HT(n,`Permission denied ${n.path}`,YC.BAD_REQUEST):HT(n)}}return t}o(VT,"postValidateChecks");jY.exports={dataObject:$Ee,urlObject:VEe,fileObject:KEe,s3FileObject:YEe}});var JC=M((oxe,QY)=>{"use strict";var Pp=Q(),KT=(k(),v(W));async function WEe(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===KT.OPERATIONS_ENUM.INSERT||t.operation===KT.OPERATIONS_ENUM.UPDATE||t.operation===KT.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===KT.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Pp.info(i.message),i):i.http_resp_msg?(Pp.error(`Error calling operation: ${e.name}`),Pp.error(i.http_resp_msg),i):(Pp.error(`Error calling operation: ${e.name}`),Pp.error(i),i)}}o(WEe,"callOperationFunctionAsAwait");QY.exports={callOperationFunctionAsAwait:WEe}});var XC=M((cxe,XY)=>{"use strict";var{S3:zEe,GetObjectCommand:jEe}=require("@aws-sdk/client-s3");XY.exports={getFileStreamFromS3:QEe,getS3AuthObj:JY};async function QEe(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await JY(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new jEe(r))).Body}o(QEe,"getFileStreamFromS3");function JY(e,t,r){return new zEe({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(JY,"getS3AuthObj")});var eW=M((uxe,ZY)=>{"use strict";var ZC=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}},eP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};ZY.exports={BulkLoadFileObject:ZC,BulkLoadDataObject:eP}});var rP=M((fxe,tW)=>{"use strict";var tP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};tW.exports=tP});var cP=M((gxe,gW)=>{"use strict";var YT=Mn(),zT=QC(),JEe=require("needle"),Ti=(k(),v(W)),hxe=Ot(),af=ie(),{handleHDBError:Xt,hdbErrors:uW}=ge(),{HTTP_STATUS_CODES:Jr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:zl}=uW,cf=Q(),nP=require("papaparse");af.promisifyPapaParse();var Ri=require("fs-extra"),XEe=require("path"),{chain:rW}=require("stream-chain"),nW=require("stream-json/streamers/StreamArray"),sW=require("stream-json/utils/Batch"),iW=require("stream-chain/utils/comp"),{finished:oW}=require("stream"),ZEe=oe(),dW=JC(),e_e=XC(),{BulkLoadFileObject:iP,BulkLoadDataObject:t_e}=eW(),oP=MC(),{verifyBulkLoadAttributePerms:fW}=xT(),pxe=rP(),Exe=pr(),_xe=Vi(),{databases:r_e}=(Me(),v(Et)),{coerceType:n_e}=(C_(),v(yk)),aW="No records parsed from csv file.",Wl=`${ZEe.get("HDB_ROOT")}/tmp`,{schemaRegex:s_e}=ki(),cW=1024*1024*2,lW=5e3,i_e={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};gW.exports={csvDataLoad:o_e,csvURLLoad:a_e,csvFileLoad:c_e,importFromS3:l_e};async function o_e(e,t){let r=zT.dataObject(e);if(r)throw Xt(r,r.message,Jr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=pW(e.schema,e.table),i=nP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:sP.bind(null,s),dynamicTyping:!1}),a=new oP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&fW(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,Jr.BAD_REQUEST,void 0,void 0,!0);let l=new t_e(e.action,e.schema,e.table,i.data);return n=await dW.callOperationFunctionAsAwait(EW,l,null),n.message===aW?aW:_W(n.records,n.number_written)}catch(s){throw jl(s)}}o(o_e,"csvDataLoad");async function a_e(e){let t=zT.urlObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Wl}/${r}`;try{await u_e(e,r)}catch(s){throw cf.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,zl(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new iP(this.job_operation_function.name,e.action,e.schema,e.table,n,Ti.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await aP(s);return await WT(n),i}catch(s){throw await WT(n),jl(s)}}o(a_e,"csvURLLoad");async function c_e(e){let t=zT.fileObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r=new iP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ti.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await aP(r)}catch(n){throw jl(n)}}o(c_e,"csvFileLoad");async function l_e(e){let t=zT.s3FileObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=XEe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Wl}/${s}`;let i=new iP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await d_e(s,e);let a=await aP(i);return await WT(r),a}catch(n){throw await WT(r),jl(n)}}o(l_e,"importFromS3");async function u_e(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await JEe("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,Ti.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}m_e(r,e.csv_url),await f_e(t,r.raw)}o(u_e,"downloadCSVFile");async function d_e(e,t){try{let r=`${Wl}/${e}`;await Ri.mkdirp(Wl),await Ri.writeFile(`${Wl}/${e}`,"",{flag:"a+"});let n=await Ri.createWriteStream(r),s=await e_e.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(){cf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw cf.error(wr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,zl(wr.S3_DOWNLOAD_ERR))}}o(d_e,"downloadFileFromS3");async function f_e(e,t){try{await Ri.mkdirp(Wl),await Ri.writeFile(`${Wl}/${e}`,t)}catch(r){throw cf.error(wr.WRITE_TEMP_FILE_ERR),Xt(r,zl(wr.DEFAULT_BULK_LOAD_ERR))}}o(f_e,"writeFileToTempFolder");async function WT(e){if(e)try{await Ri.access(e),await Ri.unlink(e)}catch{cf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(WT,"deleteTempFile");function m_e(e,t){if(e.statusCode!==uW.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Jr.BAD_REQUEST);if(!i_e[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Jr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Jr.BAD_REQUEST)}o(m_e,"validateURLResponse");async function aP(e){try{let t;switch(e.file_type){case Ti.VALID_S3_FILE_TYPES.CSV:t=await h_e(e);break;case Ti.VALID_S3_FILE_TYPES.JSON:t=await p_e(e);break;default:throw Xt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Jr.BAD_REQUEST,Ti.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return _W(t.records,t.number_written)}catch(t){throw jl(t)}}o(aP,"fileLoad");async function mW(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 YT.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&fW(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(mW,"validateChunk");async function hW(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;af.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!af.isEmpty(c)&&!af.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 dW.callOperationFunctionAsAwait(EW,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),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(hW,"insertChunk");async function h_e(e){let t={records:0,number_written:0},r=pW(e.schema,e.table);try{let n=new oP,s=Ri.createReadStream(e.file_path,{highWaterMark:cW});s.setEncoding("utf8"),await nP.parsePromise(s,mW.bind(null,e,n),sP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Jr.BAD_REQUEST);return s=Ri.createReadStream(e.file_path,{highWaterMark:cW}),s.setEncoding("utf8"),await nP.parsePromise(s,hW.bind(null,e,t),sP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,zl(wr.PAPA_PARSE_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(h_e,"callPapaParse");function pW(e,t){let r=r_e[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>n_e(i,s));return n}o(pW,"createTransformMap");function sP(e,t,r){let n=e.get(r);return n?n(t):af.autoCast(t)}o(sP,"typeFunction");async function p_e(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new oP,s=rW([Ri.createReadStream(e.file_path,{encoding:"utf-8"}),nW.withParser(),c=>c.value,new sW({batchSize:lW}),iW(async c=>{await mW(e,n,r,c)})]);await new Promise((c,l)=>{oW(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Jr.BAD_REQUEST);let a=rW([Ri.createReadStream(e.file_path,{encoding:"utf-8"}),nW.withParser(),c=>c.value,new sW({batchSize:lW}),iW(async c=>{await hW(e,t,r,c)})]);return await new Promise((c,l)=>{oW(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,zl(wr.INSERT_JSON_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(p_e,"insertJson");async function EW(e){let t={};try{e.data&&e.data.length>0&&E_e(e.data[0])?t=await __e(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",cf.info(t.message))}catch(r){throw jl(r)}return t}o(EW,"callBulkFileLoad");function E_e(e){let t=Object.keys(e);for(let r of t)if(!s_e.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(E_e,"validateColumnNames");async function __e(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=YT.insert;break;case"update":i=YT.update;break;case"upsert":i=YT.upsert;break;default:throw Xt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Jr.BAD_REQUEST,Ti.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=af.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw jl(a)}}o(__e,"bulkFileLoad");function _W(e,t){return`successfully loaded ${t} of ${e} records`}o(_W,"buildResponseMsg");function jl(e){return Xt(e,zl(wr.DEFAULT_BULK_LOAD_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(jl,"buildTopLevelErrMsg")});var dP=M((Txe,NW)=>{"use strict";var uP=sn(),g_e=XC(),{AsyncParser:S_e}=require("json2csv"),jT=require("stream"),fs=ie(),lP=require("fs-extra"),T_e=require("path"),ks=Q(),{promisify:RW}=require("util"),Lp=ie(),{handleHDBError:_r,hdbErrors:R_e}=ge(),{HDB_ERROR_MSGS:kn,HTTP_STATUS_CODES:gr}=R_e,{streamAsJSON:y_e}=(SA(),v(bv)),{Upload:A_e}=require("@aws-sdk/lib-storage"),{toCsvStream:b_e}=(Ro(),v(vv)),SW=["search_by_value","search_by_hash","sql","search_by_conditions"],TW=["json","csv"],yW="json",AW="csv",I_e="Successfully exported JSON locally.",N_e="Successfully exported CSV locally.",w_e=1e3,O_e=uP.searchByHash,C_e=uP.searchByValue,P_e=RW(jT.finished);NW.exports={export_to_s3:v_e,export_local:L_e};async function L_e(e){ks.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=bW(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(kn.MISSING_VALUE("path")),_r(new Error,kn.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(T_e.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await D_e(e.path);let s=await IW(e);return await M_e(n,e.format,s)}o(L_e,"export_local");async function D_e(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 lP.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(D_e,"confirmPath");async function M_e(e,t,r){if(ks.trace("in saveToLocal"),Lp.isEmptyOrZeroLength(e))throw _r(new Error,kn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(Lp.isEmptyOrZeroLength(t))throw _r(new Error,kn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(Lp.isEmpty(r))throw _r(new Error,kn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===yW){let n=lP.createWriteStream(e);return y_e(r).pipe(n),await P_e(n),{message:I_e,path:e}}else if(t===AW){let n=lP.createWriteStream(e),s=jT.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new S_e(i,c).fromInput(s).toOutput(n).promise(!1),{message:N_e,path:e}}throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(M_e,"saveToLocal");async function v_e(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,kn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,kn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,kn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,kn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,kn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,kn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=bW(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 IW(e)}catch(l){throw ks.error(l),l}let n,s=await g_e.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new jT.PassThrough;if(e.format===AW){i=e.s3.key+".csv";let l=b_e(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===yW){i=e.s3.key+".json";let l=new jT.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%w_e===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new A_e({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(v_e,"export_to_s3");function bW(e){if(ks.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(TW.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${TW.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(SW.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${SW.join(", ")}`}o(bW,"exportCoreValidation");async function IW(e){ks.trace("in getRecords");let t,r;if(Lp.isEmpty(e.search_operation)||Lp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,kn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=C_e;break;case"search_by_hash":t=O_e;break;case"search_by_conditions":t=uP.searchByConditions;break;case"sql":{let n=FT();t=RW(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(IW,"getRecords")});var OW=M((yxe,wW)=>{"use strict";var fP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};wW.exports=fP});var LW=M((bxe,PW)=>{"use strict";var U_e=(k(),v(W)),CW=require("moment"),x_e=require("uuid").v4,mP=class{static{o(this,"JobObject")}constructor(){this.id=x_e(),this.type=void 0,this.start_datetime=CW().valueOf(),this.created_datetime=CW().valueOf(),this.end_datetime=void 0,this.status=U_e.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};PW.exports=mP});var hP=M((Nxe,HW)=>{"use strict";var B_e=require("uuid").v4,xW=Mn(),BW=sn(),F_e=ai(),H_e=Ku(),k_e=OW(),Dt=(k(),v(W)),G_e=LW(),q_e=Xg(),yi=Q(),$_e=Zf(),lf=ie(),{promisify:V_e}=require("util"),Ql=require("moment"),K_e=FT(),QT=QC(),DW=LI(),{deleteTransactionLogsBeforeValidator:Y_e}=gC(),{handleHDBError:MW,hdbErrors:W_e,ClientError:z_e}=ge(),{HTTP_STATUS_CODES:vW}=W_e,UW=BW.searchByValue,j_e=BW.searchByHash,Q_e=xW.insert,J_e=V_e(K_e.evaluateSQL),X_e=xW.update;HW.exports={addJob:tge,updateJob:nge,handleGetJob:Z_e,handleGetJobsByStartDate:ege,getJobById:FW};async function Z_e(e){if(e.id===void 0)throw new z_e("'id' is required");let t=await FW(e.id);return lf.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(Z_e,"handleGetJob");async function ege(e){try{let t=await rge(e);if(yi.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=Ql(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=Ql(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 yi.error(r),new Error(r)}}o(ege,"handleGetJobsByStartDate");async function tge(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||lf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return yi.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return yi.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=QT.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=QT.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=QT.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=QT.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=DW(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=DW(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=Y_e(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw MW(new Error,"Invalid service",vW.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw MW(n,n.message,vW.BAD_REQUEST,void 0,void 0,!0);let s=new G_e;s.type=e.operation===Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new F_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await UW(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return yi.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=B_e();try{a=await UW(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return yi.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return yi.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new $_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await Q_e(l)}catch(d){return yi.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,yi.trace(d)}return t}o(tge,"addJob");async function rge(e){let t=Ql(e.from_date,Ql.ISO_8601),r=Ql(e.to_date,Ql.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 k_e(n,e.hdb_user);try{return await J_e(s)}catch(i){throw yi.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(rge,"getJobsInDateRange");async function FW(e){if(lf.isEmptyOrZeroLength(e))return lf.errorizeMessage("Invalid job ID specified.");let t=new H_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await j_e(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return yi.error(n),lf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(FW,"getJobById");async function nge(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(lf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Dt.JOB_STATUS_ENUM.COMPLETE||e.status===Dt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=Ql().valueOf());let t=new q_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await X_e(t),r}o(nge,"updateJob")});var WW=M((Oxe,YW)=>{"use strict";var kW=ie(),Or=(k(),v(W)),sge=require("moment"),JT=cP(),Dp=Q(),GW=hP(),qW=dP(),$W=El(),VW=nt(),ige=OT(),oge=Zd(),{parentPort:age,isMainThread:KW}=require("worker_threads"),{onMessageByType:cge}=nt(),pP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function lge(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(kW.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(kW.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await ro(e,JT.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await ro(e,JT.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await ro(e,JT.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await ro(e,JT.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await ro(e,qW.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await ro(e,qW.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await ro(e,$W.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await ro(e,$W.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await ro(e,ige.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await ro(e,oge.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(lge,"parseMessage");async function ro(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=sge().valueOf(),await GW.updateJob(e.job),await uge(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):Dp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Dp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await GW.updateJob(e.job)}catch(s){throw Dp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(ro,"runJob");async function uge(e){Dp.trace("launching job thread:",e),KW?VW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):age.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(uge,"launchJobThread");KW&&cge(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{VW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Dp.error(r)}});YW.exports={parseMessage:lge,RunnerMessage:pP}});var jW=M((Pxe,zW)=>{"use strict";var dge=ie(),EP=oe(),hc=(k(),v(W)),fge=Ot(),mge=pr(),no=Q(),hge=rP(),pge=Vi();EP.initSync();zW.exports={postOperationHandler:_ge,sendOperationTransaction:Mp};async function Mp(e,t,r,n){if(e.schema===hc.SYSTEM_SCHEMA_NAME)return;let s=Ege(e,t,r);s&&(no.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await mge.publishToStream(`${fge.SUBJECT_PREFIXES.TXN}.${e.schema}`,pge.createNatsTableStreamName(e.schema,e.table),n,s))}o(Mp,"sendOperationTransaction");function Ege(e,t,r){if(dge.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===hc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(Ege,"convertCRUDOperationToTransaction");async function _ge(e,t,r){if(!EP.get(hc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;no.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=EP.get(hc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new hge(t.txn_time,n,s);switch(e.operation){case hc.OPERATIONS_ENUM.INSERT:try{await Mp(e,t.inserted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for insert."),no.error(a)}break;case hc.OPERATIONS_ENUM.DELETE:try{await Mp(e,t.deleted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for delete."),no.error(a)}break;case hc.OPERATIONS_ENUM.UPDATE:try{await Mp(e,t.update_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for update."),no.error(a)}break;case hc.OPERATIONS_ENUM.UPSERT:try{await Mp(e,t.upserted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for upsert."),no.error(a)}break;default:break}return t}o(_ge,"postOperationHandler")});var J,QW=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 EC={};we(EC,{chooseOperation:()=>pz,executeJob:()=>Gs,getOperationFunction:()=>Ez,operation:()=>IP,processLocalTransaction:()=>hz});async function hz(e,t){try{if(e.body.operation!=="read_log"&&(Bp.default.log_level===$f.INFO||Bp.default.log_level===$f.DEBUG||Bp.default.log_level===$f.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;En.info(c)}}catch(n){En.error(n)}let r=await fz.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return Tge[e.body.operation]&&cz.default.setSchemaDataToGlobal(n=>{n&&En.error(n)}),r}function pz(e){let t;try{t=Ez(e)}catch(s){throw En.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=eR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=eR.default.checkASTPermissions(e,i);if(a)throw En.error(`${JW.FORBIDDEN} from operation ${e.operation}`),En.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=az.default.verifyPerms(i,s);if(a)throw En.error(`${JW.FORBIDDEN} from operation ${e.operation}`),En.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 Ez(e){if(En.trace(`getOperationFunction with operation: ${e.operation}`),XW.has(e.operation))return XW.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 IP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=pz(e);return hz({body:e},n)}async function Rge(e){En.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[Qy]=!0;let a;switch(i.operation){case q.INSERT:a=await Xl.default.insert(i);break;case q.UPDATE:a=await Xl.default.update(i);break;case q.UPSERT:a=await Xl.default.upsert(i);break;case q.DELETE:a=await ff.default.deleteRecord(i);break;default:En.warn("invalid operation in catchup");break}await mz.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){En.info("Invalid operation in transaction"),En.error(a)}}async function Gs(e){(0,dz.transformReq)(e);let t,r;try{if(r=await tR.default.addJob(e),r){t=r.createdJob,En.info("addJob result",r);let n=new TP.default.RunnerMessage(t,e);return{message:await TP.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 En.error(i),(0,qs.handleHDBError)(n,i)}}function yge(){let e=new Map;return e.set(q.INSERT,new J(Xl.default.insert)),e.set(q.UPDATE,new J(Xl.default.update)),e.set(q.UPSERT,new J(Xl.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(df.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(df.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(df.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(df.default.searchByValue)),e.set(q.SEARCH,new J(gge)),e.set(q.SQL,new J(Sge)),e.set(q.CSV_DATA_LOAD,new J(Gs,vp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(Gs,vp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(Gs,vp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(Gs,vp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(Ai.default.createSchema)),e.set(q.CREATE_DATABASE,new J(Ai.default.createSchema)),e.set(q.CREATE_TABLE,new J(Ai.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(Ai.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(Ai.default.dropSchema)),e.set(q.DROP_DATABASE,new J(Ai.default.dropSchema)),e.set(q.DROP_TABLE,new J(Ai.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(Ai.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(Up.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(Up.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(Up.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(Up.default.describeAll)),e.set(q.DELETE,new J(ff.default.deleteRecord)),e.set(q.ADD_USER,new J(uf.default.addUser)),e.set(q.ALTER_USER,new J(uf.default.alterUser)),e.set(q.DROP_USER,new J(uf.default.dropUser)),e.set(q.LIST_USERS,new J(uf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(xp.default.listRoles)),e.set(q.ADD_ROLE,new J(xp.default.addRole)),e.set(q.ALTER_ROLE,new J(xp.default.alterRole)),e.set(q.DROP_ROLE,new J(xp.default.dropRole)),e.set(q.USER_INFO,new J(uf.default.userInfo)),e.set(q.READ_LOG,new J(ez.default)),e.set(q.ADD_NODE,new J(tz.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(rz.default)),e.set(q.CONFIGURE_CLUSTER,new J(nz.default)),e.set(q.PURGE_STREAM,new J(sz.default)),e.set(q.SET_CONFIGURATION,new J(RP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(iz.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(oz.default)),e.set(q.CLUSTER_SET_ROUTES,new J(XT.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(XT.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(XT.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(Gs,gP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(Jl.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(Jl.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(Jl.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(Jl.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(Jl.default.removeCertificate)),e.set(q.GET_KEY,new J(Jl.default.getKey)),e.set(q.ADD_NODE_BACK,new J(uO)),e.set(q.REMOVE_NODE_BACK,new J(dO)),e.set(q.DELETE_FILES_BEFORE,new J(Gs,ff.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(Gs,ff.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(Gs,gP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(tR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(tR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(ZT.default.getFingerprint)),e.set(q.SET_LICENSE,new J(ZT.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(ZT.default.getRegistrationInfo)),e.set(q.RESTART,new J(SP.default.restart)),e.set(q.RESTART_SERVICE,new J(Gs,SP.default.restartService)),e.set(q.CATCHUP,new J(Rge)),e.set(q.SYSTEM_INFORMATION,new J(lz.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(Gs,ff.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(ZW.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(rw)),e.set(q.REFRESH_OPERATION_TOKEN,new J(nw)),e.set(q.LOGIN,new J(cC)),e.set(q.LOGOUT,new J(lC)),e.set(q.GET_CONFIGURATION,new J(RP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(yP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(Gs,yP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(AP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(AP.default.auditModules)),e.set(q.GET_BACKUP,new J(Ai.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(Ai.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(TC)),e.set(q.LIST_METRICS,new J(RC)),e.set(q.DESCRIBE_METRIC,new J(yC)),e.set(q.GET_STATUS,new J(wC)),e.set(q.SET_STATUS,new J(OC)),e.set(q.CLEAR_STATUS,new J(NC)),e}var df,eR,vp,Ai,Up,ff,ZW,uf,xp,Mt,Bp,ez,tz,_P,rz,nz,sz,iz,oz,XT,gP,az,tR,qs,ZT,SP,bP,Xl,cz,lz,TP,RP,yP,AP,uz,dz,Jl,fz,mz,JW,En,gge,Sge,Tge,XW,_C=ce(()=>{df=w(sn()),eR=w(FT()),vp=w(cP()),Ai=w(Gh()),Up=w(xa()),ff=w(El()),ZW=w(Fw()),uf=w(rs()),xp=w(Rh()),Mt=w(pC()),Bp=w(Q()),ez=w($w()),tz=w(WS()),_P=w(EO()),rz=w(jS()),nz=w(SO()),sz=w(TO()),iz=w(AO()),oz=w(IO()),XT=w(eT()),gP=w(dP()),az=w(xT()),tR=w(hP());k();qs=w(ge()),ZT=w(FO()),SP=w(Zd()),bP=w(require("util")),Xl=w(Mn()),cz=w(ii()),lz=w(Fd()),TP=w(WW());gd();TT();RP=w(wt()),yP=w(OT()),AP=w(hp()),uz=w(Zs()),dz=w(ie());Dr();Jl=w(as());kd();bC();fz=w(JC()),mz=w(jW());bp();QW();({HTTP_STATUS_CODES:JW}=qs.hdbErrors),En=Bp.default.loggerWithTag("operation"),gge=bP.promisify(df.default.search),Sge=bP.promisify(eR.default.evaluateSQL),Tge={[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(hz,"processLocalTransaction");XW=yge();Le.operation=IP;o(pz,"chooseOperation");o(Ez,"getOperationFunction");(0,uz._assignPackageExport)("operation",IP);o(IP,"operation");o(Rge,"catchup");o(Gs,"executeJob");o(yge,"initializeOperationFunctionMap")});var sR=M((Bxe,Sz)=>{"use strict";var rR=(k(),v(W)),Age=ie(),Fp=Q(),{handleHDBError:NP,hdbErrors:nR}=ge(),{isMainThread:bge}=require("worker_threads"),{Readable:Ige}=require("stream"),_z=require("os"),Nge=require("util"),wge=iw(),Oge=Nge.promisify(wge.authorize),gz=(_C(),v(EC)),{createGzip:Cge,constants:Pge}=require("zlib"),Lge=[rR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,rR.OPERATIONS_ENUM.LOGIN,rR.OPERATIONS_ENUM.LOGOUT];function Dge(e){let t=`Found an uncaught exception with message: ${e.message}. ${_z.EOL}Stack: ${e.stack} ${_z.EOL}Terminating ${bge?"HDB":"thread"}.`;console.error(t),Fp.fatal(t),process.exit(1)}o(Dge,"handleServerUncaughtException");function Mge(e,t,r){if(Fp[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:nR.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(Mge,"serverErrorHandler");function vge(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=NP(new Error,"Invalid JSON.",nR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(Age.isEmpty(e.body.operation)){let n=NP(new Error,"Request body must include an 'operation' property.",nR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(vge,"reqBodyValidationHandler");function Uge(e,t,r){let n;!Lge.includes(e.body.operation)||e.body.operation===rR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?Oge(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{Fp.warn(i),Fp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(NP(i,a,nR.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(Uge,"authHandler");async function xge(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=gz.chooseOperation(e.body);let s=await gz.processLocalTransaction(e,n);if(s instanceof Ige&&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(Cge({level:Pge.Z_BEST_SPEED})))}return s}catch(s){throw Fp.error(s),s}}o(xge,"handlePostRequest");Sz.exports={authHandler:Uge,handlePostRequest:xge,handleServerUncaughtException:Dge,serverErrorHandler:Mge,reqBodyValidationHandler:vge}});var Az=M((Hxe,yz)=>{"use strict";var Bge=require("fastify-plugin"),{handlePostRequest:Tz,authHandler:Fge,reqBodyValidationHandler:Hge}=sR();async function kge(e){e.decorate("hdbCore",{preValidation:[Hge,Fge],request:o((t,r)=>Rz(Tz(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>Rz(Tz(t,r,!0)),"requestWithoutAuthentication")})}o(kge,"hdbCore");async function Rz(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(Rz,"convertAsyncIterators");yz.exports=Bge(kge)});var Iz=M((qxe,bz)=>{"use strict";var Gxe=require("fs"),iR=oe();iR.initSync();var{CONFIG_PARAMS:wP}=(k(),v(W)),Gge=1024*1024*1024;function qge(e){let t=iR.get(wP.HTTP_TIMEOUT),r=iR.get(wP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:Gge,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:iR.get(wP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(qge,"getServerOptions");bz.exports=qge});var Oz=M((Vxe,wz)=>{"use strict";var OP=oe();OP.initSync();var{CONFIG_PARAMS:Nz}=(k(),v(W));function $ge(){let e=OP.get(Nz.HTTP_CORSACCESSLIST),t=OP.get(Nz.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($ge,"getCORSOptions");wz.exports=$ge});var Lz=M((Yxe,Pz)=>{"use strict";var Cz=oe();Cz.initSync();var Vge=(k(),v(W));function Kge(){return Cz.get(Vge.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(Kge,"getHeaderTimeoutConfig");Pz.exports=Kge});var PP={};we(PP,{customFunctionsServer:()=>zge,ready:()=>Kz,start:()=>Wge});function Wge(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){Zo||(Zo=Vz(t),Le.http((await Zo).server));let a=await Zo,c=(0,CP.dirname)(s),l=(0,CP.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!Dz.has(c)){Dz.add(c);try{a.register(Qge(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:Kz}}async function zge(){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 jge();let e=Fz.get(U.HTTP_SECUREPORT)>0,t;try{t=Zo=await Vz(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 jge(){try{yt.info("Custom Functions starting configuration."),await Hz.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function Qge(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,Mz.existsSync)(e)&&r.register(Bz.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 Vz(e){yt.info("Custom Functions starting buildServer.");let t=(0,kz.default)(e),r=(0,vz.default)(t);r.server.headersTimeout=(0,qz.default)(),r.setErrorHandler($z.serverErrorHandler);let n=(0,Gz.default)();return n&&r.register(Uz.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(xz.default),await r.register(Yge),await r.after(),am(r),yt.info("Custom Functions completed buildServer."),r}function Kz(){if(Zo)return Zo.then?Zo.then(e=>e.ready()):Zo.ready()}var CP,Mz,vz,Uz,xz,Bz,Fz,yt,Yge,Hz,kz,Gz,qz,$z,Zo,Dz,Yz=ce(()=>{CP=require("path"),Mz=require("fs"),vz=w(require("fastify")),Uz=w(require("@fastify/cors")),xz=w(XN()),Bz=w(require("@fastify/autoload")),Fz=w(oe());k();yt=w(Q()),Yge=w(Az()),Hz=w(rs()),kz=w(Iz()),Gz=w(Oz()),qz=w(Lz()),$z=w(sR());Ro();Dr();Dz=new Set;o(Wge,"start");o(zge,"customFunctionsServer");o(jge,"setUp");o(Qge,"buildRouteFolder");o(Vz,"buildServer");o(Kz,"ready")});var LP={};we(LP,{start:()=>Jge});function Jge(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Jz.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){zz||(zz=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Wz.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,jz.default)(s,(0,Qz.realpathSync)(a))}}return i(s)},{runFirst:!0})),Wz.set(r,n)}}}var jz,Qz,Jz,Wz,zz,Xz=ce(()=>{jz=w(require("send")),Qz=require("fs"),Jz=w(require("serve-static")),Wz=new Map;o(Jge,"start")});var DP={};we(DP,{start:()=>Xge});function Xge({override:e}){return{handleFile:o((t,r,n)=>{oR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,Zz.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 Zz,oR,ej=ce(()=>{Zz=require("dotenv"),oR=w(Q());o(Xge,"start")});var UP={};we(UP,{DataLoaderError:()=>ms,DataLoaderResult:()=>mf,EmptyFileError:()=>uR,FileParseError:()=>lR,InvalidPropertyTypeError:()=>dR,MissingRequiredPropertyError:()=>Hp,RecordProcessingError:()=>kp,SystemDatabaseError:()=>fR,UnsupportedFileExtensionError:()=>cR,computeRecordHash:()=>vP,handleApplication:()=>tSe,loadDataFile:()=>cj,suppressHandleApplicationWarning:()=>eSe});function vP(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,rj.createHash)("sha256").update(n).digest("hex")}function aj(e){return e.system&&e.system[MP]?e.system[MP]:aR||(aR=ze({database:"system",table:MP,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),aR)}async function Zge(e,t,r,n){try{let s=aj(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 tj(e,t,r,n,s){try{let i=aj(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 tSe(e){if((0,sj.getWorkerIndex)()!==0){$s.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||cj(t,ln,He).then(r=>{$s.debug?.("Data loader processed file: %s: %s",(0,ea.basename)(t.absolutePath),r.message)})})}async function cj({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ea.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,nj.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new cR(t,i)}catch(f){throw f instanceof ms?f:new lR(t,f)}if(!a)throw new uR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Hp(t,"table");if(!u)throw new Hp(t,"records");if(!Array.isArray(u))throw new dR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new fR(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=vP(N);if(!O){h++;let $=await f.put(N);return await tj(c,l,F,Z,s),$}let G=await Zge(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 vP(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await tj(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 kp(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 mf(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 mf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return $s.info?.(R),new mf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new kp(d,f)}}var ea,rj,nj,sj,ta,ij,oj,$s,MP,aR,eSe,ms,cR,lR,uR,Hp,dR,fR,kp,mf,lj=ce(()=>{ea=require("node:path"),rj=require("node:crypto"),nj=require("yaml");Me();sj=w(nt()),ta=w(tn()),ij=w(ge()),oj=w(Q()),$s=oj.default.forComponent("dataLoader"),MP="hdb_dataloader_hash";o(vP,"computeRecordHash");o(aj,"getHashTrackingTable");o(Zge,"getStoredHash");o(tj,"storeHash");eSe=!0;o(tSe,"handleApplication");o(cj,"loadDataFile");ms=class extends ij.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=ta.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},cR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ea.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,ta.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,ea.basename)(t)}: ${r.message}`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},uR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ea.basename)(t)} is empty or invalid`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Hp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ea.basename)(t)} is missing required "${r}" property`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},dR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ea.basename)(t)} has invalid "${r}" property, expected ${n}`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},fR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,ta.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},kp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,ta.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},mf=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 BP=M((sBe,uj)=>{"use strict";var Gp=oe();Gp.initSync();var hf=require("fs-extra"),xP=require("path"),pf=(k(),v(W)),rSe=require("crypto"),nSe=require("uuid").v4;uj.exports=sSe;function sSe(){if(Gp.getHdbBasePath()!==void 0){let e=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{hf.accessSync(r),hf.accessSync(e),hf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=nSe(),i=rSe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});hf.writeFileSync(r,s),hf.writeFileSync(e,i.privateKey),hf.writeFileSync(t,i.publicKey)}else throw n}}}o(sSe,"checkJWTTokenExist")});var fj=M((oBe,dj)=>{"use strict";var FP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};dj.exports={HdbInfoInsertObject:FP}});var pj=M((cBe,hj)=>{"use strict";var mj=(k(),v(W)),HP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[mj.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[mj.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};hj.exports={UpgradeObject:HP}});var mR=M((uBe,_j)=>{"use strict";var Vs=require("prompt"),Ef=require("chalk"),Ej=Q(),bi=require("os"),kP=xc(),GP=["yes","y"];async function iSe(e){let t=`${bi.EOL}`+Ef.bold.green("Your current HarperDB version requires that we complete an update process.")+`${bi.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${bi.EOL}${bi.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${bi.EOL}`;Vs.override=kP(["CONFIRM_UPGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_UPGRADE:{description:Ef.magenta(`${bi.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 Ej.error("There was an error when prompting user about an upgrade."),Ej.error(s),!1}return GP.includes(n.CONFIRM_UPGRADE)}o(iSe,"forceUpdatePrompt");async function oSe(e){let t=`${bi.EOL}`+Ef.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.${bi.EOL}`);Vs.override=kP(["CONFIRM_DOWNGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:Ef.magenta(`${bi.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 GP.includes(n.CONFIRM_DOWNGRADE)}o(oSe,"forceDowngradePrompt");async function aSe(){let e=`${bi.EOL}`+Ef.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=kP(["GENERATE_CERTS"]),Vs.start(),Vs.message=e;let t={properties:{GENERATE_CERTS:{description:Ef.magenta(`${bi.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 GP.includes(r.GENERATE_CERTS)}o(aSe,"upgradeCertsPrompt");_j.exports={forceUpdatePrompt:iSe,forceDowngradePrompt:oSe,upgradeCertsPrompt:aSe}});var $P=M((fBe,gj)=>{"use strict";var qP=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};gj.exports=qP});var Tj=M((gBe,Sj)=>{"use strict";var cSe=ie(),lSe=wt(),hBe=Q(),pBe=require("path"),EBe=require("fs"),_Be=(k(),v(W));Sj.exports={getOldPropsValue:uSe};function uSe(e,t,r=!1){let n=t.getRaw(e);return cSe.isNotEmptyAndHasValue(n)?n:r?lSe.getDefaultConfig(e):""}o(uSe,"getOldPropsValue")});var bj=M((TBe,Aj)=>{"use strict";var pc=require("path"),Ec=require("fs-extra"),dSe=require("properties-reader"),fSe=$P(),Sr=Q(),{getOldPropsValue:At}=Tj(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:Zl}=(k(),v(W)),eu=wt(),hR=oe(),Rj=ie(),so=(k(),v(W)),VP=new fSe("3.1.0"),yj=[];function mSe(){let e=dSe(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.
31
+ `);throw n[1]?qC(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,$C.BAD_REQUEST):qC(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",$C.BAD_REQUEST)}return t}o($Y,"convertSQLToAST");function VY(e,t,r){try{let n=CEe;if(!e.bypass_auth&&!t.permissions_checked){let i=qY(e,t);if(i&&i.length>0)return r(NEe,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case Cp.VALID_SQL_OPS_ENUM.SELECT:n=gEe,s=t.ast.statements[0];break;case Cp.VALID_SQL_OPS_ENUM.INSERT:n=PEe;break;case Cp.VALID_SQL_OPS_ENUM.UPDATE:n=TEe;break;case Cp.VALID_SQL_OPS_ENUM.DELETE:n=REe;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(VY,"processAST");function CEe(e,t){BT.info(e),t("unknown sql statement")}o(CEe,"nullFunction");function PEe({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=LEe(i,e.values)}catch(a){return r(a)}_Ee(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){BT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(PEe,"convertInsert");function LEe(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]]=mc.compile(`SELECT ${s.toString()} AS [${Cp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw BT.error(r),new Error(wEe)}}o(LEe,"createDataObjects")});var QC=M((sxe,jY)=>{var qT=require("clone"),$T=ut(),DEe=ie(),kT=(k(),v(W)),rxe=Q(),KC=require("fs"),WC=require("joi"),{string:GT}=WC.types(),{hdbErrors:MEe,handleHDBError:HT}=ge(),{HDB_ERROR_MSGS:nxe,HTTP_STATUS_CODES:YC}=MEe,{commonValidators:of}=ki(),YY=" is required",vEe=["insert","update","upsert"],zC={database:{presence:!1,format:of.schema_format,length:of.schema_length},schema:{presence:!1,format:of.schema_format,length:of.schema_length},table:{presence:!0,format:of.schema_format,length:of.schema_length},action:{inclusion:{within:vEe,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},UEe={schema:GT.required(),table:GT.required(),action:GT.valid("insert","update","upsert")},{AWS_ACCESS_KEY:xEe,AWS_SECRET:BEe,AWS_BUCKET:FEe,AWS_FILE_KEY:HEe,REGION:kEe}=kT.S3_BUCKET_AUTH_KEYS,GEe={s3:{presence:!0},[`s3.${xEe}`]:{presence:!0,type:"String"},[`s3.${BEe}`]:{presence:!0,type:"String"},[`s3.${FEe}`]:{presence:!0,type:"String"},[`s3.${HEe}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${kEe}`]:{presence:!0,type:"String"}},WY=qT(zC);WY.data.presence={message:YY};var zY=qT(zC);zY.file_path.presence={message:YY};var qEe=Object.assign(qT(zC),GEe),jC=qT(UEe);jC.csv_url=GT.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();jC.passthrough_headers=WC.object();function $Ee(e){let t=$T.validateObject(e,WY);return VT(e,t)}o($Ee,"dataObject");function VEe(e){let t=$T.validateBySchema(e,WC.object(jC));return VT(e,t)}o(VEe,"urlObject");function KEe(e){let t=$T.validateObject(e,zY);return VT(e,t)}o(KEe,"fileObject");function YEe(e){let t=$T.validateObject(e,qEe);return VT(e,t)}o(YEe,"s3FileObject");function VT(e,t){if(!t){let r=DEe.checkGlobalSchemaTable(e.schema,e.table);if(r)return HT(new Error,r,YC.BAD_REQUEST);if(e.operation===kT.OPERATIONS_ENUM.CSV_FILE_LOAD)try{KC.accessSync(e.file_path,KC.constants.R_OK|KC.constants.F_OK)}catch(n){return n.code===kT.NODE_ERROR_CODES.ENOENT?HT(n,`No such file or directory ${n.path}`,YC.BAD_REQUEST):n.code===kT.NODE_ERROR_CODES.EACCES?HT(n,`Permission denied ${n.path}`,YC.BAD_REQUEST):HT(n)}}return t}o(VT,"postValidateChecks");jY.exports={dataObject:$Ee,urlObject:VEe,fileObject:KEe,s3FileObject:YEe}});var JC=M((oxe,QY)=>{"use strict";var Pp=Q(),KT=(k(),v(W));async function WEe(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===KT.OPERATIONS_ENUM.INSERT||t.operation===KT.OPERATIONS_ENUM.UPDATE||t.operation===KT.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===KT.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Pp.info(i.message),i):i.http_resp_msg?(Pp.error(`Error calling operation: ${e.name}`),Pp.error(i.http_resp_msg),i):(Pp.error(`Error calling operation: ${e.name}`),Pp.error(i),i)}}o(WEe,"callOperationFunctionAsAwait");QY.exports={callOperationFunctionAsAwait:WEe}});var XC=M((cxe,XY)=>{"use strict";var{S3:zEe,GetObjectCommand:jEe}=require("@aws-sdk/client-s3");XY.exports={getFileStreamFromS3:QEe,getS3AuthObj:JY};async function QEe(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await JY(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new jEe(r))).Body}o(QEe,"getFileStreamFromS3");function JY(e,t,r){return new zEe({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(JY,"getS3AuthObj")});var eW=M((uxe,ZY)=>{"use strict";var ZC=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}},eP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};ZY.exports={BulkLoadFileObject:ZC,BulkLoadDataObject:eP}});var rP=M((fxe,tW)=>{"use strict";var tP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};tW.exports=tP});var cP=M((gxe,gW)=>{"use strict";var YT=Mn(),zT=QC(),JEe=require("needle"),Ti=(k(),v(W)),hxe=Ot(),af=ie(),{handleHDBError:Xt,hdbErrors:uW}=ge(),{HTTP_STATUS_CODES:Jr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:zl}=uW,cf=Q(),nP=require("papaparse");af.promisifyPapaParse();var Ri=require("fs-extra"),XEe=require("path"),{chain:rW}=require("stream-chain"),nW=require("stream-json/streamers/StreamArray"),sW=require("stream-json/utils/Batch"),iW=require("stream-chain/utils/comp"),{finished:oW}=require("stream"),ZEe=oe(),dW=JC(),e_e=XC(),{BulkLoadFileObject:iP,BulkLoadDataObject:t_e}=eW(),oP=MC(),{verifyBulkLoadAttributePerms:fW}=xT(),pxe=rP(),Exe=pr(),_xe=Vi(),{databases:r_e}=(Me(),v(Et)),{coerceType:n_e}=(C_(),v(yk)),aW="No records parsed from csv file.",Wl=`${ZEe.get("HDB_ROOT")}/tmp`,{schemaRegex:s_e}=ki(),cW=1024*1024*2,lW=5e3,i_e={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};gW.exports={csvDataLoad:o_e,csvURLLoad:a_e,csvFileLoad:c_e,importFromS3:l_e};async function o_e(e,t){let r=zT.dataObject(e);if(r)throw Xt(r,r.message,Jr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=pW(e.schema,e.table),i=nP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:sP.bind(null,s),dynamicTyping:!1}),a=new oP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&fW(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,Jr.BAD_REQUEST,void 0,void 0,!0);let l=new t_e(e.action,e.schema,e.table,i.data);return n=await dW.callOperationFunctionAsAwait(EW,l,null),n.message===aW?aW:_W(n.records,n.number_written)}catch(s){throw jl(s)}}o(o_e,"csvDataLoad");async function a_e(e){let t=zT.urlObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Wl}/${r}`;try{await u_e(e,r)}catch(s){throw cf.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,zl(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new iP(this.job_operation_function.name,e.action,e.schema,e.table,n,Ti.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await aP(s);return await WT(n),i}catch(s){throw await WT(n),jl(s)}}o(a_e,"csvURLLoad");async function c_e(e){let t=zT.fileObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r=new iP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ti.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await aP(r)}catch(n){throw jl(n)}}o(c_e,"csvFileLoad");async function l_e(e){let t=zT.s3FileObject(e);if(t)throw Xt(t,t.message,Jr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=XEe.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Wl}/${s}`;let i=new iP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await d_e(s,e);let a=await aP(i);return await WT(r),a}catch(n){throw await WT(r),jl(n)}}o(l_e,"importFromS3");async function u_e(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await JEe("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,Ti.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}m_e(r,e.csv_url),await f_e(t,r.raw)}o(u_e,"downloadCSVFile");async function d_e(e,t){try{let r=`${Wl}/${e}`;await Ri.mkdirp(Wl),await Ri.writeFile(`${Wl}/${e}`,"",{flag:"a+"});let n=await Ri.createWriteStream(r),s=await e_e.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(){cf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw cf.error(wr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,zl(wr.S3_DOWNLOAD_ERR))}}o(d_e,"downloadFileFromS3");async function f_e(e,t){try{await Ri.mkdirp(Wl),await Ri.writeFile(`${Wl}/${e}`,t)}catch(r){throw cf.error(wr.WRITE_TEMP_FILE_ERR),Xt(r,zl(wr.DEFAULT_BULK_LOAD_ERR))}}o(f_e,"writeFileToTempFolder");async function WT(e){if(e)try{await Ri.access(e),await Ri.unlink(e)}catch{cf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(WT,"deleteTempFile");function m_e(e,t){if(e.statusCode!==uW.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Jr.BAD_REQUEST);if(!i_e[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Jr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Jr.BAD_REQUEST)}o(m_e,"validateURLResponse");async function aP(e){try{let t;switch(e.file_type){case Ti.VALID_S3_FILE_TYPES.CSV:t=await h_e(e);break;case Ti.VALID_S3_FILE_TYPES.JSON:t=await p_e(e);break;default:throw Xt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Jr.BAD_REQUEST,Ti.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return _W(t.records,t.number_written)}catch(t){throw jl(t)}}o(aP,"fileLoad");async function mW(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 YT.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&fW(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(mW,"validateChunk");async function hW(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;af.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!af.isEmpty(c)&&!af.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 dW.callOperationFunctionAsAwait(EW,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),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(hW,"insertChunk");async function h_e(e){let t={records:0,number_written:0},r=pW(e.schema,e.table);try{let n=new oP,s=Ri.createReadStream(e.file_path,{highWaterMark:cW});s.setEncoding("utf8"),await nP.parsePromise(s,mW.bind(null,e,n),sP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Jr.BAD_REQUEST);return s=Ri.createReadStream(e.file_path,{highWaterMark:cW}),s.setEncoding("utf8"),await nP.parsePromise(s,hW.bind(null,e,t),sP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,zl(wr.PAPA_PARSE_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(h_e,"callPapaParse");function pW(e,t){let r=r_e[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>n_e(i,s));return n}o(pW,"createTransformMap");function sP(e,t,r){let n=e.get(r);return n?n(t):af.autoCast(t)}o(sP,"typeFunction");async function p_e(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new oP,s=rW([Ri.createReadStream(e.file_path,{encoding:"utf-8"}),nW.withParser(),c=>c.value,new sW({batchSize:lW}),iW(async c=>{await mW(e,n,r,c)})]);await new Promise((c,l)=>{oW(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Jr.BAD_REQUEST);let a=rW([Ri.createReadStream(e.file_path,{encoding:"utf-8"}),nW.withParser(),c=>c.value,new sW({batchSize:lW}),iW(async c=>{await hW(e,t,r,c)})]);return await new Promise((c,l)=>{oW(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,zl(wr.INSERT_JSON_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(p_e,"insertJson");async function EW(e){let t={};try{e.data&&e.data.length>0&&E_e(e.data[0])?t=await __e(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",cf.info(t.message))}catch(r){throw jl(r)}return t}o(EW,"callBulkFileLoad");function E_e(e){let t=Object.keys(e);for(let r of t)if(!s_e.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(E_e,"validateColumnNames");async function __e(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=YT.insert;break;case"update":i=YT.update;break;case"upsert":i=YT.upsert;break;default:throw Xt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Jr.BAD_REQUEST,Ti.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=af.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw jl(a)}}o(__e,"bulkFileLoad");function _W(e,t){return`successfully loaded ${t} of ${e} records`}o(_W,"buildResponseMsg");function jl(e){return Xt(e,zl(wr.DEFAULT_BULK_LOAD_ERR),Jr.INTERNAL_SERVER_ERROR,Ti.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(jl,"buildTopLevelErrMsg")});var dP=M((Txe,NW)=>{"use strict";var uP=sn(),g_e=XC(),{AsyncParser:S_e}=require("json2csv"),jT=require("stream"),fs=ie(),lP=require("fs-extra"),T_e=require("path"),ks=Q(),{promisify:RW}=require("util"),Lp=ie(),{handleHDBError:_r,hdbErrors:R_e}=ge(),{HDB_ERROR_MSGS:kn,HTTP_STATUS_CODES:gr}=R_e,{streamAsJSON:y_e}=(SA(),v(bv)),{Upload:A_e}=require("@aws-sdk/lib-storage"),{toCsvStream:b_e}=(Ro(),v(vv)),SW=["search_by_value","search_by_hash","sql","search_by_conditions"],TW=["json","csv"],yW="json",AW="csv",I_e="Successfully exported JSON locally.",N_e="Successfully exported CSV locally.",w_e=1e3,O_e=uP.searchByHash,C_e=uP.searchByValue,P_e=RW(jT.finished);NW.exports={export_to_s3:v_e,export_local:L_e};async function L_e(e){ks.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=bW(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(kn.MISSING_VALUE("path")),_r(new Error,kn.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(T_e.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await D_e(e.path);let s=await IW(e);return await M_e(n,e.format,s)}o(L_e,"export_local");async function D_e(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 lP.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(D_e,"confirmPath");async function M_e(e,t,r){if(ks.trace("in saveToLocal"),Lp.isEmptyOrZeroLength(e))throw _r(new Error,kn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(Lp.isEmptyOrZeroLength(t))throw _r(new Error,kn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(Lp.isEmpty(r))throw _r(new Error,kn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===yW){let n=lP.createWriteStream(e);return y_e(r).pipe(n),await P_e(n),{message:I_e,path:e}}else if(t===AW){let n=lP.createWriteStream(e),s=jT.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new S_e(i,c).fromInput(s).toOutput(n).promise(!1),{message:N_e,path:e}}throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(M_e,"saveToLocal");async function v_e(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,kn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,kn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,kn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,kn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,kn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(fs.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,kn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=bW(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 IW(e)}catch(l){throw ks.error(l),l}let n,s=await g_e.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new jT.PassThrough;if(e.format===AW){i=e.s3.key+".csv";let l=b_e(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===yW){i=e.s3.key+".json";let l=new jT.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%w_e===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new A_e({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(v_e,"export_to_s3");function bW(e){if(ks.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(TW.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${TW.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(SW.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${SW.join(", ")}`}o(bW,"exportCoreValidation");async function IW(e){ks.trace("in getRecords");let t,r;if(Lp.isEmpty(e.search_operation)||Lp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,kn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=C_e;break;case"search_by_hash":t=O_e;break;case"search_by_conditions":t=uP.searchByConditions;break;case"sql":{let n=FT();t=RW(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(IW,"getRecords")});var OW=M((yxe,wW)=>{"use strict";var fP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};wW.exports=fP});var LW=M((bxe,PW)=>{"use strict";var U_e=(k(),v(W)),CW=require("moment"),x_e=require("uuid").v4,mP=class{static{o(this,"JobObject")}constructor(){this.id=x_e(),this.type=void 0,this.start_datetime=CW().valueOf(),this.created_datetime=CW().valueOf(),this.end_datetime=void 0,this.status=U_e.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};PW.exports=mP});var hP=M((Nxe,HW)=>{"use strict";var B_e=require("uuid").v4,xW=Mn(),BW=sn(),F_e=ai(),H_e=Ku(),k_e=OW(),Dt=(k(),v(W)),G_e=LW(),q_e=Xg(),yi=Q(),$_e=Zf(),lf=ie(),{promisify:V_e}=require("util"),Ql=require("moment"),K_e=FT(),QT=QC(),DW=LI(),{deleteTransactionLogsBeforeValidator:Y_e}=gC(),{handleHDBError:MW,hdbErrors:W_e,ClientError:z_e}=ge(),{HTTP_STATUS_CODES:vW}=W_e,UW=BW.searchByValue,j_e=BW.searchByHash,Q_e=xW.insert,J_e=V_e(K_e.evaluateSQL),X_e=xW.update;HW.exports={addJob:tge,updateJob:nge,handleGetJob:Z_e,handleGetJobsByStartDate:ege,getJobById:FW};async function Z_e(e){if(e.id===void 0)throw new z_e("'id' is required");let t=await FW(e.id);return lf.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(Z_e,"handleGetJob");async function ege(e){try{let t=await rge(e);if(yi.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=Ql(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=Ql(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 yi.error(r),new Error(r)}}o(ege,"handleGetJobsByStartDate");async function tge(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||lf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return yi.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return yi.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=QT.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=QT.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=QT.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=QT.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=DW(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=DW(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=Y_e(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw MW(new Error,"Invalid service",vW.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw MW(n,n.message,vW.BAD_REQUEST,void 0,void 0,!0);let s=new G_e;s.type=e.operation===Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE?Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:e.operation,s.type=e.operation,s.user=e.hdb_user?.username;let i=new F_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await UW(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return yi.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=B_e();try{a=await UW(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return yi.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return yi.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new $_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await Q_e(l)}catch(d){return yi.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,yi.trace(d)}return t}o(tge,"addJob");async function rge(e){let t=Ql(e.from_date,Ql.ISO_8601),r=Ql(e.to_date,Ql.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 k_e(n,e.hdb_user);try{return await J_e(s)}catch(i){throw yi.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(rge,"getJobsInDateRange");async function FW(e){if(lf.isEmptyOrZeroLength(e))return lf.errorizeMessage("Invalid job ID specified.");let t=new H_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await j_e(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return yi.error(n),lf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(FW,"getJobById");async function nge(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(lf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Dt.JOB_STATUS_ENUM.COMPLETE||e.status===Dt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=Ql().valueOf());let t=new q_e(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await X_e(t),r}o(nge,"updateJob")});var WW=M((Oxe,YW)=>{"use strict";var kW=ie(),Or=(k(),v(W)),sge=require("moment"),JT=cP(),Dp=Q(),GW=hP(),qW=dP(),$W=El(),VW=nt(),ige=OT(),oge=Zd(),{parentPort:age,isMainThread:KW}=require("worker_threads"),{onMessageByType:cge}=nt(),pP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function lge(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(kW.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(kW.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await ro(e,JT.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await ro(e,JT.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await ro(e,JT.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await ro(e,JT.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await ro(e,qW.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await ro(e,qW.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await ro(e,$W.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await ro(e,$W.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await ro(e,ige.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await ro(e,oge.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(lge,"parseMessage");async function ro(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=sge().valueOf(),await GW.updateJob(e.job),await uge(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):Dp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Dp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await GW.updateJob(e.job)}catch(s){throw Dp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(ro,"runJob");async function uge(e){Dp.trace("launching job thread:",e),KW?VW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):age.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(uge,"launchJobThread");KW&&cge(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{VW.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Dp.error(r)}});YW.exports={parseMessage:lge,RunnerMessage:pP}});var jW=M((Pxe,zW)=>{"use strict";var dge=ie(),EP=oe(),hc=(k(),v(W)),fge=Ot(),mge=pr(),no=Q(),hge=rP(),pge=Vi();EP.initSync();zW.exports={postOperationHandler:_ge,sendOperationTransaction:Mp};async function Mp(e,t,r,n){if(e.schema===hc.SYSTEM_SCHEMA_NAME)return;let s=Ege(e,t,r);s&&(no.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await mge.publishToStream(`${fge.SUBJECT_PREFIXES.TXN}.${e.schema}`,pge.createNatsTableStreamName(e.schema,e.table),n,s))}o(Mp,"sendOperationTransaction");function Ege(e,t,r){if(dge.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===hc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(Ege,"convertCRUDOperationToTransaction");async function _ge(e,t,r){if(!EP.get(hc.CONFIG_PARAMS.CLUSTERING_ENABLED))return;no.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=EP.get(hc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new hge(t.txn_time,n,s);switch(e.operation){case hc.OPERATIONS_ENUM.INSERT:try{await Mp(e,t.inserted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for insert."),no.error(a)}break;case hc.OPERATIONS_ENUM.DELETE:try{await Mp(e,t.deleted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for delete."),no.error(a)}break;case hc.OPERATIONS_ENUM.UPDATE:try{await Mp(e,t.update_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for update."),no.error(a)}break;case hc.OPERATIONS_ENUM.UPSERT:try{await Mp(e,t.upserted_hashes,i,r)}catch(a){no.error("There was an error calling clustering postOperationHandler for upsert."),no.error(a)}break;default:break}return t}o(_ge,"postOperationHandler")});var J,QW=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 EC={};we(EC,{chooseOperation:()=>pz,executeJob:()=>Gs,getOperationFunction:()=>Ez,operation:()=>IP,processLocalTransaction:()=>hz});async function hz(e,t){try{if(e.body.operation!=="read_log"&&(Bp.default.log_level===$f.INFO||Bp.default.log_level===$f.DEBUG||Bp.default.log_level===$f.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;En.info(c)}}catch(n){En.error(n)}let r=await fz.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return Tge[e.body.operation]&&cz.default.setSchemaDataToGlobal(n=>{n&&En.error(n)}),r}function pz(e){let t;try{t=Ez(e)}catch(s){throw En.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=eR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=eR.default.checkASTPermissions(e,i);if(a)throw En.error(`${JW.FORBIDDEN} from operation ${e.operation}`),En.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=az.default.verifyPerms(i,s);if(a)throw En.error(`${JW.FORBIDDEN} from operation ${e.operation}`),En.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 Ez(e){if(En.trace(`getOperationFunction with operation: ${e.operation}`),XW.has(e.operation))return XW.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 IP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=pz(e);return hz({body:e},n)}async function Rge(e){En.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[Qy]=!0;let a;switch(i.operation){case q.INSERT:a=await Xl.default.insert(i);break;case q.UPDATE:a=await Xl.default.update(i);break;case q.UPSERT:a=await Xl.default.upsert(i);break;case q.DELETE:a=await ff.default.deleteRecord(i);break;default:En.warn("invalid operation in catchup");break}await mz.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){En.info("Invalid operation in transaction"),En.error(a)}}async function Gs(e){(0,dz.transformReq)(e);let t,r;try{if(r=await tR.default.addJob(e),r){t=r.createdJob,En.info("addJob result",r);let n=new TP.default.RunnerMessage(t,e);return{message:await TP.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 En.error(i),(0,qs.handleHDBError)(n,i)}}function yge(){let e=new Map;return e.set(q.INSERT,new J(Xl.default.insert)),e.set(q.UPDATE,new J(Xl.default.update)),e.set(q.UPSERT,new J(Xl.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(df.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(df.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(df.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(df.default.searchByValue)),e.set(q.SEARCH,new J(gge)),e.set(q.SQL,new J(Sge)),e.set(q.CSV_DATA_LOAD,new J(Gs,vp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(Gs,vp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(Gs,vp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(Gs,vp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(Ai.default.createSchema)),e.set(q.CREATE_DATABASE,new J(Ai.default.createSchema)),e.set(q.CREATE_TABLE,new J(Ai.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(Ai.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(Ai.default.dropSchema)),e.set(q.DROP_DATABASE,new J(Ai.default.dropSchema)),e.set(q.DROP_TABLE,new J(Ai.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(Ai.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(Up.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(Up.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(Up.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(Up.default.describeAll)),e.set(q.DELETE,new J(ff.default.deleteRecord)),e.set(q.ADD_USER,new J(uf.default.addUser)),e.set(q.ALTER_USER,new J(uf.default.alterUser)),e.set(q.DROP_USER,new J(uf.default.dropUser)),e.set(q.LIST_USERS,new J(uf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(xp.default.listRoles)),e.set(q.ADD_ROLE,new J(xp.default.addRole)),e.set(q.ALTER_ROLE,new J(xp.default.alterRole)),e.set(q.DROP_ROLE,new J(xp.default.dropRole)),e.set(q.USER_INFO,new J(uf.default.userInfo)),e.set(q.READ_LOG,new J(ez.default)),e.set(q.ADD_NODE,new J(tz.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(rz.default)),e.set(q.CONFIGURE_CLUSTER,new J(nz.default)),e.set(q.PURGE_STREAM,new J(sz.default)),e.set(q.SET_CONFIGURATION,new J(RP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(iz.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(oz.default)),e.set(q.CLUSTER_SET_ROUTES,new J(XT.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(XT.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(XT.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(Gs,gP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(Jl.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(Jl.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(Jl.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(Jl.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(Jl.default.removeCertificate)),e.set(q.GET_KEY,new J(Jl.default.getKey)),e.set(q.ADD_NODE_BACK,new J(uO)),e.set(q.REMOVE_NODE_BACK,new J(dO)),e.set(q.DELETE_FILES_BEFORE,new J(Gs,ff.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(Gs,ff.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(Gs,gP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(tR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(tR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(ZT.default.getFingerprint)),e.set(q.SET_LICENSE,new J(ZT.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(ZT.default.getRegistrationInfo)),e.set(q.RESTART,new J(SP.default.restart)),e.set(q.RESTART_SERVICE,new J(Gs,SP.default.restartService)),e.set(q.CATCHUP,new J(Rge)),e.set(q.SYSTEM_INFORMATION,new J(lz.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(Gs,ff.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(ZW.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(rw)),e.set(q.REFRESH_OPERATION_TOKEN,new J(nw)),e.set(q.LOGIN,new J(cC)),e.set(q.LOGOUT,new J(lC)),e.set(q.GET_CONFIGURATION,new J(RP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(yP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(Gs,yP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(AP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(AP.default.auditModules)),e.set(q.GET_BACKUP,new J(Ai.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(Ai.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(TC)),e.set(q.LIST_METRICS,new J(RC)),e.set(q.DESCRIBE_METRIC,new J(yC)),e.set(q.GET_STATUS,new J(wC)),e.set(q.SET_STATUS,new J(OC)),e.set(q.CLEAR_STATUS,new J(NC)),e}var df,eR,vp,Ai,Up,ff,ZW,uf,xp,Mt,Bp,ez,tz,_P,rz,nz,sz,iz,oz,XT,gP,az,tR,qs,ZT,SP,bP,Xl,cz,lz,TP,RP,yP,AP,uz,dz,Jl,fz,mz,JW,En,gge,Sge,Tge,XW,_C=ce(()=>{df=w(sn()),eR=w(FT()),vp=w(cP()),Ai=w(Gh()),Up=w(xa()),ff=w(El()),ZW=w(Fw()),uf=w(rs()),xp=w(Rh()),Mt=w(pC()),Bp=w(Q()),ez=w($w()),tz=w(WS()),_P=w(EO()),rz=w(jS()),nz=w(SO()),sz=w(TO()),iz=w(AO()),oz=w(IO()),XT=w(eT()),gP=w(dP()),az=w(xT()),tR=w(hP());k();qs=w(ge()),ZT=w(FO()),SP=w(Zd()),bP=w(require("util")),Xl=w(Mn()),cz=w(ii()),lz=w(Fd()),TP=w(WW());gd();TT();RP=w(wt()),yP=w(OT()),AP=w(hp()),uz=w(Zs()),dz=w(ie());Dr();Jl=w(as());kd();bC();fz=w(JC()),mz=w(jW());bp();QW();({HTTP_STATUS_CODES:JW}=qs.hdbErrors),En=Bp.default.loggerWithTag("operation"),gge=bP.promisify(df.default.search),Sge=bP.promisify(eR.default.evaluateSQL),Tge={[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(hz,"processLocalTransaction");XW=yge();Le.operation=IP;o(pz,"chooseOperation");o(Ez,"getOperationFunction");(0,uz._assignPackageExport)("operation",IP);o(IP,"operation");o(Rge,"catchup");o(Gs,"executeJob");o(yge,"initializeOperationFunctionMap")});var sR=M((Bxe,Sz)=>{"use strict";var rR=(k(),v(W)),Age=ie(),Fp=Q(),{handleHDBError:NP,hdbErrors:nR}=ge(),{isMainThread:bge}=require("worker_threads"),{Readable:Ige}=require("stream"),_z=require("os"),Nge=require("util"),wge=iw(),Oge=Nge.promisify(wge.authorize),gz=(_C(),v(EC)),{createGzip:Cge,constants:Pge}=require("zlib"),Lge=[rR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,rR.OPERATIONS_ENUM.LOGIN,rR.OPERATIONS_ENUM.LOGOUT];function Dge(e){let t=`Found an uncaught exception with message: ${e.message}. ${_z.EOL}Stack: ${e.stack} ${_z.EOL}Terminating ${bge?"HDB":"thread"}.`;console.error(t),Fp.fatal(t),process.exit(1)}o(Dge,"handleServerUncaughtException");function Mge(e,t,r){if(Fp[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:nR.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(Mge,"serverErrorHandler");function vge(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=NP(new Error,"Invalid JSON.",nR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(Age.isEmpty(e.body.operation)){let n=NP(new Error,"Request body must include an 'operation' property.",nR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(vge,"reqBodyValidationHandler");function Uge(e,t,r){let n;!Lge.includes(e.body.operation)||e.body.operation===rR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?Oge(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{Fp.warn(i),Fp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(NP(i,a,nR.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(Uge,"authHandler");async function xge(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=gz.chooseOperation(e.body);let s=await gz.processLocalTransaction(e,n);if(s instanceof Ige&&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(Cge({level:Pge.Z_BEST_SPEED})))}return s}catch(s){throw Fp.error(s),s}}o(xge,"handlePostRequest");Sz.exports={authHandler:Uge,handlePostRequest:xge,handleServerUncaughtException:Dge,serverErrorHandler:Mge,reqBodyValidationHandler:vge}});var Az=M((Hxe,yz)=>{"use strict";var Bge=require("fastify-plugin"),{handlePostRequest:Tz,authHandler:Fge,reqBodyValidationHandler:Hge}=sR();async function kge(e){e.decorate("hdbCore",{preValidation:[Hge,Fge],request:o((t,r)=>Rz(Tz(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>Rz(Tz(t,r,!0)),"requestWithoutAuthentication")})}o(kge,"hdbCore");async function Rz(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(Rz,"convertAsyncIterators");yz.exports=Bge(kge)});var Iz=M((qxe,bz)=>{"use strict";var Gxe=require("fs"),iR=oe();iR.initSync();var{CONFIG_PARAMS:wP}=(k(),v(W)),Gge=1024*1024*1024;function qge(e){let t=iR.get(wP.HTTP_TIMEOUT),r=iR.get(wP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:Gge,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:iR.get(wP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(qge,"getServerOptions");bz.exports=qge});var Oz=M((Vxe,wz)=>{"use strict";var OP=oe();OP.initSync();var{CONFIG_PARAMS:Nz}=(k(),v(W));function $ge(){let e=OP.get(Nz.HTTP_CORSACCESSLIST),t=OP.get(Nz.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($ge,"getCORSOptions");wz.exports=$ge});var Lz=M((Yxe,Pz)=>{"use strict";var Cz=oe();Cz.initSync();var Vge=(k(),v(W));function Kge(){return Cz.get(Vge.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(Kge,"getHeaderTimeoutConfig");Pz.exports=Kge});var PP={};we(PP,{customFunctionsServer:()=>zge,ready:()=>Kz,start:()=>Wge});function Wge(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){Zo||(Zo=Vz(t),Le.http((await Zo).server));let a=await Zo,c=(0,CP.dirname)(s),l=(0,CP.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!Dz.has(c)){Dz.add(c);try{a.register(Qge(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:Kz}}async function zge(){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 jge();let e=Fz.get(U.HTTP_SECUREPORT)>0,t;try{t=Zo=await Vz(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 jge(){try{yt.info("Custom Functions starting configuration."),await Hz.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function Qge(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,Mz.existsSync)(e)&&r.register(Bz.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 Vz(e){yt.info("Custom Functions starting buildServer.");let t=(0,kz.default)(e),r=(0,vz.default)(t);r.server.headersTimeout=(0,qz.default)(),r.setErrorHandler($z.serverErrorHandler);let n=(0,Gz.default)();return n&&r.register(Uz.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(xz.default),await r.register(Yge),await r.after(),am(r),yt.info("Custom Functions completed buildServer."),r}function Kz(){if(Zo)return Zo.then?Zo.then(e=>e.ready()):Zo.ready()}var CP,Mz,vz,Uz,xz,Bz,Fz,yt,Yge,Hz,kz,Gz,qz,$z,Zo,Dz,Yz=ce(()=>{CP=require("path"),Mz=require("fs"),vz=w(require("fastify")),Uz=w(require("@fastify/cors")),xz=w(XN()),Bz=w(require("@fastify/autoload")),Fz=w(oe());k();yt=w(Q()),Yge=w(Az()),Hz=w(rs()),kz=w(Iz()),Gz=w(Oz()),qz=w(Lz()),$z=w(sR());Ro();Dr();Dz=new Set;o(Wge,"start");o(zge,"customFunctionsServer");o(jge,"setUp");o(Qge,"buildRouteFolder");o(Vz,"buildServer");o(Kz,"ready")});var LP={};we(LP,{start:()=>Jge});function Jge(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Jz.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){zz||(zz=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Wz.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,jz.default)(s,(0,Qz.realpathSync)(a))}}return i(s)},{runFirst:!0})),Wz.set(r,n)}}}var jz,Qz,Jz,Wz,zz,Xz=ce(()=>{jz=w(require("send")),Qz=require("fs"),Jz=w(require("serve-static")),Wz=new Map;o(Jge,"start")});var DP={};we(DP,{start:()=>Xge});function Xge({override:e}){return{handleFile:o((t,r,n)=>{oR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,Zz.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 Zz,oR,ej=ce(()=>{Zz=require("dotenv"),oR=w(Q());o(Xge,"start")});var UP={};we(UP,{DataLoaderError:()=>ms,DataLoaderResult:()=>mf,EmptyFileError:()=>uR,FileParseError:()=>lR,InvalidPropertyTypeError:()=>dR,MissingRequiredPropertyError:()=>Hp,RecordProcessingError:()=>kp,SystemDatabaseError:()=>fR,UnsupportedFileExtensionError:()=>cR,computeRecordHash:()=>vP,handleApplication:()=>tSe,loadDataFile:()=>cj,suppressHandleApplicationWarning:()=>eSe});function vP(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,rj.createHash)("sha256").update(n).digest("hex")}function aj(e){return e.system&&e.system[MP]?e.system[MP]:aR||(aR=ze({database:"system",table:MP,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),aR)}async function Zge(e,t,r,n){try{let s=aj(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 tj(e,t,r,n,s){try{let i=aj(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 tSe(e){if((0,sj.getWorkerIndex)()!==0){$s.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||cj(t,ln,He).then(r=>{$s.debug?.("Data loader processed file: %s: %s",(0,ea.basename)(t.absolutePath),r.message)})})}async function cj({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ea.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,nj.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new cR(t,i)}catch(f){throw f instanceof ms?f:new lR(t,f)}if(!a)throw new uR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Hp(t,"table");if(!u)throw new Hp(t,"records");if(!Array.isArray(u))throw new dR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new fR(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=vP(N);if(!O){h++;let $=await f.put(N);return await tj(c,l,F,Z,s),$}let G=await Zge(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 vP(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await tj(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 kp(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 mf(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 mf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return $s.info?.(R),new mf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new kp(d,f)}}var ea,rj,nj,sj,ta,ij,oj,$s,MP,aR,eSe,ms,cR,lR,uR,Hp,dR,fR,kp,mf,lj=ce(()=>{ea=require("node:path"),rj=require("node:crypto"),nj=require("yaml");Me();sj=w(nt()),ta=w(tn()),ij=w(ge()),oj=w(Q()),$s=oj.default.forComponent("dataLoader"),MP="hdb_dataloader_hash";o(vP,"computeRecordHash");o(aj,"getHashTrackingTable");o(Zge,"getStoredHash");o(tj,"storeHash");eSe=!0;o(tSe,"handleApplication");o(cj,"loadDataFile");ms=class extends ij.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=ta.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},cR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ea.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,ta.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,ea.basename)(t)}: ${r.message}`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},uR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ea.basename)(t)} is empty or invalid`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Hp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ea.basename)(t)} is missing required "${r}" property`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},dR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ea.basename)(t)} has invalid "${r}" property, expected ${n}`,ta.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},fR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,ta.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},kp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,ta.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},mf=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 BP=M((sBe,uj)=>{"use strict";var Gp=oe();Gp.initSync();var hf=require("fs-extra"),xP=require("path"),pf=(k(),v(W)),rSe=require("crypto"),nSe=require("uuid").v4;uj.exports=sSe;function sSe(){if(Gp.getHdbBasePath()!==void 0){let e=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=xP.join(Gp.getHdbBasePath(),pf.LICENSE_KEY_DIR_NAME,pf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{hf.accessSync(r),hf.accessSync(e),hf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=nSe(),i=rSe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});hf.writeFileSync(r,s),hf.writeFileSync(e,i.privateKey),hf.writeFileSync(t,i.publicKey)}else throw n}}}o(sSe,"checkJWTTokenExist")});var fj=M((oBe,dj)=>{"use strict";var FP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};dj.exports={HdbInfoInsertObject:FP}});var pj=M((cBe,hj)=>{"use strict";var mj=(k(),v(W)),HP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[mj.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[mj.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};hj.exports={UpgradeObject:HP}});var mR=M((uBe,_j)=>{"use strict";var Vs=require("prompt"),Ef=require("chalk"),Ej=Q(),bi=require("os"),kP=xc(),GP=["yes","y"];async function iSe(e){let t=`${bi.EOL}`+Ef.bold.green("Your current HarperDB version requires that we complete an update process.")+`${bi.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${bi.EOL}${bi.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${bi.EOL}`;Vs.override=kP(["CONFIRM_UPGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_UPGRADE:{description:Ef.magenta(`${bi.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 Ej.error("There was an error when prompting user about an upgrade."),Ej.error(s),!1}return GP.includes(n.CONFIRM_UPGRADE)}o(iSe,"forceUpdatePrompt");async function oSe(e){let t=`${bi.EOL}`+Ef.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.${bi.EOL}`);Vs.override=kP(["CONFIRM_DOWNGRADE"]),Vs.start(),Vs.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:Ef.magenta(`${bi.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 GP.includes(n.CONFIRM_DOWNGRADE)}o(oSe,"forceDowngradePrompt");async function aSe(){let e=`${bi.EOL}`+Ef.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=kP(["GENERATE_CERTS"]),Vs.start(),Vs.message=e;let t={properties:{GENERATE_CERTS:{description:Ef.magenta(`${bi.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 GP.includes(r.GENERATE_CERTS)}o(aSe,"upgradeCertsPrompt");_j.exports={forceUpdatePrompt:iSe,forceDowngradePrompt:oSe,upgradeCertsPrompt:aSe}});var $P=M((fBe,gj)=>{"use strict";var qP=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};gj.exports=qP});var Tj=M((gBe,Sj)=>{"use strict";var cSe=ie(),lSe=wt(),hBe=Q(),pBe=require("path"),EBe=require("fs"),_Be=(k(),v(W));Sj.exports={getOldPropsValue:uSe};function uSe(e,t,r=!1){let n=t.getRaw(e);return cSe.isNotEmptyAndHasValue(n)?n:r?lSe.getDefaultConfig(e):""}o(uSe,"getOldPropsValue")});var bj=M((TBe,Aj)=>{"use strict";var pc=require("path"),Ec=require("fs-extra"),dSe=require("properties-reader"),fSe=$P(),Sr=Q(),{getOldPropsValue:At}=Tj(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:Zl}=(k(),v(W)),eu=wt(),hR=oe(),Rj=ie(),so=(k(),v(W)),VP=new fSe("3.1.0"),yj=[];function mSe(){let e=dSe(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.
32
32
 
33
33
  ;The directory selected during install where the database files reside.
34
34
  ${ye.HDB_ROOT_KEY} = ${At(ye.HDB_ROOT_KEY,e)}
@@ -117,11 +117,11 @@ Reindexing upgrade started for transaction logs`),ra.notify("Reindexing upgrade
117
117
  `;let l=[],u=uL.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}
118
118
  `);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)}
119
119
  `:n+=`${r(h+": ")}${m}
120
- `;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(xRe,"startupLog");function BRe(e){try{return Number.parseInt(ca.readFileSync(e,"utf8"),10)}catch{return null}}o(BRe,"readPidFile");function FRe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(FRe,"isProcessRunning")});var O2={};we(O2,{SERVERS:()=>Sf,portServer:()=>fL,setPortServerMap:()=>wR});function wR(e,t){let r=fL.get(e)??[];fL.set(e,[...r,t])}var Sf,fL,mL=ce(()=>{Sf={},fL=new Map;o(wR,"setPortServerMap")});var MR={};we(MR,{deliverSocket:()=>G2,getHttpOptions:()=>qRe,getRequestId:()=>K2,handleApplication:()=>GRe,httpServer:()=>RL,logRequest:()=>eE,proxyRequest:()=>$Re,registerServer:()=>SL,suppressHandleApplicationWarning:()=>kRe});function GRe(e){tE=e.options.getAll(),e.options.on("change",t=>{tE=e.options.getAll()})}function qRe(){return tE}function G2(e,t,r){let n=e?.read?e:new M2.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=Sf[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=Sf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(da.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function $Re(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=C2.get(s),r){case"connection":i=G2(void 0,t),C2.set(s,i),i.write=(c,l,u)=>(CR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(CR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),CR.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 SL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=Sf[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",D2),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else Sf[t]=e;e.on("unhandled",D2)}function TL(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,v2.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function RL(e,t){let r=[];for(let{port:n,secure:s}of TL(t))r.push(q2(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?_L[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,SL(e,n,!1)),PR[n]=LR(_L,n);return r}function q2(e,t,r,n){if(wR(e,{protocol_name:t?"HTTPS":"HTTP",name:vR()}),!OR[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,U2.getTicketKeys)(),SNICallback:(0,x2.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,B2.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ka(g,R);r&&(O.isOperationsServer=!0),tE.logging?.id&&(O.requestId=y=K2());let F=await PR[e](O);if(!F){if(O._nodeResponse.statusCode){eE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=$2(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,OR[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),eE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=EL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=EL.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(HRe(O)),eE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?da.default.warn(O):da.default.info(O):da.default.error(O)}o(N,"onError")},"requestHandler"),p=Pg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=OR[e]=(t?f?F2.createSecureServer:H2.createServer:DR.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),SL(_,e)}return OR[e]}function LR(e,t){let r=$2;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 $2(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Os}}function VRe(e,t){RL(e,{requestOnly:!0,...t})}function V2(e,t){for(let{port:r}of TL(t))P2[t?.runFirst?"unshift":"push"]({listener:e,port:r}),gL[r]=LR(P2,r)}function KRe(e,t){let r=[];for(let{port:n,secure:s}of TL(t)){wR(n,{protocol_name:s?"WSS":"WS",name:vR()});let i=q2(n,s,t?.isOperationsServer,t?.mtls);Xp[n]||(Xp[n]=new k2.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),Xp[n].on("connection",(a,c)=>{try{let l=new Ka(c);l.isWebSocket=!0;let u=PR[n](l);da.default.debug("Received WS connection, calling listeners",hL),L2[n](a,l,u)}catch(l){da.default.warn("Error in handling WS connection",l)}}),V2((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):Xp[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),Xp[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{gL[n]&&gL[n](a,c,l)})),r.push(i),hL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),L2[n]=LR(hL,n),PR[n]=LR(_L,n)}return r}function D2(e,t){t.writeHead(404),t.end(`Not found
121
- `),eE(e,404,0,e.requestId)}function eE(e,t,r,n){let s=tE.logging;if(s){pL||(pL=da.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";pL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+YRe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function YRe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function K2(){return Zp||(Zp=new BigInt64Array([1n]),Zp=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",Zp.buffer))),Number(Atomics.add(Zp,0,1n))}var M2,da,CR,Cr,v2,U2,x2,B2,F2,H2,DR,EL,k2,HRe,Xp,OR,PR,_L,tE,kRe,C2,P2,gL,hL,L2,pL,Zp,yL=ce(()=>{M2=require("node:net"),da=w(Q()),CR=require("node:worker_threads"),Cr=w(oe());k();v2=w(wt()),U2=w(nt()),x2=w(as()),B2=w(Yd()),F2=require("node:http2"),H2=require("node:https"),DR=require("node:http");Ah();uh();Yn();zi();EL=require("node:stream");Dr();mL();nf();SN();k2=require("ws"),{errorToString:HRe}=da.default;Le.http=RL;Le.request=VRe;Le.ws=KRe;Le.upgrade=V2;Xp={},OR={},PR={},_L=[],tE={},kRe=!0;o(GRe,"handleApplication");o(qRe,"getHttpOptions");o(G2,"deliverSocket");C2=new Map;o($Re,"proxyRequest");o(SL,"registerServer");o(TL,"getPorts");o(RL,"httpServer");o(q2,"getHTTPServer");o(LR,"makeCallbackChain");o($2,"unhandled");o(VRe,"onRequest");Object.defineProperty(DR.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){}});P2=[],gL={};o(V2,"onUpgrade");hL=[],L2={};o(KRe,"onWebSocket");o(D2,"defaultNotFound");o(eE,"logRequest");o(YRe,"headersToString");o(K2,"getRequestId")});var bL=M(nE=>{"use strict";eA();var{isMainThread:AL,parentPort:Y2,threadId:UR,workerData:WRe}=require("node:worker_threads"),{createServer:zRe}=require("node:net"),{unlinkSync:j2,existsSync:jRe}=require("fs"),Q2;nE.whenComponentsLoaded=new Promise(e=>{Q2=e});var Ni=Q(),Ws=oe(),gs=(k(),v(W)),{server:QRe}=(Dr(),v(Yf)),{createServer:JRe}=require("node:tls"),{restartNumber:XRe,getWorkerIndex:Tf}=nt(),{createReuseportFd:rE}=(Ah(),v(AG)),{createTLSSelector:ZRe}=as(),{resolvePath:eye}=wt(),{startupLog:tye}=N2(),{SERVERS:Rf,setPortServerMap:W2,portServer:rye}=(mL(),v(O2)),z2=(yL(),v(MR)),nye=Zs(),J2=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG),sye=Ws.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);QRe.socket=iye;if(J2){let e;if(AL)e=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){Ni.info("Could not close debugger",t)}});else{let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Tf()>=0&&(e=t+Tf())}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){Ni.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&AL)try{require("inspector").open(9229)}catch(e){XRe<=1&&Ni.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"&&Ni.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:iFe,CONFIG_PARAMS:oFe}=gs;Ws.initSync();nE.globals=nye;nE.listenOnPorts=Z2;nE.startServers=X2;function X2(){let e=Ws.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=xR().loadRootComponents(!0).then(()=>{Y2?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)z2.deliverSocket(i,s,a);else if(n.requestId)z2.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){Ni.trace("received shutdown request",UR);for(let c in Rf){let l=Rf[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?Ni.info(`Closing ${_.length} idle connections`):p&&Ni.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
120
+ `;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(xRe,"startupLog");function BRe(e){try{return Number.parseInt(ca.readFileSync(e,"utf8"),10)}catch{return null}}o(BRe,"readPidFile");function FRe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(FRe,"isProcessRunning")});var O2={};we(O2,{SERVERS:()=>Sf,portServer:()=>fL,setPortServerMap:()=>wR});function wR(e,t){let r=fL.get(e)??[];fL.set(e,[...r,t])}var Sf,fL,mL=ce(()=>{Sf={},fL=new Map;o(wR,"setPortServerMap")});var MR={};we(MR,{deliverSocket:()=>G2,getHttpOptions:()=>qRe,getRequestId:()=>K2,handleApplication:()=>GRe,httpServer:()=>RL,logRequest:()=>eE,proxyRequest:()=>$Re,registerServer:()=>SL,suppressHandleApplicationWarning:()=>kRe});function GRe(e){tE=e.options.getAll(),e.options.on("change",t=>{tE=e.options.getAll()})}function qRe(){return tE}function G2(e,t,r){let n=e?.read?e:new M2.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=Sf[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=Sf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(da.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function $Re(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=C2.get(s),r){case"connection":i=G2(void 0,t),C2.set(s,i),i.write=(c,l,u)=>(CR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(CR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),CR.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 SL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=Sf[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",D2),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else Sf[t]=e;e.on("unhandled",D2)}function TL(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,v2.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function RL(e,t){let r=[];for(let{port:n,secure:s}of TL(t))r.push(q2(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?_L[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,SL(e,n,!1)),PR[n]=LR(_L,n);return r}function q2(e,t,r,n){if(wR(e,{protocol_name:t?"HTTPS":"HTTP",name:vR()}),!OR[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,U2.getTicketKeys)(),SNICallback:(0,x2.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,B2.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ka(g,R);r&&(O.isOperationsServer=!0),tE.logging?.id&&(O.requestId=y=K2());let F=await PR[e](O);if(!F){if(O._nodeResponse.statusCode){eE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=$2(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,OR[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),eE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=EL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=EL.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(HRe(O)),eE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?da.default.warn(O):da.default.info(O):da.default.error(O)}o(N,"onError")},"requestHandler"),p=Pg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=OR[e]=(t?f?F2.createSecureServer:H2.createServer:DR.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),SL(_,e)}return OR[e]}function LR(e,t){let r=$2;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 $2(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Os}}function VRe(e,t){RL(e,{requestOnly:!0,...t})}function V2(e,t){for(let{port:r}of TL(t))P2[t?.runFirst?"unshift":"push"]({listener:e,port:r}),gL[r]=LR(P2,r)}function KRe(e,t){let r=[];for(let{port:n,secure:s}of TL(t)){wR(n,{protocol_name:s?"WSS":"WS",name:vR()});let i=q2(n,s,t?.isOperationsServer,t?.mtls);Xp[n]||(Xp[n]=new k2.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),Xp[n].on("connection",(a,c)=>{try{let l=new Ka(c);l.isWebSocket=!0;let u=PR[n](l);da.default.debug("Received WS connection, calling listeners",hL),L2[n](a,l,u)}catch(l){da.default.warn("Error in handling WS connection",l)}}),V2((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):Xp[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),Xp[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{gL[n]&&gL[n](a,c,l)})),r.push(i),hL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),L2[n]=LR(hL,n),PR[n]=LR(_L,n)}return r}function D2(e,t){t.headersSent||t.writableEnded||(t.writeHead(404),t.end(`Not found
121
+ `),eE(e,404,0,e.requestId))}function eE(e,t,r,n){let s=tE.logging;if(s){pL||(pL=da.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";pL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+YRe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function YRe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function K2(){return Zp||(Zp=new BigInt64Array([1n]),Zp=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",Zp.buffer))),Number(Atomics.add(Zp,0,1n))}var M2,da,CR,Cr,v2,U2,x2,B2,F2,H2,DR,EL,k2,HRe,Xp,OR,PR,_L,tE,kRe,C2,P2,gL,hL,L2,pL,Zp,yL=ce(()=>{M2=require("node:net"),da=w(Q()),CR=require("node:worker_threads"),Cr=w(oe());k();v2=w(wt()),U2=w(nt()),x2=w(as()),B2=w(Yd()),F2=require("node:http2"),H2=require("node:https"),DR=require("node:http");Ah();uh();Yn();zi();EL=require("node:stream");Dr();mL();nf();SN();k2=require("ws"),{errorToString:HRe}=da.default;Le.http=RL;Le.request=VRe;Le.ws=KRe;Le.upgrade=V2;Xp={},OR={},PR={},_L=[],tE={},kRe=!0;o(GRe,"handleApplication");o(qRe,"getHttpOptions");o(G2,"deliverSocket");C2=new Map;o($Re,"proxyRequest");o(SL,"registerServer");o(TL,"getPorts");o(RL,"httpServer");o(q2,"getHTTPServer");o(LR,"makeCallbackChain");o($2,"unhandled");o(VRe,"onRequest");Object.defineProperty(DR.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){}});P2=[],gL={};o(V2,"onUpgrade");hL=[],L2={};o(KRe,"onWebSocket");o(D2,"defaultNotFound");o(eE,"logRequest");o(YRe,"headersToString");o(K2,"getRequestId")});var bL=M(nE=>{"use strict";eA();var{isMainThread:AL,parentPort:Y2,threadId:UR,workerData:WRe}=require("node:worker_threads"),{createServer:zRe}=require("node:net"),{unlinkSync:j2,existsSync:jRe}=require("fs"),Q2;nE.whenComponentsLoaded=new Promise(e=>{Q2=e});var Ni=Q(),Ws=oe(),gs=(k(),v(W)),{server:QRe}=(Dr(),v(Yf)),{createServer:JRe}=require("node:tls"),{restartNumber:XRe,getWorkerIndex:Tf}=nt(),{createReuseportFd:rE}=(Ah(),v(AG)),{createTLSSelector:ZRe}=as(),{resolvePath:eye}=wt(),{startupLog:tye}=N2(),{SERVERS:Rf,setPortServerMap:W2,portServer:rye}=(mL(),v(O2)),z2=(yL(),v(MR)),nye=Zs(),J2=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG),sye=Ws.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);QRe.socket=iye;if(J2){let e;if(AL)e=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){Ni.info("Could not close debugger",t)}});else{let t=Ws.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Tf()>=0&&(e=t+Tf())}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){Ni.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&AL)try{require("inspector").open(9229)}catch(e){XRe<=1&&Ni.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"&&Ni.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:iFe,CONFIG_PARAMS:oFe}=gs;Ws.initSync();nE.globals=nye;nE.listenOnPorts=Z2;nE.startServers=X2;function X2(){let e=Ws.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=xR().loadRootComponents(!0).then(()=>{Y2?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)z2.deliverSocket(i,s,a);else if(n.requestId)z2.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){Ni.trace("received shutdown request",UR);for(let c in Rf){let l=Rf[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?Ni.info(`Closing ${_.length} idle connections`):p&&Ni.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
122
122
  Connection: close\r
123
123
  \r
124
- `))}},25).unref()}l.close?.(()=>{if(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&Tf()==0)try{j2(eye(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,UR),l.cantCleanupProperly||Ni.warn("Had to forcefully exit the thread",UR),process.exit(0)},5e3).unref()})}if(J2||process.env.DEV_MODE)try{require("inspector").close()}catch(c){Ni.info("Could not close debugger",c)}}}).ref();let r;rE&&!sye&&(r=Z2()),Promise.resolve(r).then(()=>{if(Tf()===0)try{tye(rye)}catch(n){console.error("Error displaying start-up log",n)}Y2?.postMessage({type:gs.ITC_EVENT_TYPES.CHILD_STARTED})})});return Q2(t),t}o(X2,"startServers");function Z2(){let e=[];for(let t in Rf){let r=Rf[t];if(t.includes?.("/")&&Tf()==0){jRe(t)&&j2(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),Ni.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=Tf();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?rE?n={fd:rE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:rE?n={fd:rE(+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}),Ni.trace("Listening on port "+t,UR)}).on("error",c)}))}return Promise.all(e)}o(Z2,"listenOnPorts");!AL&&!WRe?.noServerStart&&X2();function iye(e,t){let r=(nf(),v(_p)).getComponentName,n;if(t.securePort){W2(t.securePort,{protocol_name:"TLS",name:r()});let s=ZRe("server",t.mtls),i=Ws.get("tls");n=JRe({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),Rf[t.securePort]=n}return t.port&&(W2(t.port,{protocol_name:"TCP",name:r()}),n=zRe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Rf[t.port]=n),n}o(iye,"onSocket")});var w2={};we(w2,{startHTTPThreads:()=>aye,startSocketServer:()=>CL,updateWorkerIdleness:()=>cQ});async function aye(e=2,t){pN().catch(r=>Nf.error?.("Error recording hostname for analytics:",r));try{if(t)wL(0,1,!0);else{let{loadRootComponents:r}=xR();if(e===0)return(0,zs.setMainIsWorker)(!0),await bL().startServers(),Promise.resolve([]);await r()}aQ();for(let r=0;r<e;r++)wL(r,e);return Promise.all(oQ)}finally{(0,zs.threadsHaveStarted)()}}function aQ(){let e=(0,nQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),NL=setInterval(()=>{Nf.notify(e)},oye).unref())}function wL(e,t=1,r){if(IL++,(0,zs.startWorker)("server/threads/threadServer.js",{name:Zy.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===jy.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});oQ.push(s),await s,yf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=FR.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=yf.indexOf(n);a>-1&&yf.splice(a,1)}if(o(i,"removeWorker"),Af){let a=Af;Af=[];for(let c of a)iQ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{OL?OL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,zs.shutdownWorkers)(),IL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function CL(e=0,t){if(typeof e=="string")try{(0,HR.existsSync)(e)&&(0,HR.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=cye:r=lye(t):r=PL;let n=(0,bf.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=iQ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),OL=!0,r(i,(a,c)=>{if(!a){if(eQ){let u=i._socket||new bf.Socket({handle:i,writable:!0,readable:!0});eQ.deliverSocket(u,e,c),u.resume()}else IL>0?(Af.length===0&&setTimeout(()=>{Af.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,Af.push(i)):(console.log("start up a dynamic thread to handle request"),wL(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 bf.Socket({handle:i,writable:!0,readable:!0});fye(u,a,e)}it(!0,"socket-routed")})},Nf.info(`HarperDB ${sQ.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 PL(e,t){let r,n=0;for(let s of yf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=BR)return BR=i,t(r);n=i}BR=0,t(r)}function cye(e,t){let r={};e.getpeername(r);let n=r.address,s=If.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);PL(e,a=>{If.set(n,{worker:a,lastUsed:i}),t(a)})}function lye(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new bf.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=If.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);PL(n,f=>{If.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function cQ(){BR=0;for(let e of yf)e.expectedIdle=e.recentELU.idle+uye,e.requests=1;yf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function fye(e,t,r){let n=dye++;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(),FR.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")),FR.delete(n)),s.event=="destroy"&&(e.destroy(),FR.delete(n))})}var zs,bf,Nf,HR,rQ,nQ,sQ,yf,Af,iQ,eQ,IL,oQ,NL,oye,OL,BR,tQ,If,uye,FR,dye,dL=ce(()=>{zs=w(nt()),bf=require("net");k();Nf=w(Q()),HR=require("fs");zi();rQ=require("worker_threads"),nQ=w(Yd()),sQ=w(bt()),yf=[],Af=[],iQ=[],IL=0,oQ=[];rQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,zs.onMessageFromWorkers)(e=>{e.type===Xy.RESTART&&NL&&(clearInterval(NL),aQ())}));oye=6e5;o(aye,"startHTTPThreads");o(aQ,"licenseWarning");o(wL,"startHTTPWorker");o(CL,"startSocketServer");BR=0;o(PL,"findMostIdleWorker");tQ=36e5,If=new Map;o(cye,"findByRemoteAddressAffinity");o(lye,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of If)r.lastUsed+tQ<e&&If.delete(t)},tQ).unref();uye=1e3;o(cQ,"updateWorkerIdleness");(0,zs.setMonitorListener)(cQ);FR=new Map,dye=1;o(fye,"proxySocket")});var LL={};we(LL,{hdbServer:()=>Eye,start:()=>Eye});async function Eye(e){try{lo.default.debug("In Fastify server"+process.cwd()),lo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),lo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=lQ.default.isMaster,await _ye();let t=e.securePort>0;wf=gye(t),await wf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(wf.server,e),wf.server.closeIdleConnections||await wf.listen({port:0,host:"::"})}catch(r){throw wf.close(),lo.default.error(r),lo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),lo.default.fatal(t),process.exit(1)}}async function _ye(){lo.default.trace("Configuring HarperDB process."),_Q.default.setSchemaDataToGlobal(),await SQ.default.setUsersWithRolesCache(),await TQ.default.getLicense()}function gye(e){lo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Sye(e),r=(0,uQ.default)(t);r.server.headersTimeout=Rye(),r.setErrorHandler(bc.serverErrorHandler);let n=Tye();n&&r.register(dQ.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(hQ.default),r.register(fQ.default),r.register(mQ.default,{root:pQ.default.join(EQ.PACKAGE_ROOT,"studio/build-local")}),am(r);let s=Ac.default.get(zy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!gQ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[bc.reqBodyValidationHandler,bc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,bc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),lo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function Sye(e){let t=Ac.default.get(sE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ac.default.get(sE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:hye,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function Tye(){let e=Ac.default.get(sE.OPERATIONSAPI_NETWORK_CORS),t=Ac.default.get(sE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===pye)&&(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 Rye(){return Ac.default.get(sE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??mye}var lQ,Ac,lo,uQ,dQ,fQ,mQ,hQ,pQ,EQ,_Q,gQ,SQ,TQ,bc,mye,hye,pye,sE,wf,RQ=ce(()=>{lQ=w(require("cluster")),Ac=w(oe());k();lo=w(Q()),uQ=w(require("fastify")),dQ=w(require("@fastify/cors")),fQ=w(require("@fastify/compress")),mQ=w(require("@fastify/static")),hQ=w(XN()),pQ=w(require("path")),EQ=w(bt()),_Q=w(ii()),gQ=w(ie()),SQ=w(rs()),TQ=w(Yd());Dr();bc=w(sR());Ro();Ac.default.initSync();mye=6e4,hye=1024*1024*1024,pye="TRUE",{CONFIG_PARAMS:sE}=W;o(Eye,"operationsServer");o(_ye,"setUp");o(gye,"buildServer");o(Sye,"getServerOptions");o(Tye,"getCORSOpts");o(Rye,"getHeaderTimeoutConfig")});var BL={};we(BL,{disableNATS:()=>Aye,publishToStream:()=>qR,setNATSReplicator:()=>DL,setPublishToStream:()=>bye,setSubscription:()=>xL,start:()=>yye});function yye(){iE.default.get(U.CLUSTERING_ENABLED)&&Nye()}function Aye(e=!0){NQ=e}function bye(e,t){qR=e,xL=t}function Nye(){if(NQ||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];DL(s,r,i)}}Il((r,n)=>{DL(r.tableName,r.databaseName,r),n&&OQ(r)}),!yQ&&(yQ=!0)}function DL(e,t,r){if(t==="system"&&wye.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){OQ(i)}static subscribe(){let i=new Kn;return xL(t,e,i),i}static subscribeOnThisThread(i){return i<(iE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Iye)}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 kR(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=wQ;return i}o(n,"getNATSTransaction")}function OQ(e){let t=iE.default.get(U.CLUSTERING_NODENAME);qR(`${vL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,UL.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 AQ,vL,UL,bQ,IQ,iE,GR,NQ,qR,xL,Iye,wQ,yQ,wye,kR,ML,CQ=ce(()=>{Me();La();AQ=w(pr()),vL=w(Ot()),UL=w(Vi());Ru();bQ=w($R()),IQ=w(An()),iE=w(oe());k();GR=w(Q());o(yye,"start");o(Aye,"disableNATS");qR=AQ.publishToStream,xL=bQ.setSubscription;o(bye,"setPublishToStream");Iye=2;o(Nye,"assignReplicationSource");wye=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(DL,"setNATSReplicator");o(OQ,"publishSchema");kR=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=iE.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||(GR.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(qR(`${vL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,UL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw GR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},ML=class extends kR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,IQ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};wQ=new ML});async function vQ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await FL.get(e,{returnNonexistent:!0});i=new GL(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await FL.get(e);a&&a.delete()}i=new KR(e,t)}return n&&(n.id=e,n.user={username:t?.username},oE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function HL(){return VR++,VR>65500&&(VR=1),VR}function kL(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 LQ,Ic,DQ,MQ,PQ,FL,oE,VR,KR,GL,UQ=ce(()=>{Me();Fu();LQ=w(An()),Ic=w(Q());Bc();DQ=w(nt()),MQ=w(bL());Dr();P_();PQ=100,FL=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"}]}}]}),oE=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,DQ.getWorkerIndex)()===0&&(async()=>{await MQ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of oE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await kL(r,t,r)}catch{(0,Ic.warn)("Failed to publish will",t)}oE.delete(e.id)}})();o(vQ,"getSession");VR=1;o(HL,"getNextMessageId");KR=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,Ic.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=HL());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>PQ?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-PQ)):await new Promise(setImmediate)}catch(F){(0,Ic.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=HL();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 kL(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 oE.get(this.sessionId);n?.doesExist()&&await kL(n,n.data,r)}}finally{await oE.delete(this.sessionId)}}).catch(n=>{(0,Ic.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(kL,"publish");GL=class extends KR{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=HL(),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,Ic.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,LQ.getNextMonotonicTime)()),(0,Ic.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),FL.put(this.sessionRecord)}}});var qL={};we(qL,{bypassAuth:()=>Oye,start:()=>Pye});function Oye(){qQ=!0}function Pye({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new GQ.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),or.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=BQ(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{or.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),or.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)&&WR.notify?.({username:d?.username,status:Xs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&WR.error?.({username:h,status:Xs.FAILURE,type:ya.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else or.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),or.error?.(h)}else if(l.required)return or.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Cye(u.remoteAddress)&&(d=await(0,FQ.getSuperUser)(),or.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=BQ(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{or.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function BQ(e,t,r,n,s){xQ||(xQ=!0,ch(f=>{YR>0&&f.push({metric:"mqtt-connections",connections:YR,byThread:!0})}));let i;YR++;let a,c={protocolVersion:4},l=(0,zR.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){YR--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),or.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"),or.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){or.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)&&WR.notify?.({username:n?.username,status:Xs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&WR.error?.({username:f.username,status:Xs.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=vQ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return or.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 or.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?or.warn?.(le):or.info?.(le):or.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),or.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"),or.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),or.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,zR.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 Ia(y,r)}o(T,"serialize")}),l.on("error",f=>{or.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var zR,FQ,Of,HQ,kQ,GQ,WR,or,qQ,Cye,xQ,YR,$Q=ce(()=>{zR=require("mqtt-packet");UQ();FQ=w(rs());Ro();zi();Dr();Of=w(oe());k();HQ=w(ei()),kQ=w(Q()),GQ=require("events"),WR=(0,HQ.loggerWithTag)("auth-event"),or=(0,kQ.forComponent)("mqtt"),qQ=(0,Of.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Oye,"bypassAuth");Cye=o(e=>qQ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Pye,"start");YR=0;o(BQ,"onSocket")});function jR(e,t){if(t?.includes(".."))throw new $L(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var $L,VL=ce(()=>{$L=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(jR,"resolveBaseURLPath")});function VQ(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 KQ=ce(()=>{o(VQ,"deriveCommonPatternBase")});function QR(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 KL=ce(()=>{o(QR,"deriveGlobOptions")});var YQ,YL,aE,WQ=ce(()=>{VL();KQ();KL();YQ=require("micromatch"),YL=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"}},aE=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=jR(this.name,this.config.urlPath),this.globOptions=QR(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new YL(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,YQ.scan)(s).base),this.commonPatternBase=VQ(this.patternBases)}}});function zQ(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function au(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(zQ(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(zQ(n,t)){t=t.slice(n.length+1);break}}}return(0,jQ.join)(e.baseURLPath,t)}var jQ,WL=ce(()=>{jQ=require("node:path");o(zQ,"pathStartsWithBase");o(au,"deriveURLPath")});function QQ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var XR,JQ,XQ,zL,ZQ,eJ,JR,tJ=ce(()=>{XR=require("node:events");WQ();JQ=w(Q()),XQ=w(require("chokidar")),zL=require("node:path"),ZQ=require("node:fs/promises");WL();eJ=require("micromatch"),JR=class extends XR.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new aE(t,r,QQ(n)),this.#r=s||JQ.default.loggerWithTag(t),this.ready=(0,XR.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,eJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,zL.join)(this.directory,r);switch(t){case"add":case"change":{let i=au(this.#e,r,"file");(0,ZQ.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=au(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=au(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,zL.join)(this.#e.directory,r));return this.#t=XQ.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 aE(this.name,this.directory,QQ(t)),this.#a()}};o(QQ,"castConfig")});var ZR,jL=ce(()=>{ZR={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var ty,rJ,nJ,sJ,iJ,oJ,QL,JL,XL,ZL,eD,ey,aJ=ce(()=>{ty=require("events"),rJ=w(require("yaml")),nJ=w(require("chokidar")),sJ=require("node:fs/promises"),iJ=require("util"),oJ=w(Q());jL();QL=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"}},JL=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},XL=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"}},ZL=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},eD=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},ey=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||oJ.default.loggerWithTag(t),this.ready=(0,ty.once)(this,"ready"),this.#t=nJ.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,sJ.readFile)(this.#e,"utf-8").then(t=>{this.#n=rJ.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 QL(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=ZR,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,iJ.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 JL;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new XL(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 ZL(t,s);n=n[s]}if(n==null||typeof n!="object")throw new eD(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 cJ(){Dye[0]=1}var Lye,Dye,lJ=ce(()=>{bp();Lye=Jo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),Dye=new Uint8Array(Lye);o(cJ,"requestRestart")});var sy,uJ,ry,ny,dJ=ce(()=>{sy=require("node:events");tJ();aJ();uJ=w(Q());lJ();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"}},ny=class extends sy.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=uJ.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,sy.once)(this,"ready"),this.options=new ey(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 JR(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}`),cJ()}}});function cu(e){return typeof e=="string"&&e.trim()!==""}function tD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>cu(t))}function pJ(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Mye(e){e.config.root&&cE.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 cD(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(pJ(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,lE.join)(e.directory,i);iy.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 EJ(e){let t=!1;if(t=await Mye(e),t)return t;let r=await(0,fJ.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,lE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=au(e,n.path,"directory");iy.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=au(e,n.path,"file"),a=await(0,mJ.readFile)(s);iy.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 cE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var iy,fJ,cE,lE,mJ,hJ,oy,wi,rD,nD,sD,iD,oD,aD,cD,lD,uD,_J=ce(()=>{iy=require("node:worker_threads"),fJ=w(require("fast-glob")),cE=w(Q());VL();KL();lE=require("node:path"),mJ=require("node:fs/promises");WL();hJ=require("micromatch"),oy=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,!cu(this.config.files)&&!tD(this.config.files)&&!pJ(this.config.files))throw new rD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!tD(this.config.files.source)&&!cu(this.config.files.source))throw new nD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new sD(this);if(this.config.files.ignore!==void 0&&!tD(this.config.files.ignore)&&!cu(this.config.files.ignore))throw new iD(this)}if(this.config.root!==void 0&&!cu(this.config.root))throw new aD(this);if(this.config.path!==void 0&&!cu(this.config.path))throw new lD(this);if(this.config.path&&(cE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!cu(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new uD(this);this.globOptions=QR(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new oD(this,r);return r.startsWith("/")&&(cE.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,hJ.scan)(r).base),this.baseURLPath=jR(this.name,this.config.urlPath)}},wi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,lE.basename)(r.directory)}) ${t}`)}},rD=class extends wi{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)}},nD=class extends wi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},sD=class extends wi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},iD=class extends wi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},oD=class extends wi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},aD=class extends wi{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)}},cD=class extends wi{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)}},lD=class extends wi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},uD=class extends wi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(cu,"isNonEmptyString");o(tD,"isArrayOfNonEmptyStrings");o(pJ,"isObject");o(Mye,"handleRoots");o(EJ,"processResourceExtensionComponent")});var _p={};we(_p,{componentErrors:()=>uE,getComponentName:()=>vR,loadComponent:()=>uy,loadComponentDirectories:()=>TJ,setErrorReporter:()=>Uye});function TJ(e,t){t&&(fD=t),e&&(ED=e);let r=[];if((0,vt.existsSync)(dD)){let s=(0,vt.readdirSync)(dD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,Hr.join)(dD,a);r.push(uy(c,fD,Vy,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(uy(n,fD,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{SJ=!0})}function Uye(e){cy=e}function xye(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Jo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Jo.primaryStore.attemptLock(e,0,()=>{clearTimeout(s),r()}))try{(0,vt.rmSync)(t,{recursive:!0,force:!0}),(0,vt.existsSync)((0,Hr.join)(e,"node_modules"))||(0,vt.mkdirSync)((0,Hr.join)(e,"node_modules")),(0,vt.symlinkSync)(gD.PACKAGE_ROOT,t,"dir"),r()}finally{Jo.primaryStore.unlock(e,0)}})}function RJ(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(!Jo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(RJ(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(()=>{Jo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function uy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(ay.has(a))return ay.get(a);ay.set(a,!0),s&&(ED=s);try{let c;n&&(uE=new Map);let l=(0,Hr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,dy.getConfigObj)():(0,hD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,Hr.join)(e,"config.yaml"))?c=(0,hD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=ZR;try{let m=(0,Hr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,pD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)(gD.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await xye(e,m)}catch(m){fa.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&fa.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=ly,d={};for(let m in c){ly=m;let h=c[m];if(uE.set(n?m:(0,Hr.basename)(e),!1),!h)continue;let p,_=h.package;try{if(_){let N=e,O;for(;!(0,vt.existsSync)(O=(0,Hr.join)(N,"node_modules",m));)if(N=(0,Hr.dirname)(N),N.length<(0,pD.getHdbBasePath)().length){O=null;break}if(O)p=await uy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=vye[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&&fa.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new ny(m,e,l,t,Le);await RJ(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&&!gJ.includes(N)){let O=_D.get(U.HTTP_SESSIONAFFINITY);O&&fa.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!zg)&&(gJ.push(N),CL(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),ED.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new oy({config:h,name:m,directory:e,module:p,resources:t});d[m]=await EJ(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,Hr.basename)(e)}' due to: ${g.message}`,cy?.(g),((0,dE.getWorkerIndex)()===0?console:fa.default).error(g),t.set(h.path||"/",new el(g),null,!0),uE.set(n?m:(0,Hr.basename)(e),g.message)}}if(ly=u,mD.isMainThread&&!SJ&&i&&(0,dE.watchDir)(e,async()=>TJ()),c.extensionModule||c.pluginModule){let m=await Wg((0,Hr.join)(e,c.extensionModule||c.pluginModule));return ay.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?`;cy?.(new Error(m)),((0,dE.getWorkerIndex)()===0?console:fa.default).error(m),uE.set((0,Hr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||fa.default.warn(`Component ${m} from (${(0,Hr.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}`,cy?.(c),t.set("",new el(c))}}var vt,Hr,mD,hD,_D,gD,fa,dE,pD,dy,dD,ED,SJ,fD,uE,vye,gJ,ay,cy,ly,vR,nf=ce(()=>{vt=require("node:fs"),Hr=require("node:path"),mD=require("node:worker_threads"),hD=require("yaml"),_D=w(oe()),gD=w(bt());k();Bk();Wk();aG();hG();pG();OG();Yz();Xz();ej();fa=w(Q());lj();dE=w(nt());FN();Dr();Me();dL();pD=w(oe());RQ();TT();CQ();is();$Q();dy=w(wt());Ah();eb();dJ();_J();yL();bp();jL();dD=(0,dy.resolvePath)(_D.get(U.COMPONENTSROOT)),ED=new Map,uE=new Map;o(TJ,"loadComponentDirectories");vye={REST:Qg,rest:Qg,graphql:PN,graphqlSchema:ON,roles:BN,jsResource:HN,fastifyRoutes:PP,login:GN,static:LP,operationsApi:LL,customFunctions:{},http:MR,clustering:BL,replication:Fo,authentication:up,mqtt:qL,loadEnv:DP,logging:fa.default,dataLoader:UP},gJ=[],ay=new Map;o(Uye,"setErrorReporter");vR=o(()=>ly,"getComponentName");o(xye,"symlinkHarperModule");o(RJ,"sequentiallyHandleApplication");o(uy,"loadComponent")});var xR=M((BHe,AJ)=>{var{isMainThread:yJ}=require("worker_threads"),{getTables:Bye,getDatabases:UHe,table:xHe}=(Me(),v(Et)),{loadComponentDirectories:Fye,loadComponent:Hye}=(nf(),v(_p)),{resetResources:kye}=(Fu(),v(NU)),Gye=fC(),qye=wt(),{dirname:$ye}=require("path"),{getConnection:Vye}=pr(),Kye=oe(),{CONFIG_PARAMS:Yye}=(k(),v(W)),{loadCertificates:Wye}=as(),SD=new Map;async function zye(e=!1){!yJ&&Kye.get(Yye.CLUSTERING_ENABLED)&&Vye();try{yJ&&await Gye()}catch(n){console.error(n)}let t=kye();Bye(),t.isWorker=e,await Wye(),await Hye($ye(qye.getConfigFilePath()),t,"hdb",!0,SD),await Fye(SD,t);let r=[];for(let[n]of SD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(zye,"loadRootComponents");AJ.exports.loadRootComponents=zye});var nt=M((HHe,Ci)=>{"use strict";eA();var{Worker:jye,MessageChannel:Qye,parentPort:uo,isMainThread:bD,threadId:Jye,workerData:fo}=require("worker_threads"),{PACKAGE_ROOT:Xye}=bt(),{join:wJ,isAbsolute:Zye,extname:eAe}=require("path"),{server:OJ}=(Dr(),v(Yf)),{watch:tAe,readdir:rAe}=require("fs/promises"),{totalmem:bJ}=require("os"),{setHeapSnapshotNearHeapLimit:nAe}=require("v8"),Nc=(k(),v(W)),hy=oe(),Oi=Q(),{randomBytes:sAe}=require("crypto"),{_assignPackageExport:iAe}=Zs(),IJ=1024*1024,wc=[],js=[],oAe=50,ID=1e4,aAe="restart",CJ="request_thread_info",PJ="resource_report",LJ="thread_info",DJ="added-port",cAe="ack",TD;iAe("threads",js);Ci.exports={startWorker:RD,restartWorkers:wD,shutdownWorkers:mAe,workers:wc,setMonitorListener:RAe,onMessageFromWorkers:hAe,onMessageByType:HJ,broadcast:EAe,broadcastWithAcknowledgement:gAe,setChildListenerByType:fAe,getWorkerIndex:MJ,getWorkerCount:vJ,getTicketKeys:xJ,setMainIsWorker:uAe,setTerminateTimeout:lAe,restartNumber:fo?.restartNumber||1};js.onMessageByType=HJ;js.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=js.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Ci.exports.whenThreadsStarted=new Promise(e=>{Ci.exports.threadsHaveStarted=e});hy.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&nAe(1);var ND;function lAe(e){ID=e}o(lAe,"setTerminateTimeout");function MJ(){return fo?fo.workerIndex:ND?0:void 0}o(MJ,"getWorkerIndex");function vJ(){return fo?fo.workerCount:ND?1:void 0}o(vJ,"getWorkerCount");function uAe(e){ND=e,Ci.exports.threadsHaveStarted()}o(uAe,"setMainIsWorker");var UJ=1,fy;function xJ(){return fy||(fy=bD?sAe(48):fo.ticketKeys,fy)}o(xJ,"getTicketKeys");Object.defineProperty(OJ,"workerIndex",{get(){return MJ()}});Object.defineProperty(OJ,"workerCount",{get(){return vJ()}});var BJ={[CJ](e,t){SAe(t)},[PJ](e,t){TAe(t,e)}};function RD(e,t={}){let r=process.constrainedMemory?.()||bJ();r=Math.min(r,bJ(),2e4*IJ);let n=hy.get(Nc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/IJ/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let u of js){let d=new Qye;d.existingPort=u,i.push(d),a.push(d.port2)}eAe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];hy.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new jye(Zye(e)?e:wJ(Xye,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:UJ=t.threadCount,name:t.name,restartNumber:Ci.exports.restartNumber,ticketKeys:xJ()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:DJ,port:u,threadId:l.threadId},[u]);return py(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>RD(e,t),l.on("error",u=>{Oi.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{wc.splice(wc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<oAe?(t.unexpectedRestarts=l.unexpectedRestarts+1,RD(e,t)):Oi.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{BJ[u.type]?.(u,l)}),wc.push(l),AAe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(RD,"startWorker");var dAe=[Nc.THREAD_TYPES.HTTP];async function wD(e=null,t=Math.max(UJ>3,1),r=!0){if(bD){try{process.chdir(process.cwd())}catch(a){Oi.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=xR();await a()}Ci.exports.restartNumber++,t<1&&(t=t*wc.length);let n=[],s=[];for(let a of wc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Oi.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Ci.exports.restartNumber,type:Nc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=dAe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Oi.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},ID*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===Nc.ITC_EVENT_TYPES.CHILD_STARTED&&(Oi.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Oi.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}=Zd();r&&(e==="http"||!e)&&hy.get(Nc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else uo.postMessage({type:aAe,workerType:e})}o(wD,"restartWorkers");function fAe(e,t){BJ[e]=t}o(fAe,"setChildListenerByType");function mAe(e){return wD(e,1/0,!1)}o(mAe,"shutdownWorkers");var FJ=[];function hAe(e){FJ.push(e)}o(hAe,"onMessageFromWorkers");var yD=new Map;function HJ(e,t){let r=yD.get(e);r||yD.set(e,r=[]),r.push(t)}o(HJ,"onMessageByType");var pAe=10;async function EAe(e,t){let r=0;for(let n of js)try{n.postMessage(e),r++>pAe&&(r=0,await new Promise(setImmediate))}catch(s){Oi.error("Unable to send message to worker",s)}t&&GJ(e,null)}o(EAe,"broadcast");var my=new Map,_Ae=1;function gAe(e){return new Promise(t=>{let r=0;for(let n of js)try{let s=_Ae++,i=o(()=>{my.delete(s),--r===0&&t(),n!==uo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,my.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of my)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Oi.error("Unable to send message to worker",s)}r===0&&t()})}o(gAe,"broadcastWithAcknowledgement");function SAe(e){e.postMessage({type:LJ,workers:kJ()})}o(SAe,"sendThreadInfo");function kJ(){let e=Date.now();return wc.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(kJ,"getChildWorkerInfo");function TAe(e,t){e.resources=t,e.resources.updated=Date.now()}o(TAe,"recordResourceReport");var AD;function RAe(e){AD=e}o(RAe,"setMonitorListener");var yAe=1e3,NJ=!1;function AAe(){NJ||(NJ=!0,setInterval(()=>{for(let e of wc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}AD&&AD()},yAe).unref())}o(AAe,"startMonitoring");var bAe=1e3;if(uo&&fo?.addPorts){py(uo);for(let e=0,t=fo.addPorts.length;e<t;e++){let r=fo.addPorts[e];r.threadId=fo.addThreadIds[e],py(r)}setInterval(()=>{let e=process.memoryUsage();uo.postMessage({type:PJ,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},bAe).unref(),TD=o(()=>new Promise((e,t)=>{uo.on("message",r),uo.postMessage({type:CJ});function r(n){n.type===LJ&&(uo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else TD=kJ;Ci.exports.getThreadInfo=TD;function py(e,t){js.push(e),e.on("message",r=>{if(r.type===DJ)r.port.threadId=r.threadId,py(r.port);else if(r.type===cAe){let n=my.get(r.id);n&&n()}else GJ(r,e)}).on("close",()=>{js.splice(js.indexOf(e),1)}).on("exit",()=>{js.splice(js.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(py,"addPort");function GJ(e,t){for(let n of FJ)n(e,t);let r=yD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Oi.error(s)}}o(GJ,"notifyMessageListeners");if(bD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await rAe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(wJ(s,a.name));try{for await(let{filename:a}of tAe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await wD(),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");Ci.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else uo.on("message",async e=>{let{type:t}=e;t===Nc.ITC_EVENT_TYPES.SHUTDOWN&&(Ci.exports.restartNumber=e.restartNumber,uo.unref(),setTimeout(()=>{Oi.warn("Thread did not voluntarily terminate",Jye),process.exit(0)},ID).unref())})});var WJ=M(($He,YJ)=>{"use strict";var{promises:Cf,createReadStream:IAe,createWriteStream:NAe}=require("fs"),{createGzip:wAe}=require("zlib"),{promisify:OAe}=require("util"),{pipeline:CAe}=require("stream"),PAe=OAe(CAe),CD=require("path"),KJ=oe();KJ.initSync();var Ey=Q(),{CONFIG_PARAMS:LAe,ITC_EVENT_TYPES:GHe}=(k(),v(W)),{onMessageFromWorkers:qHe}=nt(),{convertToMS:qJ}=ie(),{onStorageReclamation:DAe}=(f_(),v(jv)),MAe=6e4,vAe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",UAe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",OD,$J;YJ.exports=xAe;function xAe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(DAe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(vAe);if(!i)throw new Error(UAe);let l;if(t){let f=t.slice(-1),m=t.slice(0,-1);f==="G"?l=m*1e9:f==="M"?l=m*1e6:l=m*1e3}let u;r&&(u=qJ(r));let d;return OD=Date.now(),Ey.trace("Log rotate enabled, maxSize:",t,"interval:",r),$J=setInterval(async()=>{if(l){let f;f=await Cf.stat(e.path),f.size>=l&&(d=await VJ(e.path,i))}if(u&&Date.now()-OD>=u&&(d=await VJ(e.path,i),OD=Date.now()),n||c){let f=qJ(n??"1M")/(1+c);c=0;let m=await Cf.readdir(i);for(let h of m)try{let p=await Cf.stat(CD.join(i,h));Date.now()-p.mtimeMs>f&&await Cf.unlink(CD.join(i,h))}catch(p){Ey.error("Error trying to remove log",h,p)}}},a??MAe).unref(),{end(){clearInterval($J)},getLastRotatedLogPath(){return d}}}o(xAe,"logRotator");async function VJ(e,t){let r=KJ.get(LAe.LOGGING_ROTATION_COMPRESS),n=CD.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Cf.rename(e,n),r&&(e=n,n+=".gz",await PAe(IAe(e),wAe(),NAe(n)),await Cf.unlink(e)),Ey.closeLogFile(),Ey.notify(`hdb.log rotated, old log moved to ${n}`),n}o(VJ,"moveLogFile")});var XJ={};we(XJ,{RootConfigWatcher:()=>PD});var zJ,jJ,QJ,_y,JJ,PD,ZJ=ce(()=>{zJ=w(require("chokidar")),jJ=require("node:fs/promises"),QJ=w(wt()),_y=require("node:stream"),JJ=require("yaml"),PD=class extends _y.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,QJ.getConfigFilePath)(),this.#t=zJ.default.watch(this.#e,{persistent:!1}).on("add",this.handleChange.bind(this)).on("change",this.handleChange.bind(this)).on("error",this.handleError.bind(this))}handleError(t){this.emit("error",t)}handleChange(){(0,jJ.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,JJ.parse)(t);if(!this.#r){this.#r=r,this.emit("ready",this.#r);return}this.emit("change",this.#r=r)}).catch(t=>{})}ready(){return(0,_y.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=M((zHe,Iy)=>{"use strict";var ma=require("fs-extra"),{workerData:BAe,threadId:FAe,isMainThread:o4}=require("worker_threads"),hE=require("path"),a4=require("yaml"),c4=require("properties-reader"),kr=(k(),v(W)),e4=xc(),HAe=require("os"),{PACKAGE_ROOT:BD}=bt(),{_assignPackageExport:kAe}=Zs(),{Console:GAe}=require("console"),t4=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),r4=new Map,{join:ha}=hE,n4=1e4,ar={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},qAe={STDOUT:"stdOut",STDERR:"stdErr"},WHe=ha(BD,"logs"),$Ae=ha(BD,"config/yaml/",kr.HDB_DEFAULT_CONFIG_FILE),VAe=1e4,pE,EE,gy,mo,DD,LD,Ty,Ut,Gn,Ry,yy,Pf,mE,fE;function Sy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=hE.dirname(n)):t.root?n=ha(t.root,DD):(n=Ut.path,t.root||(t.root=hE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=ar[t.level]??Ut?.level??ar.info,l4(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(Sy,"updateLogger");function l4(e){let t=e.conditional??(e.conditional={});t.notify=ar.notify>=e.level?e.notify.bind(e):void 0,t.fatal=ar.fatal>=e.level?e.fatal.bind(e):void 0,t.error=ar.error>=e.level?e.error.bind(e):void 0,t.warn=ar.warn>=e.level?e.warn.bind(e):void 0,t.info=ar.info>=e.level?e.info.bind(e):void 0,t.debug=ar.debug>=e.level?e.debug.bind(e):void 0,t.trace=ar.trace>=e.level?e.trace.bind(e):void 0}o(l4,"updateConditional");async function MD(){fE||(fE=new lbe,await fE.ready(),fE.on("change",MD));let e=fE.config,t=e.logging??{};Sy(Ut,t),Ty=Ut.path,pE=t.console??!1,t.external&&Sy(Gn,t.external);for(let r in e){let n=e[r];n.logging?Sy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&Sy(Ut.forComponent(r),t,r)}}o(MD,"updateLogSettings");var vD=class extends GAe{static{o(this,"HarperLogger")}constructor(t,r){t.stdout.removeListener=()=>{},t.stderr.removeListener=()=>{},t.stdout.listenerCount=()=>{},t.stderr.listenerCount=()=>{},super(t),this.level=r}trace(...t){gn="trace",this.level<=ar.trace&&super.info(...t),gn="info"}debug(...t){gn="debug",this.level<=ar.debug&&super.info(...t),gn="info"}info(...t){gn="info",this.level<=ar.info&&super.info(...t),gn="info"}warn(...t){gn="warn",this.level<=ar.warn&&super.warn(...t),gn="info"}error(...t){gn="error",this.level<=ar.error&&super.error(...t),gn="info"}fatal(...t){Pf=!0;try{gn="fatal",this.level<=ar.fatal&&super.error(...t),gn="info"}finally{Pf=!1}}notify(...t){Pf=!0;try{gn="notify",this.level<=ar.notify&&super.info(...t),gn="info"}finally{Pf=!1}}withTag(t){return d4(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};mE===void 0&&u4();Iy.exports={notify:XAe,fatal:ZAe,error:xD,warn:ebe,info:jAe,debug:JAe,trace:QAe,logLevel:mo,loggerWithTag:d4,suppressLogging:WAe,initLogSettings:u4,logCustomLevel:tbe,closeLogFile:f4,createLogger:by,logsAtLevel:KAe,getLogFilePath:o(()=>Ty,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:abe,setLogLevel:nbe,OUTPUTS:qAe,AuthAuditLog:cbe,start:MD,startOnMainThread:MD,errorToString:obe};Iy.exports.externalLogger={notify(...e){Gn.notify(...e)},fatal(...e){Gn.fatal(...e)},error(...e){Gn.error(...e)},warn(...e){Gn.warn(...e)},info(...e){Gn.info(...e)},debug(...e){Gn.debug(...e)},trace(...e){Gn.trace(...e)},withTag(e){return Gn.withTag(e)},loggerWithTag(e){return Gn.withTag(e)}};kAe("logger",Iy.exports.externalLogger);function KAe(e){return ar[mo]<=ar[e]}o(KAe,"logsAtLevel");function u4(e=!1){try{if(mE===void 0||e){f4();let t=rbe(),r=e4(["ROOTPATH"]);try{mE=c4(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!ma.pathExistsSync(ha(r.ROOTPATH,kr.HDB_CONFIG_FILE)))throw s}let n;if({level:mo,configLogPath:LD,toFile:EE,logConsole:pE,rotation:n,toStream:gy}=sbe(r.ROOTPATH?ha(r.ROOTPATH,kr.HDB_CONFIG_FILE):mE.get("settings_path")),DD=kr.LOG_NAMES.HDB,Ty=ha(LD,DD),Ut=by({path:Ty,level:mo,stdStreams:gy,rotation:n}),Gn=Ut.forComponent("external"),Gn.tag=null,o4)try{require("segfault-handler").registerHandler(ha(LD,"crash.log"))}catch{}}}catch(t){if(mE=void 0,t.code===kr.NODE_ERROR_CODES.ENOENT||t.code===kr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=e4(Object.keys(kr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=kr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===kr.CONFIG_PARAMS.LOGGING_LEVEL){mo=a;continue}i===kr.CONFIG_PARAMS.LOGGING_CONSOLE&&(pE=i)}let{defaultLevel:n}=ibe();EE=!1,gy=!0,mo=mo===void 0?n:mo,Ut=by({level:mo}),Gn=Ut.forComponent("external"),Gn.tag=null;return}throw xD("Error initializing log settings"),xD(t),t}process.env.DEV_MODE&&(gy=!0),YAe()}o(u4,"initLogSettings");var Oc=!0;function YAe(){EE&&(process.stdout.write=function(e){return typeof e=="string"&&Oc&&pE&&(e=e.toString(),e[e.length-1]===`
124
+ `))}},25).unref()}l.close?.(()=>{if(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&Tf()==0)try{j2(eye(Ws.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,UR),l.cantCleanupProperly||Ni.warn("Had to forcefully exit the thread",UR),process.exit(0)},5e3).unref()})}if(J2||process.env.DEV_MODE)try{require("inspector").close()}catch(c){Ni.info("Could not close debugger",c)}}}).ref();let r;rE&&!sye&&(r=Z2()),Promise.resolve(r).then(()=>{if(Tf()===0)try{tye(rye)}catch(n){console.error("Error displaying start-up log",n)}Y2?.postMessage({type:gs.ITC_EVENT_TYPES.CHILD_STARTED})})});return Q2(t),t}o(X2,"startServers");function Z2(){let e=[];for(let t in Rf){let r=Rf[t];if(t.includes?.("/")&&Tf()==0){jRe(t)&&j2(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),Ni.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=Tf();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?rE?n={fd:rE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:rE?n={fd:rE(+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}),Ni.trace("Listening on port "+t,UR)}).on("error",c)}))}return Promise.all(e)}o(Z2,"listenOnPorts");!AL&&!WRe?.noServerStart&&X2();function iye(e,t){let r=(nf(),v(_p)).getComponentName,n;if(t.securePort){W2(t.securePort,{protocol_name:"TLS",name:r()});let s=ZRe("server",t.mtls),i=Ws.get("tls");n=JRe({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),Rf[t.securePort]=n}return t.port&&(W2(t.port,{protocol_name:"TCP",name:r()}),n=zRe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Rf[t.port]=n),n}o(iye,"onSocket")});var w2={};we(w2,{startHTTPThreads:()=>aye,startSocketServer:()=>CL,updateWorkerIdleness:()=>cQ});async function aye(e=2,t){pN().catch(r=>Nf.error?.("Error recording hostname for analytics:",r));try{if(t)wL(0,1,!0);else{let{loadRootComponents:r}=xR();if(e===0)return(0,zs.setMainIsWorker)(!0),await bL().startServers(),Promise.resolve([]);await r()}aQ();for(let r=0;r<e;r++)wL(r,e);return Promise.all(oQ)}finally{(0,zs.threadsHaveStarted)()}}function aQ(){let e=(0,nQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),NL=setInterval(()=>{Nf.notify(e)},oye).unref())}function wL(e,t=1,r){if(IL++,(0,zs.startWorker)("server/threads/threadServer.js",{name:Zy.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===jy.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});oQ.push(s),await s,yf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=FR.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=yf.indexOf(n);a>-1&&yf.splice(a,1)}if(o(i,"removeWorker"),Af){let a=Af;Af=[];for(let c of a)iQ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{OL?OL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,zs.shutdownWorkers)(),IL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function CL(e=0,t){if(typeof e=="string")try{(0,HR.existsSync)(e)&&(0,HR.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=cye:r=lye(t):r=PL;let n=(0,bf.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=iQ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),OL=!0,r(i,(a,c)=>{if(!a){if(eQ){let u=i._socket||new bf.Socket({handle:i,writable:!0,readable:!0});eQ.deliverSocket(u,e,c),u.resume()}else IL>0?(Af.length===0&&setTimeout(()=>{Af.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,Af.push(i)):(console.log("start up a dynamic thread to handle request"),wL(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 bf.Socket({handle:i,writable:!0,readable:!0});fye(u,a,e)}it(!0,"socket-routed")})},Nf.info(`HarperDB ${sQ.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 PL(e,t){let r,n=0;for(let s of yf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=BR)return BR=i,t(r);n=i}BR=0,t(r)}function cye(e,t){let r={};e.getpeername(r);let n=r.address,s=If.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);PL(e,a=>{If.set(n,{worker:a,lastUsed:i}),t(a)})}function lye(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new bf.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=If.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);PL(n,f=>{If.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function cQ(){BR=0;for(let e of yf)e.expectedIdle=e.recentELU.idle+uye,e.requests=1;yf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function fye(e,t,r){let n=dye++;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(),FR.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")),FR.delete(n)),s.event=="destroy"&&(e.destroy(),FR.delete(n))})}var zs,bf,Nf,HR,rQ,nQ,sQ,yf,Af,iQ,eQ,IL,oQ,NL,oye,OL,BR,tQ,If,uye,FR,dye,dL=ce(()=>{zs=w(nt()),bf=require("net");k();Nf=w(Q()),HR=require("fs");zi();rQ=require("worker_threads"),nQ=w(Yd()),sQ=w(bt()),yf=[],Af=[],iQ=[],IL=0,oQ=[];rQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,zs.onMessageFromWorkers)(e=>{e.type===Xy.RESTART&&NL&&(clearInterval(NL),aQ())}));oye=6e5;o(aye,"startHTTPThreads");o(aQ,"licenseWarning");o(wL,"startHTTPWorker");o(CL,"startSocketServer");BR=0;o(PL,"findMostIdleWorker");tQ=36e5,If=new Map;o(cye,"findByRemoteAddressAffinity");o(lye,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of If)r.lastUsed+tQ<e&&If.delete(t)},tQ).unref();uye=1e3;o(cQ,"updateWorkerIdleness");(0,zs.setMonitorListener)(cQ);FR=new Map,dye=1;o(fye,"proxySocket")});var LL={};we(LL,{hdbServer:()=>Eye,start:()=>Eye});async function Eye(e){try{lo.default.debug("In Fastify server"+process.cwd()),lo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),lo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=lQ.default.isMaster,await _ye();let t=e.securePort>0;wf=gye(t),await wf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(wf.server,e),wf.server.closeIdleConnections||await wf.listen({port:0,host:"::"})}catch(r){throw wf.close(),lo.default.error(r),lo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),lo.default.fatal(t),process.exit(1)}}async function _ye(){lo.default.trace("Configuring HarperDB process."),_Q.default.setSchemaDataToGlobal(),await SQ.default.setUsersWithRolesCache(),await TQ.default.getLicense()}function gye(e){lo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Sye(e),r=(0,uQ.default)(t);r.server.headersTimeout=Rye(),r.setErrorHandler(bc.serverErrorHandler);let n=Tye();n&&r.register(dQ.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(hQ.default),r.register(fQ.default),r.register(mQ.default,{root:pQ.default.join(EQ.PACKAGE_ROOT,"studio/build-local")}),am(r);let s=Ac.default.get(zy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!gQ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[bc.reqBodyValidationHandler,bc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,bc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),lo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function Sye(e){let t=Ac.default.get(sE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ac.default.get(sE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:hye,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function Tye(){let e=Ac.default.get(sE.OPERATIONSAPI_NETWORK_CORS),t=Ac.default.get(sE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===pye)&&(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 Rye(){return Ac.default.get(sE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??mye}var lQ,Ac,lo,uQ,dQ,fQ,mQ,hQ,pQ,EQ,_Q,gQ,SQ,TQ,bc,mye,hye,pye,sE,wf,RQ=ce(()=>{lQ=w(require("cluster")),Ac=w(oe());k();lo=w(Q()),uQ=w(require("fastify")),dQ=w(require("@fastify/cors")),fQ=w(require("@fastify/compress")),mQ=w(require("@fastify/static")),hQ=w(XN()),pQ=w(require("path")),EQ=w(bt()),_Q=w(ii()),gQ=w(ie()),SQ=w(rs()),TQ=w(Yd());Dr();bc=w(sR());Ro();Ac.default.initSync();mye=6e4,hye=1024*1024*1024,pye="TRUE",{CONFIG_PARAMS:sE}=W;o(Eye,"operationsServer");o(_ye,"setUp");o(gye,"buildServer");o(Sye,"getServerOptions");o(Tye,"getCORSOpts");o(Rye,"getHeaderTimeoutConfig")});var BL={};we(BL,{disableNATS:()=>Aye,publishToStream:()=>qR,setNATSReplicator:()=>DL,setPublishToStream:()=>bye,setSubscription:()=>xL,start:()=>yye});function yye(){iE.default.get(U.CLUSTERING_ENABLED)&&Nye()}function Aye(e=!0){NQ=e}function bye(e,t){qR=e,xL=t}function Nye(){if(NQ||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];DL(s,r,i)}}Il((r,n)=>{DL(r.tableName,r.databaseName,r),n&&OQ(r)}),!yQ&&(yQ=!0)}function DL(e,t,r){if(t==="system"&&wye.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){OQ(i)}static subscribe(){let i=new Kn;return xL(t,e,i),i}static subscribeOnThisThread(i){return i<(iE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Iye)}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 kR(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=wQ;return i}o(n,"getNATSTransaction")}function OQ(e){let t=iE.default.get(U.CLUSTERING_NODENAME);qR(`${vL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,UL.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 AQ,vL,UL,bQ,IQ,iE,GR,NQ,qR,xL,Iye,wQ,yQ,wye,kR,ML,CQ=ce(()=>{Me();La();AQ=w(pr()),vL=w(Ot()),UL=w(Vi());Ru();bQ=w($R()),IQ=w(An()),iE=w(oe());k();GR=w(Q());o(yye,"start");o(Aye,"disableNATS");qR=AQ.publishToStream,xL=bQ.setSubscription;o(bye,"setPublishToStream");Iye=2;o(Nye,"assignReplicationSource");wye=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(DL,"setNATSReplicator");o(OQ,"publishSchema");kR=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=iE.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||(GR.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(qR(`${vL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,UL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw GR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},ML=class extends kR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,IQ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};wQ=new ML});async function vQ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await FL.get(e,{returnNonexistent:!0});i=new GL(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await FL.get(e);a&&a.delete()}i=new KR(e,t)}return n&&(n.id=e,n.user={username:t?.username},oE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function HL(){return VR++,VR>65500&&(VR=1),VR}function kL(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 LQ,Ic,DQ,MQ,PQ,FL,oE,VR,KR,GL,UQ=ce(()=>{Me();Fu();LQ=w(An()),Ic=w(Q());Bc();DQ=w(nt()),MQ=w(bL());Dr();P_();PQ=100,FL=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"}]}}]}),oE=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,DQ.getWorkerIndex)()===0&&(async()=>{await MQ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of oE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await kL(r,t,r)}catch{(0,Ic.warn)("Failed to publish will",t)}oE.delete(e.id)}})();o(vQ,"getSession");VR=1;o(HL,"getNextMessageId");KR=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,Ic.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=HL());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>PQ?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-PQ)):await new Promise(setImmediate)}catch(F){(0,Ic.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=HL();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 kL(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 oE.get(this.sessionId);n?.doesExist()&&await kL(n,n.data,r)}}finally{await oE.delete(this.sessionId)}}).catch(n=>{(0,Ic.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(kL,"publish");GL=class extends KR{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=HL(),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,Ic.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,LQ.getNextMonotonicTime)()),(0,Ic.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),FL.put(this.sessionRecord)}}});var qL={};we(qL,{bypassAuth:()=>Oye,start:()=>Pye});function Oye(){qQ=!0}function Pye({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new GQ.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),or.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=BQ(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{or.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),or.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)&&WR.notify?.({username:d?.username,status:Xs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&WR.error?.({username:h,status:Xs.FAILURE,type:ya.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else or.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),or.error?.(h)}else if(l.required)return or.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Cye(u.remoteAddress)&&(d=await(0,FQ.getSuperUser)(),or.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=BQ(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{or.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function BQ(e,t,r,n,s){xQ||(xQ=!0,ch(f=>{YR>0&&f.push({metric:"mqtt-connections",connections:YR,byThread:!0})}));let i;YR++;let a,c={protocolVersion:4},l=(0,zR.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){YR--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),or.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"),or.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){or.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)&&WR.notify?.({username:n?.username,status:Xs.SUCCESS,type:ya.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,Of.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&WR.error?.({username:f.username,status:Xs.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=vQ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return or.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 or.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?or.warn?.(le):or.info?.(le):or.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),or.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"),or.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),or.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,zR.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 Ia(y,r)}o(T,"serialize")}),l.on("error",f=>{or.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var zR,FQ,Of,HQ,kQ,GQ,WR,or,qQ,Cye,xQ,YR,$Q=ce(()=>{zR=require("mqtt-packet");UQ();FQ=w(rs());Ro();zi();Dr();Of=w(oe());k();HQ=w(ei()),kQ=w(Q()),GQ=require("events"),WR=(0,HQ.loggerWithTag)("auth-event"),or=(0,kQ.forComponent)("mqtt"),qQ=(0,Of.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Oye,"bypassAuth");Cye=o(e=>qQ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Pye,"start");YR=0;o(BQ,"onSocket")});function jR(e,t){if(t?.includes(".."))throw new $L(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var $L,VL=ce(()=>{$L=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(jR,"resolveBaseURLPath")});function VQ(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 KQ=ce(()=>{o(VQ,"deriveCommonPatternBase")});function QR(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 KL=ce(()=>{o(QR,"deriveGlobOptions")});var YQ,YL,aE,WQ=ce(()=>{VL();KQ();KL();YQ=require("micromatch"),YL=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"}},aE=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=jR(this.name,this.config.urlPath),this.globOptions=QR(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new YL(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,YQ.scan)(s).base),this.commonPatternBase=VQ(this.patternBases)}}});function zQ(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function au(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(zQ(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(zQ(n,t)){t=t.slice(n.length+1);break}}}return(0,jQ.join)(e.baseURLPath,t)}var jQ,WL=ce(()=>{jQ=require("node:path");o(zQ,"pathStartsWithBase");o(au,"deriveURLPath")});function QQ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var XR,JQ,XQ,zL,ZQ,eJ,JR,tJ=ce(()=>{XR=require("node:events");WQ();JQ=w(Q()),XQ=w(require("chokidar")),zL=require("node:path"),ZQ=require("node:fs/promises");WL();eJ=require("micromatch"),JR=class extends XR.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new aE(t,r,QQ(n)),this.#r=s||JQ.default.loggerWithTag(t),this.ready=(0,XR.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,eJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,zL.join)(this.directory,r);switch(t){case"add":case"change":{let i=au(this.#e,r,"file");(0,ZQ.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=au(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=au(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,zL.join)(this.#e.directory,r));return this.#t=XQ.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 aE(this.name,this.directory,QQ(t)),this.#a()}};o(QQ,"castConfig")});var ZR,jL=ce(()=>{ZR={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var ty,rJ,nJ,sJ,iJ,oJ,QL,JL,XL,ZL,eD,ey,aJ=ce(()=>{ty=require("events"),rJ=w(require("yaml")),nJ=w(require("chokidar")),sJ=require("node:fs/promises"),iJ=require("util"),oJ=w(Q());jL();QL=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"}},JL=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},XL=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"}},ZL=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},eD=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},ey=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||oJ.default.loggerWithTag(t),this.ready=(0,ty.once)(this,"ready"),this.#t=nJ.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,sJ.readFile)(this.#e,"utf-8").then(t=>{this.#n=rJ.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 QL(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=ZR,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,iJ.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 JL;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new XL(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 ZL(t,s);n=n[s]}if(n==null||typeof n!="object")throw new eD(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 cJ(){Dye[0]=1}var Lye,Dye,lJ=ce(()=>{bp();Lye=Jo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),Dye=new Uint8Array(Lye);o(cJ,"requestRestart")});var sy,uJ,ry,ny,dJ=ce(()=>{sy=require("node:events");tJ();aJ();uJ=w(Q());lJ();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"}},ny=class extends sy.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=uJ.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,sy.once)(this,"ready"),this.options=new ey(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 JR(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}`),cJ()}}});function cu(e){return typeof e=="string"&&e.trim()!==""}function tD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>cu(t))}function pJ(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Mye(e){e.config.root&&cE.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 cD(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(pJ(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,lE.join)(e.directory,i);iy.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 EJ(e){let t=!1;if(t=await Mye(e),t)return t;let r=await(0,fJ.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,lE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=au(e,n.path,"directory");iy.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=au(e,n.path,"file"),a=await(0,mJ.readFile)(s);iy.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 cE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var iy,fJ,cE,lE,mJ,hJ,oy,wi,rD,nD,sD,iD,oD,aD,cD,lD,uD,_J=ce(()=>{iy=require("node:worker_threads"),fJ=w(require("fast-glob")),cE=w(Q());VL();KL();lE=require("node:path"),mJ=require("node:fs/promises");WL();hJ=require("micromatch"),oy=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,!cu(this.config.files)&&!tD(this.config.files)&&!pJ(this.config.files))throw new rD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!tD(this.config.files.source)&&!cu(this.config.files.source))throw new nD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new sD(this);if(this.config.files.ignore!==void 0&&!tD(this.config.files.ignore)&&!cu(this.config.files.ignore))throw new iD(this)}if(this.config.root!==void 0&&!cu(this.config.root))throw new aD(this);if(this.config.path!==void 0&&!cu(this.config.path))throw new lD(this);if(this.config.path&&(cE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!cu(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new uD(this);this.globOptions=QR(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new oD(this,r);return r.startsWith("/")&&(cE.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,hJ.scan)(r).base),this.baseURLPath=jR(this.name,this.config.urlPath)}},wi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,lE.basename)(r.directory)}) ${t}`)}},rD=class extends wi{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)}},nD=class extends wi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},sD=class extends wi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},iD=class extends wi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},oD=class extends wi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},aD=class extends wi{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)}},cD=class extends wi{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)}},lD=class extends wi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},uD=class extends wi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(cu,"isNonEmptyString");o(tD,"isArrayOfNonEmptyStrings");o(pJ,"isObject");o(Mye,"handleRoots");o(EJ,"processResourceExtensionComponent")});var _p={};we(_p,{componentErrors:()=>uE,getComponentName:()=>vR,loadComponent:()=>uy,loadComponentDirectories:()=>TJ,setErrorReporter:()=>Uye});function TJ(e,t){t&&(fD=t),e&&(ED=e);let r=[];if((0,vt.existsSync)(dD)){let s=(0,vt.readdirSync)(dD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,Hr.join)(dD,a);r.push(uy(c,fD,Vy,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(uy(n,fD,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{SJ=!0})}function Uye(e){cy=e}function xye(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Jo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Jo.primaryStore.attemptLock(e,0,()=>{clearTimeout(s),r()}))try{(0,vt.rmSync)(t,{recursive:!0,force:!0}),(0,vt.existsSync)((0,Hr.join)(e,"node_modules"))||(0,vt.mkdirSync)((0,Hr.join)(e,"node_modules")),(0,vt.symlinkSync)(gD.PACKAGE_ROOT,t,"dir"),r()}finally{Jo.primaryStore.unlock(e,0)}})}function RJ(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(!Jo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(RJ(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(()=>{Jo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function uy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(ay.has(a))return ay.get(a);ay.set(a,!0),s&&(ED=s);try{let c;n&&(uE=new Map);let l=(0,Hr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,dy.getConfigObj)():(0,hD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,Hr.join)(e,"config.yaml"))?c=(0,hD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=ZR;try{let m=(0,Hr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,pD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)(gD.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await xye(e,m)}catch(m){fa.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&fa.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=ly,d={};for(let m in c){ly=m;let h=c[m];if(uE.set(n?m:(0,Hr.basename)(e),!1),!h)continue;let p,_=h.package;try{if(_){let N=e,O;for(;!(0,vt.existsSync)(O=(0,Hr.join)(N,"node_modules",m));)if(N=(0,Hr.dirname)(N),N.length<(0,pD.getHdbBasePath)().length){O=null;break}if(O)p=await uy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=vye[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&&fa.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new ny(m,e,l,t,Le);await RJ(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&&!gJ.includes(N)){let O=_D.get(U.HTTP_SESSIONAFFINITY);O&&fa.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!zg)&&(gJ.push(N),CL(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),ED.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new oy({config:h,name:m,directory:e,module:p,resources:t});d[m]=await EJ(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,Hr.basename)(e)}' due to: ${g.message}`,cy?.(g),((0,dE.getWorkerIndex)()===0?console:fa.default).error(g),t.set(h.path||"/",new el(g),null,!0),uE.set(n?m:(0,Hr.basename)(e),g.message)}}if(ly=u,mD.isMainThread&&!SJ&&i&&(0,dE.watchDir)(e,async()=>TJ()),c.extensionModule||c.pluginModule){let m=await Wg((0,Hr.join)(e,c.extensionModule||c.pluginModule));return ay.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?`;cy?.(new Error(m)),((0,dE.getWorkerIndex)()===0?console:fa.default).error(m),uE.set((0,Hr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||fa.default.warn(`Component ${m} from (${(0,Hr.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}`,cy?.(c),t.set("",new el(c))}}var vt,Hr,mD,hD,_D,gD,fa,dE,pD,dy,dD,ED,SJ,fD,uE,vye,gJ,ay,cy,ly,vR,nf=ce(()=>{vt=require("node:fs"),Hr=require("node:path"),mD=require("node:worker_threads"),hD=require("yaml"),_D=w(oe()),gD=w(bt());k();Bk();Wk();aG();hG();pG();OG();Yz();Xz();ej();fa=w(Q());lj();dE=w(nt());FN();Dr();Me();dL();pD=w(oe());RQ();TT();CQ();is();$Q();dy=w(wt());Ah();eb();dJ();_J();yL();bp();jL();dD=(0,dy.resolvePath)(_D.get(U.COMPONENTSROOT)),ED=new Map,uE=new Map;o(TJ,"loadComponentDirectories");vye={REST:Qg,rest:Qg,graphql:PN,graphqlSchema:ON,roles:BN,jsResource:HN,fastifyRoutes:PP,login:GN,static:LP,operationsApi:LL,customFunctions:{},http:MR,clustering:BL,replication:Fo,authentication:up,mqtt:qL,loadEnv:DP,logging:fa.default,dataLoader:UP},gJ=[],ay=new Map;o(Uye,"setErrorReporter");vR=o(()=>ly,"getComponentName");o(xye,"symlinkHarperModule");o(RJ,"sequentiallyHandleApplication");o(uy,"loadComponent")});var xR=M((BHe,AJ)=>{var{isMainThread:yJ}=require("worker_threads"),{getTables:Bye,getDatabases:UHe,table:xHe}=(Me(),v(Et)),{loadComponentDirectories:Fye,loadComponent:Hye}=(nf(),v(_p)),{resetResources:kye}=(Fu(),v(NU)),Gye=fC(),qye=wt(),{dirname:$ye}=require("path"),{getConnection:Vye}=pr(),Kye=oe(),{CONFIG_PARAMS:Yye}=(k(),v(W)),{loadCertificates:Wye}=as(),SD=new Map;async function zye(e=!1){!yJ&&Kye.get(Yye.CLUSTERING_ENABLED)&&Vye();try{yJ&&await Gye()}catch(n){console.error(n)}let t=kye();Bye(),t.isWorker=e,await Wye(),await Hye($ye(qye.getConfigFilePath()),t,"hdb",!0,SD),await Fye(SD,t);let r=[];for(let[n]of SD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(zye,"loadRootComponents");AJ.exports.loadRootComponents=zye});var nt=M((HHe,Ci)=>{"use strict";eA();var{Worker:jye,MessageChannel:Qye,parentPort:uo,isMainThread:bD,threadId:Jye,workerData:fo}=require("worker_threads"),{PACKAGE_ROOT:Xye}=bt(),{join:wJ,isAbsolute:Zye,extname:eAe}=require("path"),{server:OJ}=(Dr(),v(Yf)),{watch:tAe,readdir:rAe}=require("fs/promises"),{totalmem:bJ}=require("os"),{setHeapSnapshotNearHeapLimit:nAe}=require("v8"),Nc=(k(),v(W)),hy=oe(),Oi=Q(),{randomBytes:sAe}=require("crypto"),{_assignPackageExport:iAe}=Zs(),IJ=1024*1024,wc=[],js=[],oAe=50,ID=1e4,aAe="restart",CJ="request_thread_info",PJ="resource_report",LJ="thread_info",DJ="added-port",cAe="ack",TD;iAe("threads",js);Ci.exports={startWorker:RD,restartWorkers:wD,shutdownWorkers:mAe,workers:wc,setMonitorListener:RAe,onMessageFromWorkers:hAe,onMessageByType:HJ,broadcast:EAe,broadcastWithAcknowledgement:gAe,setChildListenerByType:fAe,getWorkerIndex:MJ,getWorkerCount:vJ,getTicketKeys:xJ,setMainIsWorker:uAe,setTerminateTimeout:lAe,restartNumber:fo?.restartNumber||1};js.onMessageByType=HJ;js.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=js.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Ci.exports.whenThreadsStarted=new Promise(e=>{Ci.exports.threadsHaveStarted=e});hy.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&nAe(1);var ND;function lAe(e){ID=e}o(lAe,"setTerminateTimeout");function MJ(){return fo?fo.workerIndex:ND?0:void 0}o(MJ,"getWorkerIndex");function vJ(){return fo?fo.workerCount:ND?1:void 0}o(vJ,"getWorkerCount");function uAe(e){ND=e,Ci.exports.threadsHaveStarted()}o(uAe,"setMainIsWorker");var UJ=1,fy;function xJ(){return fy||(fy=bD?sAe(48):fo.ticketKeys,fy)}o(xJ,"getTicketKeys");Object.defineProperty(OJ,"workerIndex",{get(){return MJ()}});Object.defineProperty(OJ,"workerCount",{get(){return vJ()}});var BJ={[CJ](e,t){SAe(t)},[PJ](e,t){TAe(t,e)}};function RD(e,t={}){let r=process.constrainedMemory?.()||bJ();r=Math.min(r,bJ(),2e4*IJ);let n=hy.get(Nc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/IJ/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let u of js){let d=new Qye;d.existingPort=u,i.push(d),a.push(d.port2)}eAe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];hy.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new jye(Zye(e)?e:wJ(Xye,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:UJ=t.threadCount,name:t.name,restartNumber:Ci.exports.restartNumber,ticketKeys:xJ()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:DJ,port:u,threadId:l.threadId},[u]);return py(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>RD(e,t),l.on("error",u=>{Oi.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{wc.splice(wc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<oAe?(t.unexpectedRestarts=l.unexpectedRestarts+1,RD(e,t)):Oi.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{BJ[u.type]?.(u,l)}),wc.push(l),AAe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(RD,"startWorker");var dAe=[Nc.THREAD_TYPES.HTTP];async function wD(e=null,t=Math.max(UJ>3,1),r=!0){if(bD){try{process.chdir(process.cwd())}catch(a){Oi.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=xR();await a()}Ci.exports.restartNumber++,t<1&&(t=t*wc.length);let n=[],s=[];for(let a of wc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Oi.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Ci.exports.restartNumber,type:Nc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=dAe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Oi.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},ID*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===Nc.ITC_EVENT_TYPES.CHILD_STARTED&&(Oi.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Oi.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}=Zd();r&&(e==="http"||!e)&&hy.get(Nc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else uo.postMessage({type:aAe,workerType:e})}o(wD,"restartWorkers");function fAe(e,t){BJ[e]=t}o(fAe,"setChildListenerByType");function mAe(e){return wD(e,1/0,!1)}o(mAe,"shutdownWorkers");var FJ=[];function hAe(e){FJ.push(e)}o(hAe,"onMessageFromWorkers");var yD=new Map;function HJ(e,t){let r=yD.get(e);r||yD.set(e,r=[]),r.push(t)}o(HJ,"onMessageByType");var pAe=10;async function EAe(e,t){let r=0;for(let n of js)try{n.postMessage(e),r++>pAe&&(r=0,await new Promise(setImmediate))}catch(s){Oi.error("Unable to send message to worker",s)}t&&GJ(e,null)}o(EAe,"broadcast");var my=new Map,_Ae=1;function gAe(e){return new Promise(t=>{let r=0;for(let n of js)try{let s=_Ae++,i=o(()=>{my.delete(s),--r===0&&t(),n!==uo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,my.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of my)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Oi.error("Unable to send message to worker",s)}r===0&&t()})}o(gAe,"broadcastWithAcknowledgement");function SAe(e){e.postMessage({type:LJ,workers:kJ()})}o(SAe,"sendThreadInfo");function kJ(){let e=Date.now();return wc.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(kJ,"getChildWorkerInfo");function TAe(e,t){e.resources=t,e.resources.updated=Date.now()}o(TAe,"recordResourceReport");var AD;function RAe(e){AD=e}o(RAe,"setMonitorListener");var yAe=1e3,NJ=!1;function AAe(){NJ||(NJ=!0,setInterval(()=>{for(let e of wc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}AD&&AD()},yAe).unref())}o(AAe,"startMonitoring");var bAe=1e3;if(uo&&fo?.addPorts){py(uo);for(let e=0,t=fo.addPorts.length;e<t;e++){let r=fo.addPorts[e];r.threadId=fo.addThreadIds[e],py(r)}setInterval(()=>{let e=process.memoryUsage();uo.postMessage({type:PJ,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},bAe).unref(),TD=o(()=>new Promise((e,t)=>{uo.on("message",r),uo.postMessage({type:CJ});function r(n){n.type===LJ&&(uo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else TD=kJ;Ci.exports.getThreadInfo=TD;function py(e,t){js.push(e),e.on("message",r=>{if(r.type===DJ)r.port.threadId=r.threadId,py(r.port);else if(r.type===cAe){let n=my.get(r.id);n&&n()}else GJ(r,e)}).on("close",()=>{js.splice(js.indexOf(e),1)}).on("exit",()=>{js.splice(js.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(py,"addPort");function GJ(e,t){for(let n of FJ)n(e,t);let r=yD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Oi.error(s)}}o(GJ,"notifyMessageListeners");if(bD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await rAe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(wJ(s,a.name));try{for await(let{filename:a}of tAe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await wD(),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");Ci.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else uo.on("message",async e=>{let{type:t}=e;t===Nc.ITC_EVENT_TYPES.SHUTDOWN&&(Ci.exports.restartNumber=e.restartNumber,uo.unref(),setTimeout(()=>{Oi.warn("Thread did not voluntarily terminate",Jye),process.exit(0)},ID).unref())})});var WJ=M(($He,YJ)=>{"use strict";var{promises:Cf,createReadStream:IAe,createWriteStream:NAe}=require("fs"),{createGzip:wAe}=require("zlib"),{promisify:OAe}=require("util"),{pipeline:CAe}=require("stream"),PAe=OAe(CAe),CD=require("path"),KJ=oe();KJ.initSync();var Ey=Q(),{CONFIG_PARAMS:LAe,ITC_EVENT_TYPES:GHe}=(k(),v(W)),{onMessageFromWorkers:qHe}=nt(),{convertToMS:qJ}=ie(),{onStorageReclamation:DAe}=(f_(),v(jv)),MAe=6e4,vAe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",UAe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",OD,$J;YJ.exports=xAe;function xAe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(DAe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(vAe);if(!i)throw new Error(UAe);let l;if(t){let f=t.slice(-1),m=t.slice(0,-1);f==="G"?l=m*1e9:f==="M"?l=m*1e6:l=m*1e3}let u;r&&(u=qJ(r));let d;return OD=Date.now(),Ey.trace("Log rotate enabled, maxSize:",t,"interval:",r),$J=setInterval(async()=>{if(l){let f;f=await Cf.stat(e.path),f.size>=l&&(d=await VJ(e.path,i))}if(u&&Date.now()-OD>=u&&(d=await VJ(e.path,i),OD=Date.now()),n||c){let f=qJ(n??"1M")/(1+c);c=0;let m=await Cf.readdir(i);for(let h of m)try{let p=await Cf.stat(CD.join(i,h));Date.now()-p.mtimeMs>f&&await Cf.unlink(CD.join(i,h))}catch(p){Ey.error("Error trying to remove log",h,p)}}},a??MAe).unref(),{end(){clearInterval($J)},getLastRotatedLogPath(){return d}}}o(xAe,"logRotator");async function VJ(e,t){let r=KJ.get(LAe.LOGGING_ROTATION_COMPRESS),n=CD.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Cf.rename(e,n),r&&(e=n,n+=".gz",await PAe(IAe(e),wAe(),NAe(n)),await Cf.unlink(e)),Ey.closeLogFile(),Ey.notify(`hdb.log rotated, old log moved to ${n}`),n}o(VJ,"moveLogFile")});var XJ={};we(XJ,{RootConfigWatcher:()=>PD});var zJ,jJ,QJ,_y,JJ,PD,ZJ=ce(()=>{zJ=w(require("chokidar")),jJ=require("node:fs/promises"),QJ=w(wt()),_y=require("node:stream"),JJ=require("yaml"),PD=class extends _y.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,QJ.getConfigFilePath)(),this.#t=zJ.default.watch(this.#e,{persistent:!1}).on("add",this.handleChange.bind(this)).on("change",this.handleChange.bind(this)).on("error",this.handleError.bind(this))}handleError(t){this.emit("error",t)}handleChange(){(0,jJ.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,JJ.parse)(t);if(!this.#r){this.#r=r,this.emit("ready",this.#r);return}this.emit("change",this.#r=r)}).catch(t=>{})}ready(){return(0,_y.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=M((zHe,Iy)=>{"use strict";var ma=require("fs-extra"),{workerData:BAe,threadId:FAe,isMainThread:o4}=require("worker_threads"),hE=require("path"),a4=require("yaml"),c4=require("properties-reader"),kr=(k(),v(W)),e4=xc(),HAe=require("os"),{PACKAGE_ROOT:BD}=bt(),{_assignPackageExport:kAe}=Zs(),{Console:GAe}=require("console"),t4=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),r4=new Map,{join:ha}=hE,n4=1e4,ar={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},qAe={STDOUT:"stdOut",STDERR:"stdErr"},WHe=ha(BD,"logs"),$Ae=ha(BD,"config/yaml/",kr.HDB_DEFAULT_CONFIG_FILE),VAe=1e4,pE,EE,gy,mo,DD,LD,Ty,Ut,Gn,Ry,yy,Pf,mE,fE;function Sy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=hE.dirname(n)):t.root?n=ha(t.root,DD):(n=Ut.path,t.root||(t.root=hE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=ar[t.level]??Ut?.level??ar.info,l4(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(Sy,"updateLogger");function l4(e){let t=e.conditional??(e.conditional={});t.notify=ar.notify>=e.level?e.notify.bind(e):void 0,t.fatal=ar.fatal>=e.level?e.fatal.bind(e):void 0,t.error=ar.error>=e.level?e.error.bind(e):void 0,t.warn=ar.warn>=e.level?e.warn.bind(e):void 0,t.info=ar.info>=e.level?e.info.bind(e):void 0,t.debug=ar.debug>=e.level?e.debug.bind(e):void 0,t.trace=ar.trace>=e.level?e.trace.bind(e):void 0}o(l4,"updateConditional");async function MD(){fE||(fE=new lbe,await fE.ready(),fE.on("change",MD));let e=fE.config,t=e.logging??{};Sy(Ut,t),Ty=Ut.path,pE=t.console??!1,t.external&&Sy(Gn,t.external);for(let r in e){let n=e[r];n.logging?Sy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&Sy(Ut.forComponent(r),t,r)}}o(MD,"updateLogSettings");var vD=class extends GAe{static{o(this,"HarperLogger")}constructor(t,r){t.stdout.removeListener=()=>{},t.stderr.removeListener=()=>{},t.stdout.listenerCount=()=>{},t.stderr.listenerCount=()=>{},super(t),this.level=r}trace(...t){gn="trace",this.level<=ar.trace&&super.info(...t),gn="info"}debug(...t){gn="debug",this.level<=ar.debug&&super.info(...t),gn="info"}info(...t){gn="info",this.level<=ar.info&&super.info(...t),gn="info"}warn(...t){gn="warn",this.level<=ar.warn&&super.warn(...t),gn="info"}error(...t){gn="error",this.level<=ar.error&&super.error(...t),gn="info"}fatal(...t){Pf=!0;try{gn="fatal",this.level<=ar.fatal&&super.error(...t),gn="info"}finally{Pf=!1}}notify(...t){Pf=!0;try{gn="notify",this.level<=ar.notify&&super.info(...t),gn="info"}finally{Pf=!1}}withTag(t){return d4(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};mE===void 0&&u4();Iy.exports={notify:XAe,fatal:ZAe,error:xD,warn:ebe,info:jAe,debug:JAe,trace:QAe,logLevel:mo,loggerWithTag:d4,suppressLogging:WAe,initLogSettings:u4,logCustomLevel:tbe,closeLogFile:f4,createLogger:by,logsAtLevel:KAe,getLogFilePath:o(()=>Ty,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:abe,setLogLevel:nbe,OUTPUTS:qAe,AuthAuditLog:cbe,start:MD,startOnMainThread:MD,errorToString:obe};Iy.exports.externalLogger={notify(...e){Gn.notify(...e)},fatal(...e){Gn.fatal(...e)},error(...e){Gn.error(...e)},warn(...e){Gn.warn(...e)},info(...e){Gn.info(...e)},debug(...e){Gn.debug(...e)},trace(...e){Gn.trace(...e)},withTag(e){return Gn.withTag(e)},loggerWithTag(e){return Gn.withTag(e)}};kAe("logger",Iy.exports.externalLogger);function KAe(e){return ar[mo]<=ar[e]}o(KAe,"logsAtLevel");function u4(e=!1){try{if(mE===void 0||e){f4();let t=rbe(),r=e4(["ROOTPATH"]);try{mE=c4(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!ma.pathExistsSync(ha(r.ROOTPATH,kr.HDB_CONFIG_FILE)))throw s}let n;if({level:mo,configLogPath:LD,toFile:EE,logConsole:pE,rotation:n,toStream:gy}=sbe(r.ROOTPATH?ha(r.ROOTPATH,kr.HDB_CONFIG_FILE):mE.get("settings_path")),DD=kr.LOG_NAMES.HDB,Ty=ha(LD,DD),Ut=by({path:Ty,level:mo,stdStreams:gy,rotation:n}),Gn=Ut.forComponent("external"),Gn.tag=null,o4)try{require("segfault-handler").registerHandler(ha(LD,"crash.log"))}catch{}}}catch(t){if(mE=void 0,t.code===kr.NODE_ERROR_CODES.ENOENT||t.code===kr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=e4(Object.keys(kr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=kr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===kr.CONFIG_PARAMS.LOGGING_LEVEL){mo=a;continue}i===kr.CONFIG_PARAMS.LOGGING_CONSOLE&&(pE=i)}let{defaultLevel:n}=ibe();EE=!1,gy=!0,mo=mo===void 0?n:mo,Ut=by({level:mo}),Gn=Ut.forComponent("external"),Gn.tag=null;return}throw xD("Error initializing log settings"),xD(t),t}process.env.DEV_MODE&&(gy=!0),YAe()}o(u4,"initLogSettings");var Oc=!0;function YAe(){EE&&(process.stdout.write=function(e){return typeof e=="string"&&Oc&&pE&&(e=e.toString(),e[e.length-1]===`
125
125
  `&&(e=e.slice(0,-1)),yy(e)),t4.apply(process.stdout,arguments)},process.stderr.write=function(e){return typeof e=="string"&&Oc&&pE&&(e[e.length-1]===`
126
126
  `&&(e=e.slice(0,-1)),yy(e)),t4.apply(process.stderr,arguments)})}o(YAe,"stdioLogging");function d4(e,t,r=Ut){return e=e.replace(/ /g,"-"),{notify:n(r.notify,"notify"),fatal:n(r.fatal,"fatal"),error:n(r.error,"error"),warn:n(r.warn,"warn"),info:n(r.info,"info"),debug:n(r.debug,"debug"),trace:n(r.trace,"trace")};function n(s,i){return!t||r.level<=ar[i]?function(...a){Ay=e;try{return s.call(r,...a)}finally{Ay=void 0}}:null}o(n,"logWithTag")}o(d4,"loggerWithTag");function WAe(e){try{Oc=!1,e()}finally{Oc=!0}}o(WAe,"suppressLogging");var zAe=BAe?.name?.replace(/ /g,"-")||"main",gn="info",UD,Ay;function by({path:e,level:t,stdStreams:r,rotation:n,isExternalInstance:s,writeToLog:i,component:a}){t||(t="info");let c=ar[t],l;function u(h){if(EE)if(l.logToStdstreams){f(h.replace(/\x1b\[[0-9;]*m/g,"")),Oc=!1;try{process.stdout.write(h)}finally{Oc=!0}}else f(h);else r&&process.stdout.write(h)}o(u,"logStdOut");function d(h){if(EE){if(f(h),r){Oc=!1;try{process.stderr.write(h)}finally{Oc=!0}}}else r&&process.stderr.write(h)}o(d,"logStdErr");let f=e&&i4(e,n,s);function m(h){return{write(p){let _=[gn];_.unshift(UD||zAe+"/"+FAe),Ay&&_.push(Ay),l.tag&&_.push(l.tag),h(`[${_.join("] [")}]: ${p}`)}}}if(o(m,"logPrepend"),s&&(yy=f),l=new vD({stdout:m(i??u),stderr:m(i??d),colorMode:r??!1},c),l4(l),l.path=e,Object.defineProperty(l,"path",{get(){return e},set(h){e=h,f=i4(e,l.rotation,s),s&&(yy=f)},enumerable:!0}),l.closeLogFile=f?.closeLogFile,l.logToStdstreams=r,!a){let h=new Map;l.forComponent=function(p){let _=h.get(p);return _||(_=by({path:e,level:t,stdStreams:r,isExternalInstance:p==="external",rotation:n,writeToLog:i,component:!0}),h.set(p,_)),_},l.hasComponent=function(p){return h.has(p)}}return l}o(by,"createLogger");var s4=100;function i4(e,t,r){let n=r4.get(e),s,i,a,c,l=0;n||(n=d,n.closeLogFile=m,n.path=e,r4.set(e,n)),o4&&JSON.stringify(t)!==JSON.stringify(n.rotation)&&(n.rotation=t,setTimeout(()=>{if(n.rotator?.end(),!t)return;let p=WJ();try{n.rotator=p({logger:n,...t})}catch(_){n("Error initializing log rotator",_)}},100));let u=0;return n;function d(p){u++;let _=`${new Date().toISOString()} ${p}${p.endsWith(`
127
127
  `)?"":`