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.
@@ -30,7 +30,7 @@ Host ${s}
30
30
  IdentitiesOnly yes`;await Ie.pathExists(l)?await Ie.appendFile(l,`
31
31
  `+u):await Ie.outputFile(l,u);let d="";if(await Ie.pathExists(Jo)||(await Ie.writeFile(Jo,""),await Ie.chmod(Jo,"0600")),i=="github.com"&&!(await Ie.readFile(Jo,"utf8")).includes("github.com"))try{let _=(await(await fetch("https://api.github.com/meta")).json()).ssh_keys;for(let g of _)Ie.appendFile(Jo,"github.com "+g+`
32
32
  `)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(Jo,a);let f=await Ri(e);return f.message=`Added ssh key: ${r}${d}`,f}o(T_e,"addSSHKey");async function R_e(e){let t=Fn.updateSSHKeyValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{name:r,key:n}=e;Qt.trace("updating ssh key",r);let s=Oe.join(hc,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 Ri(e);return i.message=`Updated ssh key: ${r}`,i}o(R_e,"updateSSHKey");async function y_e(e){let t=Fn.deleteSSHKeyValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{name:r}=e;Qt.trace("deleting ssh key",r);let n=Oe.join(hc,r+".key"),s=Oe.join(hc,"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 Ri(e);return c.message=`Deleted ssh key: ${r}`,c}o(y_e,"deleteSSHKey");async function A_e(e){let t=[];return await Ie.pathExists(hc)&&(await Ie.readdir(hc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(A_e,"listSSHKeys");async function b_e(e){let t=Fn.setSSHKnownHostsValidator(e);if(t)throw Jt(t,t.message,Xt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(Jo,r);let n=await Ri(e);return n.message="Known hosts successfully set",n}o(b_e,"setSSHKnownHosts");async function I_e(e){return await Ie.pathExists(Jo)?{known_hosts:await Ie.readFile(Jo,"utf8")}:{known_hosts:null}}o(I_e,"getSSHKnownHosts");ir.customFunctionsStatus=o_e;ir.getCustomFunctions=a_e;ir.getCustomFunction=c_e;ir.setCustomFunction=l_e;ir.dropCustomFunction=u_e;ir.addComponent=d_e;ir.dropCustomFunctionProject=f_e;ir.packageComponent=m_e;ir.deployComponent=h_e;ir.getComponents=E_e;ir.getComponentFile=__e;ir.setComponentFile=g_e;ir.dropComponent=S_e;ir.addSSHKey=T_e;ir.updateSSHKey=R_e;ir.deleteSSHKey=y_e;ir.listSSHKeys=A_e;ir.setSSHKnownHosts=b_e;ir.getSSHKnownHosts=I_e});var $C=M((RBe,QY)=>{"use strict";var Hs=require("joi"),jY=nt();QY.exports={readTransactionLogValidator:N_e,deleteTransactionLogsBeforeValidator:w_e};function N_e(e){let t=Hs.object({schema:Hs.string(),database:Hs.string(),table:Hs.string().required(),from:Hs.date().timestamp(),to:Hs.date().timestamp(),limit:Hs.number().min(1)});return jY.validateBySchema(e,t)}o(N_e,"readTransactionLogValidator");function w_e(e){let t=Hs.object({schema:Hs.string(),database:Hs.string(),table:Hs.string().required(),timestamp:Hs.date().timestamp().required()});return jY.validateBySchema(e,t)}o(w_e,"deleteTransactionLogsBeforeValidator")});var VT=M((ABe,rW)=>{"use strict";var VC=(H(),v(Y)),Op=Gt(),JY=se(),XY=oe(),ZY=Ki(),eW=j(),{handleHDBError:GT,hdbErrors:O_e}=ge(),{HTTP_STATUS_CODES:$T}=O_e,{readTransactionLogValidator:C_e,deleteTransactionLogsBeforeValidator:P_e}=$C(),tW=Xn(),L_e="Logs successfully deleted from transaction log.",D_e="All logs successfully deleted from transaction log.";rW.exports={readTransactionLog:M_e,deleteTransactionLogsBefore:U_e};async function M_e(e){let t=C_e(e);if(t)throw GT(t,t.message,$T.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=JY.checkSchemaTableExist(e.database,e.table);if(r)throw GT(new Error,r,$T.NOT_FOUND,void 0,void 0,!0);return XY.get(VC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await v_e(e):(eW.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)),tW.readAuditLog(e))}o(M_e,"readTransactionLog");async function*v_e(e){let t=ZY.createNatsTableStreamName(e.database,e.table),r=await Op.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===VC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(v_e,"readTransactionLogNats");async function U_e(e){let t=P_e(e);if(t)throw GT(t,t.message,$T.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!XY.get(VC.CONFIG_PARAMS.CLUSTERING_ENABLED))return eW.info("Delete transaction logs called for Plexus"),tW.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=JY.checkSchemaTableExist(r,n);if(i)throw GT(new Error,i,$T.NOT_FOUND,void 0,void 0,!0);let a=ZY.createNatsTableStreamName(r,n),{jsm:c}=await Op.getNATSReferences(),l=await Op.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=L_e,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=D_e):f=(await Op.viewStream(a,parseInt(s),1))[0].nats_sequence,await Op.purgeTableStream(r,n,{seq:f}),d}o(U_e,"deleteTransactionLogsBefore")});var zC={};we(zC,{describeMetric:()=>cW,describeMetricOp:()=>WC,get:()=>oW,getOp:()=>KC,listMetrics:()=>aW,listMetricsOp:()=>YC});async function B_e(e){return(await Dg().get(e)).hostname}function nW(e,t){return e.length===0||e.includes(t)}function KC(e){return Cp.trace?.("get_analytics request:",e),oW(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function iW(e){return"conditions"in e?{...e,conditions:e.conditions.map(iW)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function oW(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(iW));let a=t??[];nW(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),Cp.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],nW(a,"node")&&(Cp.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await B_e(d)),Cp.trace?.("get_analytics result:",JSON.stringify(u)),u})}function YC(e){return aW(e.metric_types,e.custom_metrics_window)}async function aW(e=["builtin"],t=x_e){let r=[],n=Object.values(xo);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 WC(e){return cW(e.metric)}async function cW(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 Cp.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var sW,x_e,Cp,jC=ce(()=>{sW=w(j());RN();yN();x_e=1e3*60*60*24*7,Cp=(0,sW.forComponent)("analytics").conditional;o(B_e,"lookupHostname");o(nW,"isSelected");o(KC,"getOp");o(iW,"conformCondition");o(oW,"get");o(YC,"listMetricsOp");o(aW,"listMetrics");o(WC,"describeMetricOp");o(cW,"describeMetric")});var KT,YT,Pp,WT=ce(()=>{KT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},YT=Object.keys(KT),Pp="primary"});function uW(e){return lW.validateBySchema(e,q_e)}var Lp,lW,F_e,H_e,k_e,q_e,dW=ce(()=>{Lp=w(require("joi")),lW=w(nt());WT();F_e=YT,H_e=Object.entries(KT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),k_e=o(()=>{let e=Lp.default.string().min(1).max(512);return Object.entries(KT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Lp.default.string().valid(...r.allowedValues).messages({"any.only":H_e[t]})}))}),e.required()},"createStatusValidationSchema"),q_e=Lp.default.object({id:Lp.default.string().valid(...F_e).required(),status:k_e()});o(uW,"validateStatus")});var eP={};we(eP,{DEFAULT_STATUS_ID:()=>Pp,STATUS_IDS:()=>YT,Status:()=>Xo,clear:()=>JC,get:()=>XC,set:()=>ZC});function Mp(){return QC||(QC=je({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),QC}function JC({id:e}){return Dp.debug?.("clearStatus",e),Mp().delete(e)}function $_e(){return Dp.debug?.("getAllStatus"),Mp().get({})}function XC({id:e}){return e?(Dp.debug?.("getStatus",e),Mp().get(e)):(Dp.debug?.("getStatus","all"),$_e())}function ZC({status:e,id:t=Pp}){let r=uW({status:e,id:t});if(r)throw(0,zT.handleHDBError)(r,r.message,G_e.BAD_REQUEST);return Dp.debug?.("setStatus",t,e),Mp().put(t,{status:e})}var zT,fW,G_e,QC,Xo,Dp,vp=ce(()=>{Me();zT=w(ge()),fW=w(ri());dW();WT();WT();({HTTP_STATUS_CODES:G_e}=zT.hdbErrors);o(Mp,"getStatusTable");Xo={get primaryStore(){return Mp().primaryStore}},Dp=(0,fW.loggerWithTag)("status");o(JC,"clearStatus");o($_e,"getAllStatus");o(XC,"getStatus");o(ZC,"setStatus")});var hW=M((qBe,mW)=>{"use strict";var tP=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}};mW.exports=tP});var EW=M(($Be,pW)=>{"use strict";var rP=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};pW.exports=rP});var sP=M((KBe,gW)=>{"use strict";var _W=hW(),V_e=EW(),{HDB_ERROR_MSGS:K_e}=tn(),nP=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=K_e.OP_AUTH_PERMS_ERROR,this.unauthorized_access={},this.invalid_schema_items=[]}handleUnauthorizedItem(t){return this.invalid_schema_items=[],this.unauthorized_access=[t],this}handleInvalidItem(t){return this.invalid_schema_items=[t],this.unauthorized_access=[],this}addInvalidItem(t,r,n){if(r&&n){let s=`${r}_${n}`;if(this.unauthorized_access[s])return}this.invalid_schema_items.push(t)}addUnauthorizedTable(t,r,n){let s=new _W(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new V_e(c,s[c]);i.push(l)});let a=`${r}_${n}`;if(this.unauthorized_access[a])this.unauthorized_access[a].required_attribute_permissions=i;else{let c=new _W(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}};gW.exports=nP});var XT=M((WBe,UW)=>{"use strict";var iP=on(),jT=sn(),ks=$d(),Bp=vo(),oP=ka(),Y_e=lO(),W_e=yV(),Fp=rs(),QT=Ih(),Nr=j(),z_e=hO(),j_e=lT(),Q_e=qO(),J_e=dT(),X_e=VO(),Z_e=KO(),ege=zO(),tge=QO(),aP=ET(),Zo=se(),rge=eK(),cP=lC(),RW=cf(),gn=(H(),v(Y)),yW=hY(),nge=Yd(),AW=(Ad(),v(Dh)),bW=(xT(),v(Tp)),IW=Ot(),Er=kC(),sge=require("alasql"),NW=VT(),wW=bp(),mf=as(),OW=(zd(),v(Wd)),lP=(jC(),v(zC)),uP=(vp(),v(eP)),CW=sP(),{handleHDBError:Hn,hdbErrors:PW}=ge(),{HDB_ERROR_MSGS:Jr,HTTP_STATUS_CODES:Up}=PW,{cleanupOrphanBlobs:ige}=$d(),X=new Map,LW="delete",pc="insert",qs="read",Xl="update",xp="describe",SW=Bp.describeSchema.name,TW=Bp.describeTable.name,DW={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},oge={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},age="catchup",cge="handleGetJob",lge="handleGetJobsByStartDate",JT={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},uge=[ks.createTable.name,ks.createAttribute.name,ks.dropTable.name,ks.dropAttribute.name],MW={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(iP.insert.name,new te(!1,[pc]));X.set(iP.update.name,new te(!1,[Xl]));X.set(iP.upsert.name,new te(!1,[pc,Xl]));X.set(jT.searchByConditions.name,new te(!1,[qs]));X.set(jT.searchByHash.name,new te(!1,[qs]));X.set(jT.searchByValue.name,new te(!1,[qs]));X.set(jT.search.name,new te(!1,[qs]));X.set(ks.createSchema.name,new te(!0,[]));X.set(ks.createTable.name,new te(!0,[]));X.set(ks.createAttribute.name,new te(!1,[pc]));X.set(ks.dropSchema.name,new te(!0,[]));X.set(ks.dropTable.name,new te(!0,[]));X.set(ks.dropAttribute.name,new te(!0,[]));X.set(Bp.describeSchema.name,new te(!1,[qs]));X.set(Bp.describeTable.name,new te(!1,[qs]));X.set(oP.deleteRecord.name,new te(!1,[LW]));X.set(Fp.addUser.name,new te(!0,[]));X.set(Fp.alterUser.name,new te(!0,[]));X.set(Fp.dropUser.name,new te(!0,[]));X.set(Fp.listUsersExternal.name,new te(!0,[]));X.set(QT.listRoles.name,new te(!0,[]));X.set(QT.addRole.name,new te(!0,[]));X.set(QT.alterRole.name,new te(!0,[]));X.set(QT.dropRole.name,new te(!0,[]));X.set(z_e.name,new te(!0,[]));X.set(j_e.name,new te(!0,[]));X.set(Q_e.name,new te(!0,[]));X.set(J_e.name,new te(!0,[]));X.set(X_e.name,new te(!0,[]));X.set(Z_e.name,new te(!0,[]));X.set(aP.setRoutes.name,new te(!0,[]));X.set(aP.getRoutes.name,new te(!0,[]));X.set(aP.deleteRoutes.name,new te(!0,[]));X.set(IW.setConfiguration.name,new te(!0,[]));X.set(ege.clusterStatus.name,new te(!0,[]));X.set(tge.name,new te(!0,[]));X.set(cP.getFingerprint.name,new te(!0,[]));X.set(cP.setLicense.name,new te(!0,[]));X.set(oP.deleteFilesBefore.name,new te(!0,[]));X.set(oP.deleteAuditLogsBefore.name,new te(!0,[]));X.set(RW.restart.name,new te(!0,[]));X.set(RW.restartService.name,new te(!0,[]));X.set(Y_e.name,new te(!0,[]));X.set(W_e.name,new te(!0,[qs]));X.set(ige.name,new te(!0,[]));X.set(nge.systemInformation.name,new te(!0,[]));X.set(IW.getConfiguration.name,new te(!0,[]));X.set(NW.readTransactionLog.name,new te(!0,[]));X.set(NW.deleteTransactionLogsBefore.name,new te(!0,[]));X.set(wW.installModules.name,new te(!0,[]));X.set(wW.auditModules.name,new te(!0,[]));X.set(mf.createCsr.name,new te(!0,[]));X.set(mf.signCertificate.name,new te(!0,[]));X.set(mf.listCertificates.name,new te(!0,[]));X.set(mf.addCertificate.name,new te(!0,[]));X.set(mf.removeCertificate.name,new te(!0,[]));X.set(mf.getKey.name,new te(!0,[]));X.set(OW.addNodeBack.name,new te(!0,[]));X.set(OW.removeNodeBack.name,new te(!0,[]));X.set(lP.getOp.name,new te(!1,[qs]));X.set(lP.listMetricsOp.name,new te(!1,[qs]));X.set(lP.describeMetricOp.name,new te(!1,[qs]));X.set(uP.clear.name,new te(!0,[]));X.set(uP.get.name,new te(!0,[]));X.set(uP.set.name,new te(!0,[]));X.set(AW.createTokens.name,new te(!1,[]));X.set(AW.refreshOperationToken.name,new te(!1,[]));X.set(bW.login.name,new te(!1,[]));X.set(bW.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(cP.getRegistrationInfo.name,new te(!1,[]));X.set(Fp.userInfo.name,new te(!1,[]));X.set(Bp.describeAll.name,new te(!1,[]));X.set(cge,new te(!1,[]));X.set(lge,new te(!0,[]));X.set(age,new te(!0,[]));X.set(JT.CSV_DATA_LOAD,new te(!1,[pc,Xl]));X.set(JT.CSV_URL_LOAD,new te(!1,[pc,Xl]));X.set(JT.CSV_FILE_LOAD,new te(!1,[pc,Xl]));X.set(JT.IMPORT_FROM_S3,new te(!1,[pc,Xl]));X.set(MW.EXPORT_TO_S3,new te(!0,[]));X.set(MW.EXPORT_LOCAL,new te(!0,[]));X.set(gn.VALID_SQL_OPS_ENUM.DELETE,new te(!1,[LW]));X.set(gn.VALID_SQL_OPS_ENUM.SELECT,new te(!1,[qs]));X.set(gn.VALID_SQL_OPS_ENUM.INSERT,new te(!1,[pc]));X.set(gn.VALID_SQL_OPS_ENUM.UPDATE,new te(!1,[Xl]));UW.exports={verifyPerms:fge,verifyPermsAst:dge,verifyBulkLoadAttributePerms:hge};function dge(e,t,r){if(Zo.isEmptyOrZeroLength(e))throw Nr.info("verify_perms_ast has an empty user parameter"),Hn(new Error);if(Zo.isEmptyOrZeroLength(t))throw Nr.info("verify_perms_ast has an empty user parameter"),Hn(new Error);if(Zo.isEmptyOrZeroLength(r))throw Nr.info("verify_perms_ast has a null operation parameter"),Hn(new Error);try{let n=new CW,s=new rge(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&&DW[r])throw Hn(new Error,Jr.DROP_SYSTEM,Up.FORBIDDEN);if(c&&!l)return null;let u=yW.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof sge.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=vW(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]),_=fP(t.role.permission,m,f[h]);dP(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw Hn(n)}}o(dge,"verifyPermsAst");function fge(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,Jr.DEFAULT_INVALID_REQUEST,Up.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 CW;if(Zo.isEmptyOrZeroLength(e.hdb_user?.role)||Zo.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Nr.info(`User ${e.hdb_user?.username} has no role or permissions. Please assign the user a valid role.`),c.handleUnauthorizedItem(Jr.USER_HAS_NO_PERMS(e.hdb_user?.username));let l=!!e.hdb_user?.role?.permission?.super_user,u=e.hdb_user?.role?.permission?.structure_user,d=a.has(gn.SYSTEM_SCHEMA_NAME)||s===gn.SYSTEM_SCHEMA_NAME;if(l&&d&&oge[e.operation]&&(i===gn.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===gn.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===gn.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&DW[r])throw Hn(new Error,Jr.DROP_SYSTEM,Up.FORBIDDEN);if(l&&!d||u===!0&&(r===ks.createSchema.name||r===ks.dropSchema.name))return null;if(uge.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=yW.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===SW||r===TW)&&!f.super_user){if(s===gn.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Jr.SCHEMA_PERM_ERROR(s));if(r===SW&&(!f[s]||!f[s][xp]))return c.handleInvalidItem(Jr.SCHEMA_NOT_FOUND(s));if(r===TW&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][xp]))return c.handleInvalidItem(Jr.TABLE_NOT_FOUND(s,i))}let m=vW(e.hdb_user,r,a,c,n);if(m)return m;if(X.get(r)&&X.get(r).perms.length===0)return null;if(!l&&e.get_attributes&&gn.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[gn.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[gn.PERMS_CRUD_ENUM.READ]).forEach(T=>{_.push(T.attribute_name)}):_=global.hdb_schema[s][i].attributes.map(R=>R.attribute),e.get_attributes=_)}let h=mge(e),p=fP(e.hdb_user?.role?.permission,s,i);return dP(h,p,r,i,s,c,n),c.getPermsResponse()}o(fge,"verifyPerms");function vW(e,t,r,n,s){if(Zo.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,Jr.OP_NOT_FOUND(t),Up.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return Nr.info(`operation ${t} requires SU permissions.`),n.handleUnauthorizedItem(Jr.OP_IS_SU_ONLY(t));let c=r.keys();for(let l of c){try{if(l&&!a[l]||a[l][xp]===!1){n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}}catch{n.addInvalidItem(Jr.SCHEMA_NOT_FOUND(l));continue}let u=r.get(l);for(let d of u){let f=a[l].tables[d];if(!f||f[xp]===!1)n.addInvalidItem(Jr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!Zo.isEmpty(s)&&h.includes(s)&&(h=[s]);for(let p=0;p<h.length;p++){let _=h[p],g=f[_];(g==null||g===!1)&&(Nr.info(`Required ${_} permission not found for ${t} ${s?`${s} `:""}operation in role ${e.role.id}`),m.push(_))}m.length>0&&n.addUnauthorizedTable(l,d,m)}catch(m){let h=Jr.UNKNOWN_OP_AUTH_ERROR(t,l,d);throw Nr.error(h),Nr.error(m),Hn(PW.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(vW,"hasPermissions");function dP(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(Zo.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[xp]===!1){i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(gn.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==qs)throw Hn(new Error,Jr.SYSTEM_TIMESTAMP_PERMS_ERR,Up.FORBIDDEN);f[m]===!1&&(l[f.attribute_name]?l[f.attribute_name].push(m):l[f.attribute_name]=[m])}}else i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n)}let u=Object.keys(l);u.length>0&&i.addUnauthorizedAttributes(u,s,n,l)}o(dP,"checkAttributePerms");function mge(e){let t=new Set;try{if(e.action)return t;if(e.operation===gn.OPERATIONS_ENUM.SEARCH_BY_CONDITIONS&&e.conditions.forEach(r=>{t.add(r.search_attribute)}),e&&e.search_attribute&&t.add(e.search_attribute),!e.records||e.records.length===0){if(!e.get_attributes||!e.get_attributes.length===0)return t;for(let r=0;r<e.get_attributes.length;r++)t.add(e.get_attributes[r])}else for(let r=0;r<e.records.length;r++){let n=Object.keys(e.records[r]);for(let s=0;s<n.length;s++)t.add(n[s])}}catch(r){Nr.info(r)}return t}o(mge,"getRecordAttributes");function fP(e,t,r){let n=new Map;if(Zo.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(fP,"getAttributePermissions");function hge(e,t,r,n,s,i,a){let c=new Set(i),l=fP(e,n,s);dP(c,l,t,s,n,a,r)}o(hge,"verifyBulkLoadAttributePerms")});var eR=M((jBe,kW)=>{"use strict";kW.exports={evaluateSQL:wge,processAST:HW,convertSQLToAST:FW,checkASTPermissions:BW};var pge=on(),xW=require("util"),Ege=xW.callbackify(pge.insert),_ge=sn().search,gge=mG().update,Sge=xW.callbackify(gge),Tge=pG().convertDelete,Ec=require("alasql"),Rge=XT(),ZT=j(),yge=fg(),Age=se(),Hp=(H(),v(Y)),{hdbErrors:bge,handleHDBError:mP}=ge(),{HTTP_STATUS_CODES:hP}=bge;yge(Ec);var Ige=403,Nge="There was a problem performing this insert. Please check the logs and try again.",pP=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function wge(e,t){let r=e.parsed_sql_object;if(!r){r=FW(e.sql);let n,s=r.ast.statements[0];if(s instanceof Ec.yy.Insert?n=s.into.databaseid:s instanceof Ec.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof Ec.yy.Update||s instanceof Ec.yy.Delete?n=s.table.databaseid:ZT.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof Ec.yy.Select)&&Age.isEmptyOrZeroLength(n))return t("No schema specified",null)}HW(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(wge,"evaluateSQL");function BW(e,t){let r;try{r=Rge.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(BW,"checkASTPermissions");function FW(e){let t=new pP;if(!e)throw mP(new Error,"The 'sql' parameter is missing from the request body",hP.BAD_REQUEST);try{let r=e.trim(),n=Ec.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
33
- `);throw n[1]?mP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,hP.BAD_REQUEST):mP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",hP.BAD_REQUEST)}return t}o(FW,"convertSQLToAST");function HW(e,t,r){try{let n=Oge;if(!e.bypass_auth&&!t.permissions_checked){let i=BW(e,t);if(i&&i.length>0)return r(Ige,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case Hp.VALID_SQL_OPS_ENUM.SELECT:n=_ge,s=t.ast.statements[0];break;case Hp.VALID_SQL_OPS_ENUM.INSERT:n=Cge;break;case Hp.VALID_SQL_OPS_ENUM.UPDATE:n=Sge;break;case Hp.VALID_SQL_OPS_ENUM.DELETE:n=Tge;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(HW,"processAST");function Oge(e,t){ZT.info(e),t("unknown sql statement")}o(Oge,"nullFunction");function Cge({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=Pge(i,e.values)}catch(a){return r(a)}Ege(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){ZT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(Cge,"convertInsert");function Pge(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]]=Ec.compile(`SELECT ${s.toString()} AS [${Hp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw ZT.error(r),new Error(Nge)}}o(Pge,"createDataObjects")});var RP=M((ZBe,VW)=>{var sR=require("clone"),iR=nt(),Lge=se(),rR=(H(),v(Y)),JBe=j(),EP=require("fs"),gP=require("joi"),{string:nR}=gP.types(),{hdbErrors:Dge,handleHDBError:tR}=ge(),{HDB_ERROR_MSGS:XBe,HTTP_STATUS_CODES:_P}=Dge,{commonValidators:hf}=qi(),qW=" is required",Mge=["insert","update","upsert"],SP={database:{presence:!1,format:hf.schema_format,length:hf.schema_length},schema:{presence:!1,format:hf.schema_format,length:hf.schema_length},table:{presence:!0,format:hf.schema_format,length:hf.schema_length},action:{inclusion:{within:Mge,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},vge={schema:nR.required(),table:nR.required(),action:nR.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Uge,AWS_SECRET:xge,AWS_BUCKET:Bge,AWS_FILE_KEY:Fge,REGION:Hge}=rR.S3_BUCKET_AUTH_KEYS,kge={s3:{presence:!0},[`s3.${Uge}`]:{presence:!0,type:"String"},[`s3.${xge}`]:{presence:!0,type:"String"},[`s3.${Bge}`]:{presence:!0,type:"String"},[`s3.${Fge}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Hge}`]:{presence:!0,type:"String"}},GW=sR(SP);GW.data.presence={message:qW};var $W=sR(SP);$W.file_path.presence={message:qW};var qge=Object.assign(sR(SP),kge),TP=sR(vge);TP.csv_url=nR.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();TP.passthrough_headers=gP.object();function Gge(e){let t=iR.validateObject(e,GW);return oR(e,t)}o(Gge,"dataObject");function $ge(e){let t=iR.validateBySchema(e,gP.object(TP));return oR(e,t)}o($ge,"urlObject");function Vge(e){let t=iR.validateObject(e,$W);return oR(e,t)}o(Vge,"fileObject");function Kge(e){let t=iR.validateObject(e,qge);return oR(e,t)}o(Kge,"s3FileObject");function oR(e,t){if(!t){let r=Lge.checkGlobalSchemaTable(e.schema,e.table);if(r)return tR(new Error,r,_P.BAD_REQUEST);if(e.operation===rR.OPERATIONS_ENUM.CSV_FILE_LOAD)try{EP.accessSync(e.file_path,EP.constants.R_OK|EP.constants.F_OK)}catch(n){return n.code===rR.NODE_ERROR_CODES.ENOENT?tR(n,`No such file or directory ${n.path}`,_P.BAD_REQUEST):n.code===rR.NODE_ERROR_CODES.EACCES?tR(n,`Permission denied ${n.path}`,_P.BAD_REQUEST):tR(n)}}return t}o(oR,"postValidateChecks");VW.exports={dataObject:Gge,urlObject:$ge,fileObject:Vge,s3FileObject:Kge}});var yP=M((tFe,KW)=>{"use strict";var kp=j(),aR=(H(),v(Y));async function Yge(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===aR.OPERATIONS_ENUM.INSERT||t.operation===aR.OPERATIONS_ENUM.UPDATE||t.operation===aR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===aR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(kp.info(i.message),i):i.http_resp_msg?(kp.error(`Error calling operation: ${e.name}`),kp.error(i.http_resp_msg),i):(kp.error(`Error calling operation: ${e.name}`),kp.error(i),i)}}o(Yge,"callOperationFunctionAsAwait");KW.exports={callOperationFunctionAsAwait:Yge}});var AP=M((nFe,WW)=>{"use strict";var{S3:Wge,GetObjectCommand:zge}=require("@aws-sdk/client-s3");WW.exports={getFileStreamFromS3:jge,getS3AuthObj:YW};async function jge(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await YW(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new zge(r))).Body}o(jge,"getFileStreamFromS3");function YW(e,t,r){return new Wge({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(YW,"getS3AuthObj")});var jW=M((iFe,zW)=>{"use strict";var bP=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}},IP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};zW.exports={BulkLoadFileObject:bP,BulkLoadDataObject:IP}});var wP=M((aFe,QW)=>{"use strict";var NP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};QW.exports=NP});var MP=M((mFe,mz)=>{"use strict";var cR=on(),uR=RP(),Qge=require("needle"),yi=(H(),v(Y)),lFe=mt(),pf=se(),{handleHDBError:Zt,hdbErrors:iz}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:eu}=iz,Ef=j(),OP=require("papaparse");pf.promisifyPapaParse();var Ai=require("fs-extra"),Jge=require("path"),{chain:JW}=require("stream-chain"),XW=require("stream-json/streamers/StreamArray"),ZW=require("stream-json/utils/Batch"),ez=require("stream-chain/utils/comp"),{finished:tz}=require("stream"),Xge=oe(),oz=yP(),Zge=AP(),{BulkLoadFileObject:PP,BulkLoadDataObject:eSe}=jW(),LP=sP(),{verifyBulkLoadAttributePerms:az}=XT(),uFe=wP(),dFe=Gt(),fFe=Ki(),{databases:tSe}=(Me(),v(_t)),{coerceType:rSe}=(B_(),v(Gk)),rz="No records parsed from csv file.",Zl=`${Xge.get("HDB_ROOT")}/tmp`,{schemaRegex:nSe}=qi(),nz=1024*1024*2,sz=5e3,sSe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};mz.exports={csvDataLoad:iSe,csvURLLoad:oSe,csvFileLoad:aSe,importFromS3:cSe};async function iSe(e,t){let r=uR.dataObject(e);if(r)throw Zt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=uz(e.schema,e.table),i=OP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:CP.bind(null,s),dynamicTyping:!1}),a=new LP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&az(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 Zt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new eSe(e.action,e.schema,e.table,i.data);return n=await oz.callOperationFunctionAsAwait(dz,l,null),n.message===rz?rz:fz(n.records,n.number_written)}catch(s){throw tu(s)}}o(iSe,"csvDataLoad");async function oSe(e){let t=uR.urlObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Zl}/${r}`;try{await lSe(e,r)}catch(s){throw Ef.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Zt(s,eu(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new PP(this.job_operation_function.name,e.action,e.schema,e.table,n,yi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await DP(s);return await lR(n),i}catch(s){throw await lR(n),tu(s)}}o(oSe,"csvURLLoad");async function aSe(e){let t=uR.fileObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new PP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,yi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await DP(r)}catch(n){throw tu(n)}}o(aSe,"csvFileLoad");async function cSe(e){let t=uR.s3FileObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=Jge.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Zl}/${s}`;let i=new PP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await uSe(s,e);let a=await DP(i);return await lR(r),a}catch(n){throw await lR(r),tu(n)}}o(cSe,"importFromS3");async function lSe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await Qge("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 Zt(n,s,n.statusCode,yi.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}fSe(r,e.csv_url),await dSe(t,r.raw)}o(lSe,"downloadCSVFile");async function uSe(e,t){try{let r=`${Zl}/${e}`;await Ai.mkdirp(Zl),await Ai.writeFile(`${Zl}/${e}`,"",{flag:"a+"});let n=await Ai.createWriteStream(r),s=await Zge.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(){Ef.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw Ef.error(wr.S3_DOWNLOAD_ERR+" - "+r),Zt(r,eu(wr.S3_DOWNLOAD_ERR))}}o(uSe,"downloadFileFromS3");async function dSe(e,t){try{await Ai.mkdirp(Zl),await Ai.writeFile(`${Zl}/${e}`,t)}catch(r){throw Ef.error(wr.WRITE_TEMP_FILE_ERR),Zt(r,eu(wr.DEFAULT_BULK_LOAD_ERR))}}o(dSe,"writeFileToTempFolder");async function lR(e){if(e)try{await Ai.access(e),await Ai.unlink(e)}catch{Ef.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(lR,"deleteTempFile");function fSe(e,t){if(e.statusCode!==iz.HTTP_STATUS_CODES.OK)throw Zt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!sSe[e.headers["content-type"]])throw Zt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Zt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(fSe,"validateURLResponse");async function DP(e){try{let t;switch(e.file_type){case yi.VALID_S3_FILE_TYPES.CSV:t=await mSe(e);break;case yi.VALID_S3_FILE_TYPES.JSON:t=await hSe(e);break;default:throw Zt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,yi.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return fz(t.records,t.number_written)}catch(t){throw tu(t)}}o(DP,"fileLoad");async function cz(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 cR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&az(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Zt(c);r(l)}}o(cz,"validateChunk");async function lz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;pf.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!pf.isEmpty(c)&&!pf.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 oz.callOperationFunctionAsAwait(dz,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Zt(c,eu(wr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(lz,"insertChunk");async function mSe(e){let t={records:0,number_written:0},r=uz(e.schema,e.table);try{let n=new LP,s=Ai.createReadStream(e.file_path,{highWaterMark:nz});s.setEncoding("utf8"),await OP.parsePromise(s,cz.bind(null,e,n),CP.bind(null,r));let i=n.getPermsResponse();if(i)throw Zt(new Error,i,Xr.BAD_REQUEST);return s=Ai.createReadStream(e.file_path,{highWaterMark:nz}),s.setEncoding("utf8"),await OP.parsePromise(s,lz.bind(null,e,t),CP.bind(null,r)),s.destroy(),t}catch(n){throw Zt(n,eu(wr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(mSe,"callPapaParse");function uz(e,t){let r=tSe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>rSe(i,s));return n}o(uz,"createTransformMap");function CP(e,t,r){let n=e.get(r);return n?n(t):pf.autoCast(t)}o(CP,"typeFunction");async function hSe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new LP,s=JW([Ai.createReadStream(e.file_path,{encoding:"utf-8"}),XW.withParser(),c=>c.value,new ZW({batchSize:sz}),ez(async c=>{await cz(e,n,r,c)})]);await new Promise((c,l)=>{tz(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Zt(new Error,i,Xr.BAD_REQUEST);let a=JW([Ai.createReadStream(e.file_path,{encoding:"utf-8"}),XW.withParser(),c=>c.value,new ZW({batchSize:sz}),ez(async c=>{await lz(e,t,r,c)})]);return await new Promise((c,l)=>{tz(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Zt(n,eu(wr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(hSe,"insertJson");async function dz(e){let t={};try{e.data&&e.data.length>0&&pSe(e.data[0])?t=await ESe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",Ef.info(t.message))}catch(r){throw tu(r)}return t}o(dz,"callBulkFileLoad");function pSe(e){let t=Object.keys(e);for(let r of t)if(!nSe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(pSe,"validateColumnNames");async function ESe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=cR.insert;break;case"update":i=cR.update;break;case"upsert":i=cR.upsert;break;default:throw Zt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,yi.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=pf.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw tu(a)}}o(ESe,"bulkFileLoad");function fz(e,t){return`successfully loaded ${t} of ${e} records`}o(fz,"buildResponseMsg");function tu(e){return Zt(e,eu(wr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(tu,"buildTopLevelErrMsg")});var xP=M((pFe,Rz)=>{"use strict";var UP=sn(),_Se=AP(),{AsyncParser:gSe}=require("json2csv"),dR=require("stream"),fs=se(),vP=require("fs-extra"),SSe=require("path"),Gs=j(),{promisify:Ez}=require("util"),qp=se(),{handleHDBError:_r,hdbErrors:TSe}=ge(),{HDB_ERROR_MSGS:kn,HTTP_STATUS_CODES:gr}=TSe,{streamAsJSON:RSe}=(CA(),v(Vv)),{Upload:ySe}=require("@aws-sdk/lib-storage"),{toCsvStream:ASe}=(yo(),v(eU)),hz=["search_by_value","search_by_hash","sql","search_by_conditions"],pz=["json","csv"],_z="json",gz="csv",bSe="Successfully exported JSON locally.",ISe="Successfully exported CSV locally.",NSe=1e3,wSe=UP.searchByHash,OSe=UP.searchByValue,CSe=Ez(dR.finished);Rz.exports={export_to_s3:MSe,export_local:PSe};async function PSe(e){Gs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=Sz(e);if(!fs.isEmpty(t))throw Gs.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(fs.isEmpty(e.path))throw Gs.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(SSe.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await LSe(e.path);let s=await Tz(e);return await DSe(n,e.format,s)}o(PSe,"export_local");async function LSe(e){if(Gs.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 vP.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,Gs.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 Gs.error(r),_r(new Error,r,gr.BAD_REQUEST,void 0,void 0,!0)}return!0}o(LSe,"confirmPath");async function DSe(e,t,r){if(Gs.trace("in saveToLocal"),qp.isEmptyOrZeroLength(e))throw _r(new Error,kn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmptyOrZeroLength(t))throw _r(new Error,kn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmpty(r))throw _r(new Error,kn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===_z){let n=vP.createWriteStream(e);return RSe(r).pipe(n),await CSe(n),{message:bSe,path:e}}else if(t===gz){let n=vP.createWriteStream(e),s=dR.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new gSe(i,c).fromInput(s).toOutput(n).promise(!1),{message:ISe,path:e}}throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(DSe,"saveToLocal");async function MSe(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=Sz(e);if(!fs.isEmpty(t))throw _r(new Error,t,gr.BAD_REQUEST);Gs.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await Tz(e)}catch(l){throw Gs.error(l),l}let n,s=await _Se.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new dR.PassThrough;if(e.format===gz){i=e.s3.key+".csv";let l=ASe(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===_z){i=e.s3.key+".json";let l=new dR.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%NSe===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 ySe({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(MSe,"export_to_s3");function Sz(e){if(Gs.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(pz.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${pz.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(hz.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${hz.join(", ")}`}o(Sz,"exportCoreValidation");async function Tz(e){Gs.trace("in getRecords");let t,r;if(qp.isEmpty(e.search_operation)||qp.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=OSe;break;case"search_by_hash":t=wSe;break;case"search_by_conditions":t=UP.searchByConditions;break;case"sql":{let n=eR();t=Ez(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,Gs.error(r),_r(new Error,r,gr.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(Tz,"getRecords")});var Az=M((_Fe,yz)=>{"use strict";var BP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};yz.exports=BP});var Nz=M((SFe,Iz)=>{"use strict";var vSe=(H(),v(Y)),bz=require("moment"),USe=require("uuid").v4,FP=class{static{o(this,"JobObject")}constructor(){this.id=USe(),this.type=void 0,this.start_datetime=bz().valueOf(),this.created_datetime=bz().valueOf(),this.end_datetime=void 0,this.status=vSe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};Iz.exports=FP});var HP=M((RFe,vz)=>{"use strict";var xSe=require("uuid").v4,Lz=on(),Dz=sn(),BSe=ci(),FSe=zu(),HSe=Az(),Dt=(H(),v(Y)),kSe=Nz(),qSe=Ch(),bi=j(),GSe=im(),_f=se(),{promisify:$Se}=require("util"),ru=require("moment"),VSe=eR(),fR=RP(),wz=qI(),{deleteTransactionLogsBeforeValidator:KSe}=$C(),{handleHDBError:Oz,hdbErrors:YSe,ClientError:WSe}=ge(),{HTTP_STATUS_CODES:Cz}=YSe,Pz=Dz.searchByValue,zSe=Dz.searchByHash,jSe=Lz.insert,QSe=$Se(VSe.evaluateSQL),JSe=Lz.update;vz.exports={addJob:eTe,updateJob:rTe,handleGetJob:XSe,handleGetJobsByStartDate:ZSe,getJobById:Mz};async function XSe(e){if(e.id===void 0)throw new WSe("'id' is required");let t=await Mz(e.id);return _f.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(XSe,"handleGetJob");async function ZSe(e){try{let t=await tTe(e);if(bi.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=ru(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=ru(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 bi.error(r),new Error(r)}}o(ZSe,"handleGetJobsByStartDate");async function eTe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||_f.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return bi.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return bi.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=fR.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=fR.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=fR.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=fR.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=wz(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=wz(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=KSe(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw Oz(new Error,"Invalid service",Cz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw Oz(n,n.message,Cz.BAD_REQUEST,void 0,void 0,!0);let s=new kSe;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 BSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await Pz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return bi.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=xSe();try{a=await Pz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return bi.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return bi.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new GSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await jSe(l)}catch(d){return bi.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,bi.trace(d)}return t}o(eTe,"addJob");async function tTe(e){let t=ru(e.from_date,ru.ISO_8601),r=ru(e.to_date,ru.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 HSe(n,e.hdb_user);try{return await QSe(s)}catch(i){throw bi.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(tTe,"getJobsInDateRange");async function Mz(e){if(_f.isEmptyOrZeroLength(e))return _f.errorizeMessage("Invalid job ID specified.");let t=new FSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await zSe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return bi.error(n),_f.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(Mz,"getJobById");async function rTe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(_f.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=ru().valueOf());let t=new qSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await JSe(t),r}o(rTe,"updateJob")});var Gz=M((AFe,qz)=>{"use strict";var Uz=se(),Or=(H(),v(Y)),nTe=require("moment"),mR=MP(),Gp=j(),xz=HP(),Bz=xP(),Fz=ka(),Hz=ze(),sTe=VT(),iTe=cf(),{parentPort:oTe,isMainThread:kz}=require("worker_threads"),{onMessageByType:aTe}=ze(),kP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function cTe(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(Uz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(Uz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await so(e,mR.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await so(e,mR.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await so(e,mR.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await so(e,mR.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await so(e,Bz.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await so(e,Bz.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await so(e,Fz.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,Fz.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,sTe.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await so(e,iTe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(cTe,"parseMessage");async function so(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=nTe().valueOf(),await xz.updateJob(e.job),await lTe(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):Gp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Gp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await xz.updateJob(e.job)}catch(s){throw Gp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function lTe(e){Gp.trace("launching job thread:",e),kz?Hz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):oTe.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(lTe,"launchJobThread");kz&&aTe(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{Hz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Gp.error(r)}});qz.exports={parseMessage:cTe,RunnerMessage:kP}});var Vz=M((IFe,$z)=>{"use strict";var uTe=se(),qP=oe(),_c=(H(),v(Y)),dTe=mt(),fTe=Gt(),io=j(),mTe=wP(),hTe=Ki();qP.initSync();$z.exports={postOperationHandler:ETe,sendOperationTransaction:$p};async function $p(e,t,r,n){if(e.schema===_c.SYSTEM_SCHEMA_NAME)return;let s=pTe(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await fTe.publishToStream(`${dTe.SUBJECT_PREFIXES.TXN}.${e.schema}`,hTe.createNatsTableStreamName(e.schema,e.table),n,s))}o($p,"sendOperationTransaction");function pTe(e,t,r){if(uTe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===_c.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(pTe,"convertCRUDOperationToTransaction");async function ETe(e,t,r){if(!qP.get(_c.CONFIG_PARAMS.CLUSTERING_ENABLED))return;io.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=qP.get(_c.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new mTe(t.txn_time,n,s);switch(e.operation){case _c.OPERATIONS_ENUM.INSERT:try{await $p(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case _c.OPERATIONS_ENUM.DELETE:try{await $p(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case _c.OPERATIONS_ENUM.UPDATE:try{await $p(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case _c.OPERATIONS_ENUM.UPSERT:try{await $p(e,t.upserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for upsert."),io.error(a)}break;default:break}return t}o(ETe,"postOperationHandler")});var J,Kz=ce(()=>{J=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var qC={};we(qC,{chooseOperation:()=>uj,executeJob:()=>$s,getOperationFunction:()=>dj,operation:()=>QP,processLocalTransaction:()=>lj});async function lj(e,t){try{if(e.body.operation!=="read_log"&&(Wp.default.log_level===jf.INFO||Wp.default.log_level===jf.DEBUG||Wp.default.log_level===jf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;Sn.info(c)}}catch(n){Sn.error(n)}let r=await aj.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return STe[e.body.operation]&&nj.default.setSchemaDataToGlobal(n=>{n&&Sn.error(n)}),r}function uj(e){let t;try{t=dj(e)}catch(s){throw Sn.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=e.operation==="sql"?e.sql:e.search_operation.sql,i=ER.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=ER.default.checkASTPermissions(e,i);if(a)throw Sn.error(`${Yz.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,Vs.handleHDBError)(new Error,a,Vs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==G.CREATE_AUTHENTICATION_TOKENS&&e.operation!==G.LOGIN&&e.operation!==G.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=rj.default.verifyPerms(i,s);if(a)throw Sn.error(`${Yz.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,Vs.handleHDBError)(new Error,a,Vs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,Vs.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function dj(e){if(Sn.trace(`getOperationFunction with operation: ${e.operation}`),Wz.has(e.operation))return Wz.get(e.operation);throw(0,Vs.handleHDBError)(new Error,Vs.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),Vs.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function QP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=uj(e);return lj({body:e},n)}async function TTe(e){Sn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[oA]=!0;let a;switch(i.operation){case G.INSERT:a=await su.default.insert(i);break;case G.UPDATE:a=await su.default.update(i);break;case G.UPSERT:a=await su.default.upsert(i);break;case G.DELETE:a=await Tf.default.deleteRecord(i);break;default:Sn.warn("invalid operation in catchup");break}await cj.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){Sn.info("Invalid operation in transaction"),Sn.error(a)}}async function $s(e){(0,oj.transformReq)(e);let t,r;try{if(r=await _R.default.addJob(e),r){t=r.createdJob,Sn.info("addJob result",r);let n=new KP.default.RunnerMessage(t,e);return{message:await KP.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw Sn.error(i),(0,Vs.handleHDBError)(n,i)}}function RTe(){let e=new Map;return e.set(G.INSERT,new J(su.default.insert)),e.set(G.UPDATE,new J(su.default.update)),e.set(G.UPSERT,new J(su.default.upsert)),e.set(G.SEARCH_BY_CONDITIONS,new J(Sf.default.searchByConditions)),e.set(G.SEARCH_BY_HASH,new J(Sf.default.searchByHash)),e.set(G.SEARCH_BY_ID,new J(Sf.default.searchByHash)),e.set(G.SEARCH_BY_VALUE,new J(Sf.default.searchByValue)),e.set(G.SEARCH,new J(_Te)),e.set(G.SQL,new J(gTe)),e.set(G.CSV_DATA_LOAD,new J($s,Vp.default.csvDataLoad)),e.set(G.CSV_FILE_LOAD,new J($s,Vp.default.csvFileLoad)),e.set(G.CSV_URL_LOAD,new J($s,Vp.default.csvURLLoad)),e.set(G.IMPORT_FROM_S3,new J($s,Vp.default.importFromS3)),e.set(G.CREATE_SCHEMA,new J(Ii.default.createSchema)),e.set(G.CREATE_DATABASE,new J(Ii.default.createSchema)),e.set(G.CREATE_TABLE,new J(Ii.default.createTable)),e.set(G.CREATE_ATTRIBUTE,new J(Ii.default.createAttribute)),e.set(G.DROP_SCHEMA,new J(Ii.default.dropSchema)),e.set(G.DROP_DATABASE,new J(Ii.default.dropSchema)),e.set(G.DROP_TABLE,new J(Ii.default.dropTable)),e.set(G.DROP_ATTRIBUTE,new J(Ii.default.dropAttribute)),e.set(G.DESCRIBE_SCHEMA,new J(Kp.default.describeSchema)),e.set(G.DESCRIBE_DATABASE,new J(Kp.default.describeSchema)),e.set(G.DESCRIBE_TABLE,new J(Kp.default.describeTable)),e.set(G.DESCRIBE_ALL,new J(Kp.default.describeAll)),e.set(G.DELETE,new J(Tf.default.deleteRecord)),e.set(G.ADD_USER,new J(gf.default.addUser)),e.set(G.ALTER_USER,new J(gf.default.alterUser)),e.set(G.DROP_USER,new J(gf.default.dropUser)),e.set(G.LIST_USERS,new J(gf.default.listUsersExternal)),e.set(G.LIST_ROLES,new J(Yp.default.listRoles)),e.set(G.ADD_ROLE,new J(Yp.default.addRole)),e.set(G.ALTER_ROLE,new J(Yp.default.alterRole)),e.set(G.DROP_ROLE,new J(Yp.default.dropRole)),e.set(G.USER_INFO,new J(gf.default.userInfo)),e.set(G.READ_LOG,new J(jz.default)),e.set(G.ADD_NODE,new J(Qz.default)),e.set(G.UPDATE_NODE,new J(GP.default)),e.set(G.SET_NODE_REPLICATION,new J(GP.default)),e.set(G.REMOVE_NODE,new J(Jz.default)),e.set(G.CONFIGURE_CLUSTER,new J(Xz.default)),e.set(G.PURGE_STREAM,new J(Zz.default)),e.set(G.SET_CONFIGURATION,new J(YP.default.setConfiguration)),e.set(G.CLUSTER_STATUS,new J(ej.default.clusterStatus)),e.set(G.CLUSTER_NETWORK,new J(tj.default)),e.set(G.CLUSTER_SET_ROUTES,new J(hR.default.setRoutes)),e.set(G.CLUSTER_GET_ROUTES,new J(hR.default.getRoutes)),e.set(G.CLUSTER_DELETE_ROUTES,new J(hR.default.deleteRoutes)),e.set(G.EXPORT_TO_S3,new J($s,$P.default.export_to_s3)),e.set(G.CREATE_CSR,new J(nu.default.createCsr)),e.set(G.SIGN_CERTIFICATE,new J(nu.default.signCertificate)),e.set(G.LIST_CERTIFICATES,new J(nu.default.listCertificates)),e.set(G.ADD_CERTIFICATES,new J(nu.default.addCertificate)),e.set(G.REMOVE_CERTIFICATE,new J(nu.default.removeCertificate)),e.set(G.GET_KEY,new J(nu.default.getKey)),e.set(G.ADD_NODE_BACK,new J(UO)),e.set(G.REMOVE_NODE_BACK,new J(xO)),e.set(G.DELETE_FILES_BEFORE,new J($s,Tf.default.deleteFilesBefore)),e.set(G.DELETE_RECORDS_BEFORE,new J($s,Tf.default.deleteFilesBefore)),e.set(G.EXPORT_LOCAL,new J($s,$P.default.export_local)),e.set(G.SEARCH_JOBS_BY_START_DATE,new J(_R.default.handleGetJobsByStartDate)),e.set(G.GET_JOB,new J(_R.default.handleGetJob)),e.set(G.GET_FINGERPRINT,new J(pR.default.getFingerprint)),e.set(G.SET_LICENSE,new J(pR.default.setLicense)),e.set(G.GET_REGISTRATION_INFO,new J(pR.default.getRegistrationInfo)),e.set(G.RESTART,new J(VP.default.restart)),e.set(G.RESTART_SERVICE,new J($s,VP.default.restartService)),e.set(G.CATCHUP,new J(TTe)),e.set(G.SYSTEM_INFORMATION,new J(sj.default.systemInformation)),e.set(G.DELETE_AUDIT_LOGS_BEFORE,new J($s,Tf.default.deleteAuditLogsBefore)),e.set(G.READ_AUDIT_LOG,new J(zz.default)),e.set(G.CREATE_AUTHENTICATION_TOKENS,new J(fw)),e.set(G.REFRESH_OPERATION_TOKEN,new J(mw)),e.set(G.LOGIN,new J(MC)),e.set(G.LOGOUT,new J(vC)),e.set(G.GET_CONFIGURATION,new J(YP.default.getConfiguration)),e.set(G.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(G.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(G.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(G.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(G.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(G.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(G.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(G.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(G.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(G.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(G.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(G.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(G.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(G.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(G.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(G.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(G.READ_TRANSACTION_LOG,new J(WP.default.readTransactionLog)),e.set(G.DELETE_TRANSACTION_LOGS_BEFORE,new J($s,WP.default.deleteTransactionLogsBefore)),e.set(G.INSTALL_NODE_MODULES,new J(zP.default.installModules)),e.set(G.AUDIT_NODE_MODULES,new J(zP.default.auditModules)),e.set(G.GET_BACKUP,new J(Ii.default.getBackup)),e.set(G.CLEANUP_ORPHAN_BLOBS,new J(Ii.default.cleanupOrphanBlobs)),e.set(G.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(G.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(G.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(G.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(G.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(G.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(G.GET_ANALYTICS,new J(KC)),e.set(G.LIST_METRICS,new J(YC)),e.set(G.DESCRIBE_METRIC,new J(WC)),e.set(G.GET_STATUS,new J(XC)),e.set(G.SET_STATUS,new J(ZC)),e.set(G.CLEAR_STATUS,new J(JC)),e}var Sf,ER,Vp,Ii,Kp,Tf,zz,gf,Yp,Mt,Wp,jz,Qz,GP,Jz,Xz,Zz,ej,tj,hR,$P,rj,_R,Vs,pR,VP,jP,su,nj,sj,KP,YP,WP,zP,ij,oj,nu,aj,cj,Yz,Sn,_Te,gTe,STe,Wz,GC=ce(()=>{Sf=w(sn()),ER=w(eR()),Vp=w(MP()),Ii=w($d()),Kp=w(vo()),Tf=w(ka()),zz=w(lO()),gf=w(rs()),Yp=w(Ih()),Mt=w(kC()),Wp=w(j()),jz=w(hO()),Qz=w(lT()),GP=w(qO()),Jz=w(dT()),Xz=w(VO()),Zz=w(KO()),ej=w(zO()),tj=w(QO()),hR=w(ET()),$P=w(xP()),rj=w(XT()),_R=w(HP());H();Vs=w(ge()),pR=w(lC()),VP=w(cf()),jP=w(require("util")),su=w(on()),nj=w(ws()),sj=w(Yd()),KP=w(Gz());Ad();xT();YP=w(Ot()),WP=w(VT()),zP=w(bp()),ij=w(ti()),oj=w(se());Dr();nu=w(as());zd();jC();aj=w(yP()),cj=w(Vz());vp();Kz();({HTTP_STATUS_CODES:Yz}=Vs.hdbErrors),Sn=Wp.default.loggerWithTag("operation"),_Te=jP.promisify(Sf.default.search),gTe=jP.promisify(ER.default.evaluateSQL),STe={[G.CREATE_ATTRIBUTE]:!0,[G.CREATE_TABLE]:!0,[G.CREATE_SCHEMA]:!0,[G.DROP_ATTRIBUTE]:!0,[G.DROP_TABLE]:!0,[G.DROP_SCHEMA]:!0};o(lj,"processLocalTransaction");Wz=RTe();Le.operation=QP;o(uj,"chooseOperation");o(dj,"getOperationFunction");(0,ij._assignPackageExport)("operation",QP);o(QP,"operation");o(TTe,"catchup");o($s,"executeJob");o(RTe,"initializeOperationFunctionMap")});var TR=M((DFe,hj)=>{"use strict";var gR=(H(),v(Y)),yTe=se(),zp=j(),{handleHDBError:JP,hdbErrors:SR}=ge(),{isMainThread:ATe}=require("worker_threads"),{Readable:bTe}=require("stream"),fj=require("os"),ITe=require("util"),NTe=pw(),wTe=ITe.promisify(NTe.authorize),mj=(GC(),v(qC)),{createGzip:OTe,constants:CTe}=require("zlib"),PTe=[gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,gR.OPERATIONS_ENUM.LOGIN,gR.OPERATIONS_ENUM.LOGOUT];function LTe(e){let t=`Found an uncaught exception with message: ${e.message}. ${fj.EOL}Stack: ${e.stack} ${fj.EOL}Terminating ${ATe?"HDB":"thread"}.`;console.error(t),zp.fatal(t),process.exit(1)}o(LTe,"handleServerUncaughtException");function DTe(e,t,r){if(zp[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:SR.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(DTe,"serverErrorHandler");function MTe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=JP(new Error,"Invalid JSON.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(yTe.isEmpty(e.body.operation)){let n=JP(new Error,"Request body must include an 'operation' property.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(MTe,"reqBodyValidationHandler");function vTe(e,t,r){let n;!PTe.includes(e.body.operation)||e.body.operation===gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?wTe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{zp.warn(i),zp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(JP(i,a,SR.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(vTe,"authHandler");async function UTe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=mj.chooseOperation(e.body);let s=await mj.processLocalTransaction(e,n);if(s instanceof bTe&&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(OTe({level:CTe.Z_BEST_SPEED})))}return s}catch(s){throw zp.error(s),s}}o(UTe,"handlePostRequest");hj.exports={authHandler:vTe,handlePostRequest:UTe,handleServerUncaughtException:LTe,serverErrorHandler:DTe,reqBodyValidationHandler:MTe}});var gj=M((vFe,_j)=>{"use strict";var xTe=require("fastify-plugin"),{handlePostRequest:pj,authHandler:BTe,reqBodyValidationHandler:FTe}=TR();async function HTe(e){e.decorate("hdbCore",{preValidation:[FTe,BTe],request:o((t,r)=>Ej(pj(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>Ej(pj(t,r,!0)),"requestWithoutAuthentication")})}o(HTe,"hdbCore");async function Ej(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(Ej,"convertAsyncIterators");_j.exports=xTe(HTe)});var Tj=M((BFe,Sj)=>{"use strict";var xFe=require("fs"),RR=oe();RR.initSync();var{CONFIG_PARAMS:XP}=(H(),v(Y)),kTe=1024*1024*1024;function qTe(e){let t=RR.get(XP.HTTP_TIMEOUT),r=RR.get(XP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:kTe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:RR.get(XP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(qTe,"getServerOptions");Sj.exports=qTe});var Aj=M((HFe,yj)=>{"use strict";var ZP=oe();ZP.initSync();var{CONFIG_PARAMS:Rj}=(H(),v(Y));function GTe(){let e=ZP.get(Rj.HTTP_CORSACCESSLIST),t=ZP.get(Rj.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(GTe,"getCORSOptions");yj.exports=GTe});var Nj=M((qFe,Ij)=>{"use strict";var bj=oe();bj.initSync();var $Te=(H(),v(Y));function VTe(){return bj.get($Te.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(VTe,"getHeaderTimeoutConfig");Ij.exports=VTe});var tL={};we(tL,{customFunctionsServer:()=>WTe,ready:()=>kj,start:()=>YTe});function YTe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ea||(ea=Hj(t),Le.http((await ea).server));let a=await ea,c=(0,eL.dirname)(s),l=(0,eL.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!wj.has(c)){wj.add(c);try{a.register(jTe(c,l))}catch(u){if(u.message==="Root plugin has already booted")At.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:kj}}async function WTe(){try{At.info("In Custom Functions Fastify server"+process.cwd()),At.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),At.debug(`Custom Functions server process ${process.pid} starting up.`),await zTe();let e=Mj.get(U.HTTP_SECUREPORT)>0,t;try{t=ea=await Hj(e)}catch(r){throw At.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw At.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){At.error(`Custom Functions ${process.pid} Error: ${e}`),At.error(e),process.exit(1)}}async function zTe(){try{At.info("Custom Functions starting configuration."),await vj.setUsersWithRolesCache(),At.info("Custom Functions completed configuration.")}catch(e){At.error(e)}}function jTe(e,t){return async function(r){try{At.info("Custom Functions starting buildRoutes"),At.trace("Loading fastify routes folder "+e),(0,Oj.existsSync)(e)&&r.register(Dj.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:At.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?At.error(s.message):s&&At.error(s),a()})}catch(n){At.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function Hj(e){At.info("Custom Functions starting buildServer.");let t=(0,Uj.default)(e),r=(0,Cj.default)(t);r.server.headersTimeout=(0,Bj.default)(),r.setErrorHandler(Fj.serverErrorHandler);let n=(0,xj.default)();return n&&r.register(Pj.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(Lj.default),await r.register(KTe),await r.after(),mm(r),At.info("Custom Functions completed buildServer."),r}function kj(){if(ea)return ea.then?ea.then(e=>e.ready()):ea.ready()}var eL,Oj,Cj,Pj,Lj,Dj,Mj,At,KTe,vj,Uj,xj,Bj,Fj,ea,wj,qj=ce(()=>{eL=require("path"),Oj=require("fs"),Cj=w(require("fastify")),Pj=w(require("@fastify/cors")),Lj=w(cw()),Dj=w(require("@fastify/autoload")),Mj=w(oe());H();At=w(j()),KTe=w(gj()),vj=w(rs()),Uj=w(Tj()),xj=w(Aj()),Bj=w(Nj()),Fj=w(TR());yo();Dr();wj=new Set;o(YTe,"start");o(WTe,"customFunctionsServer");o(zTe,"setUp");o(jTe,"buildRouteFolder");o(Hj,"buildServer");o(kj,"ready")});var rL={};we(rL,{start:()=>QTe});function QTe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Yj.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){$j||($j=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Gj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,Vj.default)(s,(0,Kj.realpathSync)(a))}}return i(s)},{runFirst:!0})),Gj.set(r,n)}}}var Vj,Kj,Yj,Gj,$j,Wj=ce(()=>{Vj=w(require("send")),Kj=require("fs"),Yj=w(require("serve-static")),Gj=new Map;o(QTe,"start")});var nL={};we(nL,{start:()=>JTe});function JTe({override:e}){return{handleFile:o((t,r,n)=>{yR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,zj.parse)(t))){if(process.env[s]!==void 0)if(yR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)yR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var zj,yR,jj=ce(()=>{zj=require("dotenv"),yR=w(j());o(JTe,"start")});var oL={};we(oL,{DataLoaderError:()=>ms,DataLoaderResult:()=>Rf,EmptyFileError:()=>NR,FileParseError:()=>IR,InvalidPropertyTypeError:()=>wR,MissingRequiredPropertyError:()=>jp,RecordProcessingError:()=>Qp,SystemDatabaseError:()=>OR,UnsupportedFileExtensionError:()=>bR,computeRecordHash:()=>iL,handleApplication:()=>eRe,loadDataFile:()=>n2,suppressHandleApplicationWarning:()=>ZTe});function iL(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,Jj.createHash)("sha256").update(n).digest("hex")}function r2(e){return e.system&&e.system[sL]?e.system[sL]:AR||(AR=je({database:"system",table:sL,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),AR)}async function XTe(e,t,r,n){try{let s=r2(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return Ks.error?.(`Failed to get stored hash: ${s.message}`),null}}async function Qj(e,t,r,n,s){try{let i=r2(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){Ks.error?.(`Failed to store hash: ${i.message}`)}}function eRe(e){if((0,Zj.getWorkerIndex)()!==0){Ks.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||n2(t,un,He).then(r=>{Ks.debug?.("Data loader processed file: %s: %s",(0,ta.basename)(t.absolutePath),r.message)})})}async function n2({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ta.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,Xj.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new bR(t,i)}catch(f){throw f instanceof ms?f:new IR(t,f)}if(!a)throw new NR(t);let{database:c,table:l,records:u}=a;if(!l)throw new jp(t,"table");if(!u)throw new jp(t,"records");if(!Array.isArray(u))throw new wR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new OR(c,l);try{let f;if(c&&s[c]&&s[c][l])Ks.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])Ks.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{Ks.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 je({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=iL(N);if(!O){h++;let $=await f.put(N);return await Qj(c,l,F,Z,s),$}let q=await XTe(c,l,F,s);if(!q)return _++,Promise.resolve({inserted:0,updated:0});let W={};for(let $ of Object.keys(N))$ in O&&(W[$]=O[$]);return iL(W)!==q?(_++,Promise.resolve({inserted:0,updated:0})):Z!==q?(p++,await f.patch(F,N),await Qj(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof ms)Ks.error?.(`Record processing error: ${O.message}`);else{let F=new Qp(d,O);Ks.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)`),Ks.info?.(R),new Rf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return Ks.info?.(R),new Rf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return Ks.info?.(R),new Rf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new Qp(d,f)}}var ta,Jj,Xj,Zj,ra,e2,t2,Ks,sL,AR,ZTe,ms,bR,IR,NR,jp,wR,OR,Qp,Rf,s2=ce(()=>{ta=require("node:path"),Jj=require("node:crypto"),Xj=require("yaml");Me();Zj=w(ze()),ra=w(tn()),e2=w(ge()),t2=w(j()),Ks=t2.default.forComponent("dataLoader"),sL="hdb_dataloader_hash";o(iL,"computeRecordHash");o(r2,"getHashTrackingTable");o(XTe,"getStoredHash");o(Qj,"storeHash");ZTe=!0;o(eRe,"handleApplication");o(n2,"loadDataFile");ms=class extends e2.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=ra.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},bR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ta.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},IR=class extends ms{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,ta.basename)(t)}: ${r.message}`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},NR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ta.basename)(t)} is empty or invalid`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},jp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ta.basename)(t)} is missing required "${r}" property`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},wR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ta.basename)(t)} has invalid "${r}" property, expected ${n}`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},OR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,ra.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Qp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,ra.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},Rf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var cL=M((ZFe,i2)=>{"use strict";var Jp=oe();Jp.initSync();var yf=require("fs-extra"),aL=require("path"),Af=(H(),v(Y)),tRe=require("crypto"),rRe=require("uuid").v4;i2.exports=nRe;function nRe(){if(Jp.getHdbBasePath()!==void 0){let e=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PASSPHRASE_NAME);try{yf.accessSync(r),yf.accessSync(e),yf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=rRe(),i=tRe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});yf.writeFileSync(r,s),yf.writeFileSync(e,i.privateKey),yf.writeFileSync(t,i.publicKey)}else throw n}}}o(nRe,"checkJWTTokenExist")});var a2=M((tHe,o2)=>{"use strict";var lL=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};o2.exports={HdbInfoInsertObject:lL}});var u2=M((nHe,l2)=>{"use strict";var c2=(H(),v(Y)),uL=class{static{o(this,"UpgradeObject")}constructor(t,r){this[c2.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[c2.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};l2.exports={UpgradeObject:uL}});var CR=M((iHe,f2)=>{"use strict";var Ys=require("prompt"),bf=require("chalk"),d2=j(),Ni=require("os"),dL=Hc(),fL=["yes","y"];async function sRe(e){let t=`${Ni.EOL}`+bf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ni.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ni.EOL}${Ni.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ni.EOL}`;Ys.override=dL(["CONFIRM_UPGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_UPGRADE:{description:bf.magenta(`${Ni.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 Ys.get([r])}catch(s){return d2.error("There was an error when prompting user about an upgrade."),d2.error(s),!1}return fL.includes(n.CONFIRM_UPGRADE)}o(sRe,"forceUpdatePrompt");async function iRe(e){let t=`${Ni.EOL}`+bf.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.${Ni.EOL}`);Ys.override=dL(["CONFIRM_DOWNGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:bf.magenta(`${Ni.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 Ys.get([r]);return fL.includes(n.CONFIRM_DOWNGRADE)}o(iRe,"forceDowngradePrompt");async function oRe(){let e=`${Ni.EOL}`+bf.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");Ys.override=dL(["GENERATE_CERTS"]),Ys.start(),Ys.message=e;let t={properties:{GENERATE_CERTS:{description:bf.magenta(`${Ni.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 Ys.get([t]);return fL.includes(r.GENERATE_CERTS)}o(oRe,"upgradeCertsPrompt");f2.exports={forceUpdatePrompt:sRe,forceDowngradePrompt:iRe,upgradeCertsPrompt:oRe}});var hL=M((aHe,m2)=>{"use strict";var mL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};m2.exports=mL});var p2=M((mHe,h2)=>{"use strict";var aRe=se(),cRe=Ot(),lHe=j(),uHe=require("path"),dHe=require("fs"),fHe=(H(),v(Y));h2.exports={getOldPropsValue:lRe};function lRe(e,t,r=!1){let n=t.getRaw(e);return aRe.isNotEmptyAndHasValue(n)?n:r?cRe.getDefaultConfig(e):""}o(lRe,"getOldPropsValue")});var S2=M((pHe,g2)=>{"use strict";var gc=require("path"),Sc=require("fs-extra"),uRe=require("properties-reader"),dRe=hL(),Sr=j(),{getOldPropsValue:bt}=p2(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:iu}=(H(),v(Y)),ou=Ot(),PR=oe(),E2=se(),oo=(H(),v(Y)),pL=new dRe("3.1.0"),_2=[];function fRe(){let e=uRe(PR.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.
33
+ `);throw n[1]?mP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,hP.BAD_REQUEST):mP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",hP.BAD_REQUEST)}return t}o(FW,"convertSQLToAST");function HW(e,t,r){try{let n=Oge;if(!e.bypass_auth&&!t.permissions_checked){let i=BW(e,t);if(i&&i.length>0)return r(Ige,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case Hp.VALID_SQL_OPS_ENUM.SELECT:n=_ge,s=t.ast.statements[0];break;case Hp.VALID_SQL_OPS_ENUM.INSERT:n=Cge;break;case Hp.VALID_SQL_OPS_ENUM.UPDATE:n=Sge;break;case Hp.VALID_SQL_OPS_ENUM.DELETE:n=Tge;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(HW,"processAST");function Oge(e,t){ZT.info(e),t("unknown sql statement")}o(Oge,"nullFunction");function Cge({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=Pge(i,e.values)}catch(a){return r(a)}Ege(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){ZT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(Cge,"convertInsert");function Pge(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]]=Ec.compile(`SELECT ${s.toString()} AS [${Hp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw ZT.error(r),new Error(Nge)}}o(Pge,"createDataObjects")});var RP=M((ZBe,VW)=>{var sR=require("clone"),iR=nt(),Lge=se(),rR=(H(),v(Y)),JBe=j(),EP=require("fs"),gP=require("joi"),{string:nR}=gP.types(),{hdbErrors:Dge,handleHDBError:tR}=ge(),{HDB_ERROR_MSGS:XBe,HTTP_STATUS_CODES:_P}=Dge,{commonValidators:hf}=qi(),qW=" is required",Mge=["insert","update","upsert"],SP={database:{presence:!1,format:hf.schema_format,length:hf.schema_length},schema:{presence:!1,format:hf.schema_format,length:hf.schema_length},table:{presence:!0,format:hf.schema_format,length:hf.schema_length},action:{inclusion:{within:Mge,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},vge={schema:nR.required(),table:nR.required(),action:nR.valid("insert","update","upsert")},{AWS_ACCESS_KEY:Uge,AWS_SECRET:xge,AWS_BUCKET:Bge,AWS_FILE_KEY:Fge,REGION:Hge}=rR.S3_BUCKET_AUTH_KEYS,kge={s3:{presence:!0},[`s3.${Uge}`]:{presence:!0,type:"String"},[`s3.${xge}`]:{presence:!0,type:"String"},[`s3.${Bge}`]:{presence:!0,type:"String"},[`s3.${Fge}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${Hge}`]:{presence:!0,type:"String"}},GW=sR(SP);GW.data.presence={message:qW};var $W=sR(SP);$W.file_path.presence={message:qW};var qge=Object.assign(sR(SP),kge),TP=sR(vge);TP.csv_url=nR.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();TP.passthrough_headers=gP.object();function Gge(e){let t=iR.validateObject(e,GW);return oR(e,t)}o(Gge,"dataObject");function $ge(e){let t=iR.validateBySchema(e,gP.object(TP));return oR(e,t)}o($ge,"urlObject");function Vge(e){let t=iR.validateObject(e,$W);return oR(e,t)}o(Vge,"fileObject");function Kge(e){let t=iR.validateObject(e,qge);return oR(e,t)}o(Kge,"s3FileObject");function oR(e,t){if(!t){let r=Lge.checkGlobalSchemaTable(e.schema,e.table);if(r)return tR(new Error,r,_P.BAD_REQUEST);if(e.operation===rR.OPERATIONS_ENUM.CSV_FILE_LOAD)try{EP.accessSync(e.file_path,EP.constants.R_OK|EP.constants.F_OK)}catch(n){return n.code===rR.NODE_ERROR_CODES.ENOENT?tR(n,`No such file or directory ${n.path}`,_P.BAD_REQUEST):n.code===rR.NODE_ERROR_CODES.EACCES?tR(n,`Permission denied ${n.path}`,_P.BAD_REQUEST):tR(n)}}return t}o(oR,"postValidateChecks");VW.exports={dataObject:Gge,urlObject:$ge,fileObject:Vge,s3FileObject:Kge}});var yP=M((tFe,KW)=>{"use strict";var kp=j(),aR=(H(),v(Y));async function Yge(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===aR.OPERATIONS_ENUM.INSERT||t.operation===aR.OPERATIONS_ENUM.UPDATE||t.operation===aR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===aR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(kp.info(i.message),i):i.http_resp_msg?(kp.error(`Error calling operation: ${e.name}`),kp.error(i.http_resp_msg),i):(kp.error(`Error calling operation: ${e.name}`),kp.error(i),i)}}o(Yge,"callOperationFunctionAsAwait");KW.exports={callOperationFunctionAsAwait:Yge}});var AP=M((nFe,WW)=>{"use strict";var{S3:Wge,GetObjectCommand:zge}=require("@aws-sdk/client-s3");WW.exports={getFileStreamFromS3:jge,getS3AuthObj:YW};async function jge(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await YW(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new zge(r))).Body}o(jge,"getFileStreamFromS3");function YW(e,t,r){return new Wge({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(YW,"getS3AuthObj")});var jW=M((iFe,zW)=>{"use strict";var bP=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}},IP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};zW.exports={BulkLoadFileObject:bP,BulkLoadDataObject:IP}});var wP=M((aFe,QW)=>{"use strict";var NP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};QW.exports=NP});var MP=M((mFe,mz)=>{"use strict";var cR=on(),uR=RP(),Qge=require("needle"),yi=(H(),v(Y)),lFe=mt(),pf=se(),{handleHDBError:Zt,hdbErrors:iz}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:wr,CHECK_LOGS_WRAPPER:eu}=iz,Ef=j(),OP=require("papaparse");pf.promisifyPapaParse();var Ai=require("fs-extra"),Jge=require("path"),{chain:JW}=require("stream-chain"),XW=require("stream-json/streamers/StreamArray"),ZW=require("stream-json/utils/Batch"),ez=require("stream-chain/utils/comp"),{finished:tz}=require("stream"),Xge=oe(),oz=yP(),Zge=AP(),{BulkLoadFileObject:PP,BulkLoadDataObject:eSe}=jW(),LP=sP(),{verifyBulkLoadAttributePerms:az}=XT(),uFe=wP(),dFe=Gt(),fFe=Ki(),{databases:tSe}=(Me(),v(_t)),{coerceType:rSe}=(B_(),v(Gk)),rz="No records parsed from csv file.",Zl=`${Xge.get("HDB_ROOT")}/tmp`,{schemaRegex:nSe}=qi(),nz=1024*1024*2,sz=5e3,sSe={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};mz.exports={csvDataLoad:iSe,csvURLLoad:oSe,csvFileLoad:aSe,importFromS3:cSe};async function iSe(e,t){let r=uR.dataObject(e);if(r)throw Zt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=uz(e.schema,e.table),i=OP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:CP.bind(null,s),dynamicTyping:!1}),a=new LP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&az(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 Zt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new eSe(e.action,e.schema,e.table,i.data);return n=await oz.callOperationFunctionAsAwait(dz,l,null),n.message===rz?rz:fz(n.records,n.number_written)}catch(s){throw tu(s)}}o(iSe,"csvDataLoad");async function oSe(e){let t=uR.urlObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Zl}/${r}`;try{await lSe(e,r)}catch(s){throw Ef.error(wr.DOWNLOAD_FILE_ERR(r)+" - "+s),Zt(s,eu(wr.DOWNLOAD_FILE_ERR(r)))}try{let s=new PP(this.job_operation_function.name,e.action,e.schema,e.table,n,yi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await DP(s);return await lR(n),i}catch(s){throw await lR(n),tu(s)}}o(oSe,"csvURLLoad");async function aSe(e){let t=uR.fileObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new PP(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,yi.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await DP(r)}catch(n){throw tu(n)}}o(aSe,"csvFileLoad");async function cSe(e){let t=uR.s3FileObject(e);if(t)throw Zt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=Jge.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Zl}/${s}`;let i=new PP(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await uSe(s,e);let a=await DP(i);return await lR(r),a}catch(n){throw await lR(r),tu(n)}}o(cSe,"importFromS3");async function lSe(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await Qge("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 Zt(n,s,n.statusCode,yi.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}fSe(r,e.csv_url),await dSe(t,r.raw)}o(lSe,"downloadCSVFile");async function uSe(e,t){try{let r=`${Zl}/${e}`;await Ai.mkdirp(Zl),await Ai.writeFile(`${Zl}/${e}`,"",{flag:"a+"});let n=await Ai.createWriteStream(r),s=await Zge.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(){Ef.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw Ef.error(wr.S3_DOWNLOAD_ERR+" - "+r),Zt(r,eu(wr.S3_DOWNLOAD_ERR))}}o(uSe,"downloadFileFromS3");async function dSe(e,t){try{await Ai.mkdirp(Zl),await Ai.writeFile(`${Zl}/${e}`,t)}catch(r){throw Ef.error(wr.WRITE_TEMP_FILE_ERR),Zt(r,eu(wr.DEFAULT_BULK_LOAD_ERR))}}o(dSe,"writeFileToTempFolder");async function lR(e){if(e)try{await Ai.access(e),await Ai.unlink(e)}catch{Ef.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(lR,"deleteTempFile");function fSe(e,t){if(e.statusCode!==iz.HTTP_STATUS_CODES.OK)throw Zt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!sSe[e.headers["content-type"]])throw Zt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Zt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(fSe,"validateURLResponse");async function DP(e){try{let t;switch(e.file_type){case yi.VALID_S3_FILE_TYPES.CSV:t=await mSe(e);break;case yi.VALID_S3_FILE_TYPES.JSON:t=await hSe(e);break;default:throw Zt(new Error,wr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,yi.LOG_LEVELS.ERROR,wr.INVALID_FILE_EXT_ERR(e))}return fz(t.records,t.number_written)}catch(t){throw tu(t)}}o(DP,"fileLoad");async function cz(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 cR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&az(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Zt(c);r(l)}}o(cz,"validateChunk");async function lz(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;pf.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!pf.isEmpty(c)&&!pf.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 oz.callOperationFunctionAsAwait(dz,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Zt(c,eu(wr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.INSERT_CSV_ERR+" - "+c);r(l)}}o(lz,"insertChunk");async function mSe(e){let t={records:0,number_written:0},r=uz(e.schema,e.table);try{let n=new LP,s=Ai.createReadStream(e.file_path,{highWaterMark:nz});s.setEncoding("utf8"),await OP.parsePromise(s,cz.bind(null,e,n),CP.bind(null,r));let i=n.getPermsResponse();if(i)throw Zt(new Error,i,Xr.BAD_REQUEST);return s=Ai.createReadStream(e.file_path,{highWaterMark:nz}),s.setEncoding("utf8"),await OP.parsePromise(s,lz.bind(null,e,t),CP.bind(null,r)),s.destroy(),t}catch(n){throw Zt(n,eu(wr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.PAPA_PARSE_ERR+n)}}o(mSe,"callPapaParse");function uz(e,t){let r=tSe[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>rSe(i,s));return n}o(uz,"createTransformMap");function CP(e,t,r){let n=e.get(r);return n?n(t):pf.autoCast(t)}o(CP,"typeFunction");async function hSe(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new LP,s=JW([Ai.createReadStream(e.file_path,{encoding:"utf-8"}),XW.withParser(),c=>c.value,new ZW({batchSize:sz}),ez(async c=>{await cz(e,n,r,c)})]);await new Promise((c,l)=>{tz(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Zt(new Error,i,Xr.BAD_REQUEST);let a=JW([Ai.createReadStream(e.file_path,{encoding:"utf-8"}),XW.withParser(),c=>c.value,new ZW({batchSize:sz}),ez(async c=>{await lz(e,t,r,c)})]);return await new Promise((c,l)=>{tz(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Zt(n,eu(wr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.INSERT_JSON_ERR+n)}}o(hSe,"insertJson");async function dz(e){let t={};try{e.data&&e.data.length>0&&pSe(e.data[0])?t=await ESe(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",Ef.info(t.message))}catch(r){throw tu(r)}return t}o(dz,"callBulkFileLoad");function pSe(e){let t=Object.keys(e);for(let r of t)if(!nSe.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(pSe,"validateColumnNames");async function ESe(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=cR.insert;break;case"update":i=cR.update;break;case"upsert":i=cR.upsert;break;default:throw Zt(new Error,wr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,yi.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=pf.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw tu(a)}}o(ESe,"bulkFileLoad");function fz(e,t){return`successfully loaded ${t} of ${e} records`}o(fz,"buildResponseMsg");function tu(e){return Zt(e,eu(wr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,yi.LOG_LEVELS.ERROR,wr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(tu,"buildTopLevelErrMsg")});var xP=M((pFe,Rz)=>{"use strict";var UP=sn(),_Se=AP(),{AsyncParser:gSe}=require("json2csv"),dR=require("stream"),fs=se(),vP=require("fs-extra"),SSe=require("path"),Gs=j(),{promisify:Ez}=require("util"),qp=se(),{handleHDBError:_r,hdbErrors:TSe}=ge(),{HDB_ERROR_MSGS:kn,HTTP_STATUS_CODES:gr}=TSe,{streamAsJSON:RSe}=(CA(),v(Vv)),{Upload:ySe}=require("@aws-sdk/lib-storage"),{toCsvStream:ASe}=(yo(),v(eU)),hz=["search_by_value","search_by_hash","sql","search_by_conditions"],pz=["json","csv"],_z="json",gz="csv",bSe="Successfully exported JSON locally.",ISe="Successfully exported CSV locally.",NSe=1e3,wSe=UP.searchByHash,OSe=UP.searchByValue,CSe=Ez(dR.finished);Rz.exports={export_to_s3:MSe,export_local:PSe};async function PSe(e){Gs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=Sz(e);if(!fs.isEmpty(t))throw Gs.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(fs.isEmpty(e.path))throw Gs.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(SSe.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=fs.buildFolderPath(e.path,r);await LSe(e.path);let s=await Tz(e);return await DSe(n,e.format,s)}o(PSe,"export_local");async function LSe(e){if(Gs.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 vP.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,Gs.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 Gs.error(r),_r(new Error,r,gr.BAD_REQUEST,void 0,void 0,!0)}return!0}o(LSe,"confirmPath");async function DSe(e,t,r){if(Gs.trace("in saveToLocal"),qp.isEmptyOrZeroLength(e))throw _r(new Error,kn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmptyOrZeroLength(t))throw _r(new Error,kn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmpty(r))throw _r(new Error,kn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===_z){let n=vP.createWriteStream(e);return RSe(r).pipe(n),await CSe(n),{message:bSe,path:e}}else if(t===gz){let n=vP.createWriteStream(e),s=dR.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new gSe(i,c).fromInput(s).toOutput(n).promise(!1),{message:ISe,path:e}}throw _r(new Error,kn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(DSe,"saveToLocal");async function MSe(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=Sz(e);if(!fs.isEmpty(t))throw _r(new Error,t,gr.BAD_REQUEST);Gs.trace(`called export_to_s3 to bucket: ${e.s3.bucket} and query ${e.search_operation.sql}`);let r;try{r=await Tz(e)}catch(l){throw Gs.error(l),l}let n,s=await _Se.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new dR.PassThrough;if(e.format===gz){i=e.s3.key+".csv";let l=ASe(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===_z){i=e.s3.key+".json";let l=new dR.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%NSe===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 ySe({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(MSe,"export_to_s3");function Sz(e){if(Gs.trace("in exportCoreValidation"),fs.isEmpty(e.format))return"format missing";if(pz.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${pz.join(", ")}`;let t=e.search_operation.operation;if(fs.isEmpty(t))return"search_operation.operation missing";if(hz.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${hz.join(", ")}`}o(Sz,"exportCoreValidation");async function Tz(e){Gs.trace("in getRecords");let t,r;if(qp.isEmpty(e.search_operation)||qp.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=OSe;break;case"search_by_hash":t=wSe;break;case"search_by_conditions":t=UP.searchByConditions;break;case"sql":{let n=eR();t=Ez(n.evaluateSQL);break}default:throw r=`Operation ${e.search_operation.operation} is not support by export.`,Gs.error(r),_r(new Error,r,gr.BAD_REQUEST)}return e.search_operation.hdb_user=e.hdb_user,t(e.search_operation)}o(Tz,"getRecords")});var Az=M((_Fe,yz)=>{"use strict";var BP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};yz.exports=BP});var Nz=M((SFe,Iz)=>{"use strict";var vSe=(H(),v(Y)),bz=require("moment"),USe=require("uuid").v4,FP=class{static{o(this,"JobObject")}constructor(){this.id=USe(),this.type=void 0,this.start_datetime=bz().valueOf(),this.created_datetime=bz().valueOf(),this.end_datetime=void 0,this.status=vSe.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};Iz.exports=FP});var HP=M((RFe,vz)=>{"use strict";var xSe=require("uuid").v4,Lz=on(),Dz=sn(),BSe=ci(),FSe=zu(),HSe=Az(),Dt=(H(),v(Y)),kSe=Nz(),qSe=Ch(),bi=j(),GSe=im(),_f=se(),{promisify:$Se}=require("util"),ru=require("moment"),VSe=eR(),fR=RP(),wz=qI(),{deleteTransactionLogsBeforeValidator:KSe}=$C(),{handleHDBError:Oz,hdbErrors:YSe,ClientError:WSe}=ge(),{HTTP_STATUS_CODES:Cz}=YSe,Pz=Dz.searchByValue,zSe=Dz.searchByHash,jSe=Lz.insert,QSe=$Se(VSe.evaluateSQL),JSe=Lz.update;vz.exports={addJob:eTe,updateJob:rTe,handleGetJob:XSe,handleGetJobsByStartDate:ZSe,getJobById:Mz};async function XSe(e){if(e.id===void 0)throw new WSe("'id' is required");let t=await Mz(e.id);return _f.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(XSe,"handleGetJob");async function ZSe(e){try{let t=await tTe(e);if(bi.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=ru(r.start_datetime)),r.end_datetime&&(r.end_datetime_converted=ru(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 bi.error(r),new Error(r)}}o(ZSe,"handleGetJobsByStartDate");async function eTe(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||_f.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return bi.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return bi.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=fR.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=fR.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=fR.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=fR.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=wz(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=wz(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=KSe(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw Oz(new Error,"Invalid service",Cz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw Oz(n,n.message,Cz.BAD_REQUEST,void 0,void 0,!0);let s=new kSe;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 BSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await Pz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return bi.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=xSe();try{a=await Pz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return bi.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return bi.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new GSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await jSe(l)}catch(d){return bi.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,bi.trace(d)}return t}o(eTe,"addJob");async function tTe(e){let t=ru(e.from_date,ru.ISO_8601),r=ru(e.to_date,ru.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 HSe(n,e.hdb_user);try{return await QSe(s)}catch(i){throw bi.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(tTe,"getJobsInDateRange");async function Mz(e){if(_f.isEmptyOrZeroLength(e))return _f.errorizeMessage("Invalid job ID specified.");let t=new FSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await zSe(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return bi.error(n),_f.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(Mz,"getJobById");async function rTe(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(_f.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=ru().valueOf());let t=new qSe(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await JSe(t),r}o(rTe,"updateJob")});var Gz=M((AFe,qz)=>{"use strict";var Uz=se(),Or=(H(),v(Y)),nTe=require("moment"),mR=MP(),Gp=j(),xz=HP(),Bz=xP(),Fz=ka(),Hz=ze(),sTe=VT(),iTe=cf(),{parentPort:oTe,isMainThread:kz}=require("worker_threads"),{onMessageByType:aTe}=ze(),kP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function cTe(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(Uz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(Uz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case Or.JOB_TYPE_ENUM.csv_file_load:await so(e,mR.csvFileLoad);break;case Or.JOB_TYPE_ENUM.csv_url_load:await so(e,mR.csvURLLoad);break;case Or.JOB_TYPE_ENUM.csv_data_load:await so(e,mR.csvDataLoad);break;case Or.JOB_TYPE_ENUM.import_from_s3:await so(e,mR.importFromS3);break;case Or.JOB_TYPE_ENUM.empty_trash:break;case Or.JOB_TYPE_ENUM.export_local:await so(e,Bz.export_local);break;case Or.JOB_TYPE_ENUM.export_to_s3:await so(e,Bz.export_to_s3);break;case Or.JOB_TYPE_ENUM.delete_files_before:case Or.JOB_TYPE_ENUM.delete_records_before:await so(e,Fz.deleteFilesBefore);break;case Or.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,Fz.deleteAuditLogsBefore);break;case Or.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,sTe.deleteTransactionLogsBefore);break;case Or.JOB_TYPE_ENUM.restart_service:return await so(e,iTe.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(cTe,"parseMessage");async function so(e,t){try{e.job.status=Or.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=nTe().valueOf(),await xz.updateJob(e.job),await lTe(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):Gp.error(`There was an error running ${t.name} job with id ${e.job.id}`),Gp.error(n),e.job.message=n,e.job.status=Or.JOB_STATUS_ENUM.ERROR;try{await xz.updateJob(e.job)}catch(s){throw Gp.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function lTe(e){Gp.trace("launching job thread:",e),kz?Hz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):oTe.postMessage({type:Or.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(lTe,"launchJobThread");kz&&aTe(Or.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{Hz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[Or.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){Gp.error(r)}});qz.exports={parseMessage:cTe,RunnerMessage:kP}});var Vz=M((IFe,$z)=>{"use strict";var uTe=se(),qP=oe(),_c=(H(),v(Y)),dTe=mt(),fTe=Gt(),io=j(),mTe=wP(),hTe=Ki();qP.initSync();$z.exports={postOperationHandler:ETe,sendOperationTransaction:$p};async function $p(e,t,r,n){if(e.schema===_c.SYSTEM_SCHEMA_NAME)return;let s=pTe(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await fTe.publishToStream(`${dTe.SUBJECT_PREFIXES.TXN}.${e.schema}`,hTe.createNatsTableStreamName(e.schema,e.table),n,s))}o($p,"sendOperationTransaction");function pTe(e,t,r){if(uTe.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===_c.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(pTe,"convertCRUDOperationToTransaction");async function ETe(e,t,r){if(!qP.get(_c.CONFIG_PARAMS.CLUSTERING_ENABLED))return;io.trace(`postOperationHandler called for operation ${e.operation} on schema.table: ${e.schema}.${e.table}`);let n=e.hdb_user?.username,s=qP.get(_c.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new mTe(t.txn_time,n,s);switch(e.operation){case _c.OPERATIONS_ENUM.INSERT:try{await $p(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case _c.OPERATIONS_ENUM.DELETE:try{await $p(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case _c.OPERATIONS_ENUM.UPDATE:try{await $p(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case _c.OPERATIONS_ENUM.UPSERT:try{await $p(e,t.upserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for upsert."),io.error(a)}break;default:break}return t}o(ETe,"postOperationHandler")});var J,Kz=ce(()=>{J=class{static{o(this,"OperationFunctionObject")}operation_function;job_operation_function;constructor(t,r=void 0){this.operation_function=t,this.job_operation_function=r}}});var qC={};we(qC,{chooseOperation:()=>uj,executeJob:()=>$s,getOperationFunction:()=>dj,operation:()=>QP,processLocalTransaction:()=>lj});async function lj(e,t){try{if(e.body.operation!=="read_log"&&(Wp.default.log_level===jf.INFO||Wp.default.log_level===jf.DEBUG||Wp.default.log_level===jf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;Sn.info(c)}}catch(n){Sn.error(n)}let r=await aj.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return STe[e.body.operation]&&nj.default.setSchemaDataToGlobal(n=>{n&&Sn.error(n)}),r}function uj(e){let t;try{t=dj(e)}catch(s){throw Sn.error(`Error when selecting operation function - ${s}`),s}let{operation_function:r,job_operation_function:n}=t;try{if(e.operation==="sql"||e.search_operation&&e.search_operation.operation==="sql"){let s=e.operation==="sql"?e.sql:e.search_operation.sql,i=ER.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=ER.default.checkASTPermissions(e,i);if(a)throw Sn.error(`${Yz.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,Vs.handleHDBError)(new Error,a,Vs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==G.CREATE_AUTHENTICATION_TOKENS&&e.operation!==G.LOGIN&&e.operation!==G.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=rj.default.verifyPerms(i,s);if(a)throw Sn.error(`${Yz.FORBIDDEN} from operation ${e.operation}`),Sn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,Vs.handleHDBError)(new Error,a,Vs.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,Vs.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function dj(e){if(Sn.trace(`getOperationFunction with operation: ${e.operation}`),Wz.has(e.operation))return Wz.get(e.operation);throw(0,Vs.handleHDBError)(new Error,Vs.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),Vs.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function QP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=uj(e);return lj({body:e},n)}async function TTe(e){Sn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[oA]=!0;let a;switch(i.operation){case G.INSERT:a=await su.default.insert(i);break;case G.UPDATE:a=await su.default.update(i);break;case G.UPSERT:a=await su.default.upsert(i);break;case G.DELETE:a=await Tf.default.deleteRecord(i);break;default:Sn.warn("invalid operation in catchup");break}await cj.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){Sn.info("Invalid operation in transaction"),Sn.error(a)}}async function $s(e){(0,oj.transformReq)(e);let t,r;try{if(r=await _R.default.addJob(e),r){t=r.createdJob,Sn.info("addJob result",r);let n=new KP.default.RunnerMessage(t,e);return{message:await KP.default.parseMessage(n)??`Starting job with id ${t.id}`,job_id:t.id}}}catch(n){let s=n instanceof Error?n:null,i=`There was an error executing job: ${s&&"http_resp_msg"in s?s.http_resp_msg:n}`;throw Sn.error(i),(0,Vs.handleHDBError)(n,i)}}function RTe(){let e=new Map;return e.set(G.INSERT,new J(su.default.insert)),e.set(G.UPDATE,new J(su.default.update)),e.set(G.UPSERT,new J(su.default.upsert)),e.set(G.SEARCH_BY_CONDITIONS,new J(Sf.default.searchByConditions)),e.set(G.SEARCH_BY_HASH,new J(Sf.default.searchByHash)),e.set(G.SEARCH_BY_ID,new J(Sf.default.searchByHash)),e.set(G.SEARCH_BY_VALUE,new J(Sf.default.searchByValue)),e.set(G.SEARCH,new J(_Te)),e.set(G.SQL,new J(gTe)),e.set(G.CSV_DATA_LOAD,new J($s,Vp.default.csvDataLoad)),e.set(G.CSV_FILE_LOAD,new J($s,Vp.default.csvFileLoad)),e.set(G.CSV_URL_LOAD,new J($s,Vp.default.csvURLLoad)),e.set(G.IMPORT_FROM_S3,new J($s,Vp.default.importFromS3)),e.set(G.CREATE_SCHEMA,new J(Ii.default.createSchema)),e.set(G.CREATE_DATABASE,new J(Ii.default.createSchema)),e.set(G.CREATE_TABLE,new J(Ii.default.createTable)),e.set(G.CREATE_ATTRIBUTE,new J(Ii.default.createAttribute)),e.set(G.DROP_SCHEMA,new J(Ii.default.dropSchema)),e.set(G.DROP_DATABASE,new J(Ii.default.dropSchema)),e.set(G.DROP_TABLE,new J(Ii.default.dropTable)),e.set(G.DROP_ATTRIBUTE,new J(Ii.default.dropAttribute)),e.set(G.DESCRIBE_SCHEMA,new J(Kp.default.describeSchema)),e.set(G.DESCRIBE_DATABASE,new J(Kp.default.describeSchema)),e.set(G.DESCRIBE_TABLE,new J(Kp.default.describeTable)),e.set(G.DESCRIBE_ALL,new J(Kp.default.describeAll)),e.set(G.DELETE,new J(Tf.default.deleteRecord)),e.set(G.ADD_USER,new J(gf.default.addUser)),e.set(G.ALTER_USER,new J(gf.default.alterUser)),e.set(G.DROP_USER,new J(gf.default.dropUser)),e.set(G.LIST_USERS,new J(gf.default.listUsersExternal)),e.set(G.LIST_ROLES,new J(Yp.default.listRoles)),e.set(G.ADD_ROLE,new J(Yp.default.addRole)),e.set(G.ALTER_ROLE,new J(Yp.default.alterRole)),e.set(G.DROP_ROLE,new J(Yp.default.dropRole)),e.set(G.USER_INFO,new J(gf.default.userInfo)),e.set(G.READ_LOG,new J(jz.default)),e.set(G.ADD_NODE,new J(Qz.default)),e.set(G.UPDATE_NODE,new J(GP.default)),e.set(G.SET_NODE_REPLICATION,new J(GP.default)),e.set(G.REMOVE_NODE,new J(Jz.default)),e.set(G.CONFIGURE_CLUSTER,new J(Xz.default)),e.set(G.PURGE_STREAM,new J(Zz.default)),e.set(G.SET_CONFIGURATION,new J(YP.default.setConfiguration)),e.set(G.CLUSTER_STATUS,new J(ej.default.clusterStatus)),e.set(G.CLUSTER_NETWORK,new J(tj.default)),e.set(G.CLUSTER_SET_ROUTES,new J(hR.default.setRoutes)),e.set(G.CLUSTER_GET_ROUTES,new J(hR.default.getRoutes)),e.set(G.CLUSTER_DELETE_ROUTES,new J(hR.default.deleteRoutes)),e.set(G.EXPORT_TO_S3,new J($s,$P.default.export_to_s3)),e.set(G.CREATE_CSR,new J(nu.default.createCsr)),e.set(G.SIGN_CERTIFICATE,new J(nu.default.signCertificate)),e.set(G.LIST_CERTIFICATES,new J(nu.default.listCertificates)),e.set(G.ADD_CERTIFICATES,new J(nu.default.addCertificate)),e.set(G.REMOVE_CERTIFICATE,new J(nu.default.removeCertificate)),e.set(G.GET_KEY,new J(nu.default.getKey)),e.set(G.ADD_NODE_BACK,new J(UO)),e.set(G.REMOVE_NODE_BACK,new J(xO)),e.set(G.DELETE_FILES_BEFORE,new J($s,Tf.default.deleteFilesBefore)),e.set(G.DELETE_RECORDS_BEFORE,new J($s,Tf.default.deleteFilesBefore)),e.set(G.EXPORT_LOCAL,new J($s,$P.default.export_local)),e.set(G.SEARCH_JOBS_BY_START_DATE,new J(_R.default.handleGetJobsByStartDate)),e.set(G.GET_JOB,new J(_R.default.handleGetJob)),e.set(G.GET_FINGERPRINT,new J(pR.default.getFingerprint)),e.set(G.SET_LICENSE,new J(pR.default.setLicense)),e.set(G.GET_REGISTRATION_INFO,new J(pR.default.getRegistrationInfo)),e.set(G.RESTART,new J(VP.default.restart)),e.set(G.RESTART_SERVICE,new J($s,VP.default.restartService)),e.set(G.CATCHUP,new J(TTe)),e.set(G.SYSTEM_INFORMATION,new J(sj.default.systemInformation)),e.set(G.DELETE_AUDIT_LOGS_BEFORE,new J($s,Tf.default.deleteAuditLogsBefore)),e.set(G.READ_AUDIT_LOG,new J(zz.default)),e.set(G.CREATE_AUTHENTICATION_TOKENS,new J(fw)),e.set(G.REFRESH_OPERATION_TOKEN,new J(mw)),e.set(G.LOGIN,new J(MC)),e.set(G.LOGOUT,new J(vC)),e.set(G.GET_CONFIGURATION,new J(YP.default.getConfiguration)),e.set(G.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(G.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(G.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(G.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(G.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(G.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(G.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(G.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(G.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(G.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(G.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(G.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(G.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(G.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(G.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(G.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(G.READ_TRANSACTION_LOG,new J(WP.default.readTransactionLog)),e.set(G.DELETE_TRANSACTION_LOGS_BEFORE,new J($s,WP.default.deleteTransactionLogsBefore)),e.set(G.INSTALL_NODE_MODULES,new J(zP.default.installModules)),e.set(G.AUDIT_NODE_MODULES,new J(zP.default.auditModules)),e.set(G.GET_BACKUP,new J(Ii.default.getBackup)),e.set(G.CLEANUP_ORPHAN_BLOBS,new J(Ii.default.cleanupOrphanBlobs)),e.set(G.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(G.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(G.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(G.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(G.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(G.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(G.GET_ANALYTICS,new J(KC)),e.set(G.LIST_METRICS,new J(YC)),e.set(G.DESCRIBE_METRIC,new J(WC)),e.set(G.GET_STATUS,new J(XC)),e.set(G.SET_STATUS,new J(ZC)),e.set(G.CLEAR_STATUS,new J(JC)),e}var Sf,ER,Vp,Ii,Kp,Tf,zz,gf,Yp,Mt,Wp,jz,Qz,GP,Jz,Xz,Zz,ej,tj,hR,$P,rj,_R,Vs,pR,VP,jP,su,nj,sj,KP,YP,WP,zP,ij,oj,nu,aj,cj,Yz,Sn,_Te,gTe,STe,Wz,GC=ce(()=>{Sf=w(sn()),ER=w(eR()),Vp=w(MP()),Ii=w($d()),Kp=w(vo()),Tf=w(ka()),zz=w(lO()),gf=w(rs()),Yp=w(Ih()),Mt=w(kC()),Wp=w(j()),jz=w(hO()),Qz=w(lT()),GP=w(qO()),Jz=w(dT()),Xz=w(VO()),Zz=w(KO()),ej=w(zO()),tj=w(QO()),hR=w(ET()),$P=w(xP()),rj=w(XT()),_R=w(HP());H();Vs=w(ge()),pR=w(lC()),VP=w(cf()),jP=w(require("util")),su=w(on()),nj=w(ws()),sj=w(Yd()),KP=w(Gz());Ad();xT();YP=w(Ot()),WP=w(VT()),zP=w(bp()),ij=w(ti()),oj=w(se());Dr();nu=w(as());zd();jC();aj=w(yP()),cj=w(Vz());vp();Kz();({HTTP_STATUS_CODES:Yz}=Vs.hdbErrors),Sn=Wp.default.loggerWithTag("operation"),_Te=jP.promisify(Sf.default.search),gTe=jP.promisify(ER.default.evaluateSQL),STe={[G.CREATE_ATTRIBUTE]:!0,[G.CREATE_TABLE]:!0,[G.CREATE_SCHEMA]:!0,[G.DROP_ATTRIBUTE]:!0,[G.DROP_TABLE]:!0,[G.DROP_SCHEMA]:!0};o(lj,"processLocalTransaction");Wz=RTe();Le.operation=QP;o(uj,"chooseOperation");o(dj,"getOperationFunction");(0,ij._assignPackageExport)("operation",QP);o(QP,"operation");o(TTe,"catchup");o($s,"executeJob");o(RTe,"initializeOperationFunctionMap")});var TR=M((DFe,hj)=>{"use strict";var gR=(H(),v(Y)),yTe=se(),zp=j(),{handleHDBError:JP,hdbErrors:SR}=ge(),{isMainThread:ATe}=require("worker_threads"),{Readable:bTe}=require("stream"),fj=require("os"),ITe=require("util"),NTe=pw(),wTe=ITe.promisify(NTe.authorize),mj=(GC(),v(qC)),{createGzip:OTe,constants:CTe}=require("zlib"),PTe=[gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,gR.OPERATIONS_ENUM.LOGIN,gR.OPERATIONS_ENUM.LOGOUT];function LTe(e){let t=`Found an uncaught exception with message: ${e.message}. ${fj.EOL}Stack: ${e.stack} ${fj.EOL}Terminating ${ATe?"HDB":"thread"}.`;console.error(t),zp.fatal(t),process.exit(1)}o(LTe,"handleServerUncaughtException");function DTe(e,t,r){if(zp[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:SR.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(DTe,"serverErrorHandler");function MTe(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=JP(new Error,"Invalid JSON.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(yTe.isEmpty(e.body.operation)){let n=JP(new Error,"Request body must include an 'operation' property.",SR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(MTe,"reqBodyValidationHandler");function vTe(e,t,r){let n;!PTe.includes(e.body.operation)||e.body.operation===gR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?wTe(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{zp.warn(i),zp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(JP(i,a,SR.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(vTe,"authHandler");async function UTe(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=mj.chooseOperation(e.body);let s=await mj.processLocalTransaction(e,n);if(s instanceof bTe&&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(OTe({level:CTe.Z_BEST_SPEED})))}return s}catch(s){throw zp.error(s),s}}o(UTe,"handlePostRequest");hj.exports={authHandler:vTe,handlePostRequest:UTe,handleServerUncaughtException:LTe,serverErrorHandler:DTe,reqBodyValidationHandler:MTe}});var gj=M((vFe,_j)=>{"use strict";var xTe=require("fastify-plugin"),{handlePostRequest:pj,authHandler:BTe,reqBodyValidationHandler:FTe}=TR();async function HTe(e){e.decorate("hdbCore",{preValidation:[FTe,BTe],request:o((t,r)=>Ej(pj(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>Ej(pj(t,r,!0)),"requestWithoutAuthentication")})}o(HTe,"hdbCore");async function Ej(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(Ej,"convertAsyncIterators");_j.exports=xTe(HTe)});var Tj=M((BFe,Sj)=>{"use strict";var xFe=require("fs"),RR=oe();RR.initSync();var{CONFIG_PARAMS:XP}=(H(),v(Y)),kTe=1024*1024*1024;function qTe(e){let t=RR.get(XP.HTTP_TIMEOUT),r=RR.get(XP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:kTe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:RR.get(XP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(qTe,"getServerOptions");Sj.exports=qTe});var Aj=M((HFe,yj)=>{"use strict";var ZP=oe();ZP.initSync();var{CONFIG_PARAMS:Rj}=(H(),v(Y));function GTe(){let e=ZP.get(Rj.HTTP_CORSACCESSLIST),t=ZP.get(Rj.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(GTe,"getCORSOptions");yj.exports=GTe});var Nj=M((qFe,Ij)=>{"use strict";var bj=oe();bj.initSync();var $Te=(H(),v(Y));function VTe(){return bj.get($Te.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(VTe,"getHeaderTimeoutConfig");Ij.exports=VTe});var tL={};we(tL,{customFunctionsServer:()=>WTe,ready:()=>kj,start:()=>YTe});function YTe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ea||(ea=Hj(t),Le.http((await ea).server));let a=await ea,c=(0,eL.dirname)(s),l=(0,eL.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!wj.has(c)){wj.add(c);try{a.register(jTe(c,l))}catch(u){if(u.message==="Root plugin has already booted")At.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:kj}}async function WTe(){try{At.info("In Custom Functions Fastify server"+process.cwd()),At.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),At.debug(`Custom Functions server process ${process.pid} starting up.`),await zTe();let e=Mj.get(U.HTTP_SECUREPORT)>0,t;try{t=ea=await Hj(e)}catch(r){throw At.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw At.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){At.error(`Custom Functions ${process.pid} Error: ${e}`),At.error(e),process.exit(1)}}async function zTe(){try{At.info("Custom Functions starting configuration."),await vj.setUsersWithRolesCache(),At.info("Custom Functions completed configuration.")}catch(e){At.error(e)}}function jTe(e,t){return async function(r){try{At.info("Custom Functions starting buildRoutes"),At.trace("Loading fastify routes folder "+e),(0,Oj.existsSync)(e)&&r.register(Dj.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:At.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?At.error(s.message):s&&At.error(s),a()})}catch(n){At.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function Hj(e){At.info("Custom Functions starting buildServer.");let t=(0,Uj.default)(e),r=(0,Cj.default)(t);r.server.headersTimeout=(0,Bj.default)(),r.setErrorHandler(Fj.serverErrorHandler);let n=(0,xj.default)();return n&&r.register(Pj.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(Lj.default),await r.register(KTe),await r.after(),mm(r),At.info("Custom Functions completed buildServer."),r}function kj(){if(ea)return ea.then?ea.then(e=>e.ready()):ea.ready()}var eL,Oj,Cj,Pj,Lj,Dj,Mj,At,KTe,vj,Uj,xj,Bj,Fj,ea,wj,qj=ce(()=>{eL=require("path"),Oj=require("fs"),Cj=w(require("fastify")),Pj=w(require("@fastify/cors")),Lj=w(cw()),Dj=w(require("@fastify/autoload")),Mj=w(oe());H();At=w(j()),KTe=w(gj()),vj=w(rs()),Uj=w(Tj()),xj=w(Aj()),Bj=w(Nj()),Fj=w(TR());yo();Dr();wj=new Set;o(YTe,"start");o(WTe,"customFunctionsServer");o(zTe,"setUp");o(jTe,"buildRouteFolder");o(Hj,"buildServer");o(kj,"ready")});var rL={};we(rL,{start:()=>QTe});function QTe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Yj.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){$j||($j=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=Gj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,Vj.default)(s,(0,Kj.realpathSync)(a))}}return i(s)},{runFirst:!0})),Gj.set(r,n)}}}var Vj,Kj,Yj,Gj,$j,Wj=ce(()=>{Vj=w(require("send")),Kj=require("fs"),Yj=w(require("serve-static")),Gj=new Map;o(QTe,"start")});var nL={};we(nL,{start:()=>JTe});function JTe({override:e}){return{handleFile:o((t,r,n)=>{yR.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,zj.parse)(t))){if(process.env[s]!==void 0)if(yR.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)yR.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var zj,yR,jj=ce(()=>{zj=require("dotenv"),yR=w(j());o(JTe,"start")});var oL={};we(oL,{DataLoaderError:()=>ms,DataLoaderResult:()=>Rf,EmptyFileError:()=>NR,FileParseError:()=>IR,InvalidPropertyTypeError:()=>wR,MissingRequiredPropertyError:()=>jp,RecordProcessingError:()=>Qp,SystemDatabaseError:()=>OR,UnsupportedFileExtensionError:()=>bR,computeRecordHash:()=>iL,handleApplication:()=>eRe,loadDataFile:()=>n2,suppressHandleApplicationWarning:()=>ZTe});function iL(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,Jj.createHash)("sha256").update(n).digest("hex")}function r2(e){return e.system&&e.system[sL]?e.system[sL]:AR||(AR=je({database:"system",table:sL,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),AR)}async function XTe(e,t,r,n){try{let s=r2(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return Ks.error?.(`Failed to get stored hash: ${s.message}`),null}}async function Qj(e,t,r,n,s){try{let i=r2(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){Ks.error?.(`Failed to store hash: ${i.message}`)}}function eRe(e){if((0,Zj.getWorkerIndex)()!==0){Ks.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||n2(t,un,He).then(r=>{Ks.debug?.("Data loader processed file: %s: %s",(0,ta.basename)(t.absolutePath),r.message)})})}async function n2({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ta.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,Xj.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new bR(t,i)}catch(f){throw f instanceof ms?f:new IR(t,f)}if(!a)throw new NR(t);let{database:c,table:l,records:u}=a;if(!l)throw new jp(t,"table");if(!u)throw new jp(t,"records");if(!Array.isArray(u))throw new wR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new OR(c,l);try{let f;if(c&&s[c]&&s[c][l])Ks.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])Ks.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{Ks.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 je({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=iL(N);if(!O){h++;let $=await f.put(N);return await Qj(c,l,F,Z,s),$}let q=await XTe(c,l,F,s);if(!q)return _++,Promise.resolve({inserted:0,updated:0});let W={};for(let $ of Object.keys(N))$ in O&&(W[$]=O[$]);return iL(W)!==q?(_++,Promise.resolve({inserted:0,updated:0})):Z!==q?(p++,await f.patch(F,N),await Qj(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof ms)Ks.error?.(`Record processing error: ${O.message}`);else{let F=new Qp(d,O);Ks.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)`),Ks.info?.(R),new Rf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return Ks.info?.(R),new Rf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return Ks.info?.(R),new Rf(t,c,l,"success",0,R)}}catch(f){throw f instanceof ms?f:new Qp(d,f)}}var ta,Jj,Xj,Zj,ra,e2,t2,Ks,sL,AR,ZTe,ms,bR,IR,NR,jp,wR,OR,Qp,Rf,s2=ce(()=>{ta=require("node:path"),Jj=require("node:crypto"),Xj=require("yaml");Me();Zj=w(ze()),ra=w(tn()),e2=w(ge()),t2=w(j()),Ks=t2.default.forComponent("dataLoader"),sL="hdb_dataloader_hash";o(iL,"computeRecordHash");o(r2,"getHashTrackingTable");o(XTe,"getStoredHash");o(Qj,"storeHash");ZTe=!0;o(eRe,"handleApplication");o(n2,"loadDataFile");ms=class extends e2.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=ra.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},bR=class extends ms{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ta.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},IR=class extends ms{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,ta.basename)(t)}: ${r.message}`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},NR=class extends ms{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ta.basename)(t)} is empty or invalid`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},jp=class extends ms{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ta.basename)(t)} is missing required "${r}" property`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},wR=class extends ms{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ta.basename)(t)} has invalid "${r}" property, expected ${n}`,ra.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},OR=class extends ms{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,ra.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Qp=class extends ms{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,ra.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},Rf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var cL=M((ZFe,i2)=>{"use strict";var Jp=oe();Jp.initSync();var yf=require("fs-extra"),aL=require("path"),Af=(H(),v(Y)),tRe=require("crypto"),rRe=require("uuid").v4;i2.exports=nRe;function nRe(){if(Jp.getHdbBasePath()!==void 0){let e=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=aL.join(Jp.getHdbBasePath(),Af.LICENSE_KEY_DIR_NAME,Af.JWT_ENUM.JWT_PASSPHRASE_NAME);try{yf.accessSync(r),yf.accessSync(e),yf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=rRe(),i=tRe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});yf.writeFileSync(r,s),yf.writeFileSync(e,i.privateKey),yf.writeFileSync(t,i.publicKey)}else throw n}}}o(nRe,"checkJWTTokenExist")});var a2=M((tHe,o2)=>{"use strict";var lL=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};o2.exports={HdbInfoInsertObject:lL}});var u2=M((nHe,l2)=>{"use strict";var c2=(H(),v(Y)),uL=class{static{o(this,"UpgradeObject")}constructor(t,r){this[c2.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[c2.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};l2.exports={UpgradeObject:uL}});var CR=M((iHe,f2)=>{"use strict";var Ys=require("prompt"),bf=require("chalk"),d2=j(),Ni=require("os"),dL=Hc(),fL=["yes","y"];async function sRe(e){let t=`${Ni.EOL}`+bf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ni.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ni.EOL}${Ni.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ni.EOL}`;Ys.override=dL(["CONFIRM_UPGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_UPGRADE:{description:bf.magenta(`${Ni.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 Ys.get([r])}catch(s){return d2.error("There was an error when prompting user about an upgrade."),d2.error(s),!1}return fL.includes(n.CONFIRM_UPGRADE)}o(sRe,"forceUpdatePrompt");async function iRe(e){let t=`${Ni.EOL}`+bf.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.${Ni.EOL}`);Ys.override=dL(["CONFIRM_DOWNGRADE"]),Ys.start(),Ys.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:bf.magenta(`${Ni.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 Ys.get([r]);return fL.includes(n.CONFIRM_DOWNGRADE)}o(iRe,"forceDowngradePrompt");async function oRe(){let e=`${Ni.EOL}`+bf.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");Ys.override=dL(["GENERATE_CERTS"]),Ys.start(),Ys.message=e;let t={properties:{GENERATE_CERTS:{description:bf.magenta(`${Ni.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 Ys.get([t]);return fL.includes(r.GENERATE_CERTS)}o(oRe,"upgradeCertsPrompt");f2.exports={forceUpdatePrompt:sRe,forceDowngradePrompt:iRe,upgradeCertsPrompt:oRe}});var hL=M((aHe,m2)=>{"use strict";var mL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};m2.exports=mL});var p2=M((mHe,h2)=>{"use strict";var aRe=se(),cRe=Ot(),lHe=j(),uHe=require("path"),dHe=require("fs"),fHe=(H(),v(Y));h2.exports={getOldPropsValue:lRe};function lRe(e,t,r=!1){let n=t.getRaw(e);return aRe.isNotEmptyAndHasValue(n)?n:r?cRe.getDefaultConfig(e):""}o(lRe,"getOldPropsValue")});var S2=M((pHe,g2)=>{"use strict";var gc=require("path"),Sc=require("fs-extra"),uRe=require("properties-reader"),dRe=hL(),Sr=j(),{getOldPropsValue:bt}=p2(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:iu}=(H(),v(Y)),ou=Ot(),PR=oe(),E2=se(),oo=(H(),v(Y)),pL=new dRe("3.1.0"),_2=[];function fRe(){let e=uRe(PR.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.
34
34
 
35
35
  ;The directory selected during install where the database files reside.
36
36
  ${ye.HDB_ROOT_KEY} = ${bt(ye.HDB_ROOT_KEY,e)}
@@ -119,11 +119,11 @@ Reindexing upgrade started for transaction logs`),na.notify("Reindexing upgrade
119
119
  `;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}
120
120
  `);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)}
121
121
  `:n+=`${r(h+": ")}${m}
122
- `;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(UAe,"startupLog");function xAe(e){try{return Number.parseInt(la.readFileSync(e,"utf8"),10)}catch{return null}}o(xAe,"readPidFile");function BAe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(BAe,"isProcessRunning")});var AQ={};we(AQ,{SERVERS:()=>wf,portServer:()=>BL,setPortServerMap:()=>$R});function $R(e,t){let r=BL.get(e)??[];BL.set(e,[...r,t])}var wf,BL,FL=ce(()=>{wf={},BL=new Map;o($R,"setPortServerMap")});var jR={};we(jR,{deliverSocket:()=>xQ,getHttpOptions:()=>qAe,getRequestId:()=>kQ,handleApplication:()=>kAe,httpServer:()=>YL,logRequest:()=>uE,proxyRequest:()=>GAe,registerServer:()=>VL,suppressHandleApplicationWarning:()=>HAe});function kAe(e){dE=e.options.getAll(),e.options.on("change",t=>{dE=e.options.getAll()})}function qAe(){return dE}function xQ(e,t,r){let n=e?.read?e:new OQ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=wf[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=wf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(fa.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function GAe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=bQ.get(s),r){case"connection":i=xQ(void 0,t),bQ.set(s,i),i.write=(c,l,u)=>(KR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(KR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),KR.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 VL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=wf[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",wQ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else wf[t]=e;e.on("unhandled",wQ)}function KL(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,CQ.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function YL(e,t){let r=[];for(let{port:n,secure:s}of KL(t))r.push(BQ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?GL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,VL(e,n,!1)),YR[n]=WR(GL,n);return r}function BQ(e,t,r,n){if($R(e,{protocol_name:t?"HTTPS":"HTTP",name:QR()}),!VR[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,PQ.getTicketKeys)(),SNICallback:(0,LQ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,DQ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Wa(g,R);r&&(O.isOperationsServer=!0),dE.logging?.id&&(O.requestId=y=kQ());let F=await YR[e](O);if(!F){if(O._nodeResponse.statusCode){uE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=FQ(O)}if(F.headers?.set||(F.headers=new Cs(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,VR[e].emit("unhandled",g,R)}let Z=F.status||200,q=performance.now(),W=q-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Cs;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=${W.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),mh(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,ie=O.method;if(ot(W,"duration",ue,ie,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,ie),Wr(1,"response_"+Z,ue,ie),uE(g,Z,y,W),!$)if(K instanceof ReadableStream&&(K=qL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=qL.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",()=>{ot(performance.now()-q,"transfer",ue,ie),ot(me,"bytes-sent",ue,ie)})}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(FAe(O)),uE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?fa.default.warn(O):fa.default.info(O):fa.default.error(O)}o(N,"onError")},"requestHandler"),p=Fg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),ot(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=VR[e]=(t?f?MQ.createSecureServer:vQ.createServer:zR.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&&ot(performance.now()-g._parent.startTime,"tls-handshake",e),ot(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),VL(_,e)}return VR[e]}function WR(e,t){let r=FQ;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 FQ(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Cs}}function $Ae(e,t){YL(e,{requestOnly:!0,...t})}function HQ(e,t){for(let{port:r}of KL(t))IQ[t?.runFirst?"unshift":"push"]({listener:e,port:r}),$L[r]=WR(IQ,r)}function VAe(e,t){let r=[];for(let{port:n,secure:s}of KL(t)){$R(n,{protocol_name:s?"WSS":"WS",name:QR()});let i=BQ(n,s,t?.isOperationsServer,t?.mtls);cE[n]||(cE[n]=new UQ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),cE[n].on("connection",(a,c)=>{try{let l=new Wa(c);l.isWebSocket=!0;let u=YR[n](l);fa.default.debug("Received WS connection, calling listeners",HL),NQ[n](a,l,u)}catch(l){fa.default.warn("Error in handling WS connection",l)}}),HQ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):cE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),cE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{$L[n]&&$L[n](a,c,l)})),r.push(i),HL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),NQ[n]=WR(HL,n),YR[n]=WR(GL,n)}return r}function wQ(e,t){t.writeHead(404),t.end(`Not found
123
- `),uE(e,404,0,e.requestId)}function uE(e,t,r,n){let s=dE.logging;if(s){kL||(kL=fa.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";kL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+KAe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function KAe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function kQ(){return lE||(lE=new BigInt64Array([1n]),lE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",lE.buffer))),Number(Atomics.add(lE,0,1n))}var OQ,fa,KR,Cr,CQ,PQ,LQ,DQ,MQ,vQ,zR,qL,UQ,FAe,cE,VR,YR,GL,dE,HAe,bQ,IQ,$L,HL,NQ,kL,lE,WL=ce(()=>{OQ=require("node:net"),fa=w(j()),KR=require("node:worker_threads"),Cr=w(oe());H();CQ=w(Ot()),PQ=w(ze()),LQ=w(as()),DQ=w(ef()),MQ=require("node:http2"),vQ=require("node:https"),zR=require("node:http");wh();hh();Yn();ji();qL=require("node:stream");Dr();FL();ff();CN();UQ=require("ws"),{errorToString:FAe}=fa.default;Le.http=YL;Le.request=$Ae;Le.ws=VAe;Le.upgrade=HQ;cE={},VR={},YR={},GL=[],dE={},HAe=!0;o(kAe,"handleApplication");o(qAe,"getHttpOptions");o(xQ,"deliverSocket");bQ=new Map;o(GAe,"proxyRequest");o(VL,"registerServer");o(KL,"getPorts");o(YL,"httpServer");o(BQ,"getHTTPServer");o(WR,"makeCallbackChain");o(FQ,"unhandled");o($Ae,"onRequest");Object.defineProperty(zR.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){}});IQ=[],$L={};o(HQ,"onUpgrade");HL=[],NQ={};o(VAe,"onWebSocket");o(wQ,"defaultNotFound");o(uE,"logRequest");o(KAe,"headersToString");o(kQ,"getRequestId")});var jL=M(mE=>{"use strict";uA();var{isMainThread:zL,parentPort:qQ,threadId:JR,workerData:YAe}=require("node:worker_threads"),{createServer:WAe}=require("node:net"),{unlinkSync:VQ,existsSync:zAe}=require("fs"),KQ;mE.whenComponentsLoaded=new Promise(e=>{KQ=e});var Oi=j(),js=oe(),gs=(H(),v(Y)),{server:jAe}=(Dr(),v(Xf)),{createServer:QAe}=require("node:tls"),{restartNumber:JAe,getWorkerIndex:Of}=ze(),{createReuseportFd:fE}=(wh(),v($q)),{createTLSSelector:XAe}=as(),{resolvePath:ZAe}=Ot(),{startupLog:ebe}=RQ(),{SERVERS:Cf,setPortServerMap:GQ,portServer:tbe}=(FL(),v(AQ)),$Q=(WL(),v(jR)),rbe=ti(),YQ=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG),nbe=js.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);jAe.socket=sbe;if(YQ){let e;if(zL)e=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){Oi.info("Could not close debugger",t)}});else{let t=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Of()>=0&&(e=t+Of())}if(e){let t=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){Oi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&zL)try{require("inspector").open(9229)}catch(e){JAe<=1&&Oi.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"&&Oi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:eke,CONFIG_PARAMS:tke}=gs;js.initSync();mE.globals=rbe;mE.listenOnPorts=zQ;mE.startServers=WQ;function WQ(){let e=js.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=XR().loadRootComponents(!0).then(()=>{qQ?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)$Q.deliverSocket(i,s,a);else if(n.requestId)$Q.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){Oi.trace("received shutdown request",JR);for(let c in Cf){let l=Cf[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?Oi.info(`Closing ${_.length} idle connections`):p&&Oi.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
+ `;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(UAe,"startupLog");function xAe(e){try{return Number.parseInt(la.readFileSync(e,"utf8"),10)}catch{return null}}o(xAe,"readPidFile");function BAe(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(BAe,"isProcessRunning")});var AQ={};we(AQ,{SERVERS:()=>wf,portServer:()=>BL,setPortServerMap:()=>$R});function $R(e,t){let r=BL.get(e)??[];BL.set(e,[...r,t])}var wf,BL,FL=ce(()=>{wf={},BL=new Map;o($R,"setPortServerMap")});var jR={};we(jR,{deliverSocket:()=>xQ,getHttpOptions:()=>qAe,getRequestId:()=>kQ,handleApplication:()=>kAe,httpServer:()=>YL,logRequest:()=>uE,proxyRequest:()=>GAe,registerServer:()=>VL,suppressHandleApplicationWarning:()=>HAe});function kAe(e){dE=e.options.getAll(),e.options.on("change",t=>{dE=e.options.getAll()})}function qAe(){return dE}function xQ(e,t,r){let n=e?.read?e:new OQ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=wf[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=wf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(fa.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function GAe(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=bQ.get(s),r){case"connection":i=xQ(void 0,t),bQ.set(s,i),i.write=(c,l,u)=>(KR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(KR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),KR.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 VL(e,t,r=!0){t||(t=Cr.default.get(U.HTTP_PORT));let n=wf[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",wQ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else wf[t]=e;e.on("unhandled",wQ)}function KL(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,CQ.resolvePath)(Cr.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function YL(e,t){let r=[];for(let{port:n,secure:s}of KL(t))r.push(BQ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?GL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,VL(e,n,!1)),YR[n]=WR(GL,n);return r}function BQ(e,t,r,n){if($R(e,{protocol_name:t?"HTTPS":"HTTP",name:QR()}),!VR[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,PQ.getTicketKeys)(),SNICallback:(0,LQ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,DQ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Wa(g,R);r&&(O.isOperationsServer=!0),dE.logging?.id&&(O.requestId=y=kQ());let F=await YR[e](O);if(!F){if(O._nodeResponse.statusCode){uE(g,O._nodeResponse.statusCode,y,performance.now()-T);return}F=FQ(O)}if(F.headers?.set||(F.headers=new Cs(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,VR[e].emit("unhandled",g,R)}let Z=F.status||200,q=performance.now(),W=q-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Cs;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=${W.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),mh(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,ie=O.method;if(ot(W,"duration",ue,ie,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,ie),Wr(1,"response_"+Z,ue,ie),uE(g,Z,y,W),!$)if(K instanceof ReadableStream&&(K=qL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=qL.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",()=>{ot(performance.now()-q,"transfer",ue,ie),ot(me,"bytes-sent",ue,ie)})}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(FAe(O)),uE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?fa.default.warn(O):fa.default.info(O):fa.default.error(O)}o(N,"onError")},"requestHandler"),p=Fg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),ot(!0,"service-unavailable",e)},Cr.default.get(s+"_requestQueueLimit")),_=VR[e]=(t?f?MQ.createSecureServer:vQ.createServer:zR.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&&ot(performance.now()-g._parent.startTime,"tls-handshake",e),ot(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),VL(_,e)}return VR[e]}function WR(e,t){let r=FQ;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 FQ(e){return e.user&&(e._nodeRequest.user=e.user),{status:-1,body:"Not found",headers:new Cs}}function $Ae(e,t){YL(e,{requestOnly:!0,...t})}function HQ(e,t){for(let{port:r}of KL(t))IQ[t?.runFirst?"unshift":"push"]({listener:e,port:r}),$L[r]=WR(IQ,r)}function VAe(e,t){let r=[];for(let{port:n,secure:s}of KL(t)){$R(n,{protocol_name:s?"WSS":"WS",name:QR()});let i=BQ(n,s,t?.isOperationsServer,t?.mtls);cE[n]||(cE[n]=new UQ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),cE[n].on("connection",(a,c)=>{try{let l=new Wa(c);l.isWebSocket=!0;let u=YR[n](l);fa.default.debug("Received WS connection, calling listeners",HL),NQ[n](a,l,u)}catch(l){fa.default.warn("Error in handling WS connection",l)}}),HQ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):cE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),cE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{$L[n]&&$L[n](a,c,l)})),r.push(i),HL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),NQ[n]=WR(HL,n),YR[n]=WR(GL,n)}return r}function wQ(e,t){t.headersSent||t.writableEnded||(t.writeHead(404),t.end(`Not found
123
+ `),uE(e,404,0,e.requestId))}function uE(e,t,r,n){let s=dE.logging;if(s){kL||(kL=fa.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";kL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+KAe(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function KAe(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function kQ(){return lE||(lE=new BigInt64Array([1n]),lE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",lE.buffer))),Number(Atomics.add(lE,0,1n))}var OQ,fa,KR,Cr,CQ,PQ,LQ,DQ,MQ,vQ,zR,qL,UQ,FAe,cE,VR,YR,GL,dE,HAe,bQ,IQ,$L,HL,NQ,kL,lE,WL=ce(()=>{OQ=require("node:net"),fa=w(j()),KR=require("node:worker_threads"),Cr=w(oe());H();CQ=w(Ot()),PQ=w(ze()),LQ=w(as()),DQ=w(ef()),MQ=require("node:http2"),vQ=require("node:https"),zR=require("node:http");wh();hh();Yn();ji();qL=require("node:stream");Dr();FL();ff();CN();UQ=require("ws"),{errorToString:FAe}=fa.default;Le.http=YL;Le.request=$Ae;Le.ws=VAe;Le.upgrade=HQ;cE={},VR={},YR={},GL=[],dE={},HAe=!0;o(kAe,"handleApplication");o(qAe,"getHttpOptions");o(xQ,"deliverSocket");bQ=new Map;o(GAe,"proxyRequest");o(VL,"registerServer");o(KL,"getPorts");o(YL,"httpServer");o(BQ,"getHTTPServer");o(WR,"makeCallbackChain");o(FQ,"unhandled");o($Ae,"onRequest");Object.defineProperty(zR.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){}});IQ=[],$L={};o(HQ,"onUpgrade");HL=[],NQ={};o(VAe,"onWebSocket");o(wQ,"defaultNotFound");o(uE,"logRequest");o(KAe,"headersToString");o(kQ,"getRequestId")});var jL=M(mE=>{"use strict";uA();var{isMainThread:zL,parentPort:qQ,threadId:JR,workerData:YAe}=require("node:worker_threads"),{createServer:WAe}=require("node:net"),{unlinkSync:VQ,existsSync:zAe}=require("fs"),KQ;mE.whenComponentsLoaded=new Promise(e=>{KQ=e});var Oi=j(),js=oe(),gs=(H(),v(Y)),{server:jAe}=(Dr(),v(Xf)),{createServer:QAe}=require("node:tls"),{restartNumber:JAe,getWorkerIndex:Of}=ze(),{createReuseportFd:fE}=(wh(),v($q)),{createTLSSelector:XAe}=as(),{resolvePath:ZAe}=Ot(),{startupLog:ebe}=RQ(),{SERVERS:Cf,setPortServerMap:GQ,portServer:tbe}=(FL(),v(AQ)),$Q=(WL(),v(jR)),rbe=ti(),YQ=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG),nbe=js.get(gs.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);jAe.socket=sbe;if(YQ){let e;if(zL)e=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){Oi.info("Could not close debugger",t)}});else{let t=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&Of()>=0&&(e=t+Of())}if(e){let t=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=js.get(gs.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){Oi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&zL)try{require("inspector").open(9229)}catch(e){JAe<=1&&Oi.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"&&Oi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:eke,CONFIG_PARAMS:tke}=gs;js.initSync();mE.globals=rbe;mE.listenOnPorts=zQ;mE.startServers=WQ;function WQ(){let e=js.get(gs.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=XR().loadRootComponents(!0).then(()=>{qQ?.on("message",n=>{let{port:s,fd:i,data:a}=n;if(i)$Q.deliverSocket(i,s,a);else if(n.requestId)$Q.proxyRequest(n);else if(n.type===gs.ITC_EVENT_TYPES.SHUTDOWN){Oi.trace("received shutdown request",JR);for(let c in Cf){let l=Cf[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?Oi.info(`Closing ${_.length} idle connections`):p&&Oi.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
124
124
  Connection: close\r
125
125
  \r
126
- `))}},25).unref()}l.close?.(()=>{if(js.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&Of()==0)try{VQ(ZAe(js.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,JR),l.cantCleanupProperly||Oi.warn("Had to forcefully exit the thread",JR),process.exit(0)},5e3).unref()})}if(YQ||process.env.DEV_MODE)try{require("inspector").close()}catch(c){Oi.info("Could not close debugger",c)}}}).ref();let r;fE&&!nbe&&(r=zQ()),Promise.resolve(r).then(()=>{if(Of()===0)try{ebe(tbe)}catch(n){console.error("Error displaying start-up log",n)}qQ?.postMessage({type:gs.ITC_EVENT_TYPES.CHILD_STARTED})})});return KQ(t),t}o(WQ,"startServers");function zQ(){let e=[];for(let t in Cf){let r=Cf[t];if(t.includes?.("/")&&Of()==0){zAe(t)&&VQ(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),Oi.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=js.get(gs.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let a=typeof s=="string"?s.split("-"):s,c=Of();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?fE?n={fd:fE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:fE?n={fd:fE(+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}),Oi.trace("Listening on port "+t,JR)}).on("error",c)}))}return Promise.all(e)}o(zQ,"listenOnPorts");!zL&&!YAe?.noServerStart&&WQ();function sbe(e,t){let r=(ff(),v(wp)).getComponentName,n;if(t.securePort){GQ(t.securePort,{protocol_name:"TLS",name:r()});let s=XAe("server",t.mtls),i=js.get("tls");n=QAe({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),Cf[t.securePort]=n}return t.port&&(GQ(t.port,{protocol_name:"TCP",name:r()}),n=WAe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Cf[t.port]=n),n}o(sbe,"onSocket")});var yQ={};we(yQ,{startHTTPThreads:()=>obe,startSocketServer:()=>eD,updateWorkerIdleness:()=>nJ});async function obe(e=2,t){IN().catch(r=>vf.error?.("Error recording hostname for analytics:",r));try{if(t)XL(0,1,!0);else{let{loadRootComponents:r}=XR();if(e===0)return(0,Qs.setMainIsWorker)(!0),await jL().startServers(),Promise.resolve([]);await r()}rJ();for(let r=0;r<e;r++)XL(r,e);return Promise.all(tJ)}finally{(0,Qs.threadsHaveStarted)()}}function rJ(){let e=(0,XQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),JL=setInterval(()=>{vf.notify(e)},ibe).unref())}function XL(e,t=1,r){if(QL++,(0,Qs.startWorker)("server/threads/threadServer.js",{name:lA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===iA.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});tJ.push(s),await s,Pf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=ey.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=Pf.indexOf(n);a>-1&&Pf.splice(a,1)}if(o(i,"removeWorker"),Lf){let a=Lf;Lf=[];for(let c of a)eJ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{ZL?ZL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Qs.shutdownWorkers)(),QL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function eD(e=0,t){if(typeof e=="string")try{(0,ty.existsSync)(e)&&(0,ty.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=abe:r=cbe(t):r=tD;let n=(0,Df.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=eJ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),ZL=!0,r(i,(a,c)=>{if(!a){if(jQ){let u=i._socket||new Df.Socket({handle:i,writable:!0,readable:!0});jQ.deliverSocket(u,e,c),u.resume()}else QL>0?(Lf.length===0&&setTimeout(()=>{Lf.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,Lf.push(i)):(console.log("start up a dynamic thread to handle request"),XL(0));ot(!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 Df.Socket({handle:i,writable:!0,readable:!0});dbe(u,a,e)}ot(!0,"socket-routed")})},vf.info(`HarperDB ${ZQ.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 tD(e,t){let r,n=0;for(let s of Pf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=ZR)return ZR=i,t(r);n=i}ZR=0,t(r)}function abe(e,t){let r={};e.getpeername(r);let n=r.address,s=Mf.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);tD(e,a=>{Mf.set(n,{worker:a,lastUsed:i}),t(a)})}function cbe(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Df.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=Mf.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);tD(n,f=>{Mf.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function nJ(){ZR=0;for(let e of Pf)e.expectedIdle=e.recentELU.idle+lbe,e.requests=1;Pf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function dbe(e,t,r){let n=ube++;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(),ey.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")),ey.delete(n)),s.event=="destroy"&&(e.destroy(),ey.delete(n))})}var Qs,Df,vf,ty,JQ,XQ,ZQ,Pf,Lf,eJ,jQ,QL,tJ,JL,ibe,ZL,ZR,QQ,Mf,lbe,ey,ube,xL=ce(()=>{Qs=w(ze()),Df=require("net");H();vf=w(j()),ty=require("fs");ji();JQ=require("worker_threads"),XQ=w(ef()),ZQ=w(It()),Pf=[],Lf=[],eJ=[],QL=0,tJ=[];JQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Qs.onMessageFromWorkers)(e=>{e.type===cA.RESTART&&JL&&(clearInterval(JL),rJ())}));ibe=6e5;o(obe,"startHTTPThreads");o(rJ,"licenseWarning");o(XL,"startHTTPWorker");o(eD,"startSocketServer");ZR=0;o(tD,"findMostIdleWorker");QQ=36e5,Mf=new Map;o(abe,"findByRemoteAddressAffinity");o(cbe,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Mf)r.lastUsed+QQ<e&&Mf.delete(t)},QQ).unref();lbe=1e3;o(nJ,"updateWorkerIdleness");(0,Qs.setMonitorListener)(nJ);ey=new Map,ube=1;o(dbe,"proxySocket")});var rD={};we(rD,{hdbServer:()=>pbe,start:()=>pbe});async function pbe(e){try{fo.default.debug("In Fastify server"+process.cwd()),fo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),fo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=sJ.default.isMaster,await Ebe();let t=e.securePort>0;Uf=_be(t),await Uf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Uf.server,e),Uf.server.closeIdleConnections||await Uf.listen({port:0,host:"::"})}catch(r){throw Uf.close(),fo.default.error(r),fo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),fo.default.fatal(t),process.exit(1)}}async function Ebe(){fo.default.trace("Configuring HarperDB process."),fJ.default.setSchemaDataToGlobal(),await hJ.default.setUsersWithRolesCache(),await pJ.default.getLicense()}function _be(e){fo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=gbe(e),r=(0,iJ.default)(t);r.server.headersTimeout=Tbe(),r.setErrorHandler(wc.serverErrorHandler);let n=Sbe();n&&r.register(oJ.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(lJ.default),r.register(aJ.default),r.register(cJ.default,{root:uJ.default.join(dJ.PACKAGE_ROOT,"studio/build-local")}),mm(r);let s=Nc.default.get(sA.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!mJ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[wc.reqBodyValidationHandler,wc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,wc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),fo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function gbe(e){let t=Nc.default.get(hE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Nc.default.get(hE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:mbe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function Sbe(){let e=Nc.default.get(hE.OPERATIONSAPI_NETWORK_CORS),t=Nc.default.get(hE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===hbe)&&(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 Tbe(){return Nc.default.get(hE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??fbe}var sJ,Nc,fo,iJ,oJ,aJ,cJ,lJ,uJ,dJ,fJ,mJ,hJ,pJ,wc,fbe,mbe,hbe,hE,Uf,EJ=ce(()=>{sJ=w(require("cluster")),Nc=w(oe());H();fo=w(j()),iJ=w(require("fastify")),oJ=w(require("@fastify/cors")),aJ=w(require("@fastify/compress")),cJ=w(require("@fastify/static")),lJ=w(cw()),uJ=w(require("path")),dJ=w(It()),fJ=w(ws()),mJ=w(se()),hJ=w(rs()),pJ=w(ef());Dr();wc=w(TR());yo();Nc.default.initSync();fbe=6e4,mbe=1024*1024*1024,hbe="TRUE",{CONFIG_PARAMS:hE}=Y;o(pbe,"operationsServer");o(Ebe,"setUp");o(_be,"buildServer");o(gbe,"getServerOptions");o(Sbe,"getCORSOpts");o(Tbe,"getHeaderTimeoutConfig")});var cD={};we(cD,{disableNATS:()=>ybe,publishToStream:()=>sy,setNATSReplicator:()=>nD,setPublishToStream:()=>Abe,setSubscription:()=>aD,start:()=>Rbe});function Rbe(){pE.default.get(U.CLUSTERING_ENABLED)&&Ibe()}function ybe(e=!0){RJ=e}function Abe(e,t){sy=e,aD=t}function Ibe(){if(RJ||process.env._DISABLE_NATS)return;let e=it(),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];nD(s,r,i)}}wl((r,n)=>{nD(r.tableName,r.databaseName,r),n&&AJ(r)}),!_J&&(_J=!0)}function nD(e,t,r){if(t==="system"&&Nbe.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){AJ(i)}static subscribe(){let i=new Kn;return aD(t,e,i),i}static subscribeOnThisThread(i){return i<(pE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??bbe)}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 ry(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=yJ;return i}o(n,"getNATSTransaction")}function AJ(e){let t=pE.default.get(U.CLUSTERING_NODENAME);sy(`${iD.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,oD.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 gJ,iD,oD,SJ,TJ,pE,ny,RJ,sy,aD,bbe,yJ,_J,Nbe,ry,sD,bJ=ce(()=>{Me();Ma();gJ=w(Gt()),iD=w(mt()),oD=w(Ki());bu();SJ=w(bw()),TJ=w(bn()),pE=w(oe());H();ny=w(j());o(Rbe,"start");o(ybe,"disableNATS");sy=gJ.publishToStream,aD=SJ.setSubscription;o(Abe,"setPublishToStream");bbe=2;o(Ibe,"assignReplicationSource");Nbe=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(nD,"setNATSReplicator");o(AJ,"publishSchema");ry=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=pE.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||(ny.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(sy(`${iD.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,oD.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw ny.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},sD=class extends ry{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,TJ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};yJ=new sD});async function CJ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await lD.get(e,{returnNonexistent:!0});i=new fD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await lD.get(e);a&&a.delete()}i=new oy(e,t)}return n&&(n.id=e,n.user={username:t?.username},EE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function uD(){return iy++,iy>65500&&(iy=1),iy}function dD(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 si(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 NJ,Oc,wJ,OJ,IJ,lD,EE,iy,oy,fD,PJ=ce(()=>{Me();qu();NJ=w(bn()),Oc=w(j());kc();wJ=w(ze()),OJ=w(jL());Dr();F_();IJ=100,lD=je({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"}]}}]}),EE=je({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,wJ.getWorkerIndex)()===0&&(async()=>{await OJ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of EE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await dD(r,t,r)}catch{(0,Oc.warn)("Failed to publish will",t)}EE.delete(e.id)}})();o(CJ,"getSession");iy=1;o(uD,"getNextMessageId");oy=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,Oc.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 q=Z.id;if(!Array.isArray(q))if(q?.indexOf?.("/")>-1)q=q.split("/");else return!1;if(O&&q.length!==y.length)return!1;for(let W=0;W<y.length;W++)if(y[W]!=="+"&&y[W]!==q[W])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=uD());let Z=O.id;if(Array.isArray(Z)&&(Z=ku(Z)),Z==null&&(Z=""),await this.listener(_+"/"+Z,O.value,F,t)===!1)break;this.awaitingAcks?.size>IJ?await new Promise(W=>setTimeout(W,this.awaitingAcks.size-IJ)):await new Promise(setImmediate)}catch(F){(0,Oc.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=uD();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 dD(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 EE.get(this.sessionId);n?.doesExist()&&await dD(n,n.data,r)}}finally{await EE.delete(this.sessionId)}}).catch(n=>{(0,Oc.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(dD,"publish");fD=class extends oy{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=uD(),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,Oc.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,NJ.getNextMonotonicTime)()),(0,Oc.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),lD.put(this.sessionRecord)}}});var mD={};we(mD,{bypassAuth:()=>wbe,start:()=>Cbe});function wbe(){BJ=!0}function Cbe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new xJ.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),ar.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=DJ(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{ar.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),ar.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&cy.notify?.({username:d?.username,status:ei.SUCCESS,type:ba.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&cy.error?.({username:h,status:ei.FAILURE,type:ba.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else ar.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),ar.error?.(h)}else if(l.required)return ar.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Obe(u.remoteAddress)&&(d=await(0,MJ.getSuperUser)(),ar.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=DJ(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{ar.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function DJ(e,t,r,n,s){LJ||(LJ=!0,fh(f=>{ay>0&&f.push({metric:"mqtt-connections",connections:ay,byThread:!0})}));let i;ay++;let a,c={protocolVersion:4},l=(0,ly.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){ay--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),ar.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),ar.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){ar.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let h=f.topic,p=h?.indexOf("/",1),_=p>0?h.slice(0,p):h;ot(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,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&cy.notify?.({username:n?.username,status:ei.SUCCESS,type:ba.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&cy.error?.({username:f.username,status:ei.FAILURE,type:ba.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=Ro(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?K(f.will.payload):void 0,delete f.will.payload}a=CJ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return ar.error?.(K),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:K.code||5,returnCode:K.code||128})}s.events.emit("connected",a,e),Wr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(K,$,le,ue)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",K);let ie=K.indexOf("/",1),me=ie>0?K.slice(0,ie):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(ie){return ar.error?.(ie),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let N=[];for(let K of f.subscriptions){let $;try{let le=await a.addSubscription(K,K.qos>=1);$=le?le.qos||0:c.protocolVersion<5?128:143}catch(le){s.events.emit("error",le,e,K,a),le.statusCode?le.statusCode===500?ar.warn?.(le):ar.info?.(le):ar.error?.(le),$=c.protocolVersion<5?128:le.statusCode===403?135:le.statusCode===404?143:128}N.push($)}await a.committed,g({cmd:"suback",granted:N,messageId:f.messageId});break;case"unsubscribe":{let K=[];for(let $ of f.unsubscriptions)K.push(a.removeSubscription($)?0:17);g({cmd:"unsuback",granted:K,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let O=f.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type"))),q=(f.payload?.length||0)>0?F(f.payload):void 0,W;try{W=await a.publish(f,q)}catch(K){s.events.emit("error",K,e,f,a),ar.warn?.(K),f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:W===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!0,"connection","mqtt","disconnect"),ar.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),ar.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,ly.generate)(y,c);t(O),ot(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 wa(y,r)}o(T,"serialize")}),l.on("error",f=>{ar.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var ly,MJ,xf,vJ,UJ,xJ,cy,ar,BJ,Obe,LJ,ay,FJ=ce(()=>{ly=require("mqtt-packet");PJ();MJ=w(rs());yo();ji();Dr();xf=w(oe());H();vJ=w(ri()),UJ=w(j()),xJ=require("events"),cy=(0,vJ.loggerWithTag)("auth-event"),ar=(0,UJ.forComponent)("mqtt"),BJ=(0,xf.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(wbe,"bypassAuth");Obe=o(e=>BJ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Cbe,"start");ay=0;o(DJ,"onSocket")});function uy(e,t){if(t?.includes(".."))throw new hD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var hD,pD=ce(()=>{hD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(uy,"resolveBaseURLPath")});function HJ(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 kJ=ce(()=>{o(HJ,"deriveCommonPatternBase")});function dy(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 ED=ce(()=>{o(dy,"deriveGlobOptions")});var qJ,_D,_E,GJ=ce(()=>{pD();kJ();ED();qJ=require("micromatch"),_D=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"}},_E=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=uy(this.name,this.config.urlPath),this.globOptions=dy(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new _D(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,qJ.scan)(s).base),this.commonPatternBase=HJ(this.patternBases)}}});function $J(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function mu(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($J(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if($J(n,t)){t=t.slice(n.length+1);break}}}return(0,VJ.join)(e.baseURLPath,t)}var VJ,gD=ce(()=>{VJ=require("node:path");o($J,"pathStartsWithBase");o(mu,"deriveURLPath")});function KJ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var my,YJ,WJ,SD,zJ,jJ,fy,QJ=ce(()=>{my=require("node:events");GJ();YJ=w(j()),WJ=w(require("chokidar")),SD=require("node:path"),zJ=require("node:fs/promises");gD();jJ=require("micromatch"),fy=class extends my.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new _E(t,r,KJ(n)),this.#r=s||YJ.default.loggerWithTag(t),this.ready=(0,my.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,jJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,SD.join)(this.directory,r);switch(t){case"add":case"change":{let i=mu(this.#e,r,"file");(0,zJ.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=mu(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=mu(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,SD.join)(this.#e.directory,r));return this.#t=WJ.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 _E(this.name,this.directory,KJ(t)),this.#a()}};o(KJ,"castConfig")});var hy,TD=ce(()=>{hy={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var Ey,JJ,XJ,ZJ,e4,t4,RD,yD,AD,bD,ID,py,r4=ce(()=>{Ey=require("events"),JJ=w(require("yaml")),XJ=w(require("chokidar")),ZJ=require("node:fs/promises"),e4=require("util"),t4=w(j());TD();RD=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"}},yD=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},AD=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"}},bD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},ID=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},py=class extends Ey.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||t4.default.loggerWithTag(t),this.ready=(0,Ey.once)(this,"ready"),this.#t=XJ.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,ZJ.readFile)(this.#e,"utf-8").then(t=>{this.#n=JJ.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 RD(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=hy,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,e4.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 yD;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new AD(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 bD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new ID(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 n4(){Lbe[0]=1}var Pbe,Lbe,s4=ce(()=>{vp();Pbe=Xo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),Lbe=new Uint8Array(Pbe);o(n4,"requestRestart")});var Sy,i4,_y,gy,o4=ce(()=>{Sy=require("node:events");QJ();r4();i4=w(j());s4();_y=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},gy=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=i4.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,Sy.once)(this,"ready"),this.options=new py(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 fy(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 _y);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 _y);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}`),n4()}}});function hu(e){return typeof e=="string"&&e.trim()!==""}function ND(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>hu(t))}function u4(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Dbe(e){e.config.root&&gE.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 MD(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(u4(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,SE.join)(e.directory,i);Ty.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 d4(e){let t=!1;if(t=await Dbe(e),t)return t;let r=await(0,a4.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,SE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=mu(e,n.path,"directory");Ty.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=mu(e,n.path,"file"),a=await(0,c4.readFile)(s);Ty.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 gE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var Ty,a4,gE,SE,c4,l4,Ry,Ci,wD,OD,CD,PD,LD,DD,MD,vD,UD,f4=ce(()=>{Ty=require("node:worker_threads"),a4=w(require("fast-glob")),gE=w(j());pD();ED();SE=require("node:path"),c4=require("node:fs/promises");gD();l4=require("micromatch"),Ry=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,!hu(this.config.files)&&!ND(this.config.files)&&!u4(this.config.files))throw new wD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!ND(this.config.files.source)&&!hu(this.config.files.source))throw new OD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new CD(this);if(this.config.files.ignore!==void 0&&!ND(this.config.files.ignore)&&!hu(this.config.files.ignore))throw new PD(this)}if(this.config.root!==void 0&&!hu(this.config.root))throw new DD(this);if(this.config.path!==void 0&&!hu(this.config.path))throw new vD(this);if(this.config.path&&(gE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!hu(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new UD(this);this.globOptions=dy(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new LD(this,r);return r.startsWith("/")&&(gE.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,l4.scan)(r).base),this.baseURLPath=uy(this.name,this.config.urlPath)}},Ci=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,SE.basename)(r.directory)}) ${t}`)}},wD=class extends Ci{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)}},OD=class extends Ci{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},CD=class extends Ci{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},PD=class extends Ci{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},LD=class extends Ci{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},DD=class extends Ci{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)}},MD=class extends Ci{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)}},vD=class extends Ci{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},UD=class extends Ci{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(hu,"isNonEmptyString");o(ND,"isArrayOfNonEmptyStrings");o(u4,"isObject");o(Dbe,"handleRoots");o(d4,"processResourceExtensionComponent")});var wp={};we(wp,{componentErrors:()=>TE,getComponentName:()=>QR,loadComponent:()=>Iy,loadComponentDirectories:()=>p4,setErrorReporter:()=>vbe});function p4(e,t){t&&(BD=t),e&&(qD=e);let r=[];if((0,vt.existsSync)(xD)){let s=(0,vt.readdirSync)(xD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,kr.join)(xD,a);r.push(Iy(c,BD,eA,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(Iy(n,BD,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{h4=!0})}function vbe(e){Ay=e}function Ube(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Xo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Xo.primaryStore.attemptLock(e,0,()=>{clearTimeout(s),r()}))try{(0,vt.rmSync)(t,{recursive:!0,force:!0}),(0,vt.existsSync)((0,kr.join)(e,"node_modules"))||(0,vt.mkdirSync)((0,kr.join)(e,"node_modules")),(0,vt.symlinkSync)($D.PACKAGE_ROOT,t,"dir"),r()}finally{Xo.primaryStore.unlock(e,0)}})}function E4(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(!Xo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(E4(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(()=>{Xo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function Iy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(yy.has(a))return yy.get(a);yy.set(a,!0),s&&(qD=s);try{let c;n&&(TE=new Map);let l=(0,kr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,Ny.getConfigObj)():(0,HD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,kr.join)(e,"config.yaml"))?c=(0,HD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=hy;try{let m=(0,kr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,kD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)($D.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await Ube(e,m)}catch(m){ma.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&ma.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=by,d={};for(let m in c){by=m;let h=c[m];if(TE.set(n?m:(0,kr.basename)(e),!1),!h)continue;let p,_=h.package;try{if(_){let N=e,O;for(;!(0,vt.existsSync)(O=(0,kr.join)(N,"node_modules",m));)if(N=(0,kr.dirname)(N),N.length<(0,kD.getHdbBasePath)().length){O=null;break}if(O)p=await Iy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=Mbe[m];if(!p)continue;let g=o(N=>(N.origin=r,je(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&&ma.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new gy(m,e,l,t,Le);await E4(N,p);continue}if(FD.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&&!m4.includes(N)){let O=GD.get(U.HTTP_SESSIONAFFINITY);O&&ma.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!rS)&&(m4.push(N),eD(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),qD.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new Ry({config:h,name:m,directory:e,module:p,resources:t});d[m]=await d4(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,kr.basename)(e)}' due to: ${g.message}`,Ay?.(g),((0,RE.getWorkerIndex)()===0?console:ma.default).error(g),t.set(h.path||"/",new nl(g),null,!0),TE.set(n?m:(0,kr.basename)(e),g.message)}}if(by=u,FD.isMainThread&&!h4&&i&&(0,RE.watchDir)(e,async()=>p4()),c.extensionModule||c.pluginModule){let m=await tS((0,kr.join)(e,c.extensionModule||c.pluginModule));return yy.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?`;Ay?.(new Error(m)),((0,RE.getWorkerIndex)()===0?console:ma.default).error(m),TE.set((0,kr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||ma.default.warn(`Component ${m} from (${(0,kr.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}`,Ay?.(c),t.set("",new nl(c))}}var vt,kr,FD,HD,GD,$D,ma,RE,kD,Ny,xD,qD,h4,BD,TE,Mbe,m4,yy,Ay,by,QR,ff=ce(()=>{vt=require("node:fs"),kr=require("node:path"),FD=require("node:worker_threads"),HD=require("yaml"),GD=w(oe()),$D=w(It());H();nq();mq();wq();vq();Uq();zq();qj();Wj();jj();ma=w(j());s2();RE=w(ze());zN();Dr();Me();xL();kD=w(oe());EJ();xT();bJ();is();FJ();Ny=w(Ot());wh();ub();o4();f4();WL();vp();TD();xD=(0,Ny.resolvePath)(GD.get(U.COMPONENTSROOT)),qD=new Map,TE=new Map;o(p4,"loadComponentDirectories");Mbe={REST:sS,rest:sS,graphql:kN,graphqlSchema:FN,roles:WN,jsResource:jN,fastifyRoutes:tL,login:JN,static:rL,operationsApi:rD,customFunctions:{},http:jR,clustering:cD,replication:ko,authentication:Tp,mqtt:mD,loadEnv:nL,logging:ma.default,dataLoader:oL},m4=[],yy=new Map;o(vbe,"setErrorReporter");QR=o(()=>by,"getComponentName");o(Ube,"symlinkHarperModule");o(E4,"sequentiallyHandleApplication");o(Iy,"loadComponent")});var XR=M((Dqe,g4)=>{var{isMainThread:_4}=require("worker_threads"),{getTables:xbe,getDatabases:Pqe,table:Lqe}=(Me(),v(_t)),{loadComponentDirectories:Bbe,loadComponent:Fbe}=(ff(),v(wp)),{resetResources:Hbe}=(qu(),v(YU)),kbe=BC(),qbe=Ot(),{dirname:Gbe}=require("path"),{getConnection:$be}=Gt(),Vbe=oe(),{CONFIG_PARAMS:Kbe}=(H(),v(Y)),{loadCertificates:Ybe}=as(),VD=new Map;async function Wbe(e=!1){!_4&&Vbe.get(Kbe.CLUSTERING_ENABLED)&&$be();try{_4&&await kbe()}catch(n){console.error(n)}let t=Hbe();xbe(),t.isWorker=e,await Ybe(),await Fbe(Gbe(qbe.getConfigFilePath()),t,"hdb",!0,VD),await Bbe(VD,t);let r=[];for(let[n]of VD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(Wbe,"loadRootComponents");g4.exports.loadRootComponents=Wbe});var ze=M((vqe,Li)=>{"use strict";uA();var{Worker:zbe,MessageChannel:jbe,parentPort:mo,isMainThread:jD,threadId:Qbe,workerData:ho}=require("worker_threads"),{PACKAGE_ROOT:Jbe}=It(),{join:y4,isAbsolute:Xbe,extname:Zbe}=require("path"),{server:A4}=(Dr(),v(Xf)),{watch:eIe,readdir:tIe}=require("fs/promises"),{totalmem:S4}=require("os"),{setHeapSnapshotNearHeapLimit:rIe}=require("v8"),Cc=(H(),v(Y)),Cy=oe(),Pi=j(),{randomBytes:nIe}=require("crypto"),{_assignPackageExport:sIe}=ti(),T4=1024*1024,Pc=[],Js=[],iIe=50,QD=1e4,oIe="restart",b4="request_thread_info",I4="resource_report",N4="thread_info",w4="added-port",aIe="ack",KD;sIe("threads",Js);Li.exports={startWorker:YD,restartWorkers:XD,shutdownWorkers:fIe,workers:Pc,setMonitorListener:TIe,onMessageFromWorkers:mIe,onMessageByType:v4,broadcast:pIe,broadcastWithAcknowledgement:_Ie,setChildListenerByType:dIe,getWorkerIndex:O4,getWorkerCount:C4,getTicketKeys:L4,setMainIsWorker:lIe,setTerminateTimeout:cIe,restartNumber:ho?.restartNumber||1};Js.onMessageByType=v4;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};Li.exports.whenThreadsStarted=new Promise(e=>{Li.exports.threadsHaveStarted=e});Cy.get(Cc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&rIe(1);var JD;function cIe(e){QD=e}o(cIe,"setTerminateTimeout");function O4(){return ho?ho.workerIndex:JD?0:void 0}o(O4,"getWorkerIndex");function C4(){return ho?ho.workerCount:JD?1:void 0}o(C4,"getWorkerCount");function lIe(e){JD=e,Li.exports.threadsHaveStarted()}o(lIe,"setMainIsWorker");var P4=1,wy;function L4(){return wy||(wy=jD?nIe(48):ho.ticketKeys,wy)}o(L4,"getTicketKeys");Object.defineProperty(A4,"workerIndex",{get(){return O4()}});Object.defineProperty(A4,"workerCount",{get(){return C4()}});var D4={[b4](e,t){gIe(t)},[I4](e,t){SIe(t,e)}};function YD(e,t={}){let r=process.constrainedMemory?.()||S4();r=Math.min(r,S4(),2e4*T4);let n=Cy.get(Cc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/T4/(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 jbe;d.existingPort=u,i.push(d),a.push(d.port2)}Zbe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];Cy.get(Cc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new zbe(Xbe(e)?e:y4(Jbe,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:P4=t.threadCount,name:t.name,restartNumber:Li.exports.restartNumber,ticketKeys:L4()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:w4,port:u,threadId:l.threadId},[u]);return Py(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>YD(e,t),l.on("error",u=>{Pi.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{Pc.splice(Pc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<iIe?(t.unexpectedRestarts=l.unexpectedRestarts+1,YD(e,t)):Pi.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{D4[u.type]?.(u,l)}),Pc.push(l),yIe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(YD,"startWorker");var uIe=[Cc.THREAD_TYPES.HTTP];async function XD(e=null,t=Math.max(P4>3,1),r=!0){if(jD){try{process.chdir(process.cwd())}catch(a){Pi.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=XR();await a()}Li.exports.restartNumber++,t<1&&(t=t*Pc.length);let n=[],s=[];for(let a of Pc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Pi.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Li.exports.restartNumber,type:Cc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=uIe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Pi.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},QD*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===Cc.ITC_EVENT_TYPES.CHILD_STARTED&&(Pi.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Pi.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}=cf();r&&(e==="http"||!e)&&Cy.get(Cc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else mo.postMessage({type:oIe,workerType:e})}o(XD,"restartWorkers");function dIe(e,t){D4[e]=t}o(dIe,"setChildListenerByType");function fIe(e){return XD(e,1/0,!1)}o(fIe,"shutdownWorkers");var M4=[];function mIe(e){M4.push(e)}o(mIe,"onMessageFromWorkers");var WD=new Map;function v4(e,t){let r=WD.get(e);r||WD.set(e,r=[]),r.push(t)}o(v4,"onMessageByType");var hIe=10;async function pIe(e,t){let r=0;for(let n of Js)try{n.postMessage(e),r++>hIe&&(r=0,await new Promise(setImmediate))}catch(s){Pi.error("Unable to send message to worker",s)}t&&x4(e,null)}o(pIe,"broadcast");var Oy=new Map,EIe=1;function _Ie(e){return new Promise(t=>{let r=0;for(let n of Js)try{let s=EIe++,i=o(()=>{Oy.delete(s),--r===0&&t(),n!==mo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,Oy.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of Oy)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Pi.error("Unable to send message to worker",s)}r===0&&t()})}o(_Ie,"broadcastWithAcknowledgement");function gIe(e){e.postMessage({type:N4,workers:U4()})}o(gIe,"sendThreadInfo");function U4(){let e=Date.now();return Pc.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(U4,"getChildWorkerInfo");function SIe(e,t){e.resources=t,e.resources.updated=Date.now()}o(SIe,"recordResourceReport");var zD;function TIe(e){zD=e}o(TIe,"setMonitorListener");var RIe=1e3,R4=!1;function yIe(){R4||(R4=!0,setInterval(()=>{for(let e of Pc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}zD&&zD()},RIe).unref())}o(yIe,"startMonitoring");var AIe=1e3;if(mo&&ho?.addPorts){Py(mo);for(let e=0,t=ho.addPorts.length;e<t;e++){let r=ho.addPorts[e];r.threadId=ho.addThreadIds[e],Py(r)}setInterval(()=>{let e=process.memoryUsage();mo.postMessage({type:I4,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},AIe).unref(),KD=o(()=>new Promise((e,t)=>{mo.on("message",r),mo.postMessage({type:b4});function r(n){n.type===N4&&(mo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else KD=U4;Li.exports.getThreadInfo=KD;function Py(e,t){Js.push(e),e.on("message",r=>{if(r.type===w4)r.port.threadId=r.threadId,Py(r.port);else if(r.type===aIe){let n=Oy.get(r.id);n&&n()}else x4(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 x4(e,t){for(let n of M4)n(e,t);let r=WD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Pi.error(s)}}o(x4,"notifyMessageListeners");if(jD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await tIe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(y4(s,a.name));try{for await(let{filename:a}of eIe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await XD(),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");Li.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else mo.on("message",async e=>{let{type:t}=e;t===Cc.ITC_EVENT_TYPES.SHUTDOWN&&(Li.exports.restartNumber=e.restartNumber,mo.unref(),setTimeout(()=>{Pi.warn("Thread did not voluntarily terminate",Qbe),process.exit(0)},QD).unref())})});var G4=M((Fqe,q4)=>{"use strict";var{promises:Bf,createReadStream:bIe,createWriteStream:IIe}=require("fs"),{createGzip:NIe}=require("zlib"),{promisify:wIe}=require("util"),{pipeline:OIe}=require("stream"),CIe=wIe(OIe),eM=require("path"),k4=oe();k4.initSync();var Ly=j(),{CONFIG_PARAMS:PIe,ITC_EVENT_TYPES:xqe}=(H(),v(Y)),{onMessageFromWorkers:Bqe}=ze(),{convertToMS:B4}=se(),{onStorageReclamation:LIe}=(T_(),v(pU)),DIe=6e4,MIe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",vIe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",ZD,F4;q4.exports=UIe;function UIe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(LIe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(MIe);if(!i)throw new Error(vIe);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=B4(r));let d;return ZD=Date.now(),Ly.trace("Log rotate enabled, maxSize:",t,"interval:",r),F4=setInterval(async()=>{if(l){let f;f=await Bf.stat(e.path),f.size>=l&&(d=await H4(e.path,i))}if(u&&Date.now()-ZD>=u&&(d=await H4(e.path,i),ZD=Date.now()),n||c){let f=B4(n??"1M")/(1+c);c=0;let m=await Bf.readdir(i);for(let h of m)try{let p=await Bf.stat(eM.join(i,h));Date.now()-p.mtimeMs>f&&await Bf.unlink(eM.join(i,h))}catch(p){Ly.error("Error trying to remove log",h,p)}}},a??DIe).unref(),{end(){clearInterval(F4)},getLastRotatedLogPath(){return d}}}o(UIe,"logRotator");async function H4(e,t){let r=k4.get(PIe.LOGGING_ROTATION_COMPRESS),n=eM.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Bf.rename(e,n),r&&(e=n,n+=".gz",await CIe(bIe(e),NIe(),IIe(n)),await Bf.unlink(e)),Ly.closeLogFile(),Ly.notify(`hdb.log rotated, old log moved to ${n}`),n}o(H4,"moveLogFile")});var W4={};we(W4,{RootConfigWatcher:()=>tM});var $4,V4,K4,Dy,Y4,tM,z4=ce(()=>{$4=w(require("chokidar")),V4=require("node:fs/promises"),K4=w(Ot()),Dy=require("node:stream"),Y4=require("yaml"),tM=class extends Dy.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,K4.getConfigFilePath)(),this.#t=$4.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,V4.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,Y4.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,Dy.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var j=M(($qe,ky)=>{"use strict";var ha=require("fs-extra"),{workerData:xIe,threadId:BIe,isMainThread:t3}=require("worker_threads"),bE=require("path"),r3=require("yaml"),n3=require("properties-reader"),qr=(H(),v(Y)),j4=Hc(),FIe=require("os"),{PACKAGE_ROOT:cM}=It(),{_assignPackageExport:HIe}=ti(),{Console:kIe}=require("console"),Q4=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),J4=new Map,{join:pa}=bE,X4=1e4,cr={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},qIe={STDOUT:"stdOut",STDERR:"stdErr"},Gqe=pa(cM,"logs"),GIe=pa(cM,"config/yaml/",qr.HDB_DEFAULT_CONFIG_FILE),$Ie=1e4,IE,NE,My,po,nM,rM,Uy,Ut,qn,xy,By,Ff,AE,yE;function vy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=bE.dirname(n)):t.root?n=pa(t.root,nM):(n=Ut.path,t.root||(t.root=bE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=cr[t.level]??Ut?.level??cr.info,s3(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(vy,"updateLogger");function s3(e){let t=e.conditional??(e.conditional={});t.notify=cr.notify>=e.level?e.notify.bind(e):void 0,t.fatal=cr.fatal>=e.level?e.fatal.bind(e):void 0,t.error=cr.error>=e.level?e.error.bind(e):void 0,t.warn=cr.warn>=e.level?e.warn.bind(e):void 0,t.info=cr.info>=e.level?e.info.bind(e):void 0,t.debug=cr.debug>=e.level?e.debug.bind(e):void 0,t.trace=cr.trace>=e.level?e.trace.bind(e):void 0}o(s3,"updateConditional");async function sM(){yE||(yE=new cNe,await yE.ready(),yE.on("change",sM));let e=yE.config,t=e.logging??{};vy(Ut,t),Uy=Ut.path,IE=t.console??!1,t.external&&vy(qn,t.external);for(let r in e){let n=e[r];n.logging?vy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&vy(Ut.forComponent(r),t,r)}}o(sM,"updateLogSettings");var iM=class extends kIe{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){Rn="trace",this.level<=cr.trace&&super.info(...t),Rn="info"}debug(...t){Rn="debug",this.level<=cr.debug&&super.info(...t),Rn="info"}info(...t){Rn="info",this.level<=cr.info&&super.info(...t),Rn="info"}warn(...t){Rn="warn",this.level<=cr.warn&&super.warn(...t),Rn="info"}error(...t){Rn="error",this.level<=cr.error&&super.error(...t),Rn="info"}fatal(...t){Ff=!0;try{Rn="fatal",this.level<=cr.fatal&&super.error(...t),Rn="info"}finally{Ff=!1}}notify(...t){Ff=!0;try{Rn="notify",this.level<=cr.notify&&super.info(...t),Rn="info"}finally{Ff=!1}}withTag(t){return o3(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};AE===void 0&&i3();ky.exports={notify:JIe,fatal:XIe,error:aM,warn:ZIe,info:zIe,debug:QIe,trace:jIe,logLevel:po,loggerWithTag:o3,suppressLogging:YIe,initLogSettings:i3,logCustomLevel:eNe,closeLogFile:a3,createLogger:Hy,logsAtLevel:VIe,getLogFilePath:o(()=>Uy,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:oNe,setLogLevel:rNe,OUTPUTS:qIe,AuthAuditLog:aNe,start:sM,startOnMainThread:sM,errorToString:iNe};ky.exports.externalLogger={notify(...e){qn.notify(...e)},fatal(...e){qn.fatal(...e)},error(...e){qn.error(...e)},warn(...e){qn.warn(...e)},info(...e){qn.info(...e)},debug(...e){qn.debug(...e)},trace(...e){qn.trace(...e)},withTag(e){return qn.withTag(e)},loggerWithTag(e){return qn.withTag(e)}};HIe("logger",ky.exports.externalLogger);function VIe(e){return cr[po]<=cr[e]}o(VIe,"logsAtLevel");function i3(e=!1){try{if(AE===void 0||e){a3();let t=tNe(),r=j4(["ROOTPATH"]);try{AE=n3(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!ha.pathExistsSync(pa(r.ROOTPATH,qr.HDB_CONFIG_FILE)))throw s}let n;if({level:po,configLogPath:rM,toFile:NE,logConsole:IE,rotation:n,toStream:My}=nNe(r.ROOTPATH?pa(r.ROOTPATH,qr.HDB_CONFIG_FILE):AE.get("settings_path")),nM=qr.LOG_NAMES.HDB,Uy=pa(rM,nM),Ut=Hy({path:Uy,level:po,stdStreams:My,rotation:n}),qn=Ut.forComponent("external"),qn.tag=null,t3)try{require("segfault-handler").registerHandler(pa(rM,"crash.log"))}catch{}}}catch(t){if(AE=void 0,t.code===qr.NODE_ERROR_CODES.ENOENT||t.code===qr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=j4(Object.keys(qr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=qr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===qr.CONFIG_PARAMS.LOGGING_LEVEL){po=a;continue}i===qr.CONFIG_PARAMS.LOGGING_CONSOLE&&(IE=i)}let{defaultLevel:n}=sNe();NE=!1,My=!0,po=po===void 0?n:po,Ut=Hy({level:po}),qn=Ut.forComponent("external"),qn.tag=null;return}throw aM("Error initializing log settings"),aM(t),t}process.env.DEV_MODE&&(My=!0),KIe()}o(i3,"initLogSettings");var Lc=!0;function KIe(){NE&&(process.stdout.write=function(e){return typeof e=="string"&&Lc&&IE&&(e=e.toString(),e[e.length-1]===`
126
+ `))}},25).unref()}l.close?.(()=>{if(js.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&Of()==0)try{VQ(ZAe(js.get(gs.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,JR),l.cantCleanupProperly||Oi.warn("Had to forcefully exit the thread",JR),process.exit(0)},5e3).unref()})}if(YQ||process.env.DEV_MODE)try{require("inspector").close()}catch(c){Oi.info("Could not close debugger",c)}}}).ref();let r;fE&&!nbe&&(r=zQ()),Promise.resolve(r).then(()=>{if(Of()===0)try{ebe(tbe)}catch(n){console.error("Error displaying start-up log",n)}qQ?.postMessage({type:gs.ITC_EVENT_TYPES.CHILD_STARTED})})});return KQ(t),t}o(WQ,"startServers");function zQ(){let e=[];for(let t in Cf){let r=Cf[t];if(t.includes?.("/")&&Of()==0){zAe(t)&&VQ(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),Oi.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=js.get(gs.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let a=typeof s=="string"?s.split("-"):s,c=Of();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?fE?n={fd:fE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:fE?n={fd:fE(+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}),Oi.trace("Listening on port "+t,JR)}).on("error",c)}))}return Promise.all(e)}o(zQ,"listenOnPorts");!zL&&!YAe?.noServerStart&&WQ();function sbe(e,t){let r=(ff(),v(wp)).getComponentName,n;if(t.securePort){GQ(t.securePort,{protocol_name:"TLS",name:r()});let s=XAe("server",t.mtls),i=js.get("tls");n=QAe({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),Cf[t.securePort]=n}return t.port&&(GQ(t.port,{protocol_name:"TCP",name:r()}),n=WAe(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Cf[t.port]=n),n}o(sbe,"onSocket")});var yQ={};we(yQ,{startHTTPThreads:()=>obe,startSocketServer:()=>eD,updateWorkerIdleness:()=>nJ});async function obe(e=2,t){IN().catch(r=>vf.error?.("Error recording hostname for analytics:",r));try{if(t)XL(0,1,!0);else{let{loadRootComponents:r}=XR();if(e===0)return(0,Qs.setMainIsWorker)(!0),await jL().startServers(),Promise.resolve([]);await r()}rJ();for(let r=0;r<e;r++)XL(r,e);return Promise.all(tJ)}finally{(0,Qs.threadsHaveStarted)()}}function rJ(){let e=(0,XQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),JL=setInterval(()=>{vf.notify(e)},ibe).unref())}function XL(e,t=1,r){if(QL++,(0,Qs.startWorker)("server/threads/threadServer.js",{name:lA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===iA.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});tJ.push(s),await s,Pf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=ey.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=Pf.indexOf(n);a>-1&&Pf.splice(a,1)}if(o(i,"removeWorker"),Lf){let a=Lf;Lf=[];for(let c of a)eJ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{ZL?ZL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,Qs.shutdownWorkers)(),QL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function eD(e=0,t){if(typeof e=="string")try{(0,ty.existsSync)(e)&&(0,ty.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=abe:r=cbe(t):r=tD;let n=(0,Df.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=eJ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),ZL=!0,r(i,(a,c)=>{if(!a){if(jQ){let u=i._socket||new Df.Socket({handle:i,writable:!0,readable:!0});jQ.deliverSocket(u,e,c),u.resume()}else QL>0?(Lf.length===0&&setTimeout(()=>{Lf.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,Lf.push(i)):(console.log("start up a dynamic thread to handle request"),XL(0));ot(!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 Df.Socket({handle:i,writable:!0,readable:!0});dbe(u,a,e)}ot(!0,"socket-routed")})},vf.info(`HarperDB ${ZQ.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 tD(e,t){let r,n=0;for(let s of Pf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=ZR)return ZR=i,t(r);n=i}ZR=0,t(r)}function abe(e,t){let r={};e.getpeername(r);let n=r.address,s=Mf.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);tD(e,a=>{Mf.set(n,{worker:a,lastUsed:i}),t(a)})}function cbe(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Df.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=Mf.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);tD(n,f=>{Mf.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function nJ(){ZR=0;for(let e of Pf)e.expectedIdle=e.recentELU.idle+lbe,e.requests=1;Pf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function dbe(e,t,r){let n=ube++;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(),ey.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")),ey.delete(n)),s.event=="destroy"&&(e.destroy(),ey.delete(n))})}var Qs,Df,vf,ty,JQ,XQ,ZQ,Pf,Lf,eJ,jQ,QL,tJ,JL,ibe,ZL,ZR,QQ,Mf,lbe,ey,ube,xL=ce(()=>{Qs=w(ze()),Df=require("net");H();vf=w(j()),ty=require("fs");ji();JQ=require("worker_threads"),XQ=w(ef()),ZQ=w(It()),Pf=[],Lf=[],eJ=[],QL=0,tJ=[];JQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,Qs.onMessageFromWorkers)(e=>{e.type===cA.RESTART&&JL&&(clearInterval(JL),rJ())}));ibe=6e5;o(obe,"startHTTPThreads");o(rJ,"licenseWarning");o(XL,"startHTTPWorker");o(eD,"startSocketServer");ZR=0;o(tD,"findMostIdleWorker");QQ=36e5,Mf=new Map;o(abe,"findByRemoteAddressAffinity");o(cbe,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Mf)r.lastUsed+QQ<e&&Mf.delete(t)},QQ).unref();lbe=1e3;o(nJ,"updateWorkerIdleness");(0,Qs.setMonitorListener)(nJ);ey=new Map,ube=1;o(dbe,"proxySocket")});var rD={};we(rD,{hdbServer:()=>pbe,start:()=>pbe});async function pbe(e){try{fo.default.debug("In Fastify server"+process.cwd()),fo.default.debug(`Running with NODE_ENV set as: ${process.env.NODE_ENV}`),fo.default.debug(`HarperDB server process ${process.pid} starting up.`),global.clustering_on=!1,global.isMaster=sJ.default.isMaster,await Ebe();let t=e.securePort>0;Uf=_be(t),await Uf.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Uf.server,e),Uf.server.closeIdleConnections||await Uf.listen({port:0,host:"::"})}catch(r){throw Uf.close(),fo.default.error(r),fo.default.error("Error configuring operations server"),r}}catch(t){console.error(`Failed to build server on ${process.pid}`,t),fo.default.fatal(t),process.exit(1)}}async function Ebe(){fo.default.trace("Configuring HarperDB process."),fJ.default.setSchemaDataToGlobal(),await hJ.default.setUsersWithRolesCache(),await pJ.default.getLicense()}function _be(e){fo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=gbe(e),r=(0,iJ.default)(t);r.server.headersTimeout=Tbe(),r.setErrorHandler(wc.serverErrorHandler);let n=Sbe();n&&r.register(oJ.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(lJ.default),r.register(aJ.default),r.register(cJ.default,{root:uJ.default.join(dJ.PACKAGE_ROOT,"studio/build-local")}),mm(r);let s=Nc.default.get(sA.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!mJ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[wc.reqBodyValidationHandler,wc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,wc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),fo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function gbe(e){let t=Nc.default.get(hE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Nc.default.get(hE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:mbe,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function Sbe(){let e=Nc.default.get(hE.OPERATIONSAPI_NETWORK_CORS),t=Nc.default.get(hE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===hbe)&&(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 Tbe(){return Nc.default.get(hE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??fbe}var sJ,Nc,fo,iJ,oJ,aJ,cJ,lJ,uJ,dJ,fJ,mJ,hJ,pJ,wc,fbe,mbe,hbe,hE,Uf,EJ=ce(()=>{sJ=w(require("cluster")),Nc=w(oe());H();fo=w(j()),iJ=w(require("fastify")),oJ=w(require("@fastify/cors")),aJ=w(require("@fastify/compress")),cJ=w(require("@fastify/static")),lJ=w(cw()),uJ=w(require("path")),dJ=w(It()),fJ=w(ws()),mJ=w(se()),hJ=w(rs()),pJ=w(ef());Dr();wc=w(TR());yo();Nc.default.initSync();fbe=6e4,mbe=1024*1024*1024,hbe="TRUE",{CONFIG_PARAMS:hE}=Y;o(pbe,"operationsServer");o(Ebe,"setUp");o(_be,"buildServer");o(gbe,"getServerOptions");o(Sbe,"getCORSOpts");o(Tbe,"getHeaderTimeoutConfig")});var cD={};we(cD,{disableNATS:()=>ybe,publishToStream:()=>sy,setNATSReplicator:()=>nD,setPublishToStream:()=>Abe,setSubscription:()=>aD,start:()=>Rbe});function Rbe(){pE.default.get(U.CLUSTERING_ENABLED)&&Ibe()}function ybe(e=!0){RJ=e}function Abe(e,t){sy=e,aD=t}function Ibe(){if(RJ||process.env._DISABLE_NATS)return;let e=it(),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];nD(s,r,i)}}wl((r,n)=>{nD(r.tableName,r.databaseName,r),n&&AJ(r)}),!_J&&(_J=!0)}function nD(e,t,r){if(t==="system"&&Nbe.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){AJ(i)}static subscribe(){let i=new Kn;return aD(t,e,i),i}static subscribeOnThisThread(i){return i<(pE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??bbe)}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 ry(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=yJ;return i}o(n,"getNATSTransaction")}function AJ(e){let t=pE.default.get(U.CLUSTERING_NODENAME);sy(`${iD.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,oD.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 gJ,iD,oD,SJ,TJ,pE,ny,RJ,sy,aD,bbe,yJ,_J,Nbe,ry,sD,bJ=ce(()=>{Me();Ma();gJ=w(Gt()),iD=w(mt()),oD=w(Ki());bu();SJ=w(bw()),TJ=w(bn()),pE=w(oe());H();ny=w(j());o(Rbe,"start");o(ybe,"disableNATS");sy=gJ.publishToStream,aD=SJ.setSubscription;o(Abe,"setPublishToStream");bbe=2;o(Ibe,"assignReplicationSource");Nbe=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(nD,"setNATSReplicator");o(AJ,"publishSchema");ry=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=pE.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||(ny.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(sy(`${iD.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,oD.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw ny.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},sD=class extends ry{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,TJ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};yJ=new sD});async function CJ({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await lD.get(e,{returnNonexistent:!0});i=new fD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await lD.get(e);a&&a.delete()}i=new oy(e,t)}return n&&(n.id=e,n.user={username:t?.username},EE.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function uD(){return iy++,iy>65500&&(iy=1),iy}function dD(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 si(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 NJ,Oc,wJ,OJ,IJ,lD,EE,iy,oy,fD,PJ=ce(()=>{Me();qu();NJ=w(bn()),Oc=w(j());kc();wJ=w(ze()),OJ=w(jL());Dr();F_();IJ=100,lD=je({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"}]}}]}),EE=je({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,wJ.getWorkerIndex)()===0&&(async()=>{await OJ.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of EE.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await dD(r,t,r)}catch{(0,Oc.warn)("Failed to publish will",t)}EE.delete(e.id)}})();o(CJ,"getSession");iy=1;o(uD,"getNextMessageId");oy=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,Oc.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 q=Z.id;if(!Array.isArray(q))if(q?.indexOf?.("/")>-1)q=q.split("/");else return!1;if(O&&q.length!==y.length)return!1;for(let W=0;W<y.length;W++)if(y[W]!=="+"&&y[W]!==q[W])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=uD());let Z=O.id;if(Array.isArray(Z)&&(Z=ku(Z)),Z==null&&(Z=""),await this.listener(_+"/"+Z,O.value,F,t)===!1)break;this.awaitingAcks?.size>IJ?await new Promise(W=>setTimeout(W,this.awaitingAcks.size-IJ)):await new Promise(setImmediate)}catch(F){(0,Oc.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=uD();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 dD(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 EE.get(this.sessionId);n?.doesExist()&&await dD(n,n.data,r)}}finally{await EE.delete(this.sessionId)}}).catch(n=>{(0,Oc.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(dD,"publish");fD=class extends oy{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=uD(),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,Oc.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,NJ.getNextMonotonicTime)()),(0,Oc.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),lD.put(this.sessionRecord)}}});var mD={};we(mD,{bypassAuth:()=>wbe,start:()=>Cbe});function wbe(){BJ=!0}function Cbe({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new xJ.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),ar.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=DJ(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{ar.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),ar.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&cy.notify?.({username:d?.username,status:ei.SUCCESS,type:ba.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&cy.error?.({username:h,status:ei.FAILURE,type:ba.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else ar.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),ar.error?.(h)}else if(l.required)return ar.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Obe(u.remoteAddress)&&(d=await(0,MJ.getSuperUser)(),ar.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=DJ(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{ar.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function DJ(e,t,r,n,s){LJ||(LJ=!0,fh(f=>{ay>0&&f.push({metric:"mqtt-connections",connections:ay,byThread:!0})}));let i;ay++;let a,c={protocolVersion:4},l=(0,ly.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){ay--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),ar.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),ar.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){ar.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let h=f.topic,p=h?.indexOf("/",1),_=p>0?h.slice(0,p):h;ot(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,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&cy.notify?.({username:n?.username,status:ei.SUCCESS,type:ba.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,xf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&cy.error?.({username:f.username,status:ei.FAILURE,type:ba.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=Ro(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?K(f.will.payload):void 0,delete f.will.payload}a=CJ({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return ar.error?.(K),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:K.code||5,returnCode:K.code||128})}s.events.emit("connected",a,e),Wr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(K,$,le,ue)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",K);let ie=K.indexOf("/",1),me=ie>0?K.slice(0,ie):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(ie){return ar.error?.(ie),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let N=[];for(let K of f.subscriptions){let $;try{let le=await a.addSubscription(K,K.qos>=1);$=le?le.qos||0:c.protocolVersion<5?128:143}catch(le){s.events.emit("error",le,e,K,a),le.statusCode?le.statusCode===500?ar.warn?.(le):ar.info?.(le):ar.error?.(le),$=c.protocolVersion<5?128:le.statusCode===403?135:le.statusCode===404?143:128}N.push($)}await a.committed,g({cmd:"suback",granted:N,messageId:f.messageId});break;case"unsubscribe":{let K=[];for(let $ of f.unsubscriptions)K.push(a.removeSubscription($)?0:17);g({cmd:"unsuback",granted:K,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let O=f.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=Ro(r?.headers.get?.("content-type"))),q=(f.payload?.length||0)>0?F(f.payload):void 0,W;try{W=await a.publish(f,q)}catch(K){s.events.emit("error",K,e,f,a),ar.warn?.(K),f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:W===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!0,"connection","mqtt","disconnect"),ar.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),ar.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,ly.generate)(y,c);t(O),ot(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 wa(y,r)}o(T,"serialize")}),l.on("error",f=>{ar.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var ly,MJ,xf,vJ,UJ,xJ,cy,ar,BJ,Obe,LJ,ay,FJ=ce(()=>{ly=require("mqtt-packet");PJ();MJ=w(rs());yo();ji();Dr();xf=w(oe());H();vJ=w(ri()),UJ=w(j()),xJ=require("events"),cy=(0,vJ.loggerWithTag)("auth-event"),ar=(0,UJ.forComponent)("mqtt"),BJ=(0,xf.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(wbe,"bypassAuth");Obe=o(e=>BJ&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Cbe,"start");ay=0;o(DJ,"onSocket")});function uy(e,t){if(t?.includes(".."))throw new hD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var hD,pD=ce(()=>{hD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(uy,"resolveBaseURLPath")});function HJ(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 kJ=ce(()=>{o(HJ,"deriveCommonPatternBase")});function dy(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 ED=ce(()=>{o(dy,"deriveGlobOptions")});var qJ,_D,_E,GJ=ce(()=>{pD();kJ();ED();qJ=require("micromatch"),_D=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"}},_E=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=uy(this.name,this.config.urlPath),this.globOptions=dy(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new _D(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,qJ.scan)(s).base),this.commonPatternBase=HJ(this.patternBases)}}});function $J(e,t){return new RegExp(`^${e}(/|$)`).test(t)}function mu(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($J(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if($J(n,t)){t=t.slice(n.length+1);break}}}return(0,VJ.join)(e.baseURLPath,t)}var VJ,gD=ce(()=>{VJ=require("node:path");o($J,"pathStartsWithBase");o(mu,"deriveURLPath")});function KJ(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var my,YJ,WJ,SD,zJ,jJ,fy,QJ=ce(()=>{my=require("node:events");GJ();YJ=w(j()),WJ=w(require("chokidar")),SD=require("node:path"),zJ=require("node:fs/promises");gD();jJ=require("micromatch"),fy=class extends my.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new _E(t,r,KJ(n)),this.#r=s||YJ.default.loggerWithTag(t),this.ready=(0,my.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,jJ.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,SD.join)(this.directory,r);switch(t){case"add":case"change":{let i=mu(this.#e,r,"file");(0,zJ.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=mu(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=mu(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,SD.join)(this.#e.directory,r));return this.#t=WJ.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 _E(this.name,this.directory,KJ(t)),this.#a()}};o(KJ,"castConfig")});var hy,TD=ce(()=>{hy={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var Ey,JJ,XJ,ZJ,e4,t4,RD,yD,AD,bD,ID,py,r4=ce(()=>{Ey=require("events"),JJ=w(require("yaml")),XJ=w(require("chokidar")),ZJ=require("node:fs/promises"),e4=require("util"),t4=w(j());TD();RD=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"}},yD=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},AD=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"}},bD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},ID=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},py=class extends Ey.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||t4.default.loggerWithTag(t),this.ready=(0,Ey.once)(this,"ready"),this.#t=XJ.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,ZJ.readFile)(this.#e,"utf-8").then(t=>{this.#n=JJ.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 RD(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=hy,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,e4.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 yD;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new AD(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 bD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new ID(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 n4(){Lbe[0]=1}var Pbe,Lbe,s4=ce(()=>{vp();Pbe=Xo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),Lbe=new Uint8Array(Pbe);o(n4,"requestRestart")});var Sy,i4,_y,gy,o4=ce(()=>{Sy=require("node:events");QJ();r4();i4=w(j());s4();_y=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},gy=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=i4.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,Sy.once)(this,"ready"),this.options=new py(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 fy(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 _y);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 _y);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}`),n4()}}});function hu(e){return typeof e=="string"&&e.trim()!==""}function ND(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>hu(t))}function u4(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Dbe(e){e.config.root&&gE.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 MD(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(u4(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,SE.join)(e.directory,i);Ty.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 d4(e){let t=!1;if(t=await Dbe(e),t)return t;let r=await(0,a4.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,SE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=mu(e,n.path,"directory");Ty.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=mu(e,n.path,"file"),a=await(0,c4.readFile)(s);Ty.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 gE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var Ty,a4,gE,SE,c4,l4,Ry,Ci,wD,OD,CD,PD,LD,DD,MD,vD,UD,f4=ce(()=>{Ty=require("node:worker_threads"),a4=w(require("fast-glob")),gE=w(j());pD();ED();SE=require("node:path"),c4=require("node:fs/promises");gD();l4=require("micromatch"),Ry=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,!hu(this.config.files)&&!ND(this.config.files)&&!u4(this.config.files))throw new wD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!ND(this.config.files.source)&&!hu(this.config.files.source))throw new OD(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new CD(this);if(this.config.files.ignore!==void 0&&!ND(this.config.files.ignore)&&!hu(this.config.files.ignore))throw new PD(this)}if(this.config.root!==void 0&&!hu(this.config.root))throw new DD(this);if(this.config.path!==void 0&&!hu(this.config.path))throw new vD(this);if(this.config.path&&(gE.default.warn("Resource extension 'path' option is deprecated. Please replace with 'urlPath'."),this.config.urlPath=this.config.path),this.config.urlPath!==void 0&&(!hu(this.config.urlPath)||typeof this.config.urlPath=="string"&&this.config.urlPath.includes("..")))throw new UD(this);this.globOptions=dy(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new LD(this,r);return r.startsWith("/")&&(gE.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,l4.scan)(r).base),this.baseURLPath=uy(this.name,this.config.urlPath)}},Ci=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,SE.basename)(r.directory)}) ${t}`)}},wD=class extends Ci{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)}},OD=class extends Ci{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},CD=class extends Ci{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},PD=class extends Ci{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},LD=class extends Ci{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},DD=class extends Ci{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)}},MD=class extends Ci{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)}},vD=class extends Ci{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},UD=class extends Ci{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(hu,"isNonEmptyString");o(ND,"isArrayOfNonEmptyStrings");o(u4,"isObject");o(Dbe,"handleRoots");o(d4,"processResourceExtensionComponent")});var wp={};we(wp,{componentErrors:()=>TE,getComponentName:()=>QR,loadComponent:()=>Iy,loadComponentDirectories:()=>p4,setErrorReporter:()=>vbe});function p4(e,t){t&&(BD=t),e&&(qD=e);let r=[];if((0,vt.existsSync)(xD)){let s=(0,vt.readdirSync)(xD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,kr.join)(xD,a);r.push(Iy(c,BD,eA,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(Iy(n,BD,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{h4=!0})}function vbe(e){Ay=e}function Ube(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Xo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Xo.primaryStore.attemptLock(e,0,()=>{clearTimeout(s),r()}))try{(0,vt.rmSync)(t,{recursive:!0,force:!0}),(0,vt.existsSync)((0,kr.join)(e,"node_modules"))||(0,vt.mkdirSync)((0,kr.join)(e,"node_modules")),(0,vt.symlinkSync)($D.PACKAGE_ROOT,t,"dir"),r()}finally{Xo.primaryStore.unlock(e,0)}})}function E4(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(!Xo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(E4(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(()=>{Xo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function Iy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(yy.has(a))return yy.get(a);yy.set(a,!0),s&&(qD=s);try{let c;n&&(TE=new Map);let l=(0,kr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,Ny.getConfigObj)():(0,HD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,kr.join)(e,"config.yaml"))?c=(0,HD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=hy;try{let m=(0,kr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,kD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)($D.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await Ube(e,m)}catch(m){ma.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&ma.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=by,d={};for(let m in c){by=m;let h=c[m];if(TE.set(n?m:(0,kr.basename)(e),!1),!h)continue;let p,_=h.package;try{if(_){let N=e,O;for(;!(0,vt.existsSync)(O=(0,kr.join)(N,"node_modules",m));)if(N=(0,kr.dirname)(N),N.length<(0,kD.getHdbBasePath)().length){O=null;break}if(O)p=await Iy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=Mbe[m];if(!p)continue;let g=o(N=>(N.origin=r,je(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&&ma.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new gy(m,e,l,t,Le);await E4(N,p);continue}if(FD.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&&!m4.includes(N)){let O=GD.get(U.HTTP_SESSIONAFFINITY);O&&ma.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!rS)&&(m4.push(N),eD(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),qD.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new Ry({config:h,name:m,directory:e,module:p,resources:t});d[m]=await d4(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,kr.basename)(e)}' due to: ${g.message}`,Ay?.(g),((0,RE.getWorkerIndex)()===0?console:ma.default).error(g),t.set(h.path||"/",new nl(g),null,!0),TE.set(n?m:(0,kr.basename)(e),g.message)}}if(by=u,FD.isMainThread&&!h4&&i&&(0,RE.watchDir)(e,async()=>p4()),c.extensionModule||c.pluginModule){let m=await tS((0,kr.join)(e,c.extensionModule||c.pluginModule));return yy.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?`;Ay?.(new Error(m)),((0,RE.getWorkerIndex)()===0?console:ma.default).error(m),TE.set((0,kr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||ma.default.warn(`Component ${m} from (${(0,kr.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}`,Ay?.(c),t.set("",new nl(c))}}var vt,kr,FD,HD,GD,$D,ma,RE,kD,Ny,xD,qD,h4,BD,TE,Mbe,m4,yy,Ay,by,QR,ff=ce(()=>{vt=require("node:fs"),kr=require("node:path"),FD=require("node:worker_threads"),HD=require("yaml"),GD=w(oe()),$D=w(It());H();nq();mq();wq();vq();Uq();zq();qj();Wj();jj();ma=w(j());s2();RE=w(ze());zN();Dr();Me();xL();kD=w(oe());EJ();xT();bJ();is();FJ();Ny=w(Ot());wh();ub();o4();f4();WL();vp();TD();xD=(0,Ny.resolvePath)(GD.get(U.COMPONENTSROOT)),qD=new Map,TE=new Map;o(p4,"loadComponentDirectories");Mbe={REST:sS,rest:sS,graphql:kN,graphqlSchema:FN,roles:WN,jsResource:jN,fastifyRoutes:tL,login:JN,static:rL,operationsApi:rD,customFunctions:{},http:jR,clustering:cD,replication:ko,authentication:Tp,mqtt:mD,loadEnv:nL,logging:ma.default,dataLoader:oL},m4=[],yy=new Map;o(vbe,"setErrorReporter");QR=o(()=>by,"getComponentName");o(Ube,"symlinkHarperModule");o(E4,"sequentiallyHandleApplication");o(Iy,"loadComponent")});var XR=M((Dqe,g4)=>{var{isMainThread:_4}=require("worker_threads"),{getTables:xbe,getDatabases:Pqe,table:Lqe}=(Me(),v(_t)),{loadComponentDirectories:Bbe,loadComponent:Fbe}=(ff(),v(wp)),{resetResources:Hbe}=(qu(),v(YU)),kbe=BC(),qbe=Ot(),{dirname:Gbe}=require("path"),{getConnection:$be}=Gt(),Vbe=oe(),{CONFIG_PARAMS:Kbe}=(H(),v(Y)),{loadCertificates:Ybe}=as(),VD=new Map;async function Wbe(e=!1){!_4&&Vbe.get(Kbe.CLUSTERING_ENABLED)&&$be();try{_4&&await kbe()}catch(n){console.error(n)}let t=Hbe();xbe(),t.isWorker=e,await Ybe(),await Fbe(Gbe(qbe.getConfigFilePath()),t,"hdb",!0,VD),await Bbe(VD,t);let r=[];for(let[n]of VD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(Wbe,"loadRootComponents");g4.exports.loadRootComponents=Wbe});var ze=M((vqe,Li)=>{"use strict";uA();var{Worker:zbe,MessageChannel:jbe,parentPort:mo,isMainThread:jD,threadId:Qbe,workerData:ho}=require("worker_threads"),{PACKAGE_ROOT:Jbe}=It(),{join:y4,isAbsolute:Xbe,extname:Zbe}=require("path"),{server:A4}=(Dr(),v(Xf)),{watch:eIe,readdir:tIe}=require("fs/promises"),{totalmem:S4}=require("os"),{setHeapSnapshotNearHeapLimit:rIe}=require("v8"),Cc=(H(),v(Y)),Cy=oe(),Pi=j(),{randomBytes:nIe}=require("crypto"),{_assignPackageExport:sIe}=ti(),T4=1024*1024,Pc=[],Js=[],iIe=50,QD=1e4,oIe="restart",b4="request_thread_info",I4="resource_report",N4="thread_info",w4="added-port",aIe="ack",KD;sIe("threads",Js);Li.exports={startWorker:YD,restartWorkers:XD,shutdownWorkers:fIe,workers:Pc,setMonitorListener:TIe,onMessageFromWorkers:mIe,onMessageByType:v4,broadcast:pIe,broadcastWithAcknowledgement:_Ie,setChildListenerByType:dIe,getWorkerIndex:O4,getWorkerCount:C4,getTicketKeys:L4,setMainIsWorker:lIe,setTerminateTimeout:cIe,restartNumber:ho?.restartNumber||1};Js.onMessageByType=v4;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};Li.exports.whenThreadsStarted=new Promise(e=>{Li.exports.threadsHaveStarted=e});Cy.get(Cc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&rIe(1);var JD;function cIe(e){QD=e}o(cIe,"setTerminateTimeout");function O4(){return ho?ho.workerIndex:JD?0:void 0}o(O4,"getWorkerIndex");function C4(){return ho?ho.workerCount:JD?1:void 0}o(C4,"getWorkerCount");function lIe(e){JD=e,Li.exports.threadsHaveStarted()}o(lIe,"setMainIsWorker");var P4=1,wy;function L4(){return wy||(wy=jD?nIe(48):ho.ticketKeys,wy)}o(L4,"getTicketKeys");Object.defineProperty(A4,"workerIndex",{get(){return O4()}});Object.defineProperty(A4,"workerCount",{get(){return C4()}});var D4={[b4](e,t){gIe(t)},[I4](e,t){SIe(t,e)}};function YD(e,t={}){let r=process.constrainedMemory?.()||S4();r=Math.min(r,S4(),2e4*T4);let n=Cy.get(Cc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/T4/(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 jbe;d.existingPort=u,i.push(d),a.push(d.port2)}Zbe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];Cy.get(Cc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new zbe(Xbe(e)?e:y4(Jbe,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:P4=t.threadCount,name:t.name,restartNumber:Li.exports.restartNumber,ticketKeys:L4()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:w4,port:u,threadId:l.threadId},[u]);return Py(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>YD(e,t),l.on("error",u=>{Pi.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{Pc.splice(Pc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<iIe?(t.unexpectedRestarts=l.unexpectedRestarts+1,YD(e,t)):Pi.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{D4[u.type]?.(u,l)}),Pc.push(l),yIe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(YD,"startWorker");var uIe=[Cc.THREAD_TYPES.HTTP];async function XD(e=null,t=Math.max(P4>3,1),r=!0){if(jD){try{process.chdir(process.cwd())}catch(a){Pi.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=XR();await a()}Li.exports.restartNumber++,t<1&&(t=t*Pc.length);let n=[],s=[];for(let a of Pc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Pi.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Li.exports.restartNumber,type:Cc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=uIe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Pi.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},QD*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===Cc.ITC_EVENT_TYPES.CHILD_STARTED&&(Pi.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Pi.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}=cf();r&&(e==="http"||!e)&&Cy.get(Cc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else mo.postMessage({type:oIe,workerType:e})}o(XD,"restartWorkers");function dIe(e,t){D4[e]=t}o(dIe,"setChildListenerByType");function fIe(e){return XD(e,1/0,!1)}o(fIe,"shutdownWorkers");var M4=[];function mIe(e){M4.push(e)}o(mIe,"onMessageFromWorkers");var WD=new Map;function v4(e,t){let r=WD.get(e);r||WD.set(e,r=[]),r.push(t)}o(v4,"onMessageByType");var hIe=10;async function pIe(e,t){let r=0;for(let n of Js)try{n.postMessage(e),r++>hIe&&(r=0,await new Promise(setImmediate))}catch(s){Pi.error("Unable to send message to worker",s)}t&&x4(e,null)}o(pIe,"broadcast");var Oy=new Map,EIe=1;function _Ie(e){return new Promise(t=>{let r=0;for(let n of Js)try{let s=EIe++,i=o(()=>{Oy.delete(s),--r===0&&t(),n!==mo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,Oy.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of Oy)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Pi.error("Unable to send message to worker",s)}r===0&&t()})}o(_Ie,"broadcastWithAcknowledgement");function gIe(e){e.postMessage({type:N4,workers:U4()})}o(gIe,"sendThreadInfo");function U4(){let e=Date.now();return Pc.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(U4,"getChildWorkerInfo");function SIe(e,t){e.resources=t,e.resources.updated=Date.now()}o(SIe,"recordResourceReport");var zD;function TIe(e){zD=e}o(TIe,"setMonitorListener");var RIe=1e3,R4=!1;function yIe(){R4||(R4=!0,setInterval(()=>{for(let e of Pc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}zD&&zD()},RIe).unref())}o(yIe,"startMonitoring");var AIe=1e3;if(mo&&ho?.addPorts){Py(mo);for(let e=0,t=ho.addPorts.length;e<t;e++){let r=ho.addPorts[e];r.threadId=ho.addThreadIds[e],Py(r)}setInterval(()=>{let e=process.memoryUsage();mo.postMessage({type:I4,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},AIe).unref(),KD=o(()=>new Promise((e,t)=>{mo.on("message",r),mo.postMessage({type:b4});function r(n){n.type===N4&&(mo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else KD=U4;Li.exports.getThreadInfo=KD;function Py(e,t){Js.push(e),e.on("message",r=>{if(r.type===w4)r.port.threadId=r.threadId,Py(r.port);else if(r.type===aIe){let n=Oy.get(r.id);n&&n()}else x4(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 x4(e,t){for(let n of M4)n(e,t);let r=WD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Pi.error(s)}}o(x4,"notifyMessageListeners");if(jD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await tIe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(y4(s,a.name));try{for await(let{filename:a}of eIe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await XD(),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");Li.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else mo.on("message",async e=>{let{type:t}=e;t===Cc.ITC_EVENT_TYPES.SHUTDOWN&&(Li.exports.restartNumber=e.restartNumber,mo.unref(),setTimeout(()=>{Pi.warn("Thread did not voluntarily terminate",Qbe),process.exit(0)},QD).unref())})});var G4=M((Fqe,q4)=>{"use strict";var{promises:Bf,createReadStream:bIe,createWriteStream:IIe}=require("fs"),{createGzip:NIe}=require("zlib"),{promisify:wIe}=require("util"),{pipeline:OIe}=require("stream"),CIe=wIe(OIe),eM=require("path"),k4=oe();k4.initSync();var Ly=j(),{CONFIG_PARAMS:PIe,ITC_EVENT_TYPES:xqe}=(H(),v(Y)),{onMessageFromWorkers:Bqe}=ze(),{convertToMS:B4}=se(),{onStorageReclamation:LIe}=(T_(),v(pU)),DIe=6e4,MIe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",vIe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",ZD,F4;q4.exports=UIe;function UIe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(LIe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(MIe);if(!i)throw new Error(vIe);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=B4(r));let d;return ZD=Date.now(),Ly.trace("Log rotate enabled, maxSize:",t,"interval:",r),F4=setInterval(async()=>{if(l){let f;f=await Bf.stat(e.path),f.size>=l&&(d=await H4(e.path,i))}if(u&&Date.now()-ZD>=u&&(d=await H4(e.path,i),ZD=Date.now()),n||c){let f=B4(n??"1M")/(1+c);c=0;let m=await Bf.readdir(i);for(let h of m)try{let p=await Bf.stat(eM.join(i,h));Date.now()-p.mtimeMs>f&&await Bf.unlink(eM.join(i,h))}catch(p){Ly.error("Error trying to remove log",h,p)}}},a??DIe).unref(),{end(){clearInterval(F4)},getLastRotatedLogPath(){return d}}}o(UIe,"logRotator");async function H4(e,t){let r=k4.get(PIe.LOGGING_ROTATION_COMPRESS),n=eM.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await Bf.rename(e,n),r&&(e=n,n+=".gz",await CIe(bIe(e),NIe(),IIe(n)),await Bf.unlink(e)),Ly.closeLogFile(),Ly.notify(`hdb.log rotated, old log moved to ${n}`),n}o(H4,"moveLogFile")});var W4={};we(W4,{RootConfigWatcher:()=>tM});var $4,V4,K4,Dy,Y4,tM,z4=ce(()=>{$4=w(require("chokidar")),V4=require("node:fs/promises"),K4=w(Ot()),Dy=require("node:stream"),Y4=require("yaml"),tM=class extends Dy.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,K4.getConfigFilePath)(),this.#t=$4.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,V4.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,Y4.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,Dy.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var j=M(($qe,ky)=>{"use strict";var ha=require("fs-extra"),{workerData:xIe,threadId:BIe,isMainThread:t3}=require("worker_threads"),bE=require("path"),r3=require("yaml"),n3=require("properties-reader"),qr=(H(),v(Y)),j4=Hc(),FIe=require("os"),{PACKAGE_ROOT:cM}=It(),{_assignPackageExport:HIe}=ti(),{Console:kIe}=require("console"),Q4=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),J4=new Map,{join:pa}=bE,X4=1e4,cr={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},qIe={STDOUT:"stdOut",STDERR:"stdErr"},Gqe=pa(cM,"logs"),GIe=pa(cM,"config/yaml/",qr.HDB_DEFAULT_CONFIG_FILE),$Ie=1e4,IE,NE,My,po,nM,rM,Uy,Ut,qn,xy,By,Ff,AE,yE;function vy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=bE.dirname(n)):t.root?n=pa(t.root,nM):(n=Ut.path,t.root||(t.root=bE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=cr[t.level]??Ut?.level??cr.info,s3(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(vy,"updateLogger");function s3(e){let t=e.conditional??(e.conditional={});t.notify=cr.notify>=e.level?e.notify.bind(e):void 0,t.fatal=cr.fatal>=e.level?e.fatal.bind(e):void 0,t.error=cr.error>=e.level?e.error.bind(e):void 0,t.warn=cr.warn>=e.level?e.warn.bind(e):void 0,t.info=cr.info>=e.level?e.info.bind(e):void 0,t.debug=cr.debug>=e.level?e.debug.bind(e):void 0,t.trace=cr.trace>=e.level?e.trace.bind(e):void 0}o(s3,"updateConditional");async function sM(){yE||(yE=new cNe,await yE.ready(),yE.on("change",sM));let e=yE.config,t=e.logging??{};vy(Ut,t),Uy=Ut.path,IE=t.console??!1,t.external&&vy(qn,t.external);for(let r in e){let n=e[r];n.logging?vy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&vy(Ut.forComponent(r),t,r)}}o(sM,"updateLogSettings");var iM=class extends kIe{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){Rn="trace",this.level<=cr.trace&&super.info(...t),Rn="info"}debug(...t){Rn="debug",this.level<=cr.debug&&super.info(...t),Rn="info"}info(...t){Rn="info",this.level<=cr.info&&super.info(...t),Rn="info"}warn(...t){Rn="warn",this.level<=cr.warn&&super.warn(...t),Rn="info"}error(...t){Rn="error",this.level<=cr.error&&super.error(...t),Rn="info"}fatal(...t){Ff=!0;try{Rn="fatal",this.level<=cr.fatal&&super.error(...t),Rn="info"}finally{Ff=!1}}notify(...t){Ff=!0;try{Rn="notify",this.level<=cr.notify&&super.info(...t),Rn="info"}finally{Ff=!1}}withTag(t){return o3(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};AE===void 0&&i3();ky.exports={notify:JIe,fatal:XIe,error:aM,warn:ZIe,info:zIe,debug:QIe,trace:jIe,logLevel:po,loggerWithTag:o3,suppressLogging:YIe,initLogSettings:i3,logCustomLevel:eNe,closeLogFile:a3,createLogger:Hy,logsAtLevel:VIe,getLogFilePath:o(()=>Uy,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:oNe,setLogLevel:rNe,OUTPUTS:qIe,AuthAuditLog:aNe,start:sM,startOnMainThread:sM,errorToString:iNe};ky.exports.externalLogger={notify(...e){qn.notify(...e)},fatal(...e){qn.fatal(...e)},error(...e){qn.error(...e)},warn(...e){qn.warn(...e)},info(...e){qn.info(...e)},debug(...e){qn.debug(...e)},trace(...e){qn.trace(...e)},withTag(e){return qn.withTag(e)},loggerWithTag(e){return qn.withTag(e)}};HIe("logger",ky.exports.externalLogger);function VIe(e){return cr[po]<=cr[e]}o(VIe,"logsAtLevel");function i3(e=!1){try{if(AE===void 0||e){a3();let t=tNe(),r=j4(["ROOTPATH"]);try{AE=n3(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!ha.pathExistsSync(pa(r.ROOTPATH,qr.HDB_CONFIG_FILE)))throw s}let n;if({level:po,configLogPath:rM,toFile:NE,logConsole:IE,rotation:n,toStream:My}=nNe(r.ROOTPATH?pa(r.ROOTPATH,qr.HDB_CONFIG_FILE):AE.get("settings_path")),nM=qr.LOG_NAMES.HDB,Uy=pa(rM,nM),Ut=Hy({path:Uy,level:po,stdStreams:My,rotation:n}),qn=Ut.forComponent("external"),qn.tag=null,t3)try{require("segfault-handler").registerHandler(pa(rM,"crash.log"))}catch{}}}catch(t){if(AE=void 0,t.code===qr.NODE_ERROR_CODES.ENOENT||t.code===qr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=j4(Object.keys(qr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=qr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===qr.CONFIG_PARAMS.LOGGING_LEVEL){po=a;continue}i===qr.CONFIG_PARAMS.LOGGING_CONSOLE&&(IE=i)}let{defaultLevel:n}=sNe();NE=!1,My=!0,po=po===void 0?n:po,Ut=Hy({level:po}),qn=Ut.forComponent("external"),qn.tag=null;return}throw aM("Error initializing log settings"),aM(t),t}process.env.DEV_MODE&&(My=!0),KIe()}o(i3,"initLogSettings");var Lc=!0;function KIe(){NE&&(process.stdout.write=function(e){return typeof e=="string"&&Lc&&IE&&(e=e.toString(),e[e.length-1]===`
127
127
  `&&(e=e.slice(0,-1)),By(e)),Q4.apply(process.stdout,arguments)},process.stderr.write=function(e){return typeof e=="string"&&Lc&&IE&&(e[e.length-1]===`
128
128
  `&&(e=e.slice(0,-1)),By(e)),Q4.apply(process.stderr,arguments)})}o(KIe,"stdioLogging");function o3(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<=cr[i]?function(...a){Fy=e;try{return s.call(r,...a)}finally{Fy=void 0}}:null}o(n,"logWithTag")}o(o3,"loggerWithTag");function YIe(e){try{Lc=!1,e()}finally{Lc=!0}}o(YIe,"suppressLogging");var WIe=xIe?.name?.replace(/ /g,"-")||"main",Rn="info",oM,Fy;function Hy({path:e,level:t,stdStreams:r,rotation:n,isExternalInstance:s,writeToLog:i,component:a}){t||(t="info");let c=cr[t],l;function u(h){if(NE)if(l.logToStdstreams){f(h.replace(/\x1b\[[0-9;]*m/g,"")),Lc=!1;try{process.stdout.write(h)}finally{Lc=!0}}else f(h);else r&&process.stdout.write(h)}o(u,"logStdOut");function d(h){if(NE){if(f(h),r){Lc=!1;try{process.stderr.write(h)}finally{Lc=!0}}}else r&&process.stderr.write(h)}o(d,"logStdErr");let f=e&&e3(e,n,s);function m(h){return{write(p){let _=[Rn];_.unshift(oM||WIe+"/"+BIe),Fy&&_.push(Fy),l.tag&&_.push(l.tag),h(`[${_.join("] [")}]: ${p}`)}}}if(o(m,"logPrepend"),s&&(By=f),l=new iM({stdout:m(i??u),stderr:m(i??d),colorMode:r??!1},c),s3(l),l.path=e,Object.defineProperty(l,"path",{get(){return e},set(h){e=h,f=e3(e,l.rotation,s),s&&(By=f)},enumerable:!0}),l.closeLogFile=f?.closeLogFile,l.logToStdstreams=r,!a){let h=new Map;l.forComponent=function(p){let _=h.get(p);return _||(_=Hy({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(Hy,"createLogger");var Z4=100;function e3(e,t,r){let n=J4.get(e),s,i,a,c,l=0;n||(n=d,n.closeLogFile=m,n.path=e,J4.set(e,n)),t3&&JSON.stringify(t)!==JSON.stringify(n.rotation)&&(n.rotation=t,setTimeout(()=>{if(n.rotator?.end(),!t)return;let p=G4();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(`
129
129
  `)?"":`