harperdb 4.6.24 → 4.6.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/harperdb.js +4 -4
- package/bin/lite.js +3 -3
- package/launchServiceScripts/launchNatsIngestService.js +4 -4
- package/launchServiceScripts/launchNatsReplyService.js +4 -4
- package/launchServiceScripts/launchUpdateNodes4-0-0.js +4 -4
- package/npm-shrinkwrap.json +363 -345
- package/package.json +1 -1
- package/server/jobs/jobProcess.js +24 -24
- package/server/threads/threadServer.js +2 -2
- package/studio/build-local/asset-manifest.json +2 -2
- package/studio/build-local/index.html +1 -1
- package/studio/build-local/static/js/{main.5e611ac2.js → main.0cabc3aa.js} +2 -2
- package/utility/scripts/restartHdb.js +23 -23
- /package/studio/build-local/static/js/{main.5e611ac2.js.LICENSE.txt → main.0cabc3aa.js.LICENSE.txt} +0 -0
|
@@ -29,7 +29,7 @@ Host ${s}
|
|
|
29
29
|
IdentitiesOnly yes`;await Ie.pathExists(l)?await Ie.appendFile(l,`
|
|
30
30
|
`+u):await Ie.outputFile(l,u);let d="";if(await Ie.pathExists(Xo)||(await Ie.writeFile(Xo,""),await Ie.chmod(Xo,"0600")),i=="github.com"&&!(await Ie.readFile(Xo,"utf8")).includes("github.com"))try{let _=(await(await fetch("https://api.github.com/meta")).json()).ssh_keys;for(let g of _)Ie.appendFile(Xo,"github.com "+g+`
|
|
31
31
|
`)}catch{d=". Unable to get known hosts from github.com. Set your known hosts manually using set_ssh_known_hosts."}a&&await Ie.appendFile(Xo,a);let f=await Ti(e);return f.message=`Added ssh key: ${r}${d}`,f}o(Bpe,"addSSHKey");async function Fpe(e){let t=Bn.updateSSHKeyValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{name:r,key:n}=e;jt.trace("updating ssh key",r);let s=Oe.join(dc,r+".key");if(!await Ie.pathExists(s))throw new Error("Key does not exist. Use add_ssh_key");await Ie.outputFile(s,n);let i=await Ti(e);return i.message=`Updated ssh key: ${r}`,i}o(Fpe,"updateSSHKey");async function Hpe(e){let t=Bn.deleteSSHKeyValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{name:r}=e;jt.trace("deleting ssh key",r);let n=Oe.join(dc,r+".key"),s=Oe.join(dc,"config");if(!await Ie.pathExists(n))throw new Error("Key does not exist");let i=await Ie.readFile(s,"utf8"),a=new RegExp(`#${r}[\\S\\s]*?IdentitiesOnly yes`,"g");i=i.replace(a,""),await Ie.outputFile(s,i),Ie.removeSync(n);let c=await Ti(e);return c.message=`Deleted ssh key: ${r}`,c}o(Hpe,"deleteSSHKey");async function kpe(e){let t=[];return await Ie.pathExists(dc)&&(await Ie.readdir(dc)).forEach(r=>{r!="known_hosts"&&r!="config"&&t.push({name:r.split(".")[0]})}),t}o(kpe,"listSSHKeys");async function Gpe(e){let t=Bn.setSSHKnownHostsValidator(e);if(t)throw Qt(t,t.message,Jt.BAD_REQUEST);let{known_hosts:r}=e;await Ie.outputFile(Xo,r);let n=await Ti(e);return n.message="Known hosts successfully set",n}o(Gpe,"setSSHKnownHosts");async function qpe(e){return await Ie.pathExists(Xo)?{known_hosts:await Ie.readFile(Xo,"utf8")}:{known_hosts:null}}o(qpe,"getSSHKnownHosts");sr.customFunctionsStatus=Ape;sr.getCustomFunctions=bpe;sr.getCustomFunction=Ipe;sr.setCustomFunction=Npe;sr.dropCustomFunction=wpe;sr.addComponent=Ope;sr.dropCustomFunctionProject=Cpe;sr.packageComponent=Ppe;sr.deployComponent=Lpe;sr.getComponents=Mpe;sr.getComponentFile=vpe;sr.setComponentFile=Upe;sr.dropComponent=xpe;sr.addSSHKey=Bpe;sr.updateSSHKey=Fpe;sr.deleteSSHKey=Hpe;sr.listSSHKeys=kpe;sr.setSSHKnownHosts=Gpe;sr.getSSHKnownHosts=qpe});var PC=M((Q0e,AY)=>{"use strict";var Fs=require("joi"),yY=lt();AY.exports={readTransactionLogValidator:$pe,deleteTransactionLogsBeforeValidator:Vpe};function $pe(e){let t=Fs.object({schema:Fs.string(),database:Fs.string(),table:Fs.string().required(),from:Fs.date().timestamp(),to:Fs.date().timestamp(),limit:Fs.number().min(1)});return yY.validateBySchema(e,t)}o($pe,"readTransactionLogValidator");function Vpe(e){let t=Fs.object({schema:Fs.string(),database:Fs.string(),table:Fs.string().required(),timestamp:Fs.date().timestamp().required()});return yY.validateBySchema(e,t)}o(Vpe,"deleteTransactionLogsBeforeValidator")});var FT=M((X0e,CY)=>{"use strict";var LC=(k(),v(W)),Cp=mr(),bY=ie(),IY=oe(),NY=Ki(),wY=Q(),{handleHDBError:xT,hdbErrors:Kpe}=ge(),{HTTP_STATUS_CODES:BT}=Kpe,{readTransactionLogValidator:Ype,deleteTransactionLogsBeforeValidator:Wpe}=PC(),OY=Zn(),zpe="Logs successfully deleted from transaction log.",jpe="All logs successfully deleted from transaction log.";CY.exports={readTransactionLog:Qpe,deleteTransactionLogsBefore:Xpe};async function Qpe(e){let t=Ype(e);if(t)throw xT(t,t.message,BT.BAD_REQUEST,void 0,void 0,!0);e.database=e.database??e.schema??"data";let r=bY.checkSchemaTableExist(e.database,e.table);if(r)throw xT(new Error,r,BT.NOT_FOUND,void 0,void 0,!0);return IY.get(LC.CONFIG_PARAMS.CLUSTERING_ENABLED)?await Jpe(e):(wY.info("Reading HarperDB logs used by Plexus"),(e.from||e.to)&&(e.search_type="timestamp",e.search_values=[e.from??0],e.to&&(e.search_values[1]=e.to)),OY.readAuditLog(e))}o(Qpe,"readTransactionLog");async function*Jpe(e){let t=NY.createNatsTableStreamName(e.database,e.table),r=await Cp.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===LC.OPERATIONS_ENUM.DELETE&&(i.hash_values=n?.entry?.hash_values),yield i}}o(Jpe,"readTransactionLogNats");async function Xpe(e){let t=Wpe(e);if(t)throw xT(t,t.message,BT.BAD_REQUEST,void 0,void 0,!0);if(e.database=e.database??e.schema??"data",!IY.get(LC.CONFIG_PARAMS.CLUSTERING_ENABLED))return wY.info("Delete transaction logs called for Plexus"),OY.deleteAuditLogsBefore(e);let{database:r,table:n,timestamp:s}=e,i=bY.checkSchemaTableExist(r,n);if(i)throw xT(new Error,i,BT.NOT_FOUND,void 0,void 0,!0);let a=NY.createNatsTableStreamName(r,n),{jsm:c}=await Cp.getNATSReferences(),l=await Cp.getStreamInfo(a),u=new Date(l.state.first_ts).getTime();if(s<=u)return`No transactions exist before: ${s}`;let d=zpe,f,m=new Date(l.state.last_ts).getTime();return s>m?(f=l.state.last_seq+1,d=jpe):f=(await Cp.viewStream(a,parseInt(s),1))[0].nats_sequence,await Cp.purgeTableStream(r,n,{seq:f}),d}o(Xpe,"deleteTransactionLogsBefore")});var UC={};we(UC,{describeMetric:()=>UY,describeMetricOp:()=>vC,get:()=>MY,getOp:()=>DC,listMetrics:()=>vY,listMetricsOp:()=>MC});async function eEe(e){return(await Ng().get(e)).hostname}function PY(e,t){return e.length===0||e.includes(t)}function DC(e){return Pp.trace?.("get_analytics request:",e),MY(e.metric,e.get_attributes,e.start_time,e.end_time,e.conditions)}function DY(e){return"conditions"in e?{...e,conditions:e.conditions.map(DY)}:{attribute:e.search_attribute??e.attribute,comparator:e.search_type??e.comparator,value:e.search_value??e.value}}async function MY(e,t,r,n,s){let i=[{attribute:"metric",comparator:"equals",value:e}];s&&i.push(...s.map(DY));let a=t??[];PY(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),Pp.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],PY(a,"node")&&(Pp.trace?.(`get_analytics lookup hostname for nodeId: ${d}`),u.node=await eEe(d)),Pp.trace?.("get_analytics result:",JSON.stringify(u)),u})}function MC(e){return vY(e.metric_types,e.custom_metrics_window)}async function vY(e=["builtin"],t=Zpe){let r=[],n=Object.values(Bo);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 vC(e){return UY(e.metric)}async function UY(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 Pp.trace?.("describe_metric result:",JSON.stringify(i)),i}return{}}var LY,Zpe,Pp,xC=ce(()=>{LY=w(Q());lN();uN();Zpe=1e3*60*60*24*7,Pp=(0,LY.forComponent)("analytics").conditional;o(eEe,"lookupHostname");o(PY,"isSelected");o(DC,"getOp");o(DY,"conformCondition");o(MY,"get");o(MC,"listMetricsOp");o(vY,"listMetrics");o(vC,"describeMetricOp");o(UY,"describeMetric")});var HT,kT,Lp,GT=ce(()=>{HT={primary:{allowedValues:null},maintenance:{allowedValues:null},availability:{allowedValues:["Available","Unavailable"]}},kT=Object.keys(HT),Lp="primary"});function BY(e){return xY.validateBySchema(e,sEe)}var Dp,xY,tEe,rEe,nEe,sEe,FY=ce(()=>{Dp=w(require("joi")),xY=w(lt());GT();tEe=kT,rEe=Object.entries(HT).reduce((e,[t,r])=>(r.allowedValues&&(e[t]=`Status "${t}" only accepts these values: ${r.allowedValues.join(", ")}`),e),{}),nEe=o(()=>{let e=Dp.default.string().min(1).max(512);return Object.entries(HT).forEach(([t,r])=>{r.allowedValues&&(e=e.when("id",{is:t,then:Dp.default.string().valid(...r.allowedValues).messages({"any.only":rEe[t]})}))}),e.required()},"createStatusValidationSchema"),sEe=Dp.default.object({id:Dp.default.string().valid(...tEe).required(),status:nEe()});o(BY,"validateStatus")});var GC={};we(GC,{DEFAULT_STATUS_ID:()=>Lp,STATUS_IDS:()=>kT,Status:()=>Zo,clear:()=>FC,get:()=>HC,set:()=>kC});function vp(){return BC||(BC=je({database:"system",table:"hdb_status",replicate:!1,attributes:[{name:"id",isPrimaryKey:!0},{name:"status"},{name:"__createdtime__"},{name:"__updatedtime__"}]})),BC}function FC({id:e}){return Mp.debug?.("clearStatus",e),vp().delete(e)}function oEe(){return Mp.debug?.("getAllStatus"),vp().get({})}function HC({id:e}){return e?(Mp.debug?.("getStatus",e),vp().get(e)):(Mp.debug?.("getStatus","all"),oEe())}function kC({status:e,id:t=Lp}){let r=BY({status:e,id:t});if(r)throw(0,qT.handleHDBError)(r,r.message,iEe.BAD_REQUEST);return Mp.debug?.("setStatus",t,e),vp().put(t,{status:e})}var qT,HY,iEe,BC,Zo,Mp,Up=ce(()=>{Me();qT=w(ge()),HY=w(ri());FY();GT();GT();({HTTP_STATUS_CODES:iEe}=qT.hdbErrors);o(vp,"getStatusTable");Zo={get primaryStore(){return vp().primaryStore}},Mp=(0,HY.loggerWithTag)("status");o(FC,"clearStatus");o(oEe,"getAllStatus");o(HC,"getStatus");o(kC,"setStatus")});var GY=M((Exe,kY)=>{"use strict";var qC=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}};kY.exports=qC});var $Y=M((gxe,qY)=>{"use strict";var $C=class{static{o(this,"PermissionAttributeResponseObject")}constructor(t,r=[]){this.attribute_name=t,this.required_permissions=r}};qY.exports=$C});var KC=M((Txe,KY)=>{"use strict";var VY=GY(),aEe=$Y(),{HDB_ERROR_MSGS:cEe}=rn(),VC=class{static{o(this,"PermissionResponseObject")}constructor(){this.error=cEe.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 VY(t,r,n),i=`${t}_${r}`;this.unauthorized_access[i]=s}addUnauthorizedAttributes(t,r,n,s){let i=[];t.forEach(c=>{let l=new aEe(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 VY(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}};KY.exports=VC});var YT=M((yxe,cW)=>{"use strict";var YC=Mn(),$T=an(),Hs=Jh(),Fp=Fa(),WC=Tl(),lEe=Jw(),uEe=j$(),Hp=ts(),VT=Ih(),Ir=Q(),dEe=rO(),fEe=np(),mEe=CO(),hEe=cp(),pEe=DO(),EEe=MO(),_Ee=cT(),gEe=BO(),zC=uT(),ea=ie(),SEe=w1(),jC=QO(),zY=sf(),_n=(k(),v(W)),jY=GK(),TEe=qd(),QY=(Sd(),v(Lh)),JY=(PT(),v(Rp)),XY=It(),Er=wC(),REe=require("alasql"),ZY=FT(),eW=Ip(),uf=os(),tW=(Vd(),v($d)),QC=(xC(),v(UC)),JC=(Up(),v(GC)),rW=KC(),{handleHDBError:Fn,hdbErrors:nW}=ge(),{HDB_ERROR_MSGS:Jr,HTTP_STATUS_CODES:xp}=nW,{cleanupOrphanBlobs:yEe}=Jh(),X=new Map,sW="delete",fc="insert",ks="read",Xl="update",Bp="describe",YY=Fp.describeSchema.name,WY=Fp.describeTable.name,iW={delete:!0,deleteRecord:!0,update:!0,updateData:!0,dropAttribute:!0,dropTable:!0,dropSchema:!0,upsert:!0,upsertData:!0},AEe={insert:!0,delete:!0,deleteRecord:!0,update:!0,updateData:!0,upsert:!0,upsertData:!0},bEe="catchup",IEe="handleGetJob",NEe="handleGetJobsByStartDate",KT={CSV_DATA_LOAD:"csvDataLoad",CSV_URL_LOAD:"csvURLLoad",CSV_FILE_LOAD:"csvFileLoad",IMPORT_FROM_S3:"importFromS3"},wEe=[Hs.createTable.name,Hs.createAttribute.name,Hs.dropTable.name,Hs.dropAttribute.name],oW={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(YC.insert.name,new te(!1,[fc]));X.set(YC.update.name,new te(!1,[Xl]));X.set(YC.upsert.name,new te(!1,[fc,Xl]));X.set($T.searchByConditions.name,new te(!1,[ks]));X.set($T.searchByHash.name,new te(!1,[ks]));X.set($T.searchByValue.name,new te(!1,[ks]));X.set($T.search.name,new te(!1,[ks]));X.set(Hs.createSchema.name,new te(!0,[]));X.set(Hs.createTable.name,new te(!0,[]));X.set(Hs.createAttribute.name,new te(!1,[fc]));X.set(Hs.dropSchema.name,new te(!0,[]));X.set(Hs.dropTable.name,new te(!0,[]));X.set(Hs.dropAttribute.name,new te(!0,[]));X.set(Fp.describeSchema.name,new te(!1,[ks]));X.set(Fp.describeTable.name,new te(!1,[ks]));X.set(WC.deleteRecord.name,new te(!1,[sW]));X.set(Hp.addUser.name,new te(!0,[]));X.set(Hp.alterUser.name,new te(!0,[]));X.set(Hp.dropUser.name,new te(!0,[]));X.set(Hp.listUsersExternal.name,new te(!0,[]));X.set(VT.listRoles.name,new te(!0,[]));X.set(VT.addRole.name,new te(!0,[]));X.set(VT.alterRole.name,new te(!0,[]));X.set(VT.dropRole.name,new te(!0,[]));X.set(dEe.name,new te(!0,[]));X.set(fEe.name,new te(!0,[]));X.set(mEe.name,new te(!0,[]));X.set(hEe.name,new te(!0,[]));X.set(pEe.name,new te(!0,[]));X.set(EEe.name,new te(!0,[]));X.set(zC.setRoutes.name,new te(!0,[]));X.set(zC.getRoutes.name,new te(!0,[]));X.set(zC.deleteRoutes.name,new te(!0,[]));X.set(XY.setConfiguration.name,new te(!0,[]));X.set(_Ee.clusterStatus.name,new te(!0,[]));X.set(gEe.name,new te(!0,[]));X.set(jC.getFingerprint.name,new te(!0,[]));X.set(jC.setLicense.name,new te(!0,[]));X.set(WC.deleteFilesBefore.name,new te(!0,[]));X.set(WC.deleteAuditLogsBefore.name,new te(!0,[]));X.set(zY.restart.name,new te(!0,[]));X.set(zY.restartService.name,new te(!0,[]));X.set(lEe.name,new te(!0,[]));X.set(uEe.name,new te(!0,[ks]));X.set(yEe.name,new te(!0,[]));X.set(TEe.systemInformation.name,new te(!0,[]));X.set(XY.getConfiguration.name,new te(!0,[]));X.set(ZY.readTransactionLog.name,new te(!0,[]));X.set(ZY.deleteTransactionLogsBefore.name,new te(!0,[]));X.set(eW.installModules.name,new te(!0,[]));X.set(eW.auditModules.name,new te(!0,[]));X.set(uf.createCsr.name,new te(!0,[]));X.set(uf.signCertificate.name,new te(!0,[]));X.set(uf.listCertificates.name,new te(!0,[]));X.set(uf.addCertificate.name,new te(!0,[]));X.set(uf.removeCertificate.name,new te(!0,[]));X.set(uf.getKey.name,new te(!0,[]));X.set(tW.addNodeBack.name,new te(!0,[]));X.set(tW.removeNodeBack.name,new te(!0,[]));X.set(QC.getOp.name,new te(!1,[ks]));X.set(QC.listMetricsOp.name,new te(!1,[ks]));X.set(QC.describeMetricOp.name,new te(!1,[ks]));X.set(JC.clear.name,new te(!0,[]));X.set(JC.get.name,new te(!0,[]));X.set(JC.set.name,new te(!0,[]));X.set(QY.createTokens.name,new te(!1,[]));X.set(QY.refreshOperationToken.name,new te(!1,[]));X.set(JY.login.name,new te(!1,[]));X.set(JY.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(jC.getRegistrationInfo.name,new te(!1,[]));X.set(Hp.userInfo.name,new te(!1,[]));X.set(Fp.describeAll.name,new te(!1,[]));X.set(IEe,new te(!1,[]));X.set(NEe,new te(!0,[]));X.set(bEe,new te(!0,[]));X.set(KT.CSV_DATA_LOAD,new te(!1,[fc,Xl]));X.set(KT.CSV_URL_LOAD,new te(!1,[fc,Xl]));X.set(KT.CSV_FILE_LOAD,new te(!1,[fc,Xl]));X.set(KT.IMPORT_FROM_S3,new te(!1,[fc,Xl]));X.set(oW.EXPORT_TO_S3,new te(!0,[]));X.set(oW.EXPORT_LOCAL,new te(!0,[]));X.set(_n.VALID_SQL_OPS_ENUM.DELETE,new te(!1,[sW]));X.set(_n.VALID_SQL_OPS_ENUM.SELECT,new te(!1,[ks]));X.set(_n.VALID_SQL_OPS_ENUM.INSERT,new te(!1,[fc]));X.set(_n.VALID_SQL_OPS_ENUM.UPDATE,new te(!1,[Xl]));cW.exports={verifyPerms:CEe,verifyPermsAst:OEe,verifyBulkLoadAttributePerms:LEe};function OEe(e,t,r){if(ea.isEmptyOrZeroLength(e))throw Ir.info("verify_perms_ast has an empty user parameter"),Fn(new Error);if(ea.isEmptyOrZeroLength(t))throw Ir.info("verify_perms_ast has an empty user parameter"),Fn(new Error);if(ea.isEmptyOrZeroLength(r))throw Ir.info("verify_perms_ast has a null operation parameter"),Fn(new Error);try{let n=new rW,s=new SEe(e),i=s.getSchemas(),a=new Map;if((!i||i.length===0)&&s.affected_attributes&&s.affected_attributes.size>0)throw Ir.info("No schemas defined in verifyPermsAst(), will not continue."),Fn(new Error);let c=!!t.role.permission.super_user,l=i.includes("system");if(l&&iW[r])throw Fn(new Error,Jr.DROP_SYSTEM,xp.FORBIDDEN);if(c&&!l)return null;let u=jY.getRolePermissions(t.role);t.role.permission=u,!c&&e instanceof REe.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=aW(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]),_=ZC(t.role.permission,m,f[h]);XC(p,_,r,f[h],m,n)}}),n.getPermsResponse())}catch(n){throw Fn(n)}}o(OEe,"verifyPermsAst");function CEe(e,t){if(e===null||t===null||e.hdb_user===void 0||e.hdb_user===null)throw Ir.info("null required parameter in verifyPerms"),Fn(new Error,Jr.DEFAULT_INVALID_REQUEST,xp.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 rW;if(ea.isEmptyOrZeroLength(e.hdb_user?.role)||ea.isEmptyOrZeroLength(e.hdb_user?.role?.permission))return Ir.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(_n.SYSTEM_SCHEMA_NAME)||s===_n.SYSTEM_SCHEMA_NAME;if(l&&d&&AEe[e.operation]&&(i===_n.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME||i===_n.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME||i===_n.SYSTEM_TABLE_NAMES.USER_TABLE_NAME))return null;if(d&&iW[r])throw Fn(new Error,Jr.DROP_SYSTEM,xp.FORBIDDEN);if(l&&!d||u===!0&&(r===Hs.createSchema.name||r===Hs.dropSchema.name))return null;if(wEe.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=jY.getRolePermissions(e.hdb_user?.role);if(e.hdb_user?.role&&(e.hdb_user.role.permission=f),(r===YY||r===WY)&&!f.super_user){if(s===_n.SYSTEM_SCHEMA_NAME)return c.handleUnauthorizedItem(Jr.SCHEMA_PERM_ERROR(s));if(r===YY&&(!f[s]||!f[s][Bp]))return c.handleInvalidItem(Jr.SCHEMA_NOT_FOUND(s));if(r===WY&&(!f[s]||!f[s].tables[i]||!f[s].tables[i][Bp]))return c.handleInvalidItem(Jr.TABLE_NOT_FOUND(s,i))}let m=aW(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&&_n.SEARCH_WILDCARDS.includes(e.get_attributes[0])){let _=[],g=f[s].tables[i];g[_n.PERMS_CRUD_ENUM.READ]&&(g.attribute_permissions.length>0?g.attribute_permissions.filter(T=>T[_n.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=PEe(e),p=ZC(e.hdb_user?.role?.permission,s,i);return XC(h,p,r,i,s,c,n),c.getPermsResponse()}o(CEe,"verifyPerms");function aW(e,t,r,n,s){if(ea.arrayHasEmptyValues([e,t,r]))throw Ir.info("hasPermissions has an invalid parameter"),Fn(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 Ir.info(`operation ${t} not found.`),Fn(new Error,Jr.OP_NOT_FOUND(t),xp.BAD_REQUEST);if(X.get(t)&&X.get(t).requires_su)return Ir.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][Bp]===!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[Bp]===!1)n.addInvalidItem(Jr.TABLE_NOT_FOUND(l,d));else try{let m=[],h=X.get(t).perms;!ea.isEmpty(s)&&h.includes(s)&&(h=[s]);for(let p=0;p<h.length;p++){let _=h[p],g=f[_];(g==null||g===!1)&&(Ir.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 Ir.error(h),Ir.error(m),Fn(nW.CHECK_LOGS_WRAPPER(h))}}}return r.size<2?n.getPermsResponse():null}o(aW,"hasPermissions");function XC(e,t,r,n,s,i,a){if(!e||!t)throw Ir.info("no attributes specified in checkAttributePerms."),Fn(new Error);let c=X.get(r).perms;if(!c||c==="")throw Ir.info(`no permissions found for ${r} in checkAttributePerms().`),Fn(new Error);if(ea.isEmptyOrZeroLength(t))return Ir.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[Bp]===!1){i.addInvalidItem(Jr.ATTR_NOT_FOUND(s,n,d),s,n);continue}if(c)for(let m of c){if(_n.TIME_STAMP_NAMES.includes(f.attribute_name)&&m!==ks)throw Fn(new Error,Jr.SYSTEM_TIMESTAMP_PERMS_ERR,xp.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(XC,"checkAttributePerms");function PEe(e){let t=new Set;try{if(e.action)return t;if(e.operation===_n.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){Ir.info(r)}return t}o(PEe,"getRecordAttributes");function ZC(e,t,r){let n=new Map;if(ea.isEmpty(e))return Ir.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{Ir.info(`No attribute permissions found for schema ${t} and table ${r}.`)}return n}o(ZC,"getAttributePermissions");function LEe(e,t,r,n,s,i,a){let c=new Set(i),l=ZC(e,n,s);XC(c,l,t,s,n,a,r)}o(LEe,"verifyBulkLoadAttributePerms")});var zT=M((bxe,mW)=>{"use strict";mW.exports={evaluateSQL:VEe,processAST:fW,convertSQLToAST:dW,checkASTPermissions:uW};var DEe=Mn(),lW=require("util"),MEe=lW.callbackify(DEe.insert),vEe=an().search,UEe=kG().update,xEe=lW.callbackify(UEe),BEe=qG().convertDelete,mc=require("alasql"),FEe=YT(),WT=Q(),HEe=ug(),kEe=ie(),kp=(k(),v(W)),{hdbErrors:GEe,handleHDBError:eP}=ge(),{HTTP_STATUS_CODES:tP}=GEe;HEe(mc);var qEe=403,$Ee="There was a problem performing this insert. Please check the logs and try again.",rP=class{static{o(this,"ParsedSQLObject")}constructor(){this.ast=void 0,this.variant=void 0,this.permissions_checked=!1}};function VEe(e,t){let r=e.parsed_sql_object;if(!r){r=dW(e.sql);let n,s=r.ast.statements[0];if(s instanceof mc.yy.Insert?n=s.into.databaseid:s instanceof mc.yy.Select?n=s.from?s.from[0].databaseid:null:s instanceof mc.yy.Update||s instanceof mc.yy.Delete?n=s.table.databaseid:WT.error("AST in evaluateSQL is not a valid SQL type."),!(s instanceof mc.yy.Select)&&kEe.isEmptyOrZeroLength(n))return t("No schema specified",null)}fW(e,r,(n,s)=>{if(n)return t(n);t(null,s)})}o(VEe,"evaluateSQL");function uW(e,t){let r;try{r=FEe.verifyPermsAst(t.ast.statements[0],e.hdb_user,t.variant),t.permissions_checked=!0}catch(n){throw n}return r||null}o(uW,"checkASTPermissions");function dW(e){let t=new rP;if(!e)throw eP(new Error,"The 'sql' parameter is missing from the request body",tP.BAD_REQUEST);try{let r=e.trim(),n=mc.parse(r),s=r.split(" ")[0].toLowerCase();t.ast=n,t.variant=s}catch(r){let n=r.message.split(`
|
|
32
|
-
`);throw n[1]?eP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,tP.BAD_REQUEST):eP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",tP.BAD_REQUEST)}return t}o(dW,"convertSQLToAST");function fW(e,t,r){try{let n=KEe;if(!e.bypass_auth&&!t.permissions_checked){let i=uW(e,t);if(i&&i.length>0)return r(qEe,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case kp.VALID_SQL_OPS_ENUM.SELECT:n=vEe,s=t.ast.statements[0];break;case kp.VALID_SQL_OPS_ENUM.INSERT:n=YEe;break;case kp.VALID_SQL_OPS_ENUM.UPDATE:n=xEe;break;case kp.VALID_SQL_OPS_ENUM.DELETE:n=BEe;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(fW,"processAST");function KEe(e,t){WT.info(e),t("unknown sql statement")}o(KEe,"nullFunction");function YEe({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=WEe(i,e.values)}catch(a){return r(a)}MEe(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){WT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(YEe,"convertInsert");function WEe(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=mc.compile(`SELECT ${s.toString()} AS [${kp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw WT.error(r),new Error($Ee)}}o(WEe,"createDataObjects")});var cP=M((Oxe,_W)=>{var XT=require("clone"),ZT=lt(),zEe=ie(),QT=(k(),v(W)),Nxe=Q(),nP=require("fs"),iP=require("joi"),{string:JT}=iP.types(),{hdbErrors:jEe,handleHDBError:jT}=ge(),{HDB_ERROR_MSGS:wxe,HTTP_STATUS_CODES:sP}=jEe,{commonValidators:df}=Gi(),hW=" is required",QEe=["insert","update","upsert"],oP={database:{presence:!1,format:df.schema_format,length:df.schema_length},schema:{presence:!1,format:df.schema_format,length:df.schema_length},table:{presence:!0,format:df.schema_format,length:df.schema_length},action:{inclusion:{within:QEe,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},JEe={schema:JT.required(),table:JT.required(),action:JT.valid("insert","update","upsert")},{AWS_ACCESS_KEY:XEe,AWS_SECRET:ZEe,AWS_BUCKET:e_e,AWS_FILE_KEY:t_e,REGION:r_e}=QT.S3_BUCKET_AUTH_KEYS,n_e={s3:{presence:!0},[`s3.${XEe}`]:{presence:!0,type:"String"},[`s3.${ZEe}`]:{presence:!0,type:"String"},[`s3.${e_e}`]:{presence:!0,type:"String"},[`s3.${t_e}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${r_e}`]:{presence:!0,type:"String"}},pW=XT(oP);pW.data.presence={message:hW};var EW=XT(oP);EW.file_path.presence={message:hW};var s_e=Object.assign(XT(oP),n_e),aP=XT(JEe);aP.csv_url=JT.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();aP.passthrough_headers=iP.object();function i_e(e){let t=ZT.validateObject(e,pW);return eR(e,t)}o(i_e,"dataObject");function o_e(e){let t=ZT.validateBySchema(e,iP.object(aP));return eR(e,t)}o(o_e,"urlObject");function a_e(e){let t=ZT.validateObject(e,EW);return eR(e,t)}o(a_e,"fileObject");function c_e(e){let t=ZT.validateObject(e,s_e);return eR(e,t)}o(c_e,"s3FileObject");function eR(e,t){if(!t){let r=zEe.checkGlobalSchemaTable(e.schema,e.table);if(r)return jT(new Error,r,sP.BAD_REQUEST);if(e.operation===QT.OPERATIONS_ENUM.CSV_FILE_LOAD)try{nP.accessSync(e.file_path,nP.constants.R_OK|nP.constants.F_OK)}catch(n){return n.code===QT.NODE_ERROR_CODES.ENOENT?jT(n,`No such file or directory ${n.path}`,sP.BAD_REQUEST):n.code===QT.NODE_ERROR_CODES.EACCES?jT(n,`Permission denied ${n.path}`,sP.BAD_REQUEST):jT(n)}}return t}o(eR,"postValidateChecks");_W.exports={dataObject:i_e,urlObject:o_e,fileObject:a_e,s3FileObject:c_e}});var lP=M((Pxe,gW)=>{"use strict";var Gp=Q(),tR=(k(),v(W));async function l_e(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===tR.OPERATIONS_ENUM.INSERT||t.operation===tR.OPERATIONS_ENUM.UPDATE||t.operation===tR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===tR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Gp.info(i.message),i):i.http_resp_msg?(Gp.error(`Error calling operation: ${e.name}`),Gp.error(i.http_resp_msg),i):(Gp.error(`Error calling operation: ${e.name}`),Gp.error(i),i)}}o(l_e,"callOperationFunctionAsAwait");gW.exports={callOperationFunctionAsAwait:l_e}});var uP=M((Dxe,TW)=>{"use strict";var{S3:u_e,GetObjectCommand:d_e}=require("@aws-sdk/client-s3");TW.exports={getFileStreamFromS3:f_e,getS3AuthObj:SW};async function f_e(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await SW(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new d_e(r))).Body}o(f_e,"getFileStreamFromS3");function SW(e,t,r){return new u_e({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(SW,"getS3AuthObj")});var yW=M((vxe,RW)=>{"use strict";var dP=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}},fP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};RW.exports={BulkLoadFileObject:dP,BulkLoadDataObject:fP}});var hP=M((xxe,AW)=>{"use strict";var mP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};AW.exports=mP});var TP=M((qxe,kW)=>{"use strict";var rR=Mn(),sR=cP(),m_e=require("needle"),Ri=(k(),v(W)),Fxe=Ct(),ff=ie(),{handleHDBError:Xt,hdbErrors:DW}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:Nr,CHECK_LOGS_WRAPPER:eu}=DW,mf=Q(),pP=require("papaparse");ff.promisifyPapaParse();var yi=require("fs-extra"),h_e=require("path"),{chain:bW}=require("stream-chain"),IW=require("stream-json/streamers/StreamArray"),NW=require("stream-json/utils/Batch"),wW=require("stream-chain/utils/comp"),{finished:OW}=require("stream"),p_e=oe(),MW=lP(),E_e=uP(),{BulkLoadFileObject:_P,BulkLoadDataObject:__e}=yW(),gP=KC(),{verifyBulkLoadAttributePerms:vW}=YT(),Hxe=hP(),kxe=mr(),Gxe=Ki(),{databases:g_e}=(Me(),v(Et)),{coerceType:S_e}=(U_(),v(pk)),CW="No records parsed from csv file.",Zl=`${p_e.get("HDB_ROOT")}/tmp`,{schemaRegex:T_e}=Gi(),PW=1024*1024*2,LW=5e3,R_e={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};kW.exports={csvDataLoad:y_e,csvURLLoad:A_e,csvFileLoad:b_e,importFromS3:I_e};async function y_e(e,t){let r=sR.dataObject(e);if(r)throw Xt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=BW(e.schema,e.table),i=pP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:EP.bind(null,s),dynamicTyping:!1}),a=new gP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&vW(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Xt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new __e(e.action,e.schema,e.table,i.data);return n=await MW.callOperationFunctionAsAwait(FW,l,null),n.message===CW?CW:HW(n.records,n.number_written)}catch(s){throw tu(s)}}o(y_e,"csvDataLoad");async function A_e(e){let t=sR.urlObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Zl}/${r}`;try{await N_e(e,r)}catch(s){throw mf.error(Nr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,eu(Nr.DOWNLOAD_FILE_ERR(r)))}try{let s=new _P(this.job_operation_function.name,e.action,e.schema,e.table,n,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await SP(s);return await nR(n),i}catch(s){throw await nR(n),tu(s)}}o(A_e,"csvURLLoad");async function b_e(e){let t=sR.fileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new _P(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await SP(r)}catch(n){throw tu(n)}}o(b_e,"csvFileLoad");async function I_e(e){let t=sR.s3FileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=h_e.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Zl}/${s}`;let i=new _P(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await w_e(s,e);let a=await SP(i);return await nR(r),a}catch(n){throw await nR(r),tu(n)}}o(I_e,"importFromS3");async function N_e(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await m_e("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Xt(n,s,n.statusCode,Ri.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}C_e(r,e.csv_url),await O_e(t,r.raw)}o(N_e,"downloadCSVFile");async function w_e(e,t){try{let r=`${Zl}/${e}`;await yi.mkdirp(Zl),await yi.writeFile(`${Zl}/${e}`,"",{flag:"a+"});let n=await yi.createWriteStream(r),s=await E_e.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){mf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw mf.error(Nr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,eu(Nr.S3_DOWNLOAD_ERR))}}o(w_e,"downloadFileFromS3");async function O_e(e,t){try{await yi.mkdirp(Zl),await yi.writeFile(`${Zl}/${e}`,t)}catch(r){throw mf.error(Nr.WRITE_TEMP_FILE_ERR),Xt(r,eu(Nr.DEFAULT_BULK_LOAD_ERR))}}o(O_e,"writeFileToTempFolder");async function nR(e){if(e)try{await yi.access(e),await yi.unlink(e)}catch{mf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(nR,"deleteTempFile");function C_e(e,t){if(e.statusCode!==DW.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!R_e[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(C_e,"validateURLResponse");async function SP(e){try{let t;switch(e.file_type){case Ri.VALID_S3_FILE_TYPES.CSV:t=await P_e(e);break;case Ri.VALID_S3_FILE_TYPES.JSON:t=await L_e(e);break;default:throw Xt(new Error,Nr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,Nr.INVALID_FILE_EXT_ERR(e))}return HW(t.records,t.number_written)}catch(t){throw tu(t)}}o(SP,"fileLoad");async function UW(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 rR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&vW(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Xt(c);r(l)}}o(UW,"validateChunk");async function xW(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!ff.isEmpty(c)&&!ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await MW.callOperationFunctionAsAwait(FW,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Xt(c,eu(Nr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.INSERT_CSV_ERR+" - "+c);r(l)}}o(xW,"insertChunk");async function P_e(e){let t={records:0,number_written:0},r=BW(e.schema,e.table);try{let n=new gP,s=yi.createReadStream(e.file_path,{highWaterMark:PW});s.setEncoding("utf8"),await pP.parsePromise(s,UW.bind(null,e,n),EP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);return s=yi.createReadStream(e.file_path,{highWaterMark:PW}),s.setEncoding("utf8"),await pP.parsePromise(s,xW.bind(null,e,t),EP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,eu(Nr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.PAPA_PARSE_ERR+n)}}o(P_e,"callPapaParse");function BW(e,t){let r=g_e[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>S_e(i,s));return n}o(BW,"createTransformMap");function EP(e,t,r){let n=e.get(r);return n?n(t):ff.autoCast(t)}o(EP,"typeFunction");async function L_e(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new gP,s=bW([yi.createReadStream(e.file_path,{encoding:"utf-8"}),IW.withParser(),c=>c.value,new NW({batchSize:LW}),wW(async c=>{await UW(e,n,r,c)})]);await new Promise((c,l)=>{OW(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);let a=bW([yi.createReadStream(e.file_path,{encoding:"utf-8"}),IW.withParser(),c=>c.value,new NW({batchSize:LW}),wW(async c=>{await xW(e,t,r,c)})]);return await new Promise((c,l)=>{OW(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,eu(Nr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.INSERT_JSON_ERR+n)}}o(L_e,"insertJson");async function FW(e){let t={};try{e.data&&e.data.length>0&&D_e(e.data[0])?t=await M_e(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",mf.info(t.message))}catch(r){throw tu(r)}return t}o(FW,"callBulkFileLoad");function D_e(e){let t=Object.keys(e);for(let r of t)if(!T_e.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(D_e,"validateColumnNames");async function M_e(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=rR.insert;break;case"update":i=rR.update;break;case"upsert":i=rR.upsert;break;default:throw Xt(new Error,Nr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,Nr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw tu(a)}}o(M_e,"bulkFileLoad");function HW(e,t){return`successfully loaded ${t} of ${e} records`}o(HW,"buildResponseMsg");function tu(e){return Xt(e,eu(Nr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(tu,"buildTopLevelErrMsg")});var AP=M((Vxe,zW)=>{"use strict";var yP=an(),v_e=uP(),{AsyncParser:U_e}=require("json2csv"),iR=require("stream"),ds=ie(),RP=require("fs-extra"),x_e=require("path"),Gs=Q(),{promisify:$W}=require("util"),qp=ie(),{handleHDBError:_r,hdbErrors:B_e}=ge(),{HDB_ERROR_MSGS:Hn,HTTP_STATUS_CODES:gr}=B_e,{streamAsJSON:F_e}=(bA(),v(vv)),{Upload:H_e}=require("@aws-sdk/lib-storage"),{toCsvStream:k_e}=(bo(),v(Vv)),GW=["search_by_value","search_by_hash","sql","search_by_conditions"],qW=["json","csv"],VW="json",KW="csv",G_e="Successfully exported JSON locally.",q_e="Successfully exported CSV locally.",$_e=1e3,V_e=yP.searchByHash,K_e=yP.searchByValue,Y_e=$W(iR.finished);zW.exports={export_to_s3:Q_e,export_local:W_e};async function W_e(e){Gs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=YW(e);if(!ds.isEmpty(t))throw Gs.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(ds.isEmpty(e.path))throw Gs.error(Hn.MISSING_VALUE("path")),_r(new Error,Hn.MISSING_VALUE("path"),gr.BAD_REQUEST,void 0,void 0,!0);let r=(ds.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(x_e.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=ds.buildFolderPath(e.path,r);await z_e(e.path);let s=await WW(e);return await j_e(n,e.format,s)}o(W_e,"export_local");async function z_e(e){if(Gs.trace("in confirmPath"),ds.isEmptyOrZeroLength(e))throw _r(new Error,`Invalid path: ${e}`,gr.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await RP.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(z_e,"confirmPath");async function j_e(e,t,r){if(Gs.trace("in saveToLocal"),qp.isEmptyOrZeroLength(e))throw _r(new Error,Hn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmptyOrZeroLength(t))throw _r(new Error,Hn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmpty(r))throw _r(new Error,Hn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===VW){let n=RP.createWriteStream(e);return F_e(r).pipe(n),await Y_e(n),{message:G_e,path:e}}else if(t===KW){let n=RP.createWriteStream(e),s=iR.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new U_e(i,c).fromInput(s).toOutput(n).promise(!1),{message:q_e,path:e}}throw _r(new Error,Hn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(j_e,"saveToLocal");async function Q_e(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,Hn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,Hn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,Hn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,Hn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,Hn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,Hn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=YW(e);if(!ds.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 WW(e)}catch(l){throw Gs.error(l),l}let n,s=await v_e.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new iR.PassThrough;if(e.format===KW){i=e.s3.key+".csv";let l=k_e(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===VW){i=e.s3.key+".json";let l=new iR.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%$_e===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,Hn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new H_e({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(Q_e,"export_to_s3");function YW(e){if(Gs.trace("in exportCoreValidation"),ds.isEmpty(e.format))return"format missing";if(qW.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${qW.join(", ")}`;let t=e.search_operation.operation;if(ds.isEmpty(t))return"search_operation.operation missing";if(GW.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${GW.join(", ")}`}o(YW,"exportCoreValidation");async function WW(e){Gs.trace("in getRecords");let t,r;if(qp.isEmpty(e.search_operation)||qp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,Hn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=K_e;break;case"search_by_hash":t=V_e;break;case"search_by_conditions":t=yP.searchByConditions;break;case"sql":{let n=zT();t=$W(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(WW,"getRecords")});var QW=M((Yxe,jW)=>{"use strict";var bP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};jW.exports=bP});var ZW=M((zxe,XW)=>{"use strict";var J_e=(k(),v(W)),JW=require("moment"),X_e=require("uuid").v4,IP=class{static{o(this,"JobObject")}constructor(){this.id=X_e(),this.type=void 0,this.start_datetime=JW().valueOf(),this.created_datetime=JW().valueOf(),this.end_datetime=void 0,this.status=J_e.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};XW.exports=IP});var NP=M((Qxe,az)=>{"use strict";var Z_e=require("uuid").v4,sz=Mn(),iz=an(),ege=ci(),tge=zu(),rge=QW(),Dt=(k(),v(W)),nge=ZW(),sge=eS(),Ai=Q(),ige=im(),hf=ie(),{promisify:oge}=require("util"),ru=require("moment"),age=zT(),oR=cP(),ez=xI(),{deleteTransactionLogsBeforeValidator:cge}=PC(),{handleHDBError:tz,hdbErrors:lge,ClientError:uge}=ge(),{HTTP_STATUS_CODES:rz}=lge,nz=iz.searchByValue,dge=iz.searchByHash,fge=sz.insert,mge=oge(age.evaluateSQL),hge=sz.update;az.exports={addJob:_ge,updateJob:Sge,handleGetJob:pge,handleGetJobsByStartDate:Ege,getJobById:oz};async function pge(e){if(e.id===void 0)throw new uge("'id' is required");let t=await oz(e.id);return hf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(pge,"handleGetJob");async function Ege(e){try{let t=await gge(e);if(Ai.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=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 Ai.error(r),new Error(r)}}o(Ege,"handleGetJobsByStartDate");async function _ge(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||hf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Ai.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return Ai.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=oR.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=oR.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=oR.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=oR.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=ez(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=ez(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=cge(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw tz(new Error,"Invalid service",rz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw tz(n,n.message,rz.BAD_REQUEST,void 0,void 0,!0);let s=new nge;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 ege(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await nz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=Z_e();try{a=await nz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Ai.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new ige(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await fge(l)}catch(d){return Ai.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Ai.trace(d)}return t}o(_ge,"addJob");async function gge(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 rge(n,e.hdb_user);try{return await mge(s)}catch(i){throw Ai.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(gge,"getJobsInDateRange");async function oz(e){if(hf.isEmptyOrZeroLength(e))return hf.errorizeMessage("Invalid job ID specified.");let t=new tge(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await dge(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Ai.error(n),hf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(oz,"getJobById");async function Sge(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(hf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Dt.JOB_STATUS_ENUM.COMPLETE||e.status===Dt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=ru().valueOf());let t=new sge(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await hge(t),r}o(Sge,"updateJob")});var pz=M((Xxe,hz)=>{"use strict";var cz=ie(),wr=(k(),v(W)),Tge=require("moment"),aR=TP(),$p=Q(),lz=NP(),uz=AP(),dz=Tl(),fz=nt(),Rge=FT(),yge=sf(),{parentPort:Age,isMainThread:mz}=require("worker_threads"),{onMessageByType:bge}=nt(),wP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function Ige(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(cz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(cz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case wr.JOB_TYPE_ENUM.csv_file_load:await so(e,aR.csvFileLoad);break;case wr.JOB_TYPE_ENUM.csv_url_load:await so(e,aR.csvURLLoad);break;case wr.JOB_TYPE_ENUM.csv_data_load:await so(e,aR.csvDataLoad);break;case wr.JOB_TYPE_ENUM.import_from_s3:await so(e,aR.importFromS3);break;case wr.JOB_TYPE_ENUM.empty_trash:break;case wr.JOB_TYPE_ENUM.export_local:await so(e,uz.export_local);break;case wr.JOB_TYPE_ENUM.export_to_s3:await so(e,uz.export_to_s3);break;case wr.JOB_TYPE_ENUM.delete_files_before:case wr.JOB_TYPE_ENUM.delete_records_before:await so(e,dz.deleteFilesBefore);break;case wr.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,dz.deleteAuditLogsBefore);break;case wr.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,Rge.deleteTransactionLogsBefore);break;case wr.JOB_TYPE_ENUM.restart_service:return await so(e,yge.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(Ige,"parseMessage");async function so(e,t){try{e.job.status=wr.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=Tge().valueOf(),await lz.updateJob(e.job),await Nge(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):$p.error(`There was an error running ${t.name} job with id ${e.job.id}`),$p.error(n),e.job.message=n,e.job.status=wr.JOB_STATUS_ENUM.ERROR;try{await lz.updateJob(e.job)}catch(s){throw $p.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function Nge(e){$p.trace("launching job thread:",e),mz?fz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[wr.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):Age.postMessage({type:wr.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(Nge,"launchJobThread");mz&&bge(wr.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{fz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[wr.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){$p.error(r)}});hz.exports={parseMessage:Ige,RunnerMessage:wP}});var _z=M((eBe,Ez)=>{"use strict";var wge=ie(),OP=oe(),hc=(k(),v(W)),Oge=Ct(),Cge=mr(),io=Q(),Pge=hP(),Lge=Ki();OP.initSync();Ez.exports={postOperationHandler:Mge,sendOperationTransaction:Vp};async function Vp(e,t,r,n){if(e.schema===hc.SYSTEM_SCHEMA_NAME)return;let s=Dge(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await Cge.publishToStream(`${Oge.SUBJECT_PREFIXES.TXN}.${e.schema}`,Lge.createNatsTableStreamName(e.schema,e.table),n,s))}o(Vp,"sendOperationTransaction");function Dge(e,t,r){if(wge.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===hc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(Dge,"convertCRUDOperationToTransaction");async function Mge(e,t,r){if(!OP.get(hc.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=OP.get(hc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new Pge(t.txn_time,n,s);switch(e.operation){case hc.OPERATIONS_ENUM.INSERT:try{await Vp(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case hc.OPERATIONS_ENUM.DELETE:try{await Vp(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case hc.OPERATIONS_ENUM.UPDATE:try{await Vp(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case hc.OPERATIONS_ENUM.UPSERT:try{await Vp(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(Mge,"postOperationHandler")});var J,gz=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 OC={};we(OC,{chooseOperation:()=>Bz,executeJob:()=>qs,getOperationFunction:()=>Fz,operation:()=>BP,processLocalTransaction:()=>xz});async function xz(e,t){try{if(e.body.operation!=="read_log"&&(zp.default.log_level===Kf.INFO||zp.default.log_level===Kf.DEBUG||zp.default.log_level===Kf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;gn.info(c)}}catch(n){gn.error(n)}let r=await vz.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return xge[e.body.operation]&&Pz.default.setSchemaDataToGlobal(n=>{n&&gn.error(n)}),r}function Bz(e){let t;try{t=Fz(e)}catch(s){throw gn.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=uR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=uR.default.checkASTPermissions(e,i);if(a)throw gn.error(`${Sz.FORBIDDEN} from operation ${e.operation}`),gn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,$s.handleHDBError)(new Error,a,$s.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==q.CREATE_AUTHENTICATION_TOKENS&&e.operation!==q.LOGIN&&e.operation!==q.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=Cz.default.verifyPerms(i,s);if(a)throw gn.error(`${Sz.FORBIDDEN} from operation ${e.operation}`),gn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,$s.handleHDBError)(new Error,a,$s.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,$s.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function Fz(e){if(gn.trace(`getOperationFunction with operation: ${e.operation}`),Tz.has(e.operation))return Tz.get(e.operation);throw(0,$s.handleHDBError)(new Error,$s.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),$s.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function BP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=Bz(e);return xz({body:e},n)}async function Bge(e){gn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Jy]=!0;let a;switch(i.operation){case q.INSERT:a=await su.default.insert(i);break;case q.UPDATE:a=await su.default.update(i);break;case q.UPSERT:a=await su.default.upsert(i);break;case q.DELETE:a=await _f.default.deleteRecord(i);break;default:gn.warn("invalid operation in catchup");break}await Uz.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){gn.info("Invalid operation in transaction"),gn.error(a)}}async function qs(e){(0,Mz.transformReq)(e);let t,r;try{if(r=await dR.default.addJob(e),r){t=r.createdJob,gn.info("addJob result",r);let n=new DP.default.RunnerMessage(t,e);return{message:await DP.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 gn.error(i),(0,$s.handleHDBError)(n,i)}}function Fge(){let e=new Map;return e.set(q.INSERT,new J(su.default.insert)),e.set(q.UPDATE,new J(su.default.update)),e.set(q.UPSERT,new J(su.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(Ef.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(Ef.default.searchByValue)),e.set(q.SEARCH,new J(vge)),e.set(q.SQL,new J(Uge)),e.set(q.CSV_DATA_LOAD,new J(qs,Kp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(qs,Kp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(qs,Kp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(qs,Kp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(bi.default.createSchema)),e.set(q.CREATE_DATABASE,new J(bi.default.createSchema)),e.set(q.CREATE_TABLE,new J(bi.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(bi.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(bi.default.dropSchema)),e.set(q.DROP_DATABASE,new J(bi.default.dropSchema)),e.set(q.DROP_TABLE,new J(bi.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(bi.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(Yp.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(Yp.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(Yp.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(Yp.default.describeAll)),e.set(q.DELETE,new J(_f.default.deleteRecord)),e.set(q.ADD_USER,new J(pf.default.addUser)),e.set(q.ALTER_USER,new J(pf.default.alterUser)),e.set(q.DROP_USER,new J(pf.default.dropUser)),e.set(q.LIST_USERS,new J(pf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(Wp.default.listRoles)),e.set(q.ADD_ROLE,new J(Wp.default.addRole)),e.set(q.ALTER_ROLE,new J(Wp.default.alterRole)),e.set(q.DROP_ROLE,new J(Wp.default.dropRole)),e.set(q.USER_INFO,new J(pf.default.userInfo)),e.set(q.READ_LOG,new J(yz.default)),e.set(q.ADD_NODE,new J(Az.default)),e.set(q.UPDATE_NODE,new J(CP.default)),e.set(q.SET_NODE_REPLICATION,new J(CP.default)),e.set(q.REMOVE_NODE,new J(bz.default)),e.set(q.CONFIGURE_CLUSTER,new J(Iz.default)),e.set(q.PURGE_STREAM,new J(Nz.default)),e.set(q.SET_CONFIGURATION,new J(MP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(wz.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(Oz.default)),e.set(q.CLUSTER_SET_ROUTES,new J(cR.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(cR.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(cR.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(qs,PP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(nu.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(nu.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(nu.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(nu.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(nu.default.removeCertificate)),e.set(q.GET_KEY,new J(nu.default.getKey)),e.set(q.ADD_NODE_BACK,new J(AO)),e.set(q.REMOVE_NODE_BACK,new J(bO)),e.set(q.DELETE_FILES_BEFORE,new J(qs,_f.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(qs,_f.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(qs,PP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(dR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(dR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(lR.default.getFingerprint)),e.set(q.SET_LICENSE,new J(lR.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(lR.default.getRegistrationInfo)),e.set(q.RESTART,new J(LP.default.restart)),e.set(q.RESTART_SERVICE,new J(qs,LP.default.restartService)),e.set(q.CATCHUP,new J(Bge)),e.set(q.SYSTEM_INFORMATION,new J(Lz.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(qs,_f.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(Rz.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(ew)),e.set(q.REFRESH_OPERATION_TOKEN,new J(tw)),e.set(q.LOGIN,new J(TC)),e.set(q.LOGOUT,new J(RC)),e.set(q.GET_CONFIGURATION,new J(MP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(vP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(qs,vP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(UP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(UP.default.auditModules)),e.set(q.GET_BACKUP,new J(bi.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(bi.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(DC)),e.set(q.LIST_METRICS,new J(MC)),e.set(q.DESCRIBE_METRIC,new J(vC)),e.set(q.GET_STATUS,new J(HC)),e.set(q.SET_STATUS,new J(kC)),e.set(q.CLEAR_STATUS,new J(FC)),e}var Ef,uR,Kp,bi,Yp,_f,Rz,pf,Wp,Mt,zp,yz,Az,CP,bz,Iz,Nz,wz,Oz,cR,PP,Cz,dR,$s,lR,LP,xP,su,Pz,Lz,DP,MP,vP,UP,Dz,Mz,nu,vz,Uz,Sz,gn,vge,Uge,xge,Tz,CC=ce(()=>{Ef=w(an()),uR=w(zT()),Kp=w(TP()),bi=w(Jh()),Yp=w(Fa()),_f=w(Tl()),Rz=w(Jw()),pf=w(ts()),Wp=w(Ih()),Mt=w(wC()),zp=w(Q()),yz=w(rO()),Az=w(np()),CP=w(CO()),bz=w(cp()),Iz=w(DO()),Nz=w(MO()),wz=w(cT()),Oz=w(BO()),cR=w(uT()),PP=w(AP()),Cz=w(YT()),dR=w(NP());k();$s=w(ge()),lR=w(QO()),LP=w(sf()),xP=w(require("util")),su=w(Mn()),Pz=w(Os()),Lz=w(qd()),DP=w(pz());Sd();PT();MP=w(It()),vP=w(FT()),UP=w(Ip()),Dz=w(ei()),Mz=w(ie());Dr();nu=w(os());Vd();xC();vz=w(lP()),Uz=w(_z());Up();gz();({HTTP_STATUS_CODES:Sz}=$s.hdbErrors),gn=zp.default.loggerWithTag("operation"),vge=xP.promisify(Ef.default.search),Uge=xP.promisify(uR.default.evaluateSQL),xge={[q.CREATE_ATTRIBUTE]:!0,[q.CREATE_TABLE]:!0,[q.CREATE_SCHEMA]:!0,[q.DROP_ATTRIBUTE]:!0,[q.DROP_TABLE]:!0,[q.DROP_SCHEMA]:!0};o(xz,"processLocalTransaction");Tz=Fge();Le.operation=BP;o(Bz,"chooseOperation");o(Fz,"getOperationFunction");(0,Dz._assignPackageExport)("operation",BP);o(BP,"operation");o(Bge,"catchup");o(qs,"executeJob");o(Fge,"initializeOperationFunctionMap")});var hR=M((aBe,Gz)=>{"use strict";var fR=(k(),v(W)),Hge=ie(),jp=Q(),{handleHDBError:FP,hdbErrors:mR}=ge(),{isMainThread:kge}=require("worker_threads"),{Readable:Gge}=require("stream"),Hz=require("os"),qge=require("util"),$ge=nw(),Vge=qge.promisify($ge.authorize),kz=(CC(),v(OC)),{createGzip:Kge,constants:Yge}=require("zlib"),Wge=[fR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,fR.OPERATIONS_ENUM.LOGIN,fR.OPERATIONS_ENUM.LOGOUT];function zge(e){let t=`Found an uncaught exception with message: ${e.message}. ${Hz.EOL}Stack: ${e.stack} ${Hz.EOL}Terminating ${kge?"HDB":"thread"}.`;console.error(t),jp.fatal(t),process.exit(1)}o(zge,"handleServerUncaughtException");function jge(e,t,r){if(jp[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:mR.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(jge,"serverErrorHandler");function Qge(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=FP(new Error,"Invalid JSON.",mR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(Hge.isEmpty(e.body.operation)){let n=FP(new Error,"Request body must include an 'operation' property.",mR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(Qge,"reqBodyValidationHandler");function Jge(e,t,r){let n;!Wge.includes(e.body.operation)||e.body.operation===fR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?Vge(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{jp.warn(i),jp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(FP(i,a,mR.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(Jge,"authHandler");async function Xge(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=kz.chooseOperation(e.body);let s=await kz.processLocalTransaction(e,n);if(s instanceof Gge&&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(Kge({level:Yge.Z_BEST_SPEED})))}return s}catch(s){throw jp.error(s),s}}o(Xge,"handlePostRequest");Gz.exports={authHandler:Jge,handlePostRequest:Xge,handleServerUncaughtException:zge,serverErrorHandler:jge,reqBodyValidationHandler:Qge}});var Kz=M((lBe,Vz)=>{"use strict";var Zge=require("fastify-plugin"),{handlePostRequest:qz,authHandler:eSe,reqBodyValidationHandler:tSe}=hR();async function rSe(e){e.decorate("hdbCore",{preValidation:[tSe,eSe],request:o((t,r)=>$z(qz(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>$z(qz(t,r,!0)),"requestWithoutAuthentication")})}o(rSe,"hdbCore");async function $z(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($z,"convertAsyncIterators");Vz.exports=Zge(rSe)});var Wz=M((fBe,Yz)=>{"use strict";var dBe=require("fs"),pR=oe();pR.initSync();var{CONFIG_PARAMS:HP}=(k(),v(W)),nSe=1024*1024*1024;function sSe(e){let t=pR.get(HP.HTTP_TIMEOUT),r=pR.get(HP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:nSe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:pR.get(HP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(sSe,"getServerOptions");Yz.exports=sSe});var Qz=M((hBe,jz)=>{"use strict";var kP=oe();kP.initSync();var{CONFIG_PARAMS:zz}=(k(),v(W));function iSe(){let e=kP.get(zz.HTTP_CORSACCESSLIST),t=kP.get(zz.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(iSe,"getCORSOptions");jz.exports=iSe});var Zz=M((EBe,Xz)=>{"use strict";var Jz=oe();Jz.initSync();var oSe=(k(),v(W));function aSe(){return Jz.get(oSe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(aSe,"getHeaderTimeoutConfig");Xz.exports=aSe});var qP={};we(qP,{customFunctionsServer:()=>uSe,ready:()=>mj,start:()=>lSe});function lSe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ta||(ta=fj(t),Le.http((await ta).server));let a=await ta,c=(0,GP.dirname)(s),l=(0,GP.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!ej.has(c)){ej.add(c);try{a.register(fSe(c,l))}catch(u){if(u.message==="Root plugin has already booted")yt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:mj}}async function uSe(){try{yt.info("In Custom Functions Fastify server"+process.cwd()),yt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),yt.debug(`Custom Functions server process ${process.pid} starting up.`),await dSe();let e=oj.get(U.HTTP_SECUREPORT)>0,t;try{t=ta=await fj(e)}catch(r){throw yt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw yt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){yt.error(`Custom Functions ${process.pid} Error: ${e}`),yt.error(e),process.exit(1)}}async function dSe(){try{yt.info("Custom Functions starting configuration."),await aj.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function fSe(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,tj.existsSync)(e)&&r.register(ij.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:yt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?yt.error(s.message):s&&yt.error(s),a()})}catch(n){yt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function fj(e){yt.info("Custom Functions starting buildServer.");let t=(0,cj.default)(e),r=(0,rj.default)(t);r.server.headersTimeout=(0,uj.default)(),r.setErrorHandler(dj.serverErrorHandler);let n=(0,lj.default)();return n&&r.register(nj.default,n),r.register(function(s,i,a){s.setNotFoundHandler(function(c,l){r.server.emit("unhandled",c.raw,l.raw)}),a()}),r.register(sj.default),await r.register(cSe),await r.after(),mm(r),yt.info("Custom Functions completed buildServer."),r}function mj(){if(ta)return ta.then?ta.then(e=>e.ready()):ta.ready()}var GP,tj,rj,nj,sj,ij,oj,yt,cSe,aj,cj,lj,uj,dj,ta,ej,hj=ce(()=>{GP=require("path"),tj=require("fs"),rj=w(require("fastify")),nj=w(require("@fastify/cors")),sj=w(QN()),ij=w(require("@fastify/autoload")),oj=w(oe());k();yt=w(Q()),cSe=w(Kz()),aj=w(ts()),cj=w(Wz()),lj=w(Qz()),uj=w(Zz()),dj=w(hR());bo();Dr();ej=new Set;o(lSe,"start");o(uSe,"customFunctionsServer");o(dSe,"setUp");o(fSe,"buildRouteFolder");o(fj,"buildServer");o(mj,"ready")});var $P={};we($P,{start:()=>mSe});function mSe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Sj.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){Ej||(Ej=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=pj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,_j.default)(s,(0,gj.realpathSync)(a))}}return i(s)},{runFirst:!0})),pj.set(r,n)}}}var _j,gj,Sj,pj,Ej,Tj=ce(()=>{_j=w(require("send")),gj=require("fs"),Sj=w(require("serve-static")),pj=new Map;o(mSe,"start")});var VP={};we(VP,{start:()=>hSe});function hSe({override:e}){return{handleFile:o((t,r,n)=>{ER.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,Rj.parse)(t))){if(process.env[s]!==void 0)if(ER.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)ER.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var Rj,ER,yj=ce(()=>{Rj=require("dotenv"),ER=w(Q());o(hSe,"start")});var WP={};we(WP,{DataLoaderError:()=>fs,DataLoaderResult:()=>gf,EmptyFileError:()=>TR,FileParseError:()=>SR,InvalidPropertyTypeError:()=>RR,MissingRequiredPropertyError:()=>Qp,RecordProcessingError:()=>Jp,SystemDatabaseError:()=>yR,UnsupportedFileExtensionError:()=>gR,computeRecordHash:()=>YP,handleApplication:()=>_Se,loadDataFile:()=>Pj,suppressHandleApplicationWarning:()=>ESe});function YP(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,bj.createHash)("sha256").update(n).digest("hex")}function Cj(e){return e.system&&e.system[KP]?e.system[KP]:_R||(_R=je({database:"system",table:KP,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),_R)}async function pSe(e,t,r,n){try{let s=Cj(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return Vs.error?.(`Failed to get stored hash: ${s.message}`),null}}async function Aj(e,t,r,n,s){try{let i=Cj(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){Vs.error?.(`Failed to store hash: ${i.message}`)}}function _Se(e){if((0,Nj.getWorkerIndex)()!==0){Vs.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||Pj(t,ln,He).then(r=>{Vs.debug?.("Data loader processed file: %s: %s",(0,ra.basename)(t.absolutePath),r.message)})})}async function Pj({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ra.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,Ij.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new gR(t,i)}catch(f){throw f instanceof fs?f:new SR(t,f)}if(!a)throw new TR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Qp(t,"table");if(!u)throw new Qp(t,"records");if(!Array.isArray(u))throw new RR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new yR(c,l);try{let f;if(c&&s[c]&&s[c][l])Vs.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])Vs.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{Vs.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=YP(N);if(!O){h++;let $=await f.put(N);return await Aj(c,l,F,Z,s),$}let G=await pSe(c,l,F,s);if(!G)return _++,Promise.resolve({inserted:0,updated:0});let Y={};for(let $ of Object.keys(N))$ in O&&(Y[$]=O[$]);return YP(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await Aj(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof fs)Vs.error?.(`Record processing error: ${O.message}`);else{let F=new Jp(d,O);Vs.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)`),Vs.info?.(R),new gf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return Vs.info?.(R),new gf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return Vs.info?.(R),new gf(t,c,l,"success",0,R)}}catch(f){throw f instanceof fs?f:new Jp(d,f)}}var ra,bj,Ij,Nj,na,wj,Oj,Vs,KP,_R,ESe,fs,gR,SR,TR,Qp,RR,yR,Jp,gf,Lj=ce(()=>{ra=require("node:path"),bj=require("node:crypto"),Ij=require("yaml");Me();Nj=w(nt()),na=w(rn()),wj=w(ge()),Oj=w(Q()),Vs=Oj.default.forComponent("dataLoader"),KP="hdb_dataloader_hash";o(YP,"computeRecordHash");o(Cj,"getHashTrackingTable");o(pSe,"getStoredHash");o(Aj,"storeHash");ESe=!0;o(_Se,"handleApplication");o(Pj,"loadDataFile");fs=class extends wj.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=na.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},gR=class extends fs{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ra.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},SR=class extends fs{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,ra.basename)(t)}: ${r.message}`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},TR=class extends fs{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ra.basename)(t)} is empty or invalid`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Qp=class extends fs{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ra.basename)(t)} is missing required "${r}" property`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},RR=class extends fs{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ra.basename)(t)} has invalid "${r}" property, expected ${n}`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},yR=class extends fs{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,na.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Jp=class extends fs{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,na.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},gf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var jP=M((OBe,Dj)=>{"use strict";var Xp=oe();Xp.initSync();var Sf=require("fs-extra"),zP=require("path"),Tf=(k(),v(W)),gSe=require("crypto"),SSe=require("uuid").v4;Dj.exports=TSe;function TSe(){if(Xp.getHdbBasePath()!==void 0){let e=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{Sf.accessSync(r),Sf.accessSync(e),Sf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=SSe(),i=gSe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});Sf.writeFileSync(r,s),Sf.writeFileSync(e,i.privateKey),Sf.writeFileSync(t,i.publicKey)}else throw n}}}o(TSe,"checkJWTTokenExist")});var vj=M((PBe,Mj)=>{"use strict";var QP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};Mj.exports={HdbInfoInsertObject:QP}});var Bj=M((DBe,xj)=>{"use strict";var Uj=(k(),v(W)),JP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[Uj.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[Uj.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};xj.exports={UpgradeObject:JP}});var AR=M((vBe,Hj)=>{"use strict";var Ks=require("prompt"),Rf=require("chalk"),Fj=Q(),Ii=require("os"),XP=Bc(),ZP=["yes","y"];async function RSe(e){let t=`${Ii.EOL}`+Rf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ii.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}${Ii.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ii.EOL}`;Ks.override=XP(["CONFIRM_UPGRADE"]),Ks.start(),Ks.message=t;let r={properties:{CONFIRM_UPGRADE:{description:Rf.magenta(`${Ii.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Ks.get([r])}catch(s){return Fj.error("There was an error when prompting user about an upgrade."),Fj.error(s),!1}return ZP.includes(n.CONFIRM_UPGRADE)}o(RSe,"forceUpdatePrompt");async function ySe(e){let t=`${Ii.EOL}`+Rf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}`);Ks.override=XP(["CONFIRM_DOWNGRADE"]),Ks.start(),Ks.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:Rf.magenta(`${Ii.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Ks.get([r]);return ZP.includes(n.CONFIRM_DOWNGRADE)}o(ySe,"forceDowngradePrompt");async function ASe(){let e=`${Ii.EOL}`+Rf.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");Ks.override=XP(["GENERATE_CERTS"]),Ks.start(),Ks.message=e;let t={properties:{GENERATE_CERTS:{description:Rf.magenta(`${Ii.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Ks.get([t]);return ZP.includes(r.GENERATE_CERTS)}o(ASe,"upgradeCertsPrompt");Hj.exports={forceUpdatePrompt:RSe,forceDowngradePrompt:ySe,upgradeCertsPrompt:ASe}});var tL=M((xBe,kj)=>{"use strict";var eL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};kj.exports=eL});var qj=M((qBe,Gj)=>{"use strict";var bSe=ie(),ISe=It(),FBe=Q(),HBe=require("path"),kBe=require("fs"),GBe=(k(),v(W));Gj.exports={getOldPropsValue:NSe};function NSe(e,t,r=!1){let n=t.getRaw(e);return bSe.isNotEmptyAndHasValue(n)?n:r?ISe.getDefaultConfig(e):""}o(NSe,"getOldPropsValue")});var Yj=M((VBe,Kj)=>{"use strict";var pc=require("path"),Ec=require("fs-extra"),wSe=require("properties-reader"),OSe=tL(),Sr=Q(),{getOldPropsValue:At}=qj(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:iu}=(k(),v(W)),ou=It(),bR=oe(),$j=ie(),oo=(k(),v(W)),rL=new OSe("3.1.0"),Vj=[];function CSe(){let e=wSe(bR.get(ye.SETTINGS_PATH_KEY)),t="Updating settings file for version 3.1.0";console.log(t),Sr.info(t);let r=` ;Settings for the HarperDB process.
|
|
32
|
+
`);throw n[1]?eP(r,`Invalid SQL at: ${n[1]}. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.`,tP.BAD_REQUEST):eP(r,"We had trouble parsing your request. Please ensure your SQL is valid. Try adding backticks to reserved words and schema table references.",tP.BAD_REQUEST)}return t}o(dW,"convertSQLToAST");function fW(e,t,r){try{let n=KEe;if(!e.bypass_auth&&!t.permissions_checked){let i=uW(e,t);if(i&&i.length>0)return r(qEe,i)}let s={statement:t.ast.statements[0],hdb_user:e.hdb_user};switch(t.variant){case kp.VALID_SQL_OPS_ENUM.SELECT:n=vEe,s=t.ast.statements[0];break;case kp.VALID_SQL_OPS_ENUM.INSERT:n=YEe;break;case kp.VALID_SQL_OPS_ENUM.UPDATE:n=xEe;break;case kp.VALID_SQL_OPS_ENUM.DELETE:n=BEe;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(fW,"processAST");function KEe(e,t){WT.info(e),t("unknown sql statement")}o(KEe,"nullFunction");function YEe({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=WEe(i,e.values)}catch(a){return r(a)}MEe(s,(a,c)=>{if(a)return r(a);try{delete c.new_attributes,delete c.txn_time}catch(l){WT.error(`Error delete new_attributes from insert response: ${l}`)}r(null,c)})}o(YEe,"convertInsert");function WEe(e,t){try{return t.map(r=>{if(e.length!==r.length)throw"number of values do not match number of columns in insert";let n={};return r.forEach((s,i)=>{if(s.columnid)throw"cannot use a column in insert value";"value"in s?n[e[i]]=s.value:n[e[i]]=mc.compile(`SELECT ${s.toString()} AS [${kp.FUNC_VAL}] FROM ?`)}),n})}catch(r){throw WT.error(r),new Error($Ee)}}o(WEe,"createDataObjects")});var cP=M((Oxe,_W)=>{var XT=require("clone"),ZT=lt(),zEe=ie(),QT=(k(),v(W)),Nxe=Q(),nP=require("fs"),iP=require("joi"),{string:JT}=iP.types(),{hdbErrors:jEe,handleHDBError:jT}=ge(),{HDB_ERROR_MSGS:wxe,HTTP_STATUS_CODES:sP}=jEe,{commonValidators:df}=Gi(),hW=" is required",QEe=["insert","update","upsert"],oP={database:{presence:!1,format:df.schema_format,length:df.schema_length},schema:{presence:!1,format:df.schema_format,length:df.schema_length},table:{presence:!0,format:df.schema_format,length:df.schema_length},action:{inclusion:{within:QEe,message:"is required and must be either insert, update, or upsert"}},file_path:{},csv_url:{url:{allowLocal:!0}},data:{},passthrough_headers:{}},JEe={schema:JT.required(),table:JT.required(),action:JT.valid("insert","update","upsert")},{AWS_ACCESS_KEY:XEe,AWS_SECRET:ZEe,AWS_BUCKET:e_e,AWS_FILE_KEY:t_e,REGION:r_e}=QT.S3_BUCKET_AUTH_KEYS,n_e={s3:{presence:!0},[`s3.${XEe}`]:{presence:!0,type:"String"},[`s3.${ZEe}`]:{presence:!0,type:"String"},[`s3.${e_e}`]:{presence:!0,type:"String"},[`s3.${t_e}`]:{presence:!0,type:"String",hasValidFileExt:[".csv",".json"]},[`s3.${r_e}`]:{presence:!0,type:"String"}},pW=XT(oP);pW.data.presence={message:hW};var EW=XT(oP);EW.file_path.presence={message:hW};var s_e=Object.assign(XT(oP),n_e),aP=XT(JEe);aP.csv_url=JT.uri().messages({"string.uri":"'csv_url' must be a valid url"}).required();aP.passthrough_headers=iP.object();function i_e(e){let t=ZT.validateObject(e,pW);return eR(e,t)}o(i_e,"dataObject");function o_e(e){let t=ZT.validateBySchema(e,iP.object(aP));return eR(e,t)}o(o_e,"urlObject");function a_e(e){let t=ZT.validateObject(e,EW);return eR(e,t)}o(a_e,"fileObject");function c_e(e){let t=ZT.validateObject(e,s_e);return eR(e,t)}o(c_e,"s3FileObject");function eR(e,t){if(!t){let r=zEe.checkGlobalSchemaTable(e.schema,e.table);if(r)return jT(new Error,r,sP.BAD_REQUEST);if(e.operation===QT.OPERATIONS_ENUM.CSV_FILE_LOAD)try{nP.accessSync(e.file_path,nP.constants.R_OK|nP.constants.F_OK)}catch(n){return n.code===QT.NODE_ERROR_CODES.ENOENT?jT(n,`No such file or directory ${n.path}`,sP.BAD_REQUEST):n.code===QT.NODE_ERROR_CODES.EACCES?jT(n,`Permission denied ${n.path}`,sP.BAD_REQUEST):jT(n)}}return t}o(eR,"postValidateChecks");_W.exports={dataObject:i_e,urlObject:o_e,fileObject:a_e,s3FileObject:c_e}});var lP=M((Pxe,gW)=>{"use strict";var Gp=Q(),tR=(k(),v(W));async function l_e(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===tR.OPERATIONS_ENUM.INSERT||t.operation===tR.OPERATIONS_ENUM.UPDATE||t.operation===tR.OPERATIONS_ENUM.UPSERT?(delete s.new_attributes,delete s.txn_time):t.operation===tR.OPERATIONS_ENUM.DELETE&&delete s.txn_time,s}catch(i){throw i.message&&typeof i.message=="string"&&i.message.includes("already exists")?(Gp.info(i.message),i):i.http_resp_msg?(Gp.error(`Error calling operation: ${e.name}`),Gp.error(i.http_resp_msg),i):(Gp.error(`Error calling operation: ${e.name}`),Gp.error(i),i)}}o(l_e,"callOperationFunctionAsAwait");gW.exports={callOperationFunctionAsAwait:l_e}});var uP=M((Dxe,TW)=>{"use strict";var{S3:u_e,GetObjectCommand:d_e}=require("@aws-sdk/client-s3");TW.exports={getFileStreamFromS3:f_e,getS3AuthObj:SW};async function f_e(e){let{s3:t}=e,r={Bucket:t.bucket,Key:t.key};return(await SW(t.aws_access_key_id,t.aws_secret_access_key,t.region).send(new d_e(r))).Body}o(f_e,"getFileStreamFromS3");function SW(e,t,r){return new u_e({credentials:{accessKeyId:e,secretAccessKey:t},region:r})}o(SW,"getS3AuthObj")});var yW=M((vxe,RW)=>{"use strict";var dP=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}},fP=class{static{o(this,"BulkLoadDataObject")}constructor(t,r,n,s){this.action=t,this.schema=r,this.table=n,this.data=s}};RW.exports={BulkLoadFileObject:dP,BulkLoadDataObject:fP}});var hP=M((xxe,AW)=>{"use strict";var mP=class{static{o(this,"ClusteringOriginObject")}constructor(t,r,n){this.timestamp=t,this.user=r,this.node_name=n}};AW.exports=mP});var TP=M((qxe,kW)=>{"use strict";var rR=Mn(),sR=cP(),m_e=require("needle"),Ri=(k(),v(W)),Fxe=Ct(),ff=ie(),{handleHDBError:Xt,hdbErrors:DW}=ge(),{HTTP_STATUS_CODES:Xr,HDB_ERROR_MSGS:Nr,CHECK_LOGS_WRAPPER:eu}=DW,mf=Q(),pP=require("papaparse");ff.promisifyPapaParse();var yi=require("fs-extra"),h_e=require("path"),{chain:bW}=require("stream-chain"),IW=require("stream-json/streamers/StreamArray"),NW=require("stream-json/utils/Batch"),wW=require("stream-chain/utils/comp"),{finished:OW}=require("stream"),p_e=oe(),MW=lP(),E_e=uP(),{BulkLoadFileObject:_P,BulkLoadDataObject:__e}=yW(),gP=KC(),{verifyBulkLoadAttributePerms:vW}=YT(),Hxe=hP(),kxe=mr(),Gxe=Ki(),{databases:g_e}=(Me(),v(Et)),{coerceType:S_e}=(U_(),v(pk)),CW="No records parsed from csv file.",Zl=`${p_e.get("HDB_ROOT")}/tmp`,{schemaRegex:T_e}=Gi(),PW=1024*1024*2,LW=5e3,R_e={"text/csv":!0,"application/octet-stream":!0,"text/plain":!0,"application/vnd.ms-excel":!0};kW.exports={csvDataLoad:y_e,csvURLLoad:A_e,csvFileLoad:b_e,importFromS3:I_e};async function y_e(e,t){let r=sR.dataObject(e);if(r)throw Xt(r,r.message,Xr.BAD_REQUEST,void 0,void 0,!0);let n={};try{let s=BW(e.schema,e.table),i=pP.parse(e.data,{header:!0,skipEmptyLines:!0,transform:EP.bind(null,s),dynamicTyping:!1}),a=new gP;e.hdb_user&&e.hdb_user?.role&&e.hdb_user?.role?.permission&&e.hdb_user?.role?.permission?.super_user!==!0&&vW(e.hdb_user?.role?.permission,this.job_operation_function.name,e.action,e.schema,e.table,i.meta.fields,a);let c=a.getPermsResponse();if(c)throw Xt(new Error,c,Xr.BAD_REQUEST,void 0,void 0,!0);let l=new __e(e.action,e.schema,e.table,i.data);return n=await MW.callOperationFunctionAsAwait(FW,l,null),n.message===CW?CW:HW(n.records,n.number_written)}catch(s){throw tu(s)}}o(y_e,"csvDataLoad");async function A_e(e){let t=sR.urlObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=`${Date.now()}.csv`,n=`${Zl}/${r}`;try{await N_e(e,r)}catch(s){throw mf.error(Nr.DOWNLOAD_FILE_ERR(r)+" - "+s),Xt(s,eu(Nr.DOWNLOAD_FILE_ERR(r)))}try{let s=new _P(this.job_operation_function.name,e.action,e.schema,e.table,n,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission),i=await SP(s);return await nR(n),i}catch(s){throw await nR(n),tu(s)}}o(A_e,"csvURLLoad");async function b_e(e){let t=sR.fileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r=new _P(this.job_operation_function.name,e.action,e.schema,e.table,e.file_path,Ri.VALID_S3_FILE_TYPES.CSV,e.hdb_user?.role?.permission);try{return await SP(r)}catch(n){throw tu(n)}}o(b_e,"csvFileLoad");async function I_e(e){let t=sR.s3FileObject(e);if(t)throw Xt(t,t.message,Xr.BAD_REQUEST,void 0,void 0,!0);let r;try{let n=h_e.extname(e.s3.key),s=`${Date.now()}${n}`;r=`${Zl}/${s}`;let i=new _P(this.job_operation_function.name,e.action,e.schema,e.table,r,n,e.hdb_user?.role?.permission);await w_e(s,e);let a=await SP(i);return await nR(r),a}catch(n){throw await nR(r),tu(n)}}o(I_e,"importFromS3");async function N_e(e,t){let r;try{let n=e.passthrough_headers?{headers:e.passthrough_headers}:void 0;r=await m_e("get",e.csv_url,n)}catch(n){let s=`Error downloading CSV file from ${e.csv_url}, status code: ${n.statusCode}. Check the log for more information.`;throw Xt(n,s,n.statusCode,Ri.LOG_LEVELS.ERROR,"Error downloading CSV file - "+n)}C_e(r,e.csv_url),await O_e(t,r.raw)}o(N_e,"downloadCSVFile");async function w_e(e,t){try{let r=`${Zl}/${e}`;await yi.mkdirp(Zl),await yi.writeFile(`${Zl}/${e}`,"",{flag:"a+"});let n=await yi.createWriteStream(r),s=await E_e.getFileStreamFromS3(t);await new Promise((i,a)=>{s.on("error",function(c){a(c)}),s.pipe(n).on("error",function(c){a(c)}).on("close",function(){mf.info(`${t.s3.key} successfully downloaded to ${r}`),i()})})}catch(r){throw mf.error(Nr.S3_DOWNLOAD_ERR+" - "+r),Xt(r,eu(Nr.S3_DOWNLOAD_ERR))}}o(w_e,"downloadFileFromS3");async function O_e(e,t){try{await yi.mkdirp(Zl),await yi.writeFile(`${Zl}/${e}`,t)}catch(r){throw mf.error(Nr.WRITE_TEMP_FILE_ERR),Xt(r,eu(Nr.DEFAULT_BULK_LOAD_ERR))}}o(O_e,"writeFileToTempFolder");async function nR(e){if(e)try{await yi.access(e),await yi.unlink(e)}catch{mf.warn(`could not delete temp csv file at ${e}, file does not exist`)}}o(nR,"deleteTempFile");function C_e(e,t){if(e.statusCode!==DW.HTTP_STATUS_CODES.OK)throw Xt(new Error,`CSV Load failed from URL: ${t}, status code: ${e.statusCode}, message: ${e.statusMessage}`,Xr.BAD_REQUEST);if(!R_e[e.headers["content-type"]])throw Xt(new Error,`CSV Load failed from URL: ${t}, unsupported content type: ${e.headers["content-type"]}`,Xr.BAD_REQUEST);if(!e.raw)throw Xt(new Error,`CSV Load failed from URL: ${t}, no csv found at url`,Xr.BAD_REQUEST)}o(C_e,"validateURLResponse");async function SP(e){try{let t;switch(e.file_type){case Ri.VALID_S3_FILE_TYPES.CSV:t=await P_e(e);break;case Ri.VALID_S3_FILE_TYPES.JSON:t=await L_e(e);break;default:throw Xt(new Error,Nr.DEFAULT_BULK_LOAD_ERR,Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,Nr.INVALID_FILE_EXT_ERR(e))}return HW(t.records,t.number_written)}catch(t){throw tu(t)}}o(SP,"fileLoad");async function UW(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 rR.validation(a);e.role_perms&&e.role_perms.super_user!==!0&&vW(e.role_perms,e.op,e.action,e.schema,e.table,c,t),s&&s.resume()}catch(c){let l=Xt(c);r(l)}}o(UW,"validateChunk");async function xW(e,t,r,n,s){let i=n.data?n.data:n;if(i.length===0)return;ff.autoCastJSONDeep(i),s&&s.pause();let a=n.meta?n.meta.fields:null;if(a)i.forEach(c=>{!ff.isEmpty(c)&&!ff.isEmpty(c.__parsed_extra)&&delete c.__parsed_extra});else{let c=new Set;i.forEach(l=>{Object.keys(l).forEach(u=>c.add(u))}),a=[...c]}try{let c={schema:e.schema,table:e.table,action:e.action,data:i},l=await MW.callOperationFunctionAsAwait(FW,c,null);t.records+=l.records,t.number_written+=l.number_written,s&&s.resume()}catch(c){let l=Xt(c,eu(Nr.INSERT_CSV_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.INSERT_CSV_ERR+" - "+c);r(l)}}o(xW,"insertChunk");async function P_e(e){let t={records:0,number_written:0},r=BW(e.schema,e.table);try{let n=new gP,s=yi.createReadStream(e.file_path,{highWaterMark:PW});s.setEncoding("utf8"),await pP.parsePromise(s,UW.bind(null,e,n),EP.bind(null,r));let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);return s=yi.createReadStream(e.file_path,{highWaterMark:PW}),s.setEncoding("utf8"),await pP.parsePromise(s,xW.bind(null,e,t),EP.bind(null,r)),s.destroy(),t}catch(n){throw Xt(n,eu(Nr.PAPA_PARSE_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.PAPA_PARSE_ERR+n)}}o(P_e,"callPapaParse");function BW(e,t){let r=g_e[e][t].attributes,n=new Map;for(let s of r)s.type&&!s.computed&&!s.relationship&&n.set(s.name,i=>S_e(i,s));return n}o(BW,"createTransformMap");function EP(e,t,r){let n=e.get(r);return n?n(t):ff.autoCast(t)}o(EP,"typeFunction");async function L_e(e){let t={records:0,number_written:0},r=o(n=>{throw n},"throwErr");try{let n=new gP,s=bW([yi.createReadStream(e.file_path,{encoding:"utf-8"}),IW.withParser(),c=>c.value,new NW({batchSize:LW}),wW(async c=>{await UW(e,n,r,c)})]);await new Promise((c,l)=>{OW(s,u=>{u?l(u):c()}),s.resume()});let i=n.getPermsResponse();if(i)throw Xt(new Error,i,Xr.BAD_REQUEST);let a=bW([yi.createReadStream(e.file_path,{encoding:"utf-8"}),IW.withParser(),c=>c.value,new NW({batchSize:LW}),wW(async c=>{await xW(e,t,r,c)})]);return await new Promise((c,l)=>{OW(a,u=>{u?l(u):c()}),a.resume()}),t}catch(n){throw Xt(n,eu(Nr.INSERT_JSON_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.INSERT_JSON_ERR+n)}}o(L_e,"insertJson");async function FW(e){let t={};try{e.data&&e.data.length>0&&D_e(e.data[0])?t=await M_e(e.data,e.schema,e.table,e.action):(t.message="No records parsed from csv file.",mf.info(t.message))}catch(r){throw tu(r)}return t}o(FW,"callBulkFileLoad");function D_e(e){let t=Object.keys(e);for(let r of t)if(!T_e.test(r))throw new Error(`Invalid column name '${r}', cancelling load operation`);return!0}o(D_e,"validateColumnNames");async function M_e(e,t,r,n){n||(n="insert");let s={operation:n,schema:t,table:r,records:e},i;switch(n){case"insert":i=rR.insert;break;case"update":i=rR.update;break;case"upsert":i=rR.upsert;break;default:throw Xt(new Error,Nr.INVALID_ACTION_PARAM_ERR(n),Xr.BAD_REQUEST,Ri.LOG_LEVELS.ERROR,Nr.INVALID_ACTION_PARAM_ERR(n))}try{let a=await i(s),c;switch(n){case"insert":c=a.inserted_hashes;break;case"update":c=a.update_hashes;break;case"upsert":c=a.upserted_hashes;break;default:break}if(Array.isArray(a.skipped_hashes)&&a.skipped_hashes.length>0){let d=global.hdb_schema[t][r].hash_attribute,f=e.length;for(;f--;)a.skipped_hashes.indexOf(e[f][d])>=0&&e.splice(f,1)}let l=ff.isEmptyOrZeroLength(c)?0:c.length;return{records:e.length,number_written:l,new_attributes:a.new_attributes}}catch(a){throw tu(a)}}o(M_e,"bulkFileLoad");function HW(e,t){return`successfully loaded ${t} of ${e} records`}o(HW,"buildResponseMsg");function tu(e){return Xt(e,eu(Nr.DEFAULT_BULK_LOAD_ERR),Xr.INTERNAL_SERVER_ERROR,Ri.LOG_LEVELS.ERROR,Nr.DEFAULT_BULK_LOAD_ERR+" - "+e)}o(tu,"buildTopLevelErrMsg")});var AP=M((Vxe,zW)=>{"use strict";var yP=an(),v_e=uP(),{AsyncParser:U_e}=require("json2csv"),iR=require("stream"),ds=ie(),RP=require("fs-extra"),x_e=require("path"),Gs=Q(),{promisify:$W}=require("util"),qp=ie(),{handleHDBError:_r,hdbErrors:B_e}=ge(),{HDB_ERROR_MSGS:Hn,HTTP_STATUS_CODES:gr}=B_e,{streamAsJSON:F_e}=(bA(),v(vv)),{Upload:H_e}=require("@aws-sdk/lib-storage"),{toCsvStream:k_e}=(bo(),v(Vv)),GW=["search_by_value","search_by_hash","sql","search_by_conditions"],qW=["json","csv"],VW="json",KW="csv",G_e="Successfully exported JSON locally.",q_e="Successfully exported CSV locally.",$_e=1e3,V_e=yP.searchByHash,K_e=yP.searchByValue,Y_e=$W(iR.finished);zW.exports={export_to_s3:Q_e,export_local:W_e};async function W_e(e){Gs.trace(`export_local request to path: ${e.path}, filename: ${e.filename}, format: ${e.format}`);let t=YW(e);if(!ds.isEmpty(t))throw Gs.error(t),_r(new Error,t,gr.BAD_REQUEST,void 0,void 0,!0);if(ds.isEmpty(e.path))throw Gs.error(Hn.MISSING_VALUE("path")),_r(new Error,Hn.MISSING_VALUE("path"),gr.BAD_REQUEST,void 0,void 0,!0);let r=(ds.isEmpty(e.filename)?new Date().getTime():e.filename)+"."+e.format;e.path.endsWith(x_e.sep)&&(e.path=e.path.substring(0,e.path.length-1));let n=ds.buildFolderPath(e.path,r);await z_e(e.path);let s=await WW(e);return await j_e(n,e.format,s)}o(W_e,"export_local");async function z_e(e){if(Gs.trace("in confirmPath"),ds.isEmptyOrZeroLength(e))throw _r(new Error,`Invalid path: ${e}`,gr.BAD_REQUEST,void 0,void 0,!0);let t;try{t=await RP.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(z_e,"confirmPath");async function j_e(e,t,r){if(Gs.trace("in saveToLocal"),qp.isEmptyOrZeroLength(e))throw _r(new Error,Hn.INVALID_VALUE("file_path"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmptyOrZeroLength(t))throw _r(new Error,Hn.INVALID_VALUE("Source format"),gr.BAD_REQUEST,void 0,void 0,!0);if(qp.isEmpty(r))throw _r(new Error,Hn.NOT_FOUND("Data"),gr.BAD_REQUEST,void 0,void 0,!0);if(t===VW){let n=RP.createWriteStream(e);return F_e(r).pipe(n),await Y_e(n),{message:G_e,path:e}}else if(t===KW){let n=RP.createWriteStream(e),s=iR.Readable.from(r),i={},a=r.getColumns?.();a&&(i.fields=a.map(d=>({label:d,value:d})));let c={objectMode:!0};return await new U_e(i,c).fromInput(s).toOutput(n).promise(!1),{message:q_e,path:e}}throw _r(new Error,Hn.INVALID_VALUE("format"),gr.BAD_REQUEST)}o(j_e,"saveToLocal");async function Q_e(e){if(!e.s3||Object.keys(e.s3).length===0)throw _r(new Error,Hn.MISSING_VALUE("S3 object"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_access_key_id))throw _r(new Error,Hn.MISSING_VALUE("aws_access_key_id"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.aws_secret_access_key))throw _r(new Error,Hn.MISSING_VALUE("aws_secret_access_key"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.bucket))throw _r(new Error,Hn.MISSING_VALUE("bucket"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.key))throw _r(new Error,Hn.MISSING_VALUE("key"),gr.BAD_REQUEST);if(ds.isEmptyOrZeroLength(e.s3.region))throw _r(new Error,Hn.MISSING_VALUE("region"),gr.BAD_REQUEST);let t=YW(e);if(!ds.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 WW(e)}catch(l){throw Gs.error(l),l}let n,s=await v_e.getS3AuthObj(e.s3.aws_access_key_id,e.s3.aws_secret_access_key,e.s3.region),i,a=new iR.PassThrough;if(e.format===KW){i=e.s3.key+".csv";let l=k_e(r,r.getColumns?.());l.on("error",u=>{throw u}),l.pipe(a)}else if(e.format===VW){i=e.s3.key+".json";let l=new iR.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%$_e===0&&(l.push(d),d="")}d.length!==0&&l.push(d),l.push("]"),l.push(null)}else throw _r(new Error,Hn.INVALID_VALUE("format"),gr.BAD_REQUEST);return new H_e({client:s,params:{Bucket:e.s3.bucket,Key:i,Body:a}}).done()}o(Q_e,"export_to_s3");function YW(e){if(Gs.trace("in exportCoreValidation"),ds.isEmpty(e.format))return"format missing";if(qW.indexOf(e.format)<0)return`format invalid. must be one of the following values: ${qW.join(", ")}`;let t=e.search_operation.operation;if(ds.isEmpty(t))return"search_operation.operation missing";if(GW.indexOf(t)<0)return`searchOperation.operation must be one of the following values: ${GW.join(", ")}`}o(YW,"exportCoreValidation");async function WW(e){Gs.trace("in getRecords");let t,r;if(qp.isEmpty(e.search_operation)||qp.isEmptyOrZeroLength(e.search_operation.operation))throw _r(new Error,Hn.INVALID_VALUE("Search operation"),gr.BAD_REQUEST);switch(e.search_operation.operation){case"search_by_value":t=K_e;break;case"search_by_hash":t=V_e;break;case"search_by_conditions":t=yP.searchByConditions;break;case"sql":{let n=zT();t=$W(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(WW,"getRecords")});var QW=M((Yxe,jW)=>{"use strict";var bP=class{static{o(this,"SqlSearchObject")}constructor(t,r){this.operation="sql",this.sql=t,this.hdb_user=r}};jW.exports=bP});var ZW=M((zxe,XW)=>{"use strict";var J_e=(k(),v(W)),JW=require("moment"),X_e=require("uuid").v4,IP=class{static{o(this,"JobObject")}constructor(){this.id=X_e(),this.type=void 0,this.start_datetime=JW().valueOf(),this.created_datetime=JW().valueOf(),this.end_datetime=void 0,this.status=J_e.JOB_STATUS_ENUM.CREATED,this.message=void 0,this.user=void 0,this.request=void 0}};XW.exports=IP});var NP=M((Qxe,az)=>{"use strict";var Z_e=require("uuid").v4,sz=Mn(),iz=an(),ege=ci(),tge=zu(),rge=QW(),Dt=(k(),v(W)),nge=ZW(),sge=eS(),Ai=Q(),ige=im(),hf=ie(),{promisify:oge}=require("util"),ru=require("moment"),age=zT(),oR=cP(),ez=xI(),{deleteTransactionLogsBeforeValidator:cge}=PC(),{handleHDBError:tz,hdbErrors:lge,ClientError:uge}=ge(),{HTTP_STATUS_CODES:rz}=lge,nz=iz.searchByValue,dge=iz.searchByHash,fge=sz.insert,mge=oge(age.evaluateSQL),hge=sz.update;az.exports={addJob:_ge,updateJob:Sge,handleGetJob:pge,handleGetJobsByStartDate:Ege,getJobById:oz};async function pge(e){if(e.id===void 0)throw new uge("'id' is required");let t=await oz(e.id);return hf.isEmptyOrZeroLength(t)||(t[0]={...t[0]},t[0].request!==void 0&&delete t[0].request,delete t[0].__createdtime__,delete t[0].__updatedtime__),t}o(pge,"handleGetJob");async function Ege(e){try{let t=await gge(e);if(Ai.trace(`Searching for jobs from ${e.from_date} to ${e.to_date}`),t&&t.length>0)for(let r of t)r.start_datetime&&(r.start_datetime_converted=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 Ai.error(r),new Error(r)}}o(Ege,"handleGetJobsByStartDate");async function _ge(e){let t={message:"",error:"",success:!1,createdJob:void 0};if(!e||Object.keys(e).length===0||hf.isEmptyOrZeroLength(e.operation)){let d="job parameter is invalid";return Ai.info(d),t.error=d,t}if(!Dt.JOB_TYPE_ENUM[e.operation])return Ai.info(`invalid job type specified: ${e.operation}.`),t;let r=e.operation,n;switch(r){case Dt.OPERATIONS_ENUM.CSV_FILE_LOAD:n=oR.fileObject(e);break;case Dt.OPERATIONS_ENUM.CSV_URL_LOAD:n=oR.urlObject(e);break;case Dt.OPERATIONS_ENUM.CSV_DATA_LOAD:n=oR.dataObject(e);break;case Dt.OPERATIONS_ENUM.IMPORT_FROM_S3:n=oR.s3FileObject(e);break;case Dt.OPERATIONS_ENUM.DELETE_FILES_BEFORE:case Dt.OPERATIONS_ENUM.DELETE_RECORDS_BEFORE:n=ez(e,"date");break;case Dt.OPERATIONS_ENUM.DELETE_AUDIT_LOGS_BEFORE:n=ez(e,"timestamp");break;case Dt.OPERATIONS_ENUM.DELETE_TRANSACTION_LOGS_BEFORE:n=cge(e);break;case Dt.OPERATIONS_ENUM.RESTART_SERVICE:if(Dt.HDB_PROCESS_SERVICES[e.service]===void 0)throw tz(new Error,"Invalid service",rz.BAD_REQUEST,void 0,void 0,!0);break;default:break}if(n)throw tz(n,n.message,rz.BAD_REQUEST,void 0,void 0,!0);let s=new nge;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 ege(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",s.id,"id",["id"]),a;try{a=Array.from(await nz(i))}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}let c=Array.isArray(a)?a:Object.keys(a);if(c&&c.length>0){s.id=Z_e();try{a=await nz(i)}catch(d){let f=`There was an error inserting a new job: ${d}`;return Ai.error(f),t}if(c=Array.isArray(a)?a:Object.keys(a),c&&c.length>0)return Ai.error("Error creating a job, could not find a unique job id."),t}s.request=e;let l=new ige(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,"id",[s]),u;try{u=await fge(l)}catch(d){return Ai.error(`There was an error inserting a job for job type: ${e.operation} -- ${d}`),t.success=!1,t}if(u.inserted_hashes.length===0)t.message=`Had a problem creating a job with type ${s.operation} and id ${s.id}`;else{let d=`Created a job with type ${s.type} and id ${s.id}`;t.message=d,t.createdJob=s,t.success=!0,Ai.trace(d)}return t}o(_ge,"addJob");async function gge(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 rge(n,e.hdb_user);try{return await mge(s)}catch(i){throw Ai.error(`there was a problem searching for jobs from date ${e.from_date} to date ${e.to_date} ${i}`),new Error("there was an error searching for jobs. Please check the log for details.")}}o(gge,"getJobsInDateRange");async function oz(e){if(hf.isEmptyOrZeroLength(e))return hf.errorizeMessage("Invalid job ID specified.");let t=new tge(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e],["*"]);try{return await dge(t)}catch(r){let n=`There was an error searching for a job by id: ${e} ${r}`;return Ai.error(n),hf.errorizeMessage("there was an error searching for jobs. Please check the log for details.")}}o(oz,"getJobById");async function Sge(e){if(Object.keys(e).length===0)throw new Error("invalid job object passed to updateJob");if(hf.isEmptyOrZeroLength(e.id))throw new Error("invalid ID passed to updateJob");(e.status===Dt.JOB_STATUS_ENUM.COMPLETE||e.status===Dt.JOB_STATUS_ENUM.ERROR)&&(e.end_datetime=ru().valueOf());let t=new sge(Dt.SYSTEM_SCHEMA_NAME,Dt.SYSTEM_TABLE_NAMES.JOB_TABLE_NAME,[e]),r;return r=await hge(t),r}o(Sge,"updateJob")});var pz=M((Xxe,hz)=>{"use strict";var cz=ie(),wr=(k(),v(W)),Tge=require("moment"),aR=TP(),$p=Q(),lz=NP(),uz=AP(),dz=Tl(),fz=nt(),Rge=FT(),yge=sf(),{parentPort:Age,isMainThread:mz}=require("worker_threads"),{onMessageByType:bge}=nt(),wP=class{static{o(this,"RunnerMessage")}constructor(t,r){this.job=t,this.json=r}};async function Ige(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(cz.isEmptyOrZeroLength(e.json.operation))throw new Error("Invalid operation");if(cz.isEmptyOrZeroLength(e.job.id))throw new Error("Empty job id specified");switch(e.json.operation){case wr.JOB_TYPE_ENUM.csv_file_load:await so(e,aR.csvFileLoad);break;case wr.JOB_TYPE_ENUM.csv_url_load:await so(e,aR.csvURLLoad);break;case wr.JOB_TYPE_ENUM.csv_data_load:await so(e,aR.csvDataLoad);break;case wr.JOB_TYPE_ENUM.import_from_s3:await so(e,aR.importFromS3);break;case wr.JOB_TYPE_ENUM.empty_trash:break;case wr.JOB_TYPE_ENUM.export_local:await so(e,uz.export_local);break;case wr.JOB_TYPE_ENUM.export_to_s3:await so(e,uz.export_to_s3);break;case wr.JOB_TYPE_ENUM.delete_files_before:case wr.JOB_TYPE_ENUM.delete_records_before:await so(e,dz.deleteFilesBefore);break;case wr.JOB_TYPE_ENUM.delete_audit_logs_before:await so(e,dz.deleteAuditLogsBefore);break;case wr.JOB_TYPE_ENUM.delete_transaction_logs_before:await so(e,Rge.deleteTransactionLogsBefore);break;case wr.JOB_TYPE_ENUM.restart_service:return await so(e,yge.restartService),`Restarting ${e.json.service}`;break;default:return`Invalid operation ${e.json.operation} specified`}}o(Ige,"parseMessage");async function so(e,t){try{e.job.status=wr.JOB_STATUS_ENUM.IN_PROGRESS,e.job.start_datetime=Tge().valueOf(),await lz.updateJob(e.job),await Nge(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):$p.error(`There was an error running ${t.name} job with id ${e.job.id}`),$p.error(n),e.job.message=n,e.job.status=wr.JOB_STATUS_ENUM.ERROR;try{await lz.updateJob(e.job)}catch(s){throw $p.error(`Unable to update job with id ${e.job.id}`),s}throw r}}o(so,"runJob");async function Nge(e){$p.trace("launching job thread:",e),mz?fz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[wr.PROCESS_NAME_ENV_PROP]:`JOB-${e}`}}):Age.postMessage({type:wr.ITC_EVENT_TYPES.START_JOB,jobId:e})}o(Nge,"launchJobThread");mz&&bge(wr.ITC_EVENT_TYPES.START_JOB,async(e,t)=>{try{fz.startWorker("server/jobs/jobProcess.js",{autoRestart:!1,name:"job",env:{...process.env,[wr.PROCESS_NAME_ENV_PROP]:`JOB-${e.jobId}`}})}catch(r){$p.error(r)}});hz.exports={parseMessage:Ige,RunnerMessage:wP}});var _z=M((eBe,Ez)=>{"use strict";var wge=ie(),OP=oe(),hc=(k(),v(W)),Oge=Ct(),Cge=mr(),io=Q(),Pge=hP(),Lge=Ki();OP.initSync();Ez.exports={postOperationHandler:Mge,sendOperationTransaction:Vp};async function Vp(e,t,r,n){if(e.schema===hc.SYSTEM_SCHEMA_NAME)return;let s=Dge(e,t,r);s&&(io.trace(`sendOperationTransaction publishing to schema ${e.schema} following transaction:`,s),await Cge.publishToStream(`${Oge.SUBJECT_PREFIXES.TXN}.${e.schema}`,Lge.createNatsTableStreamName(e.schema,e.table),n,s))}o(Vp,"sendOperationTransaction");function Dge(e,t,r){if(wge.isEmptyOrZeroLength(t))return null;let n={operation:e.operation,schema:e.schema,table:e.table,__origin:r};return e.operation===hc.OPERATIONS_ENUM.DELETE?n.hash_values=t:n.records=e.records,n}o(Dge,"convertCRUDOperationToTransaction");async function Mge(e,t,r){if(!OP.get(hc.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=OP.get(hc.CONFIG_PARAMS.CLUSTERING_NODENAME),i=new Pge(t.txn_time,n,s);switch(e.operation){case hc.OPERATIONS_ENUM.INSERT:try{await Vp(e,t.inserted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for insert."),io.error(a)}break;case hc.OPERATIONS_ENUM.DELETE:try{await Vp(e,t.deleted_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for delete."),io.error(a)}break;case hc.OPERATIONS_ENUM.UPDATE:try{await Vp(e,t.update_hashes,i,r)}catch(a){io.error("There was an error calling clustering postOperationHandler for update."),io.error(a)}break;case hc.OPERATIONS_ENUM.UPSERT:try{await Vp(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(Mge,"postOperationHandler")});var J,gz=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 OC={};we(OC,{chooseOperation:()=>Bz,executeJob:()=>qs,getOperationFunction:()=>Fz,operation:()=>BP,processLocalTransaction:()=>xz});async function xz(e,t){try{if(e.body.operation!=="read_log"&&(zp.default.log_level===Kf.INFO||zp.default.log_level===Kf.DEBUG||zp.default.log_level===Kf.TRACE)){let{hdb_user:n,hdbAuthHeader:s,password:i,payload:a,...c}=e.body;gn.info(c)}}catch(n){gn.error(n)}let r=await vz.default.callOperationFunctionAsAwait(t,e.body,null);if(typeof r!="object"&&(r={message:r}),r instanceof Error)throw r;return xge[e.body.operation]&&Pz.default.setSchemaDataToGlobal(n=>{n&&gn.error(n)}),r}function Bz(e){let t;try{t=Fz(e)}catch(s){throw gn.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=uR.default.convertSQLToAST(s);if(e.parsed_sql_object=i,!e.bypass_auth){let a=uR.default.checkASTPermissions(e,i);if(a)throw gn.error(`${Sz.FORBIDDEN} from operation ${e.operation}`),gn.warn(`User '${e.hdb_user?.username}' is not permitted to ${e.operation}`),(0,$s.handleHDBError)(new Error,a,$s.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,void 0,!0)}}else if(!e.bypass_auth&&e.operation!==q.CREATE_AUTHENTICATION_TOKENS&&e.operation!==q.LOGIN&&e.operation!==q.LOGOUT){let s=n===void 0?r:n,i=e.search_operation?e.search_operation:e;i.hdb_user||(i.hdb_user=e.hdb_user);let a=Cz.default.verifyPerms(i,s);if(a)throw gn.error(`${Sz.FORBIDDEN} from operation ${e.operation}`),gn.warn(`User '${i.hdb_user?.username}' is not permitted to ${i.operation}`),(0,$s.handleHDBError)(new Error,a,$s.hdbErrors.HTTP_STATUS_CODES.FORBIDDEN,void 0,!1,!0)}}catch(s){throw(0,$s.handleHDBError)(s,"There was an error when trying to choose an operation path")}return r}function Fz(e){if(gn.trace(`getOperationFunction with operation: ${e.operation}`),Tz.has(e.operation))return Tz.get(e.operation);throw(0,$s.handleHDBError)(new Error,$s.hdbErrors.HDB_ERROR_MSGS.OP_NOT_FOUND(e.operation),$s.hdbErrors.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0)}function BP(e,t,r){e.hdb_user=t?.user,e.bypass_auth=!r;let n=Bz(e);return xz({body:e},n)}async function Bge(e){gn.trace("In serverUtils.catchup");let t=e.transaction,r=t.channel.split(":"),n=r[0],s=r[1];for(let i of t.transactions)try{i.schema=n,i.table=s,i[Jy]=!0;let a;switch(i.operation){case q.INSERT:a=await su.default.insert(i);break;case q.UPDATE:a=await su.default.update(i);break;case q.UPSERT:a=await su.default.upsert(i);break;case q.DELETE:a=await _f.default.deleteRecord(i);break;default:gn.warn("invalid operation in catchup");break}await Uz.transactToClusteringUtils.postOperationHandler(i,a,e)}catch(a){gn.info("Invalid operation in transaction"),gn.error(a)}}async function qs(e){(0,Mz.transformReq)(e);let t,r;try{if(r=await dR.default.addJob(e),r){t=r.createdJob,gn.info("addJob result",r);let n=new DP.default.RunnerMessage(t,e);return{message:await DP.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 gn.error(i),(0,$s.handleHDBError)(n,i)}}function Fge(){let e=new Map;return e.set(q.INSERT,new J(su.default.insert)),e.set(q.UPDATE,new J(su.default.update)),e.set(q.UPSERT,new J(su.default.upsert)),e.set(q.SEARCH_BY_CONDITIONS,new J(Ef.default.searchByConditions)),e.set(q.SEARCH_BY_HASH,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_ID,new J(Ef.default.searchByHash)),e.set(q.SEARCH_BY_VALUE,new J(Ef.default.searchByValue)),e.set(q.SEARCH,new J(vge)),e.set(q.SQL,new J(Uge)),e.set(q.CSV_DATA_LOAD,new J(qs,Kp.default.csvDataLoad)),e.set(q.CSV_FILE_LOAD,new J(qs,Kp.default.csvFileLoad)),e.set(q.CSV_URL_LOAD,new J(qs,Kp.default.csvURLLoad)),e.set(q.IMPORT_FROM_S3,new J(qs,Kp.default.importFromS3)),e.set(q.CREATE_SCHEMA,new J(bi.default.createSchema)),e.set(q.CREATE_DATABASE,new J(bi.default.createSchema)),e.set(q.CREATE_TABLE,new J(bi.default.createTable)),e.set(q.CREATE_ATTRIBUTE,new J(bi.default.createAttribute)),e.set(q.DROP_SCHEMA,new J(bi.default.dropSchema)),e.set(q.DROP_DATABASE,new J(bi.default.dropSchema)),e.set(q.DROP_TABLE,new J(bi.default.dropTable)),e.set(q.DROP_ATTRIBUTE,new J(bi.default.dropAttribute)),e.set(q.DESCRIBE_SCHEMA,new J(Yp.default.describeSchema)),e.set(q.DESCRIBE_DATABASE,new J(Yp.default.describeSchema)),e.set(q.DESCRIBE_TABLE,new J(Yp.default.describeTable)),e.set(q.DESCRIBE_ALL,new J(Yp.default.describeAll)),e.set(q.DELETE,new J(_f.default.deleteRecord)),e.set(q.ADD_USER,new J(pf.default.addUser)),e.set(q.ALTER_USER,new J(pf.default.alterUser)),e.set(q.DROP_USER,new J(pf.default.dropUser)),e.set(q.LIST_USERS,new J(pf.default.listUsersExternal)),e.set(q.LIST_ROLES,new J(Wp.default.listRoles)),e.set(q.ADD_ROLE,new J(Wp.default.addRole)),e.set(q.ALTER_ROLE,new J(Wp.default.alterRole)),e.set(q.DROP_ROLE,new J(Wp.default.dropRole)),e.set(q.USER_INFO,new J(pf.default.userInfo)),e.set(q.READ_LOG,new J(yz.default)),e.set(q.ADD_NODE,new J(Az.default)),e.set(q.UPDATE_NODE,new J(CP.default)),e.set(q.SET_NODE_REPLICATION,new J(CP.default)),e.set(q.REMOVE_NODE,new J(bz.default)),e.set(q.CONFIGURE_CLUSTER,new J(Iz.default)),e.set(q.PURGE_STREAM,new J(Nz.default)),e.set(q.SET_CONFIGURATION,new J(MP.default.setConfiguration)),e.set(q.CLUSTER_STATUS,new J(wz.default.clusterStatus)),e.set(q.CLUSTER_NETWORK,new J(Oz.default)),e.set(q.CLUSTER_SET_ROUTES,new J(cR.default.setRoutes)),e.set(q.CLUSTER_GET_ROUTES,new J(cR.default.getRoutes)),e.set(q.CLUSTER_DELETE_ROUTES,new J(cR.default.deleteRoutes)),e.set(q.EXPORT_TO_S3,new J(qs,PP.default.export_to_s3)),e.set(q.CREATE_CSR,new J(nu.default.createCsr)),e.set(q.SIGN_CERTIFICATE,new J(nu.default.signCertificate)),e.set(q.LIST_CERTIFICATES,new J(nu.default.listCertificates)),e.set(q.ADD_CERTIFICATES,new J(nu.default.addCertificate)),e.set(q.REMOVE_CERTIFICATE,new J(nu.default.removeCertificate)),e.set(q.GET_KEY,new J(nu.default.getKey)),e.set(q.ADD_NODE_BACK,new J(AO)),e.set(q.REMOVE_NODE_BACK,new J(bO)),e.set(q.DELETE_FILES_BEFORE,new J(qs,_f.default.deleteFilesBefore)),e.set(q.DELETE_RECORDS_BEFORE,new J(qs,_f.default.deleteFilesBefore)),e.set(q.EXPORT_LOCAL,new J(qs,PP.default.export_local)),e.set(q.SEARCH_JOBS_BY_START_DATE,new J(dR.default.handleGetJobsByStartDate)),e.set(q.GET_JOB,new J(dR.default.handleGetJob)),e.set(q.GET_FINGERPRINT,new J(lR.default.getFingerprint)),e.set(q.SET_LICENSE,new J(lR.default.setLicense)),e.set(q.GET_REGISTRATION_INFO,new J(lR.default.getRegistrationInfo)),e.set(q.RESTART,new J(LP.default.restart)),e.set(q.RESTART_SERVICE,new J(qs,LP.default.restartService)),e.set(q.CATCHUP,new J(Bge)),e.set(q.SYSTEM_INFORMATION,new J(Lz.default.systemInformation)),e.set(q.DELETE_AUDIT_LOGS_BEFORE,new J(qs,_f.default.deleteAuditLogsBefore)),e.set(q.READ_AUDIT_LOG,new J(Rz.default)),e.set(q.CREATE_AUTHENTICATION_TOKENS,new J(ew)),e.set(q.REFRESH_OPERATION_TOKEN,new J(tw)),e.set(q.LOGIN,new J(TC)),e.set(q.LOGOUT,new J(RC)),e.set(q.GET_CONFIGURATION,new J(MP.default.getConfiguration)),e.set(q.CUSTOM_FUNCTIONS_STATUS,new J(Mt.default.customFunctionsStatus)),e.set(q.GET_CUSTOM_FUNCTIONS,new J(Mt.default.getCustomFunctions)),e.set(q.GET_COMPONENT_FILE,new J(Mt.default.getComponentFile)),e.set(q.GET_COMPONENTS,new J(Mt.default.getComponents)),e.set(q.SET_COMPONENT_FILE,new J(Mt.default.setComponentFile)),e.set(q.DROP_COMPONENT,new J(Mt.default.dropComponent)),e.set(q.GET_CUSTOM_FUNCTION,new J(Mt.default.getCustomFunction)),e.set(q.SET_CUSTOM_FUNCTION,new J(Mt.default.setCustomFunction)),e.set(q.DROP_CUSTOM_FUNCTION,new J(Mt.default.dropCustomFunction)),e.set(q.ADD_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.addComponent)),e.set(q.ADD_COMPONENT,new J(Mt.default.addComponent)),e.set(q.DROP_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.dropCustomFunctionProject)),e.set(q.PACKAGE_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.packageComponent)),e.set(q.PACKAGE_COMPONENT,new J(Mt.default.packageComponent)),e.set(q.DEPLOY_CUSTOM_FUNCTION_PROJECT,new J(Mt.default.deployComponent)),e.set(q.DEPLOY_COMPONENT,new J(Mt.default.deployComponent)),e.set(q.READ_TRANSACTION_LOG,new J(vP.default.readTransactionLog)),e.set(q.DELETE_TRANSACTION_LOGS_BEFORE,new J(qs,vP.default.deleteTransactionLogsBefore)),e.set(q.INSTALL_NODE_MODULES,new J(UP.default.installModules)),e.set(q.AUDIT_NODE_MODULES,new J(UP.default.auditModules)),e.set(q.GET_BACKUP,new J(bi.default.getBackup)),e.set(q.CLEANUP_ORPHAN_BLOBS,new J(bi.default.cleanupOrphanBlobs)),e.set(q.ADD_SSH_KEY,new J(Mt.default.addSSHKey)),e.set(q.UPDATE_SSH_KEY,new J(Mt.default.updateSSHKey)),e.set(q.DELETE_SSH_KEY,new J(Mt.default.deleteSSHKey)),e.set(q.LIST_SSH_KEYS,new J(Mt.default.listSSHKeys)),e.set(q.SET_SSH_KNOWN_HOSTS,new J(Mt.default.setSSHKnownHosts)),e.set(q.GET_SSH_KNOWN_HOSTS,new J(Mt.default.getSSHKnownHosts)),e.set(q.GET_ANALYTICS,new J(DC)),e.set(q.LIST_METRICS,new J(MC)),e.set(q.DESCRIBE_METRIC,new J(vC)),e.set(q.GET_STATUS,new J(HC)),e.set(q.SET_STATUS,new J(kC)),e.set(q.CLEAR_STATUS,new J(FC)),e}var Ef,uR,Kp,bi,Yp,_f,Rz,pf,Wp,Mt,zp,yz,Az,CP,bz,Iz,Nz,wz,Oz,cR,PP,Cz,dR,$s,lR,LP,xP,su,Pz,Lz,DP,MP,vP,UP,Dz,Mz,nu,vz,Uz,Sz,gn,vge,Uge,xge,Tz,CC=ce(()=>{Ef=w(an()),uR=w(zT()),Kp=w(TP()),bi=w(Jh()),Yp=w(Fa()),_f=w(Tl()),Rz=w(Jw()),pf=w(ts()),Wp=w(Ih()),Mt=w(wC()),zp=w(Q()),yz=w(rO()),Az=w(np()),CP=w(CO()),bz=w(cp()),Iz=w(DO()),Nz=w(MO()),wz=w(cT()),Oz=w(BO()),cR=w(uT()),PP=w(AP()),Cz=w(YT()),dR=w(NP());k();$s=w(ge()),lR=w(QO()),LP=w(sf()),xP=w(require("util")),su=w(Mn()),Pz=w(Os()),Lz=w(qd()),DP=w(pz());Sd();PT();MP=w(It()),vP=w(FT()),UP=w(Ip()),Dz=w(ei()),Mz=w(ie());Dr();nu=w(os());Vd();xC();vz=w(lP()),Uz=w(_z());Up();gz();({HTTP_STATUS_CODES:Sz}=$s.hdbErrors),gn=zp.default.loggerWithTag("operation"),vge=xP.promisify(Ef.default.search),Uge=xP.promisify(uR.default.evaluateSQL),xge={[q.CREATE_ATTRIBUTE]:!0,[q.CREATE_TABLE]:!0,[q.CREATE_SCHEMA]:!0,[q.DROP_ATTRIBUTE]:!0,[q.DROP_TABLE]:!0,[q.DROP_SCHEMA]:!0};o(xz,"processLocalTransaction");Tz=Fge();Le.operation=BP;o(Bz,"chooseOperation");o(Fz,"getOperationFunction");(0,Dz._assignPackageExport)("operation",BP);o(BP,"operation");o(Bge,"catchup");o(qs,"executeJob");o(Fge,"initializeOperationFunctionMap")});var hR=M((aBe,Gz)=>{"use strict";var fR=(k(),v(W)),Hge=ie(),jp=Q(),{handleHDBError:FP,hdbErrors:mR}=ge(),{isMainThread:kge}=require("worker_threads"),{Readable:Gge}=require("stream"),Hz=require("os"),qge=require("util"),$ge=nw(),Vge=qge.promisify($ge.authorize),kz=(CC(),v(OC)),{createGzip:Kge,constants:Yge}=require("zlib"),Wge=[fR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS,fR.OPERATIONS_ENUM.LOGIN,fR.OPERATIONS_ENUM.LOGOUT];function zge(e){let t=`Found an uncaught exception with message: ${e.message}. ${Hz.EOL}Stack: ${e.stack} ${Hz.EOL}Terminating ${kge?"HDB":"thread"}.`;console.error(t),jp.fatal(t),process.exit(1)}o(zge,"handleServerUncaughtException");function jge(e,t,r){if(jp[e.logLevel||"error"](e),e.statusCode)return typeof e.http_resp_msg!="object"?r.code(e.statusCode).send({error:e.http_resp_msg||e.message}):r.code(e.statusCode).send(e.http_resp_msg);let n=e.statusCode?e.statusCode:mR.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(jge,"serverErrorHandler");function Qge(e,t,r){if(!e.body||Object.keys(e.body).length===0||typeof e.body!="object"){let n=FP(new Error,"Invalid JSON.",mR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}if(Hge.isEmpty(e.body.operation)){let n=FP(new Error,"Request body must include an 'operation' property.",mR.HTTP_STATUS_CODES.BAD_REQUEST);r(n,null)}r()}o(Qge,"reqBodyValidationHandler");function Jge(e,t,r){let n;!Wge.includes(e.body.operation)||e.body.operation===fR.OPERATIONS_ENUM.CREATE_AUTHENTICATION_TOKENS&&!e.body.username&&!e.body.password?Vge(e,t).then(i=>{n=i,e.body.hdb_user=n,r()}).catch(i=>{jp.warn(i),jp.warn(`{"ip":"${e.socket.remoteAddress}", "error":"${i.stack}"`);let a=typeof i=="string"?{error:i}:{error:i.message};r(FP(i,a,mR.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(Jge,"authHandler");async function Xge(e,t,r=!1){let n;try{e.body.bypass_auth&&delete e.body.bypass_auth,n=kz.chooseOperation(e.body);let s=await kz.processLocalTransaction(e,n);if(s instanceof Gge&&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(Kge({level:Yge.Z_BEST_SPEED})))}return s}catch(s){throw jp.error(s),s}}o(Xge,"handlePostRequest");Gz.exports={authHandler:Jge,handlePostRequest:Xge,handleServerUncaughtException:zge,serverErrorHandler:jge,reqBodyValidationHandler:Qge}});var Kz=M((lBe,Vz)=>{"use strict";var Zge=require("fastify-plugin"),{handlePostRequest:qz,authHandler:eSe,reqBodyValidationHandler:tSe}=hR();async function rSe(e){e.decorate("hdbCore",{preValidation:[tSe,eSe],request:o((t,r)=>$z(qz(t,r)),"request"),requestWithoutAuthentication:o((t,r)=>$z(qz(t,r,!0)),"requestWithoutAuthentication")})}o(rSe,"hdbCore");async function $z(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($z,"convertAsyncIterators");Vz.exports=Zge(rSe)});var Wz=M((fBe,Yz)=>{"use strict";var dBe=require("fs"),pR=oe();pR.initSync();var{CONFIG_PARAMS:HP}=(k(),v(W)),nSe=1024*1024*1024;function sSe(e){let t=pR.get(HP.HTTP_TIMEOUT),r=pR.get(HP.HTTP_KEEPALIVETIMEOUT);return{bodyLimit:nSe,connectionTimeout:t,keepAliveTimeout:r,return503OnClosing:!1,forceCloseConnections:!0,ignoreTrailingSlash:!0,maxParamLength:pR.get(HP.HTTP_MAXPARAMLENGTH)??1e3,https:e}}o(sSe,"getServerOptions");Yz.exports=sSe});var Qz=M((hBe,jz)=>{"use strict";var kP=oe();kP.initSync();var{CONFIG_PARAMS:zz}=(k(),v(W));function iSe(){let e=kP.get(zz.HTTP_CORSACCESSLIST),t=kP.get(zz.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(iSe,"getCORSOptions");jz.exports=iSe});var Zz=M((EBe,Xz)=>{"use strict";var Jz=oe();Jz.initSync();var oSe=(k(),v(W));function aSe(){return Jz.get(oSe.CONFIG_PARAMS.HTTP_HEADERSTIMEOUT)??6e4}o(aSe,"getHeaderTimeoutConfig");Xz.exports=aSe});var qP={};we(qP,{customFunctionsServer:()=>uSe,ready:()=>mj,start:()=>lSe});function lSe(e){let t=e.securePort>0;return{async handleFile(r,n,s,i){ta||(ta=fj(t),Le.http((await ta).server));let a=await ta,c=(0,GP.dirname)(s),l=(0,GP.dirname)(n);if(l.startsWith("/")&&(l=l.slice(1)),!ej.has(c)){ej.add(c);try{a.register(fSe(c,l))}catch(u){if(u.message==="Root plugin has already booted")yt.warn(`Could not load root fastify route for ${s}, this may require a restart to install properly`);else throw u}}},ready:mj}}async function uSe(){try{yt.info("In Custom Functions Fastify server"+process.cwd()),yt.info(`Custom Functions Running with NODE_ENV set as: ${process.env.NODE_ENV}`),yt.debug(`Custom Functions server process ${process.pid} starting up.`),await dSe();let e=oj.get(U.HTTP_SECUREPORT)>0,t;try{t=ta=await fj(e)}catch(r){throw yt.error(`Custom Functions buildServer error: ${r}`),r}try{await t.ready()}catch(r){throw yt.error(`Custom Functions server.ready() error: ${r}`),r}t.server.cantCleanupProperly=!0}catch(e){yt.error(`Custom Functions ${process.pid} Error: ${e}`),yt.error(e),process.exit(1)}}async function dSe(){try{yt.info("Custom Functions starting configuration."),await aj.setUsersWithRolesCache(),yt.info("Custom Functions completed configuration.")}catch(e){yt.error(e)}}function fSe(e,t){return async function(r){try{yt.info("Custom Functions starting buildRoutes"),yt.trace("Loading fastify routes folder "+e),(0,tj.existsSync)(e)&&r.register(ij.default,s=>({dir:e,dirNameRoutePrefix:!1,options:{hdbCore:s.hdbCore,logger:yt.loggerWithTag("custom-function"),prefix:`/${t}`}})).after((s,i,a)=>{s?.message?yt.error(s.message):s&&yt.error(s),a()})}catch(n){yt.error(`Custom Functions errored buildRoutes: ${n}`)}}}async function fj(e){yt.info("Custom Functions starting buildServer.");let t=(0,cj.default)(e),r=(0,rj.default)(t);r.server.headersTimeout=(0,uj.default)(),r.setErrorHandler(dj.serverErrorHandler);let n=(0,lj.default)();return n&&r.register(nj.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(sj.default),await r.register(cSe),await r.after(),mm(r),yt.info("Custom Functions completed buildServer."),r}function mj(){if(ta)return ta.then?ta.then(e=>e.ready()):ta.ready()}var GP,tj,rj,nj,sj,ij,oj,yt,cSe,aj,cj,lj,uj,dj,ta,ej,hj=ce(()=>{GP=require("path"),tj=require("fs"),rj=w(require("fastify")),nj=w(require("@fastify/cors")),sj=w(QN()),ij=w(require("@fastify/autoload")),oj=w(oe());k();yt=w(Q()),cSe=w(Kz()),aj=w(ts()),cj=w(Wz()),lj=w(Qz()),uj=w(Zz()),dj=w(hR());bo();Dr();ej=new Set;o(lSe,"start");o(uSe,"customFunctionsServer");o(dSe,"setUp");o(fSe,"buildRouteFolder");o(fj,"buildServer");o(mj,"ready")});var $P={};we($P,{start:()=>mSe});function mSe(e){return{handleDirectory(t,r){if(t==="/"){let n=(0,Sj.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){Ej||(Ej=!0,e.server.http(async(s,i)=>{if(!s.isWebSocket){let a=pj.get(s.pathname);if(a)return{handlesHeaders:!0,body:(0,_j.default)(s,(0,gj.realpathSync)(a))}}return i(s)},{runFirst:!0})),pj.set(r,n)}}}var _j,gj,Sj,pj,Ej,Tj=ce(()=>{_j=w(require("send")),gj=require("fs"),Sj=w(require("serve-static")),pj=new Map;o(mSe,"start")});var VP={};we(VP,{start:()=>hSe});function hSe({override:e}){return{handleFile:o((t,r,n)=>{ER.default.debug(`Loading env file: ${n}`);for(let[s,i]of Object.entries((0,Rj.parse)(t))){if(process.env[s]!==void 0)if(ER.default.warn(`Environment variable conflict: ${s} from ${n} is already set on process.env`),e)ER.default.debug(`override option enabled. overriding environment variable: ${s}`);else continue;process.env[s]=i}},"handleFile")}}var Rj,ER,yj=ce(()=>{Rj=require("dotenv"),ER=w(Q());o(hSe,"start")});var WP={};we(WP,{DataLoaderError:()=>fs,DataLoaderResult:()=>gf,EmptyFileError:()=>TR,FileParseError:()=>SR,InvalidPropertyTypeError:()=>RR,MissingRequiredPropertyError:()=>Qp,RecordProcessingError:()=>Jp,SystemDatabaseError:()=>yR,UnsupportedFileExtensionError:()=>gR,computeRecordHash:()=>YP,handleApplication:()=>_Se,loadDataFile:()=>Pj,suppressHandleApplicationWarning:()=>ESe});function YP(e){let t=Object.keys(e).sort(),r={};for(let s of t)r[s]=e[s];let n=JSON.stringify(r);return(0,bj.createHash)("sha256").update(n).digest("hex")}function Cj(e){return e.system&&e.system[KP]?e.system[KP]:_R||(_R=je({database:"system",table:KP,attributes:[{name:"id",type:"string",isPrimaryKey:!0},{name:"hash",type:"string"}]}),_R)}async function pSe(e,t,r,n){try{let s=Cj(n),i=e?`${e}:${t}:${r}`:`${t}:${r}`;return(await s.get(i))?.hash||null}catch(s){return Vs.error?.(`Failed to get stored hash: ${s.message}`),null}}async function Aj(e,t,r,n,s){try{let i=Cj(s),a=e?`${e}:${t}:${r}`:`${t}:${r}`;await i.put({id:a,hash:n})}catch(i){Vs.error?.(`Failed to store hash: ${i.message}`)}}function _Se(e){if((0,Nj.getWorkerIndex)()!==0){Vs.debug?.("Skipping data loader initialization on non-primary worker");return}e.handleEntry(t=>{t.entryType!=="file"||t.eventType==="unlink"||Pj(t,ln,He).then(r=>{Vs.debug?.("Data loader processed file: %s: %s",(0,ra.basename)(t.absolutePath),r.message)})})}async function Pj({contents:e,absolutePath:t,stats:r},n,s){let i=(0,ra.extname)(t)||"unknown",a;try{if(i===".yaml"||i===".yml")a=(0,Ij.parseDocument)(e.toString()).toJSON();else if(i===".json")a=JSON.parse(e.toString());else throw new gR(t,i)}catch(f){throw f instanceof fs?f:new SR(t,f)}if(!a)throw new TR(t);let{database:c,table:l,records:u}=a;if(!l)throw new Qp(t,"table");if(!u)throw new Qp(t,"records");if(!Array.isArray(u))throw new RR(t,"records","array");let d=c?`${c}.${l}`:l;if(c?.toLowerCase()==="system")throw new yR(c,l);try{let f;if(c&&s[c]&&s[c][l])Vs.debug?.(`Using existing table ${d} from database tables`),f=s[c][l];else if(n&&n[l])Vs.debug?.(`Using existing table ${d} from global tables`),f=n[l];else{Vs.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=YP(N);if(!O){h++;let $=await f.put(N);return await Aj(c,l,F,Z,s),$}let G=await pSe(c,l,F,s);if(!G)return _++,Promise.resolve({inserted:0,updated:0});let Y={};for(let $ of Object.keys(N))$ in O&&(Y[$]=O[$]);return YP(Y)!==G?(_++,Promise.resolve({inserted:0,updated:0})):Z!==G?(p++,await f.patch(F,N),await Aj(c,l,F,Z,s),{updated:1}):(_++,Promise.resolve({inserted:0,updated:0}))}catch(O){if(O instanceof fs)Vs.error?.(`Record processing error: ${O.message}`);else{let F=new Jp(d,O);Vs.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)`),Vs.info?.(R),new gf(t,c,l,"success",h+p,R)}else if(_>0){let R=`All ${_} records in ${d} already up-to-date`;return Vs.info?.(R),new gf(t,c,l,"skipped",m,R)}else{let R=`No records to process in ${d}`;return Vs.info?.(R),new gf(t,c,l,"success",0,R)}}catch(f){throw f instanceof fs?f:new Jp(d,f)}}var ra,bj,Ij,Nj,na,wj,Oj,Vs,KP,_R,ESe,fs,gR,SR,TR,Qp,RR,yR,Jp,gf,Lj=ce(()=>{ra=require("node:path"),bj=require("node:crypto"),Ij=require("yaml");Me();Nj=w(nt()),na=w(rn()),wj=w(ge()),Oj=w(Q()),Vs=Oj.default.forComponent("dataLoader"),KP="hdb_dataloader_hash";o(YP,"computeRecordHash");o(Cj,"getHashTrackingTable");o(pSe,"getStoredHash");o(Aj,"storeHash");ESe=!0;o(_Se,"handleApplication");o(Pj,"loadDataFile");fs=class extends wj.ClientError{static{o(this,"DataLoaderError")}constructor(t,r=na.HTTP_STATUS_CODES.BAD_REQUEST){super(t,r),this.name="DataLoaderError"}},gR=class extends fs{static{o(this,"UnsupportedFileExtensionError")}constructor(t,r){super(`Unsupported file extension in ${(0,ra.basename)(t)}: ${r}. Only YAML and JSON files are supported.`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="UnsupportedFileExtensionError"}},SR=class extends fs{static{o(this,"FileParseError")}constructor(t,r){super(`Failed to parse data file ${(0,ra.basename)(t)}: ${r.message}`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="FileParseError"}},TR=class extends fs{static{o(this,"EmptyFileError")}constructor(t){super(`Data file ${(0,ra.basename)(t)} is empty or invalid`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="EmptyFileError"}},Qp=class extends fs{static{o(this,"MissingRequiredPropertyError")}constructor(t,r){super(`Data file ${(0,ra.basename)(t)} is missing required "${r}" property`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="MissingRequiredPropertyError"}},RR=class extends fs{static{o(this,"InvalidPropertyTypeError")}constructor(t,r,n){super(`Data file ${(0,ra.basename)(t)} has invalid "${r}" property, expected ${n}`,na.HTTP_STATUS_CODES.BAD_REQUEST),this.name="InvalidPropertyTypeError"}},yR=class extends fs{static{o(this,"SystemDatabaseError")}constructor(t,r){super(`Cannot load data into system database: ${t}.${r}`,na.HTTP_STATUS_CODES.FORBIDDEN),this.name="SystemDatabaseError"}},Jp=class extends fs{static{o(this,"RecordProcessingError")}constructor(t,r){super(`Failed to process record in ${t}: ${r.message}`,na.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR),this.name="RecordProcessingError"}},gf=class{static{o(this,"DataLoaderResult")}#e;#t;#r;#n;#s;#i;constructor(t,r,n,s,i,a){this.#e=t,this.#t=r||"unknown",this.#r=n||"unknown",this.#n=s,this.#s=i,this.#i=a}get filePath(){return this.#e}get database(){return this.#t}get table(){return this.#r}get status(){return this.#n}get count(){return this.#s}get message(){return this.#i}toJSON(){return{filePath:this.#e,database:this.#t,table:this.#r,status:this.#n,count:this.#s,message:this.#i}}}});var jP=M((OBe,Dj)=>{"use strict";var Xp=oe();Xp.initSync();var Sf=require("fs-extra"),zP=require("path"),Tf=(k(),v(W)),gSe=require("crypto"),SSe=require("uuid").v4;Dj.exports=TSe;function TSe(){if(Xp.getHdbBasePath()!==void 0){let e=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PRIVATE_KEY_NAME),t=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PUBLIC_KEY_NAME),r=zP.join(Xp.getHdbBasePath(),Tf.LICENSE_KEY_DIR_NAME,Tf.JWT_ENUM.JWT_PASSPHRASE_NAME);try{Sf.accessSync(r),Sf.accessSync(e),Sf.accessSync(t)}catch(n){if(n.code==="ENOENT"){let s=SSe(),i=gSe.generateKeyPairSync("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:s}});Sf.writeFileSync(r,s),Sf.writeFileSync(e,i.privateKey),Sf.writeFileSync(t,i.publicKey)}else throw n}}}o(TSe,"checkJWTTokenExist")});var vj=M((PBe,Mj)=>{"use strict";var QP=class{static{o(this,"HdbInfoInsertObject")}constructor(t,r,n){this.info_id=t,this.data_version_num=r,this.hdb_version_num=n}};Mj.exports={HdbInfoInsertObject:QP}});var Bj=M((DBe,xj)=>{"use strict";var Uj=(k(),v(W)),JP=class{static{o(this,"UpgradeObject")}constructor(t,r){this[Uj.UPGRADE_JSON_FIELD_NAMES_ENUM.DATA_VERSION]=t,this[Uj.UPGRADE_JSON_FIELD_NAMES_ENUM.UPGRADE_VERSION]=r}};xj.exports={UpgradeObject:JP}});var AR=M((vBe,Hj)=>{"use strict";var Ks=require("prompt"),Rf=require("chalk"),Fj=Q(),Ii=require("os"),XP=Bc(),ZP=["yes","y"];async function RSe(e){let t=`${Ii.EOL}`+Rf.bold.green("Your current HarperDB version requires that we complete an update process.")+`${Ii.EOL}If a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}${Ii.EOL}You can read more about the changes in this upgrade at https://harperdb.io/developers/release-notes/${Ii.EOL}`;Ks.override=XP(["CONFIRM_UPGRADE"]),Ks.start(),Ks.message=t;let r={properties:{CONFIRM_UPGRADE:{description:Rf.magenta(`${Ii.EOL}[CONFIRM_UPGRADE] Do you want to upgrade your HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n;try{n=await Ks.get([r])}catch(s){return Fj.error("There was an error when prompting user about an upgrade."),Fj.error(s),!1}return ZP.includes(n.CONFIRM_UPGRADE)}o(RSe,"forceUpdatePrompt");async function ySe(e){let t=`${Ii.EOL}`+Rf.bold.green(`Your installed HarperDB version is older than the version used to create your data. Downgrading is not recommended as it is not tested and guaranteed to work. However, if you need to downgrade, and a backup of your data has not been created, we recommend you cancel this process and backup before proceeding.${Ii.EOL}`);Ks.override=XP(["CONFIRM_DOWNGRADE"]),Ks.start(),Ks.message=t;let r={properties:{CONFIRM_DOWNGRADE:{description:Rf.magenta(`${Ii.EOL}[CONFIRM_DOWNGRADE] Do you want to proceed with using your downgraded HDB instance now? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"no",required:!0}}},n=await Ks.get([r]);return ZP.includes(n.CONFIRM_DOWNGRADE)}o(ySe,"forceDowngradePrompt");async function ASe(){let e=`${Ii.EOL}`+Rf.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");Ks.override=XP(["GENERATE_CERTS"]),Ks.start(),Ks.message=e;let t={properties:{GENERATE_CERTS:{description:Rf.magenta(`${Ii.EOL}[GENERATE_CERTS] Do you want HarperDB to generate all new certificates? (yes/no)`),pattern:/y(es)?$|n(o)?$/,message:"Must respond 'yes' or 'no'",default:"yes",required:!0}}},r=await Ks.get([t]);return ZP.includes(r.GENERATE_CERTS)}o(ASe,"upgradeCertsPrompt");Hj.exports={forceUpdatePrompt:RSe,forceDowngradePrompt:ySe,upgradeCertsPrompt:ASe}});var tL=M((xBe,kj)=>{"use strict";var eL=class{static{o(this,"UpgradeDirective")}constructor(t){this.version=t,this.sync_functions=[],this.async_functions=[]}};kj.exports=eL});var qj=M((qBe,Gj)=>{"use strict";var bSe=ie(),ISe=It(),FBe=Q(),HBe=require("path"),kBe=require("fs"),GBe=(k(),v(W));Gj.exports={getOldPropsValue:NSe};function NSe(e,t,r=!1){let n=t.getRaw(e);return bSe.isNotEmptyAndHasValue(n)?n:r?ISe.getDefaultConfig(e):""}o(NSe,"getOldPropsValue")});var Yj=M((VBe,Kj)=>{"use strict";var pc=require("path"),Ec=require("fs-extra"),wSe=require("properties-reader"),OSe=tL(),Sr=Q(),{getOldPropsValue:At}=qj(),{HDB_SETTINGS_NAMES:ye,CONFIG_PARAMS:iu}=(k(),v(W)),ou=It(),bR=oe(),$j=ie(),oo=(k(),v(W)),rL=new OSe("3.1.0"),Vj=[];function CSe(){let e=wSe(bR.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
33
|
|
|
34
34
|
;The directory selected during install where the database files reside.
|
|
35
35
|
${ye.HDB_ROOT_KEY} = ${At(ye.HDB_ROOT_KEY,e)}
|
|
@@ -119,11 +119,11 @@ Reindexing upgrade started for transaction logs`),sa.notify("Reindexing upgrade
|
|
|
119
119
|
`;let l=[],u=AL.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)&&Es.logsAtLevel("info")&&Es.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(sye,"startupLog");function iye(e){try{return Number.parseInt(ua.readFileSync(e,"utf8"),10)}catch{return null}}o(iye,"readPidFile");function oye(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(oye,"isProcessRunning")});var J2={};we(J2,{SERVERS:()=>bf,portServer:()=>IL,setPortServerMap:()=>BR});function BR(e,t){let r=IL.get(e)??[];IL.set(e,[...r,t])}var bf,IL,NL=ce(()=>{bf={},IL=new Map;o(BR,"setPortServerMap")});var $R={};we($R,{deliverSocket:()=>uQ,getHttpOptions:()=>uye,getRequestId:()=>hQ,handleApplication:()=>lye,httpServer:()=>vL,logRequest:()=>dE,proxyRequest:()=>dye,registerServer:()=>DL,suppressHandleApplicationWarning:()=>cye});function lye(e){fE=e.options.getAll(),e.options.on("change",t=>{fE=e.options.getAll()})}function uye(){return fE}function uQ(e,t,r){let n=e?.read?e:new rQ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=bf[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=bf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(ma.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function dye(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=X2.get(s),r){case"connection":i=uQ(void 0,t),X2.set(s,i),i.write=(c,l,u)=>(HR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(HR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),HR.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 DL(e,t,r=!0){t||(t=Or.default.get(U.HTTP_PORT));let n=bf[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",tQ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else bf[t]=e;e.on("unhandled",tQ)}function ML(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=[],Or.default.get(U.HTTP_PORT)!=null&&t.push({port:Or.default.get(U.HTTP_PORT),secure:Or.default.get(U.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),Or.default.get(U.HTTP_SECUREPORT)!=null&&t.push({port:Or.default.get(U.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&Or.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:(0,nQ.resolvePath)(Or.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function vL(e,t){let r=[];for(let{port:n,secure:s}of ML(t))r.push(dQ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?PL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,DL(e,n,!1)),kR[n]=GR(PL,n);return r}function dQ(e,t,r,n){if(BR(e,{protocol_name:t?"HTTPS":"HTTP",name:VR()}),!FR[e]){let s=r?"operationsApi_network":"http",i=Or.default.get(s+"_keepAliveTimeout"),a=Or.default.get(s+"_timeout"),c=Or.default.get(s+"_headersTimeout"),l={keepAliveTimeout:i,headersTimeout:c,requestTimeout:a,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:Or.default.get(U.HTTP_MAXHEADERSIZE)},u=Or.default.get(s+"_mtls"),d=Or.default.get(s+"_mtls_required"),f;if(t){let g=Or.default.get("tls");f=Or.default.get(s+"_http2"),Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!d,requestCert:!!(u||n),ticketKeys:(0,sQ.getTicketKeys)(),SNICallback:(0,iQ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,oQ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ka(g,R);r&&(O.isOperationsServer=!0),fE.logging?.id&&(O.requestId=y=hQ());let F=await kR[e](O);if(!F){if(O._nodeResponse.statusCode){dE(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,FR[e].emit("unhandled",g,R)}let Z=F.status||200,G=performance.now(),Y=G-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Cs;K?K.length>=0?(typeof K=="string"?me.set("Content-Length",Buffer.byteLength(K)):me.set("Content-Length",K.length),$=!0):K instanceof ys&&(K.size?me.set("Content-Length",K.size):K.on&&(le=!0,K.on("size",De=>{R.headersSent||R.setHeader("Content-Length",De)})),K=K.stream()):(me.set("Content-Length","0"),$=!0);let Pe=`hdb;dur=${Y.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),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,se=O.method;if(it(Y,"duration",ue,se,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,se),Wr(1,"response_"+Z,ue,se),dE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=CL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=CL.Readable.from(K)),K?.pipe){K.pipe(R),K.destroy&&R.on("close",()=>{K.destroy()});let me=0;K.on("data",Pe=>{me+=Pe.length}),K.on("end",()=>{it(performance.now()-G,"transfer",ue,se),it(me,"bytes-sent",ue,se)})}else K?.then?K.then(me=>{R.end(me)},N):R.end(K)}catch(O){N(O)}function N(O){let F=O.headers,Z=O.statusCode||500;R.writeHead(Z,F&&(F[Symbol.iterator]?Array.from(F):F)),R.end(aye(O)),dE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?ma.default.warn(O):ma.default.info(O):ma.default.error(O)}o(N,"onError")},"requestHandler"),p=Dg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Or.default.get(s+"_requestQueueLimit")),_=FR[e]=(t?f?aQ.createSecureServer:cQ.createServer:qR.createServer)(l,(g,R)=>{let T=g.method;T==="GET"||T==="OPTIONS"||T==="HEAD"?h(g,R):p(g,R)});i>=0&&(_.keepAliveTimeout=i),c>=0&&(_.headersTimeout=c),t&&(_.ports||(_.ports=[]),_.ports.push(e),l.SNICallback.initialize(_),u&&(_.mtlsConfig=u),_.on("secureConnection",g=>{g._parent.startTime&&it(performance.now()-g._parent.startTime,"tls-handshake",e),it(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),DL(_,e)}return FR[e]}function GR(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 fye(e,t){vL(e,{requestOnly:!0,...t})}function mQ(e,t){for(let{port:r}of ML(t))Z2[t?.runFirst?"unshift":"push"]({listener:e,port:r}),LL[r]=GR(Z2,r)}function mye(e,t){let r=[];for(let{port:n,secure:s}of ML(t)){BR(n,{protocol_name:s?"WSS":"WS",name:VR()});let i=dQ(n,s,t?.isOperationsServer,t?.mtls);lE[n]||(lE[n]=new lQ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),lE[n].on("connection",(a,c)=>{try{let l=new Ka(c);l.isWebSocket=!0;let u=kR[n](l);ma.default.debug("Received WS connection, calling listeners",wL),eQ[n](a,l,u)}catch(l){ma.default.warn("Error in handling WS connection",l)}}),mQ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):lE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),lE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{LL[n]&&LL[n](a,c,l)})),r.push(i),wL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),eQ[n]=GR(wL,n),kR[n]=GR(PL,n)}return r}function tQ(e,t){t.writeHead(404),t.end(`Not found
|
|
123
|
-
`),dE(e,404,0,e.requestId)}function dE(e,t,r,n){let s=fE.logging;if(s){OL||(OL=ma.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";OL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+hye(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function hye(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function hQ(){return uE||(uE=new BigInt64Array([1n]),uE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",uE.buffer))),Number(Atomics.add(uE,0,1n))}var rQ,ma,HR,Or,nQ,sQ,iQ,oQ,aQ,cQ,qR,CL,lQ,aye,lE,FR,kR,PL,fE,cye,X2,Z2,LL,wL,eQ,OL,uE,UL=ce(()=>{rQ=require("node:net"),ma=w(Q()),HR=require("node:worker_threads"),Or=w(oe());k();nQ=w(It()),sQ=w(nt()),iQ=w(os()),oQ=w(Qd()),aQ=require("node:http2"),cQ=require("node:https"),qR=require("node:http");wh();hh();Wn();zi();CL=require("node:stream");Dr();NL();lf();_N();lQ=require("ws"),{errorToString:aye}=ma.default;Le.http=vL;Le.request=fye;Le.ws=mye;Le.upgrade=mQ;lE={},FR={},kR={},PL=[],fE={},cye=!0;o(lye,"handleApplication");o(uye,"getHttpOptions");o(uQ,"deliverSocket");X2=new Map;o(dye,"proxyRequest");o(DL,"registerServer");o(ML,"getPorts");o(vL,"httpServer");o(dQ,"getHTTPServer");o(GR,"makeCallbackChain");o(fQ,"unhandled");o(fye,"onRequest");Object.defineProperty(qR.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){}});Z2=[],LL={};o(mQ,"onUpgrade");wL=[],eQ={};o(mye,"onWebSocket");o(tQ,"defaultNotFound");o(dE,"logRequest");o(hye,"headersToString");o(hQ,"getRequestId")});var BL=M(hE=>{"use strict";fA();var{isMainThread:xL,parentPort:pQ,threadId:KR,workerData:pye}=require("node:worker_threads"),{createServer:Eye}=require("node:net"),{unlinkSync:gQ,existsSync:_ye}=require("fs"),SQ;hE.whenComponentsLoaded=new Promise(e=>{SQ=e});var wi=Q(),zs=oe(),_s=(k(),v(W)),{server:gye}=(Dr(),v(jf)),{createServer:Sye}=require("node:tls"),{restartNumber:Tye,getWorkerIndex:If}=nt(),{createReuseportFd:mE}=(wh(),v(EG)),{createTLSSelector:Rye}=os(),{resolvePath:yye}=It(),{startupLog:Aye}=j2(),{SERVERS:Nf,setPortServerMap:EQ,portServer:bye}=(NL(),v(J2)),_Q=(UL(),v($R)),Iye=ei(),TQ=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG),Nye=zs.get(_s.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);gye.socket=wye;if(TQ){let e;if(xL)e=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){wi.info("Could not close debugger",t)}});else{let t=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&If()>=0&&(e=t+If())}if(e){let t=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){wi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&xL)try{require("inspector").open(9229)}catch(e){Tye<=1&&wi.trace("Could not start debugging on port 9229, you may already be debugging:",e.message)}process.on("uncaughtException",e=>{e.isHandled||e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&wi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:LFe,CONFIG_PARAMS:DFe}=_s;zs.initSync();hE.globals=Iye;hE.listenOnPorts=yQ;hE.startServers=RQ;function RQ(){let e=zs.get(_s.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=YR().loadRootComponents(!0).then(()=>{pQ?.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===_s.ITC_EVENT_TYPES.SHUTDOWN){wi.trace("received shutdown request",KR);for(let c in Nf){let l=Nf[c],u;if(l.closeIdleConnections){let f=Object.getOwnPropertySymbols(l).find(p=>p.description.includes("connections")),m=0,h=setInterval(()=>{m++;let p=m>=100;if(!l[f]){p&&l.closeAllConnections?.(),clearInterval(h);return}let _=l[f][p?"all":"idle"]?.()||[];if(_.length===0){p&&clearInterval(h);return}m===1?wi.info(`Closing ${_.length} idle connections`):p&&wi.warn(`Forcefully closing ${_.length} active connections`);for(let g=0,R=_.length;g<R;g++){let T=_[g].socket;T._httpMessage&&!T._httpMessage.finished&&!p||(p?T.destroySoon():T.end(`HTTP/1.1 408 Request Timeout\r
|
|
122
|
+
`;console.log(n),Ae.get(Ue.LOGGING_STDSTREAMS)&&Es.logsAtLevel("info")&&Es.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(sye,"startupLog");function iye(e){try{return Number.parseInt(ua.readFileSync(e,"utf8"),10)}catch{return null}}o(iye,"readPidFile");function oye(e){try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}o(oye,"isProcessRunning")});var J2={};we(J2,{SERVERS:()=>bf,portServer:()=>IL,setPortServerMap:()=>BR});function BR(e,t){let r=IL.get(e)??[];IL.set(e,[...r,t])}var bf,IL,NL=ce(()=>{bf={},IL=new Map;o(BR,"setPortServerMap")});var $R={};we($R,{deliverSocket:()=>uQ,getHttpOptions:()=>uye,getRequestId:()=>hQ,handleApplication:()=>lye,httpServer:()=>vL,logRequest:()=>dE,proxyRequest:()=>dye,registerServer:()=>DL,suppressHandleApplicationWarning:()=>cye});function lye(e){fE=e.options.getAll(),e.options.on("change",t=>{fE=e.options.getAll()})}function uye(){return fE}function uQ(e,t,r){let n=e?.read?e:new rQ.Socket({fd:e,readable:!0,writable:!0,allowHalfOpen:!0}),s=bf[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=bf[t];c?(typeof c=="function"?c(n):c.emit("connection",n),r&&n.emit("data",r)):a<5?i(a+1):(ma.default.error(`Server on port ${t} was not registered`),n.destroy())},1e3)},"retry");i(1)}return n}function dye(e){let{port:t,event:r,data:n,requestId:s}=e,i;switch(i=X2.get(s),r){case"connection":i=uQ(void 0,t),X2.set(s,i),i.write=(c,l,u)=>(HR.parentPort.postMessage({requestId:s,event:"data",data:c.toString("latin1")}),u&&u(),!0),i.end=(c,l,u)=>(HR.parentPort.postMessage({requestId:s,event:"end",data:c?.toString("latin1")}),u&&u(),!0);let a=i.destroy;i.destroy=()=>{a.call(i),HR.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 DL(e,t,r=!0){t||(t=Or.default.get(U.HTTP_PORT));let n=bf[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",tQ),s.on("unhandled",(i,a)=>{e.cantCleanupProperly&&(n.cantCleanupProperly=!0),e.emit("request",i,a)}),n.lastServer=e}else bf[t]=e;e.on("unhandled",tQ)}function ML(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=[],Or.default.get(U.HTTP_PORT)!=null&&t.push({port:Or.default.get(U.HTTP_PORT),secure:Or.default.get(U.CUSTOMFUNCTIONS_NETWORK_HTTPS)}),Or.default.get(U.HTTP_SECUREPORT)!=null&&t.push({port:Or.default.get(U.HTTP_SECUREPORT),secure:!0})),e?.isOperationsServer&&Or.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&t.push({port:(0,nQ.resolvePath)(Or.default.get(U.OPERATIONSAPI_NETWORK_DOMAINSOCKET)),secure:!1}),t}function vL(e,t){let r=[];for(let{port:n,secure:s}of ML(t))r.push(dQ(n,s,t?.isOperationsServer,t?.mtls)),typeof e=="function"?PL[t?.runFirst?"unshift":"push"]({listener:e,port:t?.port||n}):(e.isSecure=s,DL(e,n,!1)),kR[n]=GR(PL,n);return r}function dQ(e,t,r,n){if(BR(e,{protocol_name:t?"HTTPS":"HTTP",name:VR()}),!FR[e]){let s=r?"operationsApi_network":"http",i=Or.default.get(s+"_keepAliveTimeout"),a=Or.default.get(s+"_timeout"),c=Or.default.get(s+"_headersTimeout"),l={keepAliveTimeout:i,headersTimeout:c,requestTimeout:a,highWaterMark:128*1024,noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600,maxHeaderSize:Or.default.get(U.HTTP_MAXHEADERSIZE)},u=Or.default.get(s+"_mtls"),d=Or.default.get(s+"_mtls_required"),f;if(t){let g=Or.default.get("tls");f=Or.default.get(s+"_http2"),Object.assign(l,{allowHTTP1:!0,rejectUnauthorized:!!d,requestCert:!!(u||n),ticketKeys:(0,sQ.getTicketKeys)(),SNICallback:(0,iQ.createTLSSelector)(r?"operations-api":"server",u),ciphers:g.ciphers??g[0]?.ciphers})}let m=(0,oQ.checkMemoryLimit)(),h=o(async(g,R)=>{let T=performance.now(),y=0;try{let O=new Ka(g,R);r&&(O.isOperationsServer=!0),fE.logging?.id&&(O.requestId=y=hQ());let F=await kR[e](O);if(!F){if(O._nodeResponse.statusCode){dE(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,FR[e].emit("unhandled",g,R)}let Z=F.status||200,G=performance.now(),Y=G-T,K=F.body,$,le=!1;if(!F.handlesHeaders){let me=F.headers||new Cs;K?K.length>=0?(typeof K=="string"?me.set("Content-Length",Buffer.byteLength(K)):me.set("Content-Length",K.length),$=!0):K instanceof ys&&(K.size?me.set("Content-Length",K.size):K.on&&(le=!0,K.on("size",De=>{R.headersSent||R.setHeader("Content-Length",De)})),K=K.stream()):(me.set("Content-Length","0"),$=!0);let Pe=`hdb;dur=${Y.toFixed(2)}`;if(F.wasCacheMiss&&(Pe+=", miss"),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,se=O.method;if(it(Y,"duration",ue,se,F.wasCacheMiss==null?void 0:F.wasCacheMiss?"cache-miss":"cache-hit"),Wr(Z<400,"success",ue,se),Wr(1,"response_"+Z,ue,se),dE(g,Z,y,Y),!$)if(K instanceof ReadableStream&&(K=CL.Readable.fromWeb(K)),(K[Symbol.iterator]||K[Symbol.asyncIterator])&&(K=CL.Readable.from(K)),K?.pipe){K.pipe(R),K.destroy&&R.on("close",()=>{K.destroy()});let me=0;K.on("data",Pe=>{me+=Pe.length}),K.on("end",()=>{it(performance.now()-G,"transfer",ue,se),it(me,"bytes-sent",ue,se)})}else K?.then?K.then(me=>{R.end(me)},N):R.end(K)}catch(O){N(O)}function N(O){let F=O.headers,Z=O.statusCode||500;R.writeHead(Z,F&&(F[Symbol.iterator]?Array.from(F):F)),R.end(aye(O)),dE(g,Z,y,performance.now()-T),O.statusCode?O.statusCode===500?ma.default.warn(O):ma.default.info(O):ma.default.error(O)}o(N,"onError")},"requestHandler"),p=Dg(h,(g,R)=>{R.statusCode=503,R.end("Service unavailable, exceeded request queue limit"),it(!0,"service-unavailable",e)},Or.default.get(s+"_requestQueueLimit")),_=FR[e]=(t?f?aQ.createSecureServer:cQ.createServer:qR.createServer)(l,(g,R)=>{let T=g.method;T==="GET"||T==="OPTIONS"||T==="HEAD"?h(g,R):p(g,R)});i>=0&&(_.keepAliveTimeout=i),c>=0&&(_.headersTimeout=c),t&&(_.ports||(_.ports=[]),_.ports.push(e),l.SNICallback.initialize(_),u&&(_.mtlsConfig=u),_.on("secureConnection",g=>{g._parent.startTime&&it(performance.now()-g._parent.startTime,"tls-handshake",e),it(g.isSessionReused(),"tls-reused",e)}),_.isSecure=!0),DL(_,e)}return FR[e]}function GR(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 fye(e,t){vL(e,{requestOnly:!0,...t})}function mQ(e,t){for(let{port:r}of ML(t))Z2[t?.runFirst?"unshift":"push"]({listener:e,port:r}),LL[r]=GR(Z2,r)}function mye(e,t){let r=[];for(let{port:n,secure:s}of ML(t)){BR(n,{protocol_name:s?"WSS":"WS",name:VR()});let i=dQ(n,s,t?.isOperationsServer,t?.mtls);lE[n]||(lE[n]=new lQ.WebSocketServer({noServer:!0,maxPayload:t.maxPayload??100*1024*1024}),lE[n].on("connection",(a,c)=>{try{let l=new Ka(c);l.isWebSocket=!0;let u=kR[n](l);ma.default.debug("Received WS connection, calling listeners",wL),eQ[n](a,l,u)}catch(l){ma.default.warn("Error in handling WS connection",l)}}),mQ((a,c,l,u)=>a.__harperdbRequestUpgraded?u(a,c,l):lE[n].handleUpgrade(a,c,l,d=>{a.__harperdbRequestUpgraded=!0,u(a,c,l),lE[n].emit("connection",d,a)}),{port:n}),i.on("upgrade",(a,c,l)=>{LL[n]&&LL[n](a,c,l)})),r.push(i),wL[t?.runFirst?"unshift":"push"]({listener:e,port:n}),eQ[n]=GR(wL,n),kR[n]=GR(PL,n)}return r}function tQ(e,t){t.headersSent||t.writableEnded||(t.writeHead(404),t.end(`Not found
|
|
123
|
+
`),dE(e,404,0,e.requestId))}function dE(e,t,r,n){let s=fE.logging;if(s){OL||(OL=ma.default.forComponent("http"));let i=t<400?"info":t===500?"error":"warn";OL[i]?.(`${e.method} ${e.url} ${e.socket.encrypted?"HTTPS":"HTTP"}/${e.httpVersion}${s.headers?" "+hye(e.headers):""} ${t}${s.timing&&n?" "+n.toFixed(2)+"ms":""}${r?" id: "+r:""}`)}}function hye(e){let t=[];for(let r in e)t.push(`${r}: ${e[r]}`);return t.join(", ")}function hQ(){return uE||(uE=new BigInt64Array([1n]),uE=new BigInt64Array(databases.system.hdb_analytics.primaryStore.getUserSharedBuffer("next-request-id",uE.buffer))),Number(Atomics.add(uE,0,1n))}var rQ,ma,HR,Or,nQ,sQ,iQ,oQ,aQ,cQ,qR,CL,lQ,aye,lE,FR,kR,PL,fE,cye,X2,Z2,LL,wL,eQ,OL,uE,UL=ce(()=>{rQ=require("node:net"),ma=w(Q()),HR=require("node:worker_threads"),Or=w(oe());k();nQ=w(It()),sQ=w(nt()),iQ=w(os()),oQ=w(Qd()),aQ=require("node:http2"),cQ=require("node:https"),qR=require("node:http");wh();hh();Wn();zi();CL=require("node:stream");Dr();NL();lf();_N();lQ=require("ws"),{errorToString:aye}=ma.default;Le.http=vL;Le.request=fye;Le.ws=mye;Le.upgrade=mQ;lE={},FR={},kR={},PL=[],fE={},cye=!0;o(lye,"handleApplication");o(uye,"getHttpOptions");o(uQ,"deliverSocket");X2=new Map;o(dye,"proxyRequest");o(DL,"registerServer");o(ML,"getPorts");o(vL,"httpServer");o(dQ,"getHTTPServer");o(GR,"makeCallbackChain");o(fQ,"unhandled");o(fye,"onRequest");Object.defineProperty(qR.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){}});Z2=[],LL={};o(mQ,"onUpgrade");wL=[],eQ={};o(mye,"onWebSocket");o(tQ,"defaultNotFound");o(dE,"logRequest");o(hye,"headersToString");o(hQ,"getRequestId")});var BL=M(hE=>{"use strict";fA();var{isMainThread:xL,parentPort:pQ,threadId:KR,workerData:pye}=require("node:worker_threads"),{createServer:Eye}=require("node:net"),{unlinkSync:gQ,existsSync:_ye}=require("fs"),SQ;hE.whenComponentsLoaded=new Promise(e=>{SQ=e});var wi=Q(),zs=oe(),_s=(k(),v(W)),{server:gye}=(Dr(),v(jf)),{createServer:Sye}=require("node:tls"),{restartNumber:Tye,getWorkerIndex:If}=nt(),{createReuseportFd:mE}=(wh(),v(EG)),{createTLSSelector:Rye}=os(),{resolvePath:yye}=It(),{startupLog:Aye}=j2(),{SERVERS:Nf,setPortServerMap:EQ,portServer:bye}=(NL(),v(J2)),_Q=(UL(),v($R)),Iye=ei(),TQ=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG),Nye=zs.get(_s.CONFIG_PARAMS.HTTP_SESSIONAFFINITY);gye.socket=wye;if(TQ){let e;if(xL)e=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_PORT)??9229,process.on(["SIGINT","SIGTERM","SIGQUIT","exit"],()=>{try{require("inspector").close()}catch(t){wi.info("Could not close debugger",t)}});else{let t=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);t&&If()>=0&&(e=t+If())}if(e){let t=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_HOST),r=zs.get(_s.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);try{require("inspector").open(e,t,r)}catch(n){wi.trace(`Could not start debugging on port ${e}, you may already be debugging:`,n.message)}}}else if(process.env.DEV_MODE&&xL)try{require("inspector").open(9229)}catch(e){Tye<=1&&wi.trace("Could not start debugging on port 9229, you may already be debugging:",e.message)}process.on("uncaughtException",e=>{e.isHandled||e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&wi.error("uncaughtException",e)});var{HDB_SETTINGS_NAMES:LFe,CONFIG_PARAMS:DFe}=_s;zs.initSync();hE.globals=Iye;hE.listenOnPorts=yQ;hE.startServers=RQ;function RQ(){let e=zs.get(_s.CONFIG_PARAMS.ROOTPATH);if(e)try{process.chdir(e)}catch{}let t=YR().loadRootComponents(!0).then(()=>{pQ?.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===_s.ITC_EVENT_TYPES.SHUTDOWN){wi.trace("received shutdown request",KR);for(let c in Nf){let l=Nf[c],u;if(l.closeIdleConnections){let f=Object.getOwnPropertySymbols(l).find(p=>p.description.includes("connections")),m=0,h=setInterval(()=>{m++;let p=m>=100;if(!l[f]){p&&l.closeAllConnections?.(),clearInterval(h);return}let _=l[f][p?"all":"idle"]?.()||[];if(_.length===0){p&&clearInterval(h);return}m===1?wi.info(`Closing ${_.length} idle connections`):p&&wi.warn(`Forcefully closing ${_.length} active connections`);for(let g=0,R=_.length;g<R;g++){let T=_[g].socket;T._httpMessage&&!T._httpMessage.finished&&!p||(p?T.destroySoon():T.end(`HTTP/1.1 408 Request Timeout\r
|
|
124
124
|
Connection: close\r
|
|
125
125
|
\r
|
|
126
|
-
`))}},25).unref()}l.close?.(()=>{if(zs.get(_s.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&If()==0)try{gQ(yye(zs.get(_s.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,KR),l.cantCleanupProperly||wi.warn("Had to forcefully exit the thread",KR),process.exit(0)},5e3).unref()})}if(TQ||process.env.DEV_MODE)try{require("inspector").close()}catch(c){wi.info("Could not close debugger",c)}}}).ref();let r;mE&&!Nye&&(r=yQ()),Promise.resolve(r).then(()=>{if(If()===0)try{Aye(bye)}catch(n){console.error("Error displaying start-up log",n)}pQ?.postMessage({type:_s.ITC_EVENT_TYPES.CHILD_STARTED})})});return SQ(t),t}o(RQ,"startServers");function yQ(){let e=[];for(let t in Nf){let r=Nf[t];if(t.includes?.("/")&&If()==0){_ye(t)&&gQ(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=zs.get(_s.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let a=typeof s=="string"?s.split("-"):s,c=If();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?mE?n={fd:mE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:mE?n={fd:mE(+t,"::")}:n={port:t}}catch(a){console.error(`Unable to bind to port ${t}`,a);continue}e.push(new Promise((a,c)=>{r.listen(n,()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.trace("Listening on port "+t,KR)}).on("error",c)}))}return Promise.all(e)}o(yQ,"listenOnPorts");!xL&&!pye?.noServerStart&&RQ();function wye(e,t){let r=(lf(),v(Op)).getComponentName,n;if(t.securePort){EQ(t.securePort,{protocol_name:"TLS",name:r()});let s=Rye("server",t.mtls),i=zs.get("tls");n=Sye({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),Nf[t.securePort]=n}return t.port&&(EQ(t.port,{protocol_name:"TCP",name:r()}),n=Eye(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Nf[t.port]=n),n}o(wye,"onSocket")});var Q2={};we(Q2,{startHTTPThreads:()=>Cye,startSocketServer:()=>qL,updateWorkerIdleness:()=>LQ});async function Cye(e=2,t){mN().catch(r=>Lf.error?.("Error recording hostname for analytics:",r));try{if(t)kL(0,1,!0);else{let{loadRootComponents:r}=YR();if(e===0)return(0,js.setMainIsWorker)(!0),await BL().startServers(),Promise.resolve([]);await r()}PQ();for(let r=0;r<e;r++)kL(r,e);return Promise.all(CQ)}finally{(0,js.threadsHaveStarted)()}}function PQ(){let e=(0,NQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),HL=setInterval(()=>{Lf.notify(e)},Oye).unref())}function kL(e,t=1,r){if(FL++,(0,js.startWorker)("server/threads/threadServer.js",{name:eA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===Qy.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});CQ.push(s),await s,wf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=zR.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=wf.indexOf(n);a>-1&&wf.splice(a,1)}if(o(i,"removeWorker"),Of){let a=Of;Of=[];for(let c of a)OQ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{GL?GL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,js.shutdownWorkers)(),FL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function qL(e=0,t){if(typeof e=="string")try{(0,jR.existsSync)(e)&&(0,jR.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=Pye:r=Lye(t):r=$L;let n=(0,Cf.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=OQ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),GL=!0,r(i,(a,c)=>{if(!a){if(AQ){let u=i._socket||new Cf.Socket({handle:i,writable:!0,readable:!0});AQ.deliverSocket(u,e,c),u.resume()}else FL>0?(Of.length===0&&setTimeout(()=>{Of.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,Of.push(i)):(console.log("start up a dynamic thread to handle request"),kL(0));it(!1,"socket-routed");return}a.requests++;let l=i.fd;if(l>=0)a.postMessage({port:e,fd:l,data:c});else{let u=i._socket||new Cf.Socket({handle:i,writable:!0,readable:!0});vye(u,a,e)}it(!0,"socket-routed")})},Lf.info(`HarperDB ${wQ.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 $L(e,t){let r,n=0;for(let s of wf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=WR)return WR=i,t(r);n=i}WR=0,t(r)}function Pye(e,t){let r={};e.getpeername(r);let n=r.address,s=Pf.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);$L(e,a=>{Pf.set(n,{worker:a,lastUsed:i}),t(a)})}function Lye(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Cf.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=Pf.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);$L(n,f=>{Pf.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function LQ(){WR=0;for(let e of wf)e.expectedIdle=e.recentELU.idle+Dye,e.requests=1;wf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function vye(e,t,r){let n=Mye++;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(),zR.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")),zR.delete(n)),s.event=="destroy"&&(e.destroy(),zR.delete(n))})}var js,Cf,Lf,jR,IQ,NQ,wQ,wf,Of,OQ,AQ,FL,CQ,HL,Oye,GL,WR,bQ,Pf,Dye,zR,Mye,bL=ce(()=>{js=w(nt()),Cf=require("net");k();Lf=w(Q()),jR=require("fs");zi();IQ=require("worker_threads"),NQ=w(Qd()),wQ=w(bt()),wf=[],Of=[],OQ=[],FL=0,CQ=[];IQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,js.onMessageFromWorkers)(e=>{e.type===Zy.RESTART&&HL&&(clearInterval(HL),PQ())}));Oye=6e5;o(Cye,"startHTTPThreads");o(PQ,"licenseWarning");o(kL,"startHTTPWorker");o(qL,"startSocketServer");WR=0;o($L,"findMostIdleWorker");bQ=36e5,Pf=new Map;o(Pye,"findByRemoteAddressAffinity");o(Lye,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Pf)r.lastUsed+bQ<e&&Pf.delete(t)},bQ).unref();Dye=1e3;o(LQ,"updateWorkerIdleness");(0,js.setMonitorListener)(LQ);zR=new Map,Mye=1;o(vye,"proxySocket")});var VL={};we(VL,{hdbServer:()=>Fye,start:()=>Fye});async function Fye(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=DQ.default.isMaster,await Hye();let t=e.securePort>0;Df=kye(t),await Df.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Df.server,e),Df.server.closeIdleConnections||await Df.listen({port:0,host:"::"})}catch(r){throw Df.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 Hye(){fo.default.trace("Configuring HarperDB process."),kQ.default.setSchemaDataToGlobal(),await qQ.default.setUsersWithRolesCache(),await $Q.default.getLicense()}function kye(e){fo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Gye(e),r=(0,MQ.default)(t);r.server.headersTimeout=$ye(),r.setErrorHandler(bc.serverErrorHandler);let n=qye();n&&r.register(vQ.default,n),r.register(function(i,a,c){i.setNotFoundHandler(function(l,u){r.server.emit("unhandled",l.raw,u.raw)}),c()}),r.register(BQ.default),r.register(UQ.default),r.register(xQ.default,{root:FQ.default.join(HQ.PACKAGE_ROOT,"studio/build-local")}),mm(r);let s=Ac.default.get(jy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!GQ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[bc.reqBodyValidationHandler,bc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,bc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),fo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function Gye(e){let t=Ac.default.get(pE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ac.default.get(pE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:xye,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function qye(){let e=Ac.default.get(pE.OPERATIONSAPI_NETWORK_CORS),t=Ac.default.get(pE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===Bye)&&(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 $ye(){return Ac.default.get(pE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Uye}var DQ,Ac,fo,MQ,vQ,UQ,xQ,BQ,FQ,HQ,kQ,GQ,qQ,$Q,bc,Uye,xye,Bye,pE,Df,VQ=ce(()=>{DQ=w(require("cluster")),Ac=w(oe());k();fo=w(Q()),MQ=w(require("fastify")),vQ=w(require("@fastify/cors")),UQ=w(require("@fastify/compress")),xQ=w(require("@fastify/static")),BQ=w(QN()),FQ=w(require("path")),HQ=w(bt()),kQ=w(Os()),GQ=w(ie()),qQ=w(ts()),$Q=w(Qd());Dr();bc=w(hR());bo();Ac.default.initSync();Uye=6e4,xye=1024*1024*1024,Bye="TRUE",{CONFIG_PARAMS:pE}=W;o(Fye,"operationsServer");o(Hye,"setUp");o(kye,"buildServer");o(Gye,"getServerOptions");o(qye,"getCORSOpts");o($ye,"getHeaderTimeoutConfig")});var QL={};we(QL,{disableNATS:()=>Kye,publishToStream:()=>XR,setNATSReplicator:()=>KL,setPublishToStream:()=>Yye,setSubscription:()=>jL,start:()=>Vye});function Vye(){EE.default.get(U.CLUSTERING_ENABLED)&&zye()}function Kye(e=!0){jQ=e}function Yye(e,t){XR=e,jL=t}function zye(){if(jQ||process.env._DISABLE_NATS)return;let e=st(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];KL(s,r,i)}}wl((r,n)=>{KL(r.tableName,r.databaseName,r),n&&JQ(r)}),!KQ&&(KQ=!0)}function KL(e,t,r){if(t==="system"&&jye.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){JQ(i)}static subscribe(){let i=new Yn;return jL(t,e,i),i}static subscribeOnThisThread(i){return i<(EE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Wye)}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 QR(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=QQ;return i}o(n,"getNATSTransaction")}function JQ(e){let t=EE.default.get(U.CLUSTERING_NODENAME);XR(`${WL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,zL.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 YQ,WL,zL,WQ,zQ,EE,JR,jQ,XR,jL,Wye,QQ,KQ,jye,QR,YL,XQ=ce(()=>{Me();Ma();YQ=w(mr()),WL=w(Ct()),zL=w(Ki());bu();WQ=w(fw()),zQ=w(bn()),EE=w(oe());k();JR=w(Q());o(Vye,"start");o(Kye,"disableNATS");XR=YQ.publishToStream,jL=WQ.setSubscription;o(Yye,"setPublishToStream");Wye=2;o(zye,"assignReplicationSource");jye=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(KL,"setNATSReplicator");o(JQ,"publishSchema");QR=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=EE.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||(JR.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(XR(`${WL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,zL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw JR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},YL=class extends QR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,zQ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};QQ=new YL});async function n4({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await JL.get(e,{returnNonexistent:!0});i=new eD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await JL.get(e);a&&a.delete()}i=new ey(e,t)}return n&&(n.id=e,n.user={username:t?.username},_E.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function XL(){return ZR++,ZR>65500&&(ZR=1),ZR}function ZL(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=Is.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 Ht(r,()=>s?t===void 0?c.delete(a,r):c.put(a,e.data,r):c.publish(a,e.data,r))}var e4,Ic,t4,r4,ZQ,JL,_E,ZR,ey,eD,s4=ce(()=>{Me();Gu();e4=w(bn()),Ic=w(Q());Gc();t4=w(nt()),r4=w(BL());Dr();x_();ZQ=100,JL=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"}]}}]}),_E=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,t4.getWorkerIndex)()===0&&(async()=>{await r4.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of _E.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await ZL(r,t,r)}catch{(0,Ic.warn)("Failed to publish will",t)}_E.delete(e.id)}})();o(n4,"getSession");ZR=1;o(XL,"getNextMessageId");ey=class{static{o(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:a}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(T=>T.topic===s),f;d?(f=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):f=i===2;let m={search:l,async:!0,user:this.user,startTime:a,omitCurrent:f,target:"",checkPermission:this.user?.role?.permission??{}};a&&(0,Ic.trace)("Resuming subscription from",s,"from",a);let h=Is.getMatch(u,"mqtt");if(!h){let T=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw T.statusCode=404,T}m.url=h.relativeURL;let p;if(m.url.indexOf("+")>-1||(p=m.url.indexOf("#"))>-1){let T=m.url.slice(1);if(p--,p>-1&&p!==T.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(m.isCollection=!0,T.indexOf("+")===T.length-1)m.onlyChildren=!0,m.url="/"+T.slice(0,T.length-1);else{let y=T.split("/"),N;for(let Z=0;Z<y.length;Z++)if(y[Z].indexOf("+")>-1)if(y[Z]==="+")N=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&N)throw new Error("Filters can not be combined");let O=!0;y[y.length-1]==="#"&&(y.length--,O=!1),N&&(n=o(Z=>{let G=Z.id;if(!Array.isArray(G))if(G?.indexOf?.("/")>-1)G=G.split("/");else return!1;if(O&&G.length!==y.length)return!1;for(let Y=0;Y<y.length;Y++)if(y[Y]!=="+"&&y[Y]!==G[Y])return!1;return!0},"filter"));let F=y.indexOf("+");m.url="/"+(F>-1?y.slice(0,F):y).concat("").join("/")}}else m.isCollection=!1;let _=h.path,g=h.Resource,R=await Ht(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=XL());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>ZQ?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-ZQ)):await new Promise(setImmediate)}catch(F){(0,Ic.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=XL();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 ZL(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();Ht(r,async()=>{try{if(!t){let n=await _E.get(this.sessionId);n?.doesExist()&&await ZL(n,n.data,r)}}finally{await _E.delete(this.sessionId)}}).catch(n=>{(0,Ic.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};o(ZL,"publish");eD=class extends ey{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=XL(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,Ic.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,e4.getNextMonotonicTime)()),(0,Ic.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),JL.put(this.sessionRecord)}}});var tD={};we(tD,{bypassAuth:()=>Qye,start:()=>Xye});function Qye(){d4=!0}function Xye({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new u4.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),or.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=o4(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{or.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),or.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ry.notify?.({username:d?.username,status:Zs.SUCCESS,type:Aa.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ry.error?.({username:h,status:Zs.FAILURE,type:Aa.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else or.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),or.error?.(h)}else if(l.required)return or.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Jye(u.remoteAddress)&&(d=await(0,a4.getSuperUser)(),or.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=o4(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{or.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function o4(e,t,r,n,s){i4||(i4=!0,fh(f=>{ty>0&&f.push({metric:"mqtt-connections",connections:ty,byThread:!0})}));let i;ty++;let a,c={protocolVersion:4},l=(0,ny.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){ty--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),or.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),or.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){or.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let h=f.topic,p=h?.indexOf("/",1),_=p>0?h.slice(0,p):h;it(f.length,"bytes-received",_,R(f),"mqtt");try{switch(a?.receivedPacket?.(),m){case"connect":if(c.protocolVersion=f.protocolVersion,f.username)try{n=await Le.getUser(f.username,f.password.toString(),r),(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ry.notify?.({username:n?.username,status:Zs.SUCCESS,type:Aa.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ry.error?.({username:f.username,status:Zs.FAILURE,type:Aa.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=Ao(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?K(f.will.payload):void 0,delete f.will.payload}a=n4({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return or.error?.(K),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:K.code||5,returnCode:K.code||128})}s.events.emit("connected",a,e),Wr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(K,$,le,ue)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",K);let se=K.indexOf("/",1),me=se>0?K.slice(0,se):K;g({cmd:"publish",topic:K,payload:await T($),messageId:le||Math.floor(Math.random()*1e8),qos:ue.qos},me);let Pe=e._socket??e;return Pe.writableNeedDrain?new Promise(De=>Pe.once("drain",De)):!Pe.closed}catch(se){return or.error?.(se),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let N=[];for(let K of f.subscriptions){let $;try{let le=await a.addSubscription(K,K.qos>=1);$=le?le.qos||0:c.protocolVersion<5?128:143}catch(le){s.events.emit("error",le,e,K,a),le.statusCode?le.statusCode===500?or.warn?.(le):or.info?.(le):or.error?.(le),$=c.protocolVersion<5?128:le.statusCode===403?135:le.statusCode===404?143:128}N.push($)}await a.committed,g({cmd:"suback",granted:N,messageId:f.messageId});break;case"unsubscribe":{let K=[];for(let $ of f.unsubscriptions)K.push(a.removeSubscription($)?0:17);g({cmd:"unsuback",granted:K,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let O=f.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=Ao(r?.headers.get?.("content-type"))),G=(f.payload?.length||0)>0?F(f.payload):void 0,Y;try{Y=await a.publish(f,G)}catch(K){s.events.emit("error",K,e,f,a),or.warn?.(K),f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:Y===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!0,"connection","mqtt","disconnect"),or.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),or.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,ny.generate)(y,c);t(O),it(O.length,"bytes-sent",N,R(y),"mqtt")}o(g,"sendPacket");function R(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}o(R,"packetMethodName");function T(y){return wa(y,r)}o(T,"serialize")}),l.on("error",f=>{or.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var ny,a4,Mf,c4,l4,u4,ry,or,d4,Jye,i4,ty,f4=ce(()=>{ny=require("mqtt-packet");s4();a4=w(ts());bo();zi();Dr();Mf=w(oe());k();c4=w(ri()),l4=w(Q()),u4=require("events"),ry=(0,c4.loggerWithTag)("auth-event"),or=(0,l4.forComponent)("mqtt"),d4=(0,Mf.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Qye,"bypassAuth");Jye=o(e=>d4&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Xye,"start");ty=0;o(o4,"onSocket")});function sy(e,t){if(t?.includes(".."))throw new rD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var rD,nD=ce(()=>{rD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(sy,"resolveBaseURLPath")});function m4(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 h4=ce(()=>{o(m4,"deriveCommonPatternBase")});function iy(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 sD=ce(()=>{o(iy,"deriveGlobOptions")});var p4,iD,gE,E4=ce(()=>{nD();h4();sD();p4=require("micromatch"),iD=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"}},gE=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=sy(this.name,this.config.urlPath),this.globOptions=iy(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new iD(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,p4.scan)(s).base),this.commonPatternBase=m4(this.patternBases)}}});function _4(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(_4(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(_4(n,t)){t=t.slice(n.length+1);break}}}return(0,g4.join)(e.baseURLPath,t)}var g4,oD=ce(()=>{g4=require("node:path");o(_4,"pathStartsWithBase");o(mu,"deriveURLPath")});function S4(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var ay,T4,R4,aD,y4,A4,oy,b4=ce(()=>{ay=require("node:events");E4();T4=w(Q()),R4=w(require("chokidar")),aD=require("node:path"),y4=require("node:fs/promises");oD();A4=require("micromatch"),oy=class extends ay.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new gE(t,r,S4(n)),this.#r=s||T4.default.loggerWithTag(t),this.ready=(0,ay.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,A4.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,aD.join)(this.directory,r);switch(t){case"add":case"change":{let i=mu(this.#e,r,"file");(0,y4.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,aD.join)(this.#e.directory,r));return this.#t=R4.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 gE(this.name,this.directory,S4(t)),this.#a()}};o(S4,"castConfig")});var cy,cD=ce(()=>{cy={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var uy,I4,N4,w4,O4,C4,lD,uD,dD,fD,mD,ly,P4=ce(()=>{uy=require("events"),I4=w(require("yaml")),N4=w(require("chokidar")),w4=require("node:fs/promises"),O4=require("util"),C4=w(Q());cD();lD=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"}},uD=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},dD=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"}},fD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},mD=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},ly=class extends uy.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||C4.default.loggerWithTag(t),this.ready=(0,uy.once)(this,"ready"),this.#t=N4.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,w4.readFile)(this.#e,"utf-8").then(t=>{this.#n=I4.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 lD(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=cy,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,O4.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 uD;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new dD(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 fD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new mD(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 L4(){eAe[0]=1}var Zye,eAe,D4=ce(()=>{Up();Zye=Zo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),eAe=new Uint8Array(Zye);o(L4,"requestRestart")});var my,M4,dy,fy,v4=ce(()=>{my=require("node:events");b4();P4();M4=w(Q());D4();dy=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},fy=class extends my.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=M4.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,my.once)(this,"ready"),this.options=new ly(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 oy(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 dy);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 dy);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}`),L4()}}});function hu(e){return typeof e=="string"&&e.trim()!==""}function hD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>hu(t))}function F4(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function tAe(e){e.config.root&&SE.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 RD(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(F4(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,TE.join)(e.directory,i);hy.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 H4(e){let t=!1;if(t=await tAe(e),t)return t;let r=await(0,U4.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,TE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=mu(e,n.path,"directory");hy.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,x4.readFile)(s);hy.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 SE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var hy,U4,SE,TE,x4,B4,py,Oi,pD,ED,_D,gD,SD,TD,RD,yD,AD,k4=ce(()=>{hy=require("node:worker_threads"),U4=w(require("fast-glob")),SE=w(Q());nD();sD();TE=require("node:path"),x4=require("node:fs/promises");oD();B4=require("micromatch"),py=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)&&!hD(this.config.files)&&!F4(this.config.files))throw new pD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!hD(this.config.files.source)&&!hu(this.config.files.source))throw new ED(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new _D(this);if(this.config.files.ignore!==void 0&&!hD(this.config.files.ignore)&&!hu(this.config.files.ignore))throw new gD(this)}if(this.config.root!==void 0&&!hu(this.config.root))throw new TD(this);if(this.config.path!==void 0&&!hu(this.config.path))throw new yD(this);if(this.config.path&&(SE.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 AD(this);this.globOptions=iy(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new SD(this,r);return r.startsWith("/")&&(SE.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,B4.scan)(r).base),this.baseURLPath=sy(this.name,this.config.urlPath)}},Oi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,TE.basename)(r.directory)}) ${t}`)}},pD=class extends Oi{static{o(this,"InvalidFilesOptionError")}constructor(t){super("'files' option must be a non-empty string, an array of non-empty strings, or an object.",t)}},ED=class extends Oi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},_D=class extends Oi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},gD=class extends Oi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},SD=class extends Oi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},TD=class extends Oi{static{o(this,"InvalidRootOptionError")}constructor(t){super("deprecated 'root' option must be a non-empty string. Consider removing and updating 'files' glob pattern instead.",t)}},RD=class extends Oi{static{o(this,"InvalidRootOptionUseError")}constructor(t){super("the 'root' option is deprecated and only supported if 'files' is a singular, non-empty string. Please remove the 'root' option and modify the 'files' glob pattern instead.",t)}},yD=class extends Oi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},AD=class extends Oi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(hu,"isNonEmptyString");o(hD,"isArrayOfNonEmptyStrings");o(F4,"isObject");o(tAe,"handleRoots");o(H4,"processResourceExtensionComponent")});var Op={};we(Op,{componentErrors:()=>RE,getComponentName:()=>VR,loadComponent:()=>Sy,loadComponentDirectories:()=>$4,setErrorReporter:()=>nAe});function $4(e,t){t&&(ID=t),e&&(CD=e);let r=[];if((0,vt.existsSync)(bD)){let s=(0,vt.readdirSync)(bD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,kr.join)(bD,a);r.push(Sy(c,ID,Ky,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(Sy(n,ID,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{q4=!0})}function nAe(e){_y=e}function sAe(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Zo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Zo.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)(LD.PACKAGE_ROOT,t,"dir"),r()}finally{Zo.primaryStore.unlock(e,0)}})}function V4(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(!Zo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(V4(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(()=>{Zo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function Sy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(Ey.has(a))return Ey.get(a);Ey.set(a,!0),s&&(CD=s);try{let c;n&&(RE=new Map);let l=(0,kr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,Ty.getConfigObj)():(0,wD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,kr.join)(e,"config.yaml"))?c=(0,wD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=cy;try{let m=(0,kr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,OD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)(LD.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await sAe(e,m)}catch(m){ha.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&ha.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=gy,d={};for(let m in c){gy=m;let h=c[m];if(RE.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,OD.getHdbBasePath)().length){O=null;break}if(O)p=await Sy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=rAe[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&&ha.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new fy(m,e,l,t,Le);await V4(N,p);continue}if(ND.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&&!G4.includes(N)){let O=PD.get(U.HTTP_SESSIONAFFINITY);O&&ha.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!Qg)&&(G4.push(N),qL(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),CD.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new py({config:h,name:m,directory:e,module:p,resources:t});d[m]=await H4(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,kr.basename)(e)}' due to: ${g.message}`,_y?.(g),((0,yE.getWorkerIndex)()===0?console:ha.default).error(g),t.set(h.path||"/",new sl(g),null,!0),RE.set(n?m:(0,kr.basename)(e),g.message)}}if(gy=u,ND.isMainThread&&!q4&&i&&(0,yE.watchDir)(e,async()=>$4()),c.extensionModule||c.pluginModule){let m=await jg((0,kr.join)(e,c.extensionModule||c.pluginModule));return Ey.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?`;_y?.(new Error(m)),((0,yE.getWorkerIndex)()===0?console:ha.default).error(m),RE.set((0,kr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||ha.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}`,_y?.(c),t.set("",new sl(c))}}var vt,kr,ND,wD,PD,LD,ha,yE,OD,Ty,bD,CD,q4,ID,RE,rAe,G4,Ey,_y,gy,VR,lf=ce(()=>{vt=require("node:fs"),kr=require("node:path"),ND=require("node:worker_threads"),wD=require("yaml"),PD=w(oe()),LD=w(bt());k();Pk();kk();eG();aG();cG();RG();hj();Tj();yj();ha=w(Q());Lj();yE=w(nt());xN();Dr();Me();bL();OD=w(oe());VQ();PT();XQ();ss();f4();Ty=w(It());wh();ib();v4();k4();UL();Up();cD();bD=(0,Ty.resolvePath)(PD.get(U.COMPONENTSROOT)),CD=new Map,RE=new Map;o($4,"loadComponentDirectories");rAe={REST:Xg,rest:Xg,graphql:ON,graphqlSchema:NN,roles:UN,jsResource:BN,fastifyRoutes:qP,login:HN,static:$P,operationsApi:VL,customFunctions:{},http:$R,clustering:QL,replication:Go,authentication:Rp,mqtt:tD,loadEnv:VP,logging:ha.default,dataLoader:WP},G4=[],Ey=new Map;o(nAe,"setErrorReporter");VR=o(()=>gy,"getComponentName");o(sAe,"symlinkHarperModule");o(V4,"sequentiallyHandleApplication");o(Sy,"loadComponent")});var YR=M((lke,Y4)=>{var{isMainThread:K4}=require("worker_threads"),{getTables:iAe,getDatabases:ake,table:cke}=(Me(),v(Et)),{loadComponentDirectories:oAe,loadComponent:aAe}=(lf(),v(Op)),{resetResources:cAe}=(Gu(),v(xU)),lAe=bC(),uAe=It(),{dirname:dAe}=require("path"),{getConnection:fAe}=mr(),mAe=oe(),{CONFIG_PARAMS:hAe}=(k(),v(W)),{loadCertificates:pAe}=os(),DD=new Map;async function EAe(e=!1){!K4&&mAe.get(hAe.CLUSTERING_ENABLED)&&fAe();try{K4&&await lAe()}catch(n){console.error(n)}let t=cAe();iAe(),t.isWorker=e,await pAe(),await aAe(dAe(uAe.getConfigFilePath()),t,"hdb",!0,DD),await oAe(DD,t);let r=[];for(let[n]of DD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(EAe,"loadRootComponents");Y4.exports.loadRootComponents=EAe});var nt=M((dke,Pi)=>{"use strict";fA();var{Worker:_Ae,MessageChannel:gAe,parentPort:mo,isMainThread:BD,threadId:SAe,workerData:ho}=require("worker_threads"),{PACKAGE_ROOT:TAe}=bt(),{join:Q4,isAbsolute:RAe,extname:yAe}=require("path"),{server:J4}=(Dr(),v(jf)),{watch:AAe,readdir:bAe}=require("fs/promises"),{totalmem:W4}=require("os"),{setHeapSnapshotNearHeapLimit:IAe}=require("v8"),Nc=(k(),v(W)),Ay=oe(),Ci=Q(),{randomBytes:NAe}=require("crypto"),{_assignPackageExport:wAe}=ei(),z4=1024*1024,wc=[],Qs=[],OAe=50,FD=1e4,CAe="restart",X4="request_thread_info",Z4="resource_report",eJ="thread_info",tJ="added-port",PAe="ack",MD;wAe("threads",Qs);Pi.exports={startWorker:vD,restartWorkers:kD,shutdownWorkers:UAe,workers:wc,setMonitorListener:$Ae,onMessageFromWorkers:xAe,onMessageByType:cJ,broadcast:FAe,broadcastWithAcknowledgement:kAe,setChildListenerByType:vAe,getWorkerIndex:rJ,getWorkerCount:nJ,getTicketKeys:iJ,setMainIsWorker:DAe,setTerminateTimeout:LAe,restartNumber:ho?.restartNumber||1};Qs.onMessageByType=cJ;Qs.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Qs.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Pi.exports.whenThreadsStarted=new Promise(e=>{Pi.exports.threadsHaveStarted=e});Ay.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&IAe(1);var HD;function LAe(e){FD=e}o(LAe,"setTerminateTimeout");function rJ(){return ho?ho.workerIndex:HD?0:void 0}o(rJ,"getWorkerIndex");function nJ(){return ho?ho.workerCount:HD?1:void 0}o(nJ,"getWorkerCount");function DAe(e){HD=e,Pi.exports.threadsHaveStarted()}o(DAe,"setMainIsWorker");var sJ=1,Ry;function iJ(){return Ry||(Ry=BD?NAe(48):ho.ticketKeys,Ry)}o(iJ,"getTicketKeys");Object.defineProperty(J4,"workerIndex",{get(){return rJ()}});Object.defineProperty(J4,"workerCount",{get(){return nJ()}});var oJ={[X4](e,t){GAe(t)},[Z4](e,t){qAe(t,e)}};function vD(e,t={}){let r=process.constrainedMemory?.()||W4();r=Math.min(r,W4(),2e4*z4);let n=Ay.get(Nc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/z4/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let u of Qs){let d=new gAe;d.existingPort=u,i.push(d),a.push(d.port2)}yAe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];Ay.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new _Ae(RAe(e)?e:Q4(TAe,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:sJ=t.threadCount,name:t.name,restartNumber:Pi.exports.restartNumber,ticketKeys:iJ()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:tJ,port:u,threadId:l.threadId},[u]);return by(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>vD(e,t),l.on("error",u=>{Ci.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{wc.splice(wc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<OAe?(t.unexpectedRestarts=l.unexpectedRestarts+1,vD(e,t)):Ci.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{oJ[u.type]?.(u,l)}),wc.push(l),KAe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(vD,"startWorker");var MAe=[Nc.THREAD_TYPES.HTTP];async function kD(e=null,t=Math.max(sJ>3,1),r=!0){if(BD){try{process.chdir(process.cwd())}catch(a){Ci.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=YR();await a()}Pi.exports.restartNumber++,t<1&&(t=t*wc.length);let n=[],s=[];for(let a of wc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Ci.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Pi.exports.restartNumber,type:Nc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=MAe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},FD*2).unref();a.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&a.startCopy(),u()})});if(n.push(l),c&&r){let u=a.startCopy(),d=new Promise(f=>{let m=o(h=>{h.type===Nc.ITC_EVENT_TYPES.CHILD_STARTED&&(Ci.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Ci.trace("Waiting for worker to start",u.threadId),u.on("message",m)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=sf();r&&(e==="http"||!e)&&Ay.get(Nc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else mo.postMessage({type:CAe,workerType:e})}o(kD,"restartWorkers");function vAe(e,t){oJ[e]=t}o(vAe,"setChildListenerByType");function UAe(e){return kD(e,1/0,!1)}o(UAe,"shutdownWorkers");var aJ=[];function xAe(e){aJ.push(e)}o(xAe,"onMessageFromWorkers");var UD=new Map;function cJ(e,t){let r=UD.get(e);r||UD.set(e,r=[]),r.push(t)}o(cJ,"onMessageByType");var BAe=10;async function FAe(e,t){let r=0;for(let n of Qs)try{n.postMessage(e),r++>BAe&&(r=0,await new Promise(setImmediate))}catch(s){Ci.error("Unable to send message to worker",s)}t&&uJ(e,null)}o(FAe,"broadcast");var yy=new Map,HAe=1;function kAe(e){return new Promise(t=>{let r=0;for(let n of Qs)try{let s=HAe++,i=o(()=>{yy.delete(s),--r===0&&t(),n!==mo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,yy.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of yy)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Ci.error("Unable to send message to worker",s)}r===0&&t()})}o(kAe,"broadcastWithAcknowledgement");function GAe(e){e.postMessage({type:eJ,workers:lJ()})}o(GAe,"sendThreadInfo");function lJ(){let e=Date.now();return wc.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}o(lJ,"getChildWorkerInfo");function qAe(e,t){e.resources=t,e.resources.updated=Date.now()}o(qAe,"recordResourceReport");var xD;function $Ae(e){xD=e}o($Ae,"setMonitorListener");var VAe=1e3,j4=!1;function KAe(){j4||(j4=!0,setInterval(()=>{for(let e of wc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}xD&&xD()},VAe).unref())}o(KAe,"startMonitoring");var YAe=1e3;if(mo&&ho?.addPorts){by(mo);for(let e=0,t=ho.addPorts.length;e<t;e++){let r=ho.addPorts[e];r.threadId=ho.addThreadIds[e],by(r)}setInterval(()=>{let e=process.memoryUsage();mo.postMessage({type:Z4,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},YAe).unref(),MD=o(()=>new Promise((e,t)=>{mo.on("message",r),mo.postMessage({type:X4});function r(n){n.type===eJ&&(mo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else MD=lJ;Pi.exports.getThreadInfo=MD;function by(e,t){Qs.push(e),e.on("message",r=>{if(r.type===tJ)r.port.threadId=r.threadId,by(r.port);else if(r.type===PAe){let n=yy.get(r.id);n&&n()}else uJ(r,e)}).on("close",()=>{Qs.splice(Qs.indexOf(e),1)}).on("exit",()=>{Qs.splice(Qs.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(by,"addPort");function uJ(e,t){for(let n of aJ)n(e,t);let r=UD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Ci.error(s)}}o(uJ,"notifyMessageListeners");if(BD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await bAe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(Q4(s,a.name));try{for await(let{filename:a}of AAe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await kD(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(a){console.warn("Error trying to watch component directory",s,a)}},"watchDir");Pi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else mo.on("message",async e=>{let{type:t}=e;t===Nc.ITC_EVENT_TYPES.SHUTDOWN&&(Pi.exports.restartNumber=e.restartNumber,mo.unref(),setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate",SAe),process.exit(0)},FD).unref())})});var EJ=M((pke,pJ)=>{"use strict";var{promises:vf,createReadStream:WAe,createWriteStream:zAe}=require("fs"),{createGzip:jAe}=require("zlib"),{promisify:QAe}=require("util"),{pipeline:JAe}=require("stream"),XAe=QAe(JAe),qD=require("path"),hJ=oe();hJ.initSync();var Iy=Q(),{CONFIG_PARAMS:ZAe,ITC_EVENT_TYPES:mke}=(k(),v(W)),{onMessageFromWorkers:hke}=nt(),{convertToMS:dJ}=ie(),{onStorageReclamation:ebe}=(g_(),v(iU)),tbe=6e4,rbe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",nbe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",GD,fJ;pJ.exports=sbe;function sbe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(ebe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(rbe);if(!i)throw new Error(nbe);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=dJ(r));let d;return GD=Date.now(),Iy.trace("Log rotate enabled, maxSize:",t,"interval:",r),fJ=setInterval(async()=>{if(l){let f;f=await vf.stat(e.path),f.size>=l&&(d=await mJ(e.path,i))}if(u&&Date.now()-GD>=u&&(d=await mJ(e.path,i),GD=Date.now()),n||c){let f=dJ(n??"1M")/(1+c);c=0;let m=await vf.readdir(i);for(let h of m)try{let p=await vf.stat(qD.join(i,h));Date.now()-p.mtimeMs>f&&await vf.unlink(qD.join(i,h))}catch(p){Iy.error("Error trying to remove log",h,p)}}},a??tbe).unref(),{end(){clearInterval(fJ)},getLastRotatedLogPath(){return d}}}o(sbe,"logRotator");async function mJ(e,t){let r=hJ.get(ZAe.LOGGING_ROTATION_COMPRESS),n=qD.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await vf.rename(e,n),r&&(e=n,n+=".gz",await XAe(WAe(e),jAe(),zAe(n)),await vf.unlink(e)),Iy.closeLogFile(),Iy.notify(`hdb.log rotated, old log moved to ${n}`),n}o(mJ,"moveLogFile")});var RJ={};we(RJ,{RootConfigWatcher:()=>$D});var _J,gJ,SJ,Ny,TJ,$D,yJ=ce(()=>{_J=w(require("chokidar")),gJ=require("node:fs/promises"),SJ=w(It()),Ny=require("node:stream"),TJ=require("yaml"),$D=class extends Ny.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,SJ.getConfigFilePath)(),this.#t=_J.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,gJ.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,TJ.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,Ny.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=M((Tke,vy)=>{"use strict";var pa=require("fs-extra"),{workerData:ibe,threadId:obe,isMainThread:CJ}=require("worker_threads"),IE=require("path"),PJ=require("yaml"),LJ=require("properties-reader"),Gr=(k(),v(W)),AJ=Bc(),abe=require("os"),{PACKAGE_ROOT:QD}=bt(),{_assignPackageExport:cbe}=ei(),{Console:lbe}=require("console"),bJ=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),IJ=new Map,{join:Ea}=IE,NJ=1e4,ar={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},ube={STDOUT:"stdOut",STDERR:"stdErr"},Ske=Ea(QD,"logs"),dbe=Ea(QD,"config/yaml/",Gr.HDB_DEFAULT_CONFIG_FILE),fbe=1e4,NE,wE,wy,po,KD,VD,Cy,Ut,kn,Py,Ly,Uf,bE,AE;function Oy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=IE.dirname(n)):t.root?n=Ea(t.root,KD):(n=Ut.path,t.root||(t.root=IE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=ar[t.level]??Ut?.level??ar.info,DJ(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(Oy,"updateLogger");function DJ(e){let t=e.conditional??(e.conditional={});t.notify=ar.notify>=e.level?e.notify.bind(e):void 0,t.fatal=ar.fatal>=e.level?e.fatal.bind(e):void 0,t.error=ar.error>=e.level?e.error.bind(e):void 0,t.warn=ar.warn>=e.level?e.warn.bind(e):void 0,t.info=ar.info>=e.level?e.info.bind(e):void 0,t.debug=ar.debug>=e.level?e.debug.bind(e):void 0,t.trace=ar.trace>=e.level?e.trace.bind(e):void 0}o(DJ,"updateConditional");async function YD(){AE||(AE=new Lbe,await AE.ready(),AE.on("change",YD));let e=AE.config,t=e.logging??{};Oy(Ut,t),Cy=Ut.path,NE=t.console??!1,t.external&&Oy(kn,t.external);for(let r in e){let n=e[r];n.logging?Oy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&Oy(Ut.forComponent(r),t,r)}}o(YD,"updateLogSettings");var WD=class extends lbe{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){Tn="trace",this.level<=ar.trace&&super.info(...t),Tn="info"}debug(...t){Tn="debug",this.level<=ar.debug&&super.info(...t),Tn="info"}info(...t){Tn="info",this.level<=ar.info&&super.info(...t),Tn="info"}warn(...t){Tn="warn",this.level<=ar.warn&&super.warn(...t),Tn="info"}error(...t){Tn="error",this.level<=ar.error&&super.error(...t),Tn="info"}fatal(...t){Uf=!0;try{Tn="fatal",this.level<=ar.fatal&&super.error(...t),Tn="info"}finally{Uf=!1}}notify(...t){Uf=!0;try{Tn="notify",this.level<=ar.notify&&super.info(...t),Tn="info"}finally{Uf=!1}}withTag(t){return vJ(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};bE===void 0&&MJ();vy.exports={notify:Tbe,fatal:Rbe,error:jD,warn:ybe,info:_be,debug:Sbe,trace:gbe,logLevel:po,loggerWithTag:vJ,suppressLogging:pbe,initLogSettings:MJ,logCustomLevel:Abe,closeLogFile:UJ,createLogger:My,logsAtLevel:mbe,getLogFilePath:o(()=>Cy,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:Cbe,setLogLevel:Ibe,OUTPUTS:ube,AuthAuditLog:Pbe,start:YD,startOnMainThread:YD,errorToString:Obe};vy.exports.externalLogger={notify(...e){kn.notify(...e)},fatal(...e){kn.fatal(...e)},error(...e){kn.error(...e)},warn(...e){kn.warn(...e)},info(...e){kn.info(...e)},debug(...e){kn.debug(...e)},trace(...e){kn.trace(...e)},withTag(e){return kn.withTag(e)},loggerWithTag(e){return kn.withTag(e)}};cbe("logger",vy.exports.externalLogger);function mbe(e){return ar[po]<=ar[e]}o(mbe,"logsAtLevel");function MJ(e=!1){try{if(bE===void 0||e){UJ();let t=bbe(),r=AJ(["ROOTPATH"]);try{bE=LJ(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!pa.pathExistsSync(Ea(r.ROOTPATH,Gr.HDB_CONFIG_FILE)))throw s}let n;if({level:po,configLogPath:VD,toFile:wE,logConsole:NE,rotation:n,toStream:wy}=Nbe(r.ROOTPATH?Ea(r.ROOTPATH,Gr.HDB_CONFIG_FILE):bE.get("settings_path")),KD=Gr.LOG_NAMES.HDB,Cy=Ea(VD,KD),Ut=My({path:Cy,level:po,stdStreams:wy,rotation:n}),kn=Ut.forComponent("external"),kn.tag=null,CJ)try{require("segfault-handler").registerHandler(Ea(VD,"crash.log"))}catch{}}}catch(t){if(bE=void 0,t.code===Gr.NODE_ERROR_CODES.ENOENT||t.code===Gr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=AJ(Object.keys(Gr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=Gr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===Gr.CONFIG_PARAMS.LOGGING_LEVEL){po=a;continue}i===Gr.CONFIG_PARAMS.LOGGING_CONSOLE&&(NE=i)}let{defaultLevel:n}=wbe();wE=!1,wy=!0,po=po===void 0?n:po,Ut=My({level:po}),kn=Ut.forComponent("external"),kn.tag=null;return}throw jD("Error initializing log settings"),jD(t),t}process.env.DEV_MODE&&(wy=!0),hbe()}o(MJ,"initLogSettings");var Oc=!0;function hbe(){wE&&(process.stdout.write=function(e){return typeof e=="string"&&Oc&&NE&&(e=e.toString(),e[e.length-1]===`
|
|
126
|
+
`))}},25).unref()}l.close?.(()=>{if(zs.get(_s.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)&&If()==0)try{gQ(yye(zs.get(_s.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)))}catch{}clearInterval(u),setTimeout(()=>{console.log("forced close server",c,KR),l.cantCleanupProperly||wi.warn("Had to forcefully exit the thread",KR),process.exit(0)},5e3).unref()})}if(TQ||process.env.DEV_MODE)try{require("inspector").close()}catch(c){wi.info("Could not close debugger",c)}}}).ref();let r;mE&&!Nye&&(r=yQ()),Promise.resolve(r).then(()=>{if(If()===0)try{Aye(bye)}catch(n){console.error("Error displaying start-up log",n)}pQ?.postMessage({type:_s.ITC_EVENT_TYPES.CHILD_STARTED})})});return SQ(t),t}o(RQ,"startServers");function yQ(){let e=[];for(let t in Nf){let r=Nf[t];if(t.includes?.("/")&&If()==0){_ye(t)&&gQ(t),e.push(new Promise((a,c)=>{r.listen({path:t},()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.info("Domain socket listening on "+t)}).on("error",c)}));continue}let n,s=zs.get(_s.CONFIG_PARAMS.HTTP_THREADRANGE);if(s){let a=typeof s=="string"?s.split("-"):s,c=If();if(c<a[0]||c>a[1])continue}let i;try{let a=t.lastIndexOf(":");a>0?mE?n={fd:mE(+t.slice(a+1).replace(/[\[\]]/g,""),t.slice(0,a))}:n={host:+t.slice(a+1).replace(/[\[\]]/g,""),port:t.slice(0,a)}:mE?n={fd:mE(+t,"::")}:n={port:t}}catch(a){console.error(`Unable to bind to port ${t}`,a);continue}e.push(new Promise((a,c)=>{r.listen(n,()=>{a({port:t,name:r.name,protocol_name:r.protocol_name}),wi.trace("Listening on port "+t,KR)}).on("error",c)}))}return Promise.all(e)}o(yQ,"listenOnPorts");!xL&&!pye?.noServerStart&&RQ();function wye(e,t){let r=(lf(),v(Op)).getComponentName,n;if(t.securePort){EQ(t.securePort,{protocol_name:"TLS",name:r()});let s=Rye("server",t.mtls),i=zs.get("tls");n=Sye({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),Nf[t.securePort]=n}return t.port&&(EQ(t.port,{protocol_name:"TCP",name:r()}),n=Eye(e,{noDelay:!0,keepAlive:!0,keepAliveInitialDelay:600}),Nf[t.port]=n),n}o(wye,"onSocket")});var Q2={};we(Q2,{startHTTPThreads:()=>Cye,startSocketServer:()=>qL,updateWorkerIdleness:()=>LQ});async function Cye(e=2,t){mN().catch(r=>Lf.error?.("Error recording hostname for analytics:",r));try{if(t)kL(0,1,!0);else{let{loadRootComponents:r}=YR();if(e===0)return(0,js.setMainIsWorker)(!0),await BL().startServers(),Promise.resolve([]);await r()}PQ();for(let r=0;r<e;r++)kL(r,e);return Promise.all(CQ)}finally{(0,js.threadsHaveStarted)()}}function PQ(){let e=(0,NQ.checkMemoryLimit)();e&&!process.env.DEV_MODE&&(console.error(e),HL=setInterval(()=>{Lf.notify(e)},Oye).unref())}function kL(e,t=1,r){if(FL++,(0,js.startWorker)("server/threads/threadServer.js",{name:eA.HTTP,workerIndex:e,threadCount:t,async onStarted(n){let s=new Promise((a,c)=>{function l(u){u.type===Qy.CHILD_STARTED&&(n.removeListener("message",l),a(n))}o(l,"onMessage"),n.on("message",l),n.on("error",c)});CQ.push(s),await s,wf.push(n),n.expectedIdle=1,n.lastIdle=0,n.requests=1,n.on("message",a=>{if(a.requestId){let c=zR.get(a.requestId);c&&c(a)}}),n.on("exit",i),n.on("shutdown",i);function i(){let a=wf.indexOf(n);a>-1&&wf.splice(a,1)}if(o(i,"removeWorker"),Of){let a=Of;Of=[];for(let c of a)OQ[c.localPort](null,c)}}}),r){let n=setInterval(()=>{GL?GL=!1:(clearInterval(n),console.log("shut down dynamic thread due to inactivity"),(0,js.shutdownWorkers)(),FL=0,setTimeout(()=>{global.gc?.()},5e3))},1e4)}}function qL(e=0,t){if(typeof e=="string")try{(0,jR.existsSync)(e)&&(0,jR.unlinkSync)(e)}catch{}let r;t?t==="ip"?r=Pye:r=Lye(t):r=$L;let n=(0,Cf.createServer)({allowHalfOpen:!0,pauseOnConnect:!r.readsData}).listen(e);return n._handle&&(n._handle.onconnection=OQ[e]=function(s,i){r.readsData||(i.reading=!1,i.readStop()),GL=!0,r(i,(a,c)=>{if(!a){if(AQ){let u=i._socket||new Cf.Socket({handle:i,writable:!0,readable:!0});AQ.deliverSocket(u,e,c),u.resume()}else FL>0?(Of.length===0&&setTimeout(()=>{Of.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,Of.push(i)):(console.log("start up a dynamic thread to handle request"),kL(0));it(!1,"socket-routed");return}a.requests++;let l=i.fd;if(l>=0)a.postMessage({port:e,fd:l,data:c});else{let u=i._socket||new Cf.Socket({handle:i,writable:!0,readable:!0});vye(u,a,e)}it(!0,"socket-routed")})},Lf.info(`HarperDB ${wQ.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 $L(e,t){let r,n=0;for(let s of wf){if(s.threadId===-1)continue;let i=s.expectedIdle/s.requests;if(i>n)r=s;else if(n>=WR)return WR=i,t(r);n=i}WR=0,t(r)}function Pye(e,t){let r={};e.getpeername(r);let n=r.address,s=Pf.get(n),i=Date.now();if(s&&s.worker.threadId!==-1)return s.lastUsed=i,t(s.worker);$L(e,a=>{Pf.set(n,{worker:a,lastUsed:i}),t(a)})}function Lye(e){let t=new RegExp(`${e}:\\s*(.+)`,"i");return r.readsData=!0,r;function r(n,s){let i=new Cf.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=Pf.get(l),d=Date.now();if(u&&u.worker.threadId!==-1)return u.lastUsed=d,s(u.worker);$L(n,f=>{Pf.set(l,{worker:f,lastUsed:d}),s(f,a)})})}o(r,"findByHeaderAffinity")}function LQ(){WR=0;for(let e of wf)e.expectedIdle=e.recentELU.idle+Dye,e.requests=1;wf.sort((e,t)=>e.expectedIdle>t.expectedIdle?-1:1)}function vye(e,t,r){let n=Mye++;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(),zR.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")),zR.delete(n)),s.event=="destroy"&&(e.destroy(),zR.delete(n))})}var js,Cf,Lf,jR,IQ,NQ,wQ,wf,Of,OQ,AQ,FL,CQ,HL,Oye,GL,WR,bQ,Pf,Dye,zR,Mye,bL=ce(()=>{js=w(nt()),Cf=require("net");k();Lf=w(Q()),jR=require("fs");zi();IQ=require("worker_threads"),NQ=w(Qd()),wQ=w(bt()),wf=[],Of=[],OQ=[],FL=0,CQ=[];IQ.isMainThread&&(process.on("uncaughtException",e=>{e.code==="ECONNRESET"||e.code==="ECONNREFUSED"||e.message!=="write EIO"&&console.error("uncaughtException",e)}),(0,js.onMessageFromWorkers)(e=>{e.type===Zy.RESTART&&HL&&(clearInterval(HL),PQ())}));Oye=6e5;o(Cye,"startHTTPThreads");o(PQ,"licenseWarning");o(kL,"startHTTPWorker");o(qL,"startSocketServer");WR=0;o($L,"findMostIdleWorker");bQ=36e5,Pf=new Map;o(Pye,"findByRemoteAddressAffinity");o(Lye,"makeFindByHeaderAffinity");setInterval(()=>{let e=Date.now();for(let[t,r]of Pf)r.lastUsed+bQ<e&&Pf.delete(t)},bQ).unref();Dye=1e3;o(LQ,"updateWorkerIdleness");(0,js.setMonitorListener)(LQ);zR=new Map,Mye=1;o(vye,"proxySocket")});var VL={};we(VL,{hdbServer:()=>Fye,start:()=>Fye});async function Fye(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=DQ.default.isMaster,await Hye();let t=e.securePort>0;Df=kye(t),await Df.ready(),e||(e={}),e.isOperationsServer=!0;try{Le.http(Df.server,e),Df.server.closeIdleConnections||await Df.listen({port:0,host:"::"})}catch(r){throw Df.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 Hye(){fo.default.trace("Configuring HarperDB process."),kQ.default.setSchemaDataToGlobal(),await qQ.default.setUsersWithRolesCache(),await $Q.default.getLicense()}function kye(e){fo.default.debug(`HarperDB process starting to build ${e?"HTTPS":"HTTP"} server.`);let t=Gye(e),r=(0,MQ.default)(t);r.server.headersTimeout=$ye(),r.setErrorHandler(bc.serverErrorHandler);let n=qye();n&&r.register(vQ.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(BQ.default),r.register(UQ.default),r.register(xQ.default,{root:FQ.default.join(HQ.PACKAGE_ROOT,"studio/build-local")}),mm(r);let s=Ac.default.get(jy.LOCAL_STUDIO_ON);return r.get("/",function(i,a){return!GQ.default.isEmpty(s)&&s.toString().toLowerCase()==="true"?a.sendFile("index.html"):a.sendFile("running.html")}),r.post("/",{preValidation:[bc.reqBodyValidationHandler,bc.authHandler],config:{isOperation:!0}},async function(i,a){return i.body?.operation?.startsWith("restart")&&a.header("Connection","close"),(0,bc.handlePostRequest)(i,a)}),r.get("/health",()=>"HarperDB is running."),fo.default.debug(`HarperDB process starting up ${e?"HTTPS":"HTTP"} server listener.`),r}function Gye(e){let t=Ac.default.get(pE.OPERATIONSAPI_NETWORK_TIMEOUT),r=Ac.default.get(pE.OPERATIONSAPI_NETWORK_KEEPALIVETIMEOUT);return{bodyLimit:xye,connectionTimeout:t,keepAliveTimeout:r,forceCloseConnections:!0,return503OnClosing:!1,https:e}}function qye(){let e=Ac.default.get(pE.OPERATIONSAPI_NETWORK_CORS),t=Ac.default.get(pE.OPERATIONSAPI_NETWORK_CORSACCESSLIST),r;return e&&(e===!0||e.toUpperCase()===Bye)&&(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 $ye(){return Ac.default.get(pE.OPERATIONSAPI_NETWORK_HEADERSTIMEOUT)??Uye}var DQ,Ac,fo,MQ,vQ,UQ,xQ,BQ,FQ,HQ,kQ,GQ,qQ,$Q,bc,Uye,xye,Bye,pE,Df,VQ=ce(()=>{DQ=w(require("cluster")),Ac=w(oe());k();fo=w(Q()),MQ=w(require("fastify")),vQ=w(require("@fastify/cors")),UQ=w(require("@fastify/compress")),xQ=w(require("@fastify/static")),BQ=w(QN()),FQ=w(require("path")),HQ=w(bt()),kQ=w(Os()),GQ=w(ie()),qQ=w(ts()),$Q=w(Qd());Dr();bc=w(hR());bo();Ac.default.initSync();Uye=6e4,xye=1024*1024*1024,Bye="TRUE",{CONFIG_PARAMS:pE}=W;o(Fye,"operationsServer");o(Hye,"setUp");o(kye,"buildServer");o(Gye,"getServerOptions");o(qye,"getCORSOpts");o($ye,"getHeaderTimeoutConfig")});var QL={};we(QL,{disableNATS:()=>Kye,publishToStream:()=>XR,setNATSReplicator:()=>KL,setPublishToStream:()=>Yye,setSubscription:()=>jL,start:()=>Vye});function Vye(){EE.default.get(U.CLUSTERING_ENABLED)&&zye()}function Kye(e=!0){jQ=e}function Yye(e,t){XR=e,jL=t}function zye(){if(jQ||process.env._DISABLE_NATS)return;let e=st(),t=Object.keys(e);t.push("system");for(let r of t){let n=e[r];for(let s in n){let i=n[s];KL(s,r,i)}}wl((r,n)=>{KL(r.tableName,r.databaseName,r),n&&JQ(r)}),!KQ&&(KQ=!0)}function KL(e,t,r){if(t==="system"&&jye.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){JQ(i)}static subscribe(){let i=new Yn;return jL(t,e,i),i}static subscribeOnThisThread(i){return i<(EE.default.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)??Wye)}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 QR(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=QQ;return i}o(n,"getNATSTransaction")}function JQ(e){let t=EE.default.get(U.CLUSTERING_NODENAME);XR(`${WL.SUBJECT_PREFIXES.TXN}.${e.databaseName}.${e.tableName}`,(0,zL.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 YQ,WL,zL,WQ,zQ,EE,JR,jQ,XR,jL,Wye,QQ,KQ,jye,QR,YL,XQ=ce(()=>{Me();Ma();YQ=w(mr()),WL=w(Ct()),zL=w(Ki());bu();WQ=w(fw()),zQ=w(bn()),EE=w(oe());k();JR=w(Q());o(Vye,"start");o(Kye,"disableNATS");XR=YQ.publishToStream,jL=WQ.setSubscription;o(Yye,"setPublishToStream");Wye=2;o(zye,"assignReplicationSource");jye=["hdb_job","hdb_raw_analytics","hdb_info","hdb_license"];o(KL,"setNATSReplicator");o(JQ,"publishSchema");QR=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=EE.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||(JR.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(XR(`${WL.SUBJECT_PREFIXES.TXN}.${s}.${l.table}`,(0,zL.createNatsTableStreamName)(s,l.table),void 0,l)?.catch(d=>{throw JR.error("An error has occurred trying to replicate transaction",l,d),d.statusCode=504,d}))}return Promise.all(n)}},YL=class extends QR{static{o(this,"ImmmediateNATSTransaction")}constructor(){super({get timestamp(){return(0,zQ.getNextMonotonicTime)()}})}addWrite(t,r){super.addWrite(t,r),this.commit({})}};QQ=new YL});async function n4({clientId:e,user:t,clean:r,will:n,keepalive:s}){let i;if(e&&!r){let a=await JL.get(e,{returnNonexistent:!0});i=new eD(e,t,a),a&&(i.sessionWasPresent=!0)}else{if(e){let a=await JL.get(e);a&&a.delete()}i=new ey(e,t)}return n&&(n.id=e,n.user={username:t?.username},_E.put(n)),s&&(i.keepalive=s,i.receivedPacket()),i}function XL(){return ZR++,ZR>65500&&(ZR=1),ZR}function ZL(e,t,r){let{topic:n,retain:s}=e;e.data=t,e.async=!0,r.authorize=!0;let i=Is.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 Ht(r,()=>s?t===void 0?c.delete(a,r):c.put(a,e.data,r):c.publish(a,e.data,r))}var e4,Ic,t4,r4,ZQ,JL,_E,ZR,ey,eD,s4=ce(()=>{Me();Gu();e4=w(bn()),Ic=w(Q());Gc();t4=w(nt()),r4=w(BL());Dr();x_();ZQ=100,JL=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"}]}}]}),_E=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,t4.getWorkerIndex)()===0&&(async()=>{await r4.whenComponentsLoaded,await new Promise(e=>setTimeout(e,2e3));for await(let e of _E.search({})){let t=e.data,r={...e};r.user?.username&&(r.user=await Le.getUser(r.user.username));try{await ZL(r,t,r)}catch{(0,Ic.warn)("Failed to publish will",t)}_E.delete(e.id)}})();o(n4,"getSession");ZR=1;o(XL,"getNextMessageId");ey=class{static{o(this,"SubscriptionsSession")}listener;sessionId;user;request;socket;subscriptions=[];awaitingAcks;sessionWasPresent;keepalive;keepaliveTimer;constructor(t,r){this.sessionId=t,this.user=r}async addSubscription(t,r,n){let{topic:s,rh:i,startTime:a}=t,c=s.indexOf("?"),l,u;if(c>-1?(l=s.slice(c),u=s.slice(0,c)):u=s,!u)throw new Error("No topic provided");if(u.indexOf(".")>-1)throw new Error("Dots are not allowed in topic names");let d=this.subscriptions.find(T=>T.topic===s),f;d?(f=i>0,d.end(),this.subscriptions.splice(this.subscriptions.indexOf(d),1)):f=i===2;let m={search:l,async:!0,user:this.user,startTime:a,omitCurrent:f,target:"",checkPermission:this.user?.role?.permission??{}};a&&(0,Ic.trace)("Resuming subscription from",s,"from",a);let h=Is.getMatch(u,"mqtt");if(!h){let T=new Error(`The topic ${s} does not exist, no resource has been defined to handle this topic`);throw T.statusCode=404,T}m.url=h.relativeURL;let p;if(m.url.indexOf("+")>-1||(p=m.url.indexOf("#"))>-1){let T=m.url.slice(1);if(p--,p>-1&&p!==T.length-1)throw new Error("Multi-level wildcards can only be used at the end of a topic");if(m.isCollection=!0,T.indexOf("+")===T.length-1)m.onlyChildren=!0,m.url="/"+T.slice(0,T.length-1);else{let y=T.split("/"),N;for(let Z=0;Z<y.length;Z++)if(y[Z].indexOf("+")>-1)if(y[Z]==="+")N=!0;else throw new Error("Single-level wildcards can only be used as a topic level (between or after slashes)");if(n&&N)throw new Error("Filters can not be combined");let O=!0;y[y.length-1]==="#"&&(y.length--,O=!1),N&&(n=o(Z=>{let G=Z.id;if(!Array.isArray(G))if(G?.indexOf?.("/")>-1)G=G.split("/");else return!1;if(O&&G.length!==y.length)return!1;for(let Y=0;Y<y.length;Y++)if(y[Y]!=="+"&&y[Y]!==G[Y])return!1;return!0},"filter"));let F=y.indexOf("+");m.url="/"+(F>-1?y.slice(0,F):y).concat("").join("/")}}else m.isCollection=!1;let _=h.path,g=h.Resource,R=await Ht(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=XL());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>ZQ?await new Promise(Y=>setTimeout(Y,this.awaitingAcks.size-ZQ)):await new Promise(setImmediate)}catch(F){(0,Ic.warn)(F)}})();return y});if(R)return R.topic=s,R.qos=t.qos,this.subscriptions.push(R),R}resume(){}needsAcknowledge(t){let r=XL();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 ZL(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();Ht(r,async()=>{try{if(!t){let n=await _E.get(this.sessionId);n?.doesExist()&&await ZL(n,n.data,r)}}finally{await _E.delete(this.sessionId)}}).catch(n=>{(0,Ic.warn)(`Error publishing MQTT will for ${this.sessionId}`,n)});for(let n of this.subscriptions)n.end();this.subscriptions=[]}receivedPacket(){this.keepalive&&(clearTimeout(this.keepaliveTimer),this.keepaliveTimer=setTimeout(()=>{this.socket?.destroy?this.socket.destroy(new Error("Keepalive timeout")):this.socket?.terminate()},this.keepalive*1500))}};o(ZL,"publish");eD=class extends ey{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=XL(),n={topic:t.topic,timestamp:t.localTime};return t.acknowledge&&(n.acknowledge=t.acknowledge),this.awaitingAcks.set(r,n),r}acknowledge(t){let r=this.awaitingAcks?.get(t);if(!r)return;this.awaitingAcks?.delete(t),r.acknowledge?.();let n=r.topic;for(let[,s]of this.awaitingAcks)if(s.topic===n&&s.timestamp<r.timestamp){for(let i of this.sessionRecord.subscriptions)if(i.topic===n){i.acks||(i.acks=[]),i.acks.push(r.timestamp),(0,Ic.trace)("Received ack",n,r.timestamp),this.sessionRecord.update();return}}for(let s of this.sessionRecord.subscriptions)s.topic===n&&(s.startTime=r.timestamp);this.sessionRecord.update()}async addSubscription(t,r){await this.resumeSubscription(t,r);let{qos:n,startTime:s}=t;return n>0&&!s&&this.saveSubscriptions(),t.qos}removeSubscription(t){let r=this.subscriptions.find(s=>s.topic===t),n=super.removeSubscription(t);return r.qos>0&&this.saveSubscriptions(),n}saveSubscriptions(){this.sessionRecord.subscriptions=this.subscriptions.map(t=>{let r=t.startTime;return r||(r=t.startTime=(0,e4.getNextMonotonicTime)()),(0,Ic.trace)("Added durable subscription",t.topic,r),{qos:t.qos,topic:t.topic,startTime:r}}),JL.put(this.sessionRecord)}}});var tD={};we(tD,{bypassAuth:()=>Qye,start:()=>Xye});function Qye(){d4=!0}function Xye({server:e,port:t,network:r,webSocket:n,securePort:s,requireAuthentication:i}){e.mqtt||(e.mqtt={requireAuthentication:i,sessions:new Set,events:new u4.EventEmitter},e.mqtt.events.on("error",()=>{}));let a=e.mqtt,c=[],l=r?.mtls;return n&&(c=e.ws((u,d,f,m)=>{if(d.headers.get("sec-websocket-protocol")!=="mqtt")return m(u,d,f);a.events.emit("connection",u),or.debug?.("Received WebSocket connection for MQTT from",u._socket.remoteAddress);let{onMessage:h,onClose:p}=o4(u,_=>{u.send(_)},d,Promise.resolve(f).then(()=>d?.user),a);u.on("message",h),u.on("close",p),u.on("error",_=>{or.info?.("WebSocket error",_)})},{...n})),(t||s)&&c.push(e.socket(async u=>{let d;if(a.events.emit("connection",u),or.debug?.(`Received ${u.getCertificate?"SSL":"TCP"} connection for MQTT from ${u.remoteAddress}`),l){if(u.authorized)try{let h=l.user;if(h!==null){(h===void 0||h==="Common Name"||h==="CN")&&(h=u.getPeerCertificate().subject.CN);try{d=await e.getUser(h,null,null),(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ry.notify?.({username:d?.username,status:Zs.SUCCESS,type:Aa.AUTHENTICATION,authStrategy:"MQTT mTLS",remoteAddress:u.remoteAddress})}catch(p){throw(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ry.error?.({username:h,status:Zs.FAILURE,type:Aa.AUTHENTICATION,authStrategy:"mqtt",remoteAddress:u.remoteAddress}),p}}else or.debug?.("MQTT mTLS authorized connection (mTLS did not authorize a user)","from",u.remoteAddress)}catch(h){a.events.emit("error",h,u),or.error?.(h)}else if(l.required)return or.info?.(`Unauthorized connection attempt, no authorized client certificate provided, error: ${u.authorizationError}`),u.end()}!d&&Jye(u.remoteAddress)&&(d=await(0,a4.getSuperUser)(),or.debug?.("Auto-authorizing local connection",d?.username));let{onMessage:f,onClose:m}=o4(u,h=>u.write(h),null,d,a);u.on("data",f),u.on("close",m),u.on("error",h=>{or.info?.("Socket error",h)})},{port:t,securePort:s,mtls:l})),c}function o4(e,t,r,n,s){i4||(i4=!0,fh(f=>{ty>0&&f.push({metric:"mqtt-connections",connections:ty,byThread:!0})}));let i;ty++;let a,c={protocolVersion:4},l=(0,ny.parser)({protocolVersion:5});function u(f){l.parse(f)}o(u,"onMessage");function d(){ty--,i||(i=!0,a?.disconnect?.(),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!1,"connection","mqtt","disconnect"),or.debug?.("MQTT connection was closed",e.remoteAddress))}return o(d,"onClose"),l.on("packet",async f=>{try{n?.then&&(n=await n)}catch(y){e.close?.(1008,"Unauthorized"),or.info?.(y);return}let m=f.cmd;if(a)a.then&&await a;else if(m!=="connect"){or.info?.("Received packet before connection was established, closing connection"),e?.destroy?e.destroy():e?.terminate();return}let h=f.topic,p=h?.indexOf("/",1),_=p>0?h.slice(0,p):h;it(f.length,"bytes-received",_,R(f),"mqtt");try{switch(a?.receivedPacket?.(),m){case"connect":if(c.protocolVersion=f.protocolVersion,f.username)try{n=await Le.getUser(f.username,f.password.toString(),r),(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGSUCCESSFUL)&&ry.notify?.({username:n?.username,status:Zs.SUCCESS,type:Aa.AUTHENTICATION,authStrategy:"MQTT",remoteAddress:e.remoteAddress})}catch(K){return(0,Mf.get)(U.LOGGING_AUDITAUTHEVENTS_LOGFAILED)&&ry.error?.({username:f.username,status:Zs.FAILURE,type:Aa.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=Ao(r?.headers.get?.("content-type")));f.will.data=f.will.payload?.length>0?K(f.will.payload):void 0,delete f.will.payload}a=n4({user:n,...f}),a=await a,a.socket=e,r&&(a.request=r),s.sessions.add(a)}catch(K){return or.error?.(K),s.events.emit("auth-failed",f,e,K),Wr(!1,"connection","mqtt","connect"),g({cmd:"connack",reasonCode:K.code||5,returnCode:K.code||128})}s.events.emit("connected",a,e),Wr(!0,"connection","mqtt","connect"),g({cmd:"connack",sessionPresent:a.sessionWasPresent,reasonCode:0,returnCode:0});let y=o(async(K,$,le,ue)=>{try{if(i)throw new Error("Session disconnected while trying to send message to",K);let se=K.indexOf("/",1),me=se>0?K.slice(0,se):K;g({cmd:"publish",topic:K,payload:await T($),messageId:le||Math.floor(Math.random()*1e8),qos:ue.qos},me);let Pe=e._socket??e;return Pe.writableNeedDrain?new Promise(De=>Pe.once("drain",De)):!Pe.closed}catch(se){return or.error?.(se),a?.disconnect(),s.sessions.delete(a),!1}},"listener");a.setListener(y),a.sessionWasPresent&&await a.resume();break;case"subscribe":let N=[];for(let K of f.subscriptions){let $;try{let le=await a.addSubscription(K,K.qos>=1);$=le?le.qos||0:c.protocolVersion<5?128:143}catch(le){s.events.emit("error",le,e,K,a),le.statusCode?le.statusCode===500?or.warn?.(le):or.info?.(le):or.error?.(le),$=c.protocolVersion<5?128:le.statusCode===403?135:le.statusCode===404?143:128}N.push($)}await a.committed,g({cmd:"suback",granted:N,messageId:f.messageId});break;case"unsubscribe":{let K=[];for(let $ of f.unsubscriptions)K.push(a.removeSubscription($)?0:17);g({cmd:"unsuback",granted:K,messageId:f.messageId});break}case"pubrel":g({cmd:"pubcomp",messageId:f.messageId,reasonCode:0});return;case"publish":let O=f.qos===2?"pubrec":"puback",F=e.deserialize||(e.deserialize=Ao(r?.headers.get?.("content-type"))),G=(f.payload?.length||0)>0?F(f.payload):void 0,Y;try{Y=await a.publish(f,G)}catch(K){s.events.emit("error",K,e,f,a),or.warn?.(K),f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:128},f.topic);break}f.qos>0&&g({cmd:O,messageId:f.messageId,reasonCode:Y===!1?144:0},f.topic);break;case"pubrec":g({cmd:"pubrel",messageId:f.messageId,reasonCode:0});break;case"pubcomp":case"puback":a.acknowledge(f.messageId);break;case"pingreq":g({cmd:"pingresp"});break;case"disconnect":i=!0,a?.disconnect(!0),s.events.emit("disconnected",a,e),s.sessions.delete(a),Wr(!0,"connection","mqtt","disconnect"),or.debug?.("Received disconnect command, closing MQTT session",e.remoteAddress),e.close?e.close():e.end();break}}catch(y){s.events.emit("error",y,e,f,a),or.error?.(y),g({cmd:"disconnect"})}function g(y,N){let O=(0,ny.generate)(y,c);t(O),it(O.length,"bytes-sent",N,R(y),"mqtt")}o(g,"sendPacket");function R(y){return y.qos>0?y.cmd+",qos="+y.qos:y.cmd}o(R,"packetMethodName");function T(y){return wa(y,r)}o(T,"serialize")}),l.on("error",f=>{or.warn("MQTT parsing error, closing connection:",f.message),e?.destroy?e.destroy():e?.terminate()}),{onMessage:u,onClose:d}}var ny,a4,Mf,c4,l4,u4,ry,or,d4,Jye,i4,ty,f4=ce(()=>{ny=require("mqtt-packet");s4();a4=w(ts());bo();zi();Dr();Mf=w(oe());k();c4=w(ri()),l4=w(Q()),u4=require("events"),ry=(0,c4.loggerWithTag)("auth-event"),or=(0,l4.forComponent)("mqtt"),d4=(0,Mf.get)(U.AUTHENTICATION_AUTHORIZELOCAL)??process.env.DEV_MODE;o(Qye,"bypassAuth");Jye=o(e=>d4&&(e.includes("127.0.0.")||e==="::1"),"authorizeLocal");o(Xye,"start");ty=0;o(o4,"onSocket")});function sy(e,t){if(t?.includes(".."))throw new rD(t);let r=t||"/";return(r==="."||r.startsWith("./"))&&(r=`/${e}${r.slice(1)}`),r.startsWith("/")||(r=`/${r}`),r.endsWith("/")||(r=`${r}/`),r}var rD,nD=ce(()=>{rD=class extends Error{static{o(this,"InvalidBaseURLPathError")}constructor(t){super(`urlPath must not contain '..'. Received: '${t}'`)}};o(sy,"resolveBaseURLPath")});function m4(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 h4=ce(()=>{o(m4,"deriveCommonPatternBase")});function iy(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 sD=ce(()=>{o(iy,"deriveGlobOptions")});var p4,iD,gE,E4=ce(()=>{nD();h4();sD();p4=require("micromatch"),iD=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"}},gE=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=sy(this.name,this.config.urlPath),this.globOptions=iy(this.config.files),this.globOptions.source=this.globOptions.source.map(s=>{if(s.includes("..")||s.startsWith("/"))throw new iD(s);return s==="."||s==="./"?"**/*":s}),this.patternBases=this.globOptions.source.map(s=>(0,p4.scan)(s).base),this.commonPatternBase=m4(this.patternBases)}}});function _4(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(_4(n,t)){t=t.slice(n.length+1);break}}if(r==="directory"){if(t===n){t="";break}else if(_4(n,t)){t=t.slice(n.length+1);break}}}return(0,g4.join)(e.baseURLPath,t)}var g4,oD=ce(()=>{g4=require("node:path");o(_4,"pathStartsWithBase");o(mu,"deriveURLPath")});function S4(e){return typeof e=="string"||Array.isArray(e)||!("files"in e)?{files:e}:e}var ay,T4,R4,aD,y4,A4,oy,b4=ce(()=>{ay=require("node:events");E4();T4=w(Q()),R4=w(require("chokidar")),aD=require("node:path"),y4=require("node:fs/promises");oD();A4=require("micromatch"),oy=class extends ay.EventEmitter{static{o(this,"EntryHandler")}#e;#t;#r;ready;constructor(t,r,n,s){super(),this.#e=new gE(t,r,S4(n)),this.#r=s||T4.default.loggerWithTag(t),this.ready=(0,ay.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,A4.isMatch)(r,this.#e.globOptions.source,{ignore:this.#e.globOptions.ignore}))return;let s=(0,aD.join)(this.directory,r);switch(t){case"add":case"change":{let i=mu(this.#e,r,"file");(0,y4.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,aD.join)(this.#e.directory,r));return this.#t=R4.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 gE(this.name,this.directory,S4(t)),this.#a()}};o(S4,"castConfig")});var cy,cD=ce(()=>{cy={rest:!0,graphqlSchema:{files:"*.graphql"},roles:{files:"roles.yaml"},jsResource:{files:"resources.js"},fastifyRoutes:{files:"routes/*.js"},static:{files:"web/**"}}});var uy,I4,N4,w4,O4,C4,lD,uD,dD,fD,mD,ly,P4=ce(()=>{uy=require("events"),I4=w(require("yaml")),N4=w(require("chokidar")),w4=require("node:fs/promises"),O4=require("util"),C4=w(Q());cD();lD=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"}},uD=class extends Error{static{o(this,"InvariantUninitializedOptionsWatcherError")}constructor(){super("Invariant: OptionsWatcher has not been initialized yet. This should never happen."),this.name="InvariantUninitializedOptionsWatcherError"}},dD=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"}},fD=class extends Error{static{o(this,"KeyDoesNotExistError")}constructor(t,r){super(`Cannot set property ${t.join(".")} as ${r} does not exist.`),this.name="KeyDoesNotExistError"}},mD=class extends Error{static{o(this,"CannotSetPropertyError")}constructor(t){super(`Cannot set property ${t.join(".")} as parent is not an object.`),this.name="CannotSetPropertyError"}},ly=class extends uy.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||C4.default.loggerWithTag(t),this.ready=(0,uy.once)(this,"ready"),this.#t=N4.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,w4.readFile)(this.#e,"utf-8").then(t=>{this.#n=I4.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 lD(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=cy,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,O4.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 uD;if(!["object","string","array","number","boolean","undefined"].includes(typeof r))throw new dD(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 fD(t,s);n=n[s]}if(n==null||typeof n!="object")throw new mD(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 L4(){eAe[0]=1}var Zye,eAe,D4=ce(()=>{Up();Zye=Zo.primaryStore.getUserSharedBuffer("restart-needed",new ArrayBuffer(1)),eAe=new Uint8Array(Zye);o(L4,"requestRestart")});var my,M4,dy,fy,v4=ce(()=>{my=require("node:events");b4();P4();M4=w(Q());D4();dy=class extends Error{static{o(this,"MissingDefaultFilesOptionError")}constructor(){super("No default files option exists. Ensure `files` is specified in config.yaml"),this.name="MissingDefaultFilesOptionError"}},fy=class extends my.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=M4.default.forComponent(this.#r),this.resources=s,this.server=i,this.#s=[],this.ready=(0,my.once)(this,"ready"),this.options=new ly(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 oy(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 dy);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 dy);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}`),L4()}}});function hu(e){return typeof e=="string"&&e.trim()!==""}function hD(e){return Array.isArray(e)&&e.length!==0&&e.every(t=>hu(t))}function F4(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function tAe(e){e.config.root&&SE.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 RD(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(F4(e.config.files)&&e.config.files.only==="files")return!1;t=e.patternBases}let s=!1;for(let i of t){let a=(0,TE.join)(e.directory,i);hy.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 H4(e){let t=!1;if(t=await tAe(e),t)return t;let r=await(0,U4.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,TE.join)(e.directory,n.path);if(n.dirent.isDirectory()){let i=mu(e,n.path,"directory");hy.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,x4.readFile)(s);hy.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 SE.default.error(`Entry received from glob pattern match for component ${e.name} is neither a file nor a directory:`,n)}return t}var hy,U4,SE,TE,x4,B4,py,Oi,pD,ED,_D,gD,SD,TD,RD,yD,AD,k4=ce(()=>{hy=require("node:worker_threads"),U4=w(require("fast-glob")),SE=w(Q());nD();sD();TE=require("node:path"),x4=require("node:fs/promises");oD();B4=require("micromatch"),py=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)&&!hD(this.config.files)&&!F4(this.config.files))throw new pD(this);if(typeof this.config.files=="object"&&!Array.isArray(this.config.files)){if(this.config.files.source===void 0||!hD(this.config.files.source)&&!hu(this.config.files.source))throw new ED(this);if(this.config.files.only!==void 0&&(typeof this.config.files.only!="string"||!["all","files","directories"].includes(this.config.files.only)))throw new _D(this);if(this.config.files.ignore!==void 0&&!hD(this.config.files.ignore)&&!hu(this.config.files.ignore))throw new gD(this)}if(this.config.root!==void 0&&!hu(this.config.root))throw new TD(this);if(this.config.path!==void 0&&!hu(this.config.path))throw new yD(this);if(this.config.path&&(SE.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 AD(this);this.globOptions=iy(this.config.files),this.globOptions.source=this.globOptions.source.map(r=>{if(r.includes(".."))throw new SD(this,r);return r.startsWith("/")&&(SE.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,B4.scan)(r).base),this.baseURLPath=sy(this.name,this.config.urlPath)}},Oi=class extends Error{static{o(this,"ComponentV1ProcessingError")}constructor(t,r){super(`Component ${r.name} (from ${(0,TE.basename)(r.directory)}) ${t}`)}},pD=class extends Oi{static{o(this,"InvalidFilesOptionError")}constructor(t){super("'files' option must be a non-empty string, an array of non-empty strings, or an object.",t)}},ED=class extends Oi{static{o(this,"InvalidFilesSourceOptionError")}constructor(t){super("'files' object must have a non-empty 'source' property.",t)}},_D=class extends Oi{static{o(this,"InvalidFilesOnlyOptionError")}constructor(t){super("'files.only' option must be one of 'all', 'files', or 'directories'.",t)}},gD=class extends Oi{static{o(this,"InvalidFileIgnoreOptionError")}constructor(t){super("'files.ignore' option must be a non-empty string or an array of non-empty strings.",t)}},SD=class extends Oi{static{o(this,"InvalidGlobPattern")}constructor(t,r){super(`'files' glob pattern must not contain '..'. Received: '${r}'`,t)}},TD=class extends Oi{static{o(this,"InvalidRootOptionError")}constructor(t){super("deprecated 'root' option must be a non-empty string. Consider removing and updating 'files' glob pattern instead.",t)}},RD=class extends Oi{static{o(this,"InvalidRootOptionUseError")}constructor(t){super("the 'root' option is deprecated and only supported if 'files' is a singular, non-empty string. Please remove the 'root' option and modify the 'files' glob pattern instead.",t)}},yD=class extends Oi{static{o(this,"InvalidPathOptionError")}constructor(t){super("deprecated 'path' option must be a non-empty string. Consider replacing with 'urlPath'.",t)}},AD=class extends Oi{static{o(this,"InvalidURLPathOptionError")}constructor(t){super("'urlPath' option must be a non-empty string that must not contain '..'.",t)}};o(hu,"isNonEmptyString");o(hD,"isArrayOfNonEmptyStrings");o(F4,"isObject");o(tAe,"handleRoots");o(H4,"processResourceExtensionComponent")});var Op={};we(Op,{componentErrors:()=>RE,getComponentName:()=>VR,loadComponent:()=>Sy,loadComponentDirectories:()=>$4,setErrorReporter:()=>nAe});function $4(e,t){t&&(ID=t),e&&(CD=e);let r=[];if((0,vt.existsSync)(bD)){let s=(0,vt.readdirSync)(bD,{withFileTypes:!0});for(let i of s){if(!i.isDirectory()&&!i.isSymbolicLink())continue;let a=i.name,c=(0,kr.join)(bD,a);r.push(Sy(c,ID,Ky,!1))}}let n=process.env.RUN_HDB_APP;return n&&r.push(Sy(n,ID,n,!1,void 0,!!process.env.DEV_MODE)),Promise.all(r).then(()=>{q4=!0})}function nAe(e){_y=e}function sAe(e,t){return new Promise((r,n)=>{let s=setTimeout(()=>{Zo.primaryStore.unlock(e,0),n(new Error("symlinking harperdb module timed out"))},1e4);if(Zo.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)(LD.PACKAGE_ROOT,t,"dir"),r()}finally{Zo.primaryStore.unlock(e,0)}})}function V4(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(!Zo.primaryStore.attemptLock(e.name,0,()=>{clearTimeout(s),n(V4(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(()=>{Zo.primaryStore.unlock(e.name,0),clearTimeout(i)})})}async function Sy(e,t,r,n,s,i){let a=(0,vt.realpathSync)(e);if(Ey.has(a))return Ey.get(a);Ey.set(a,!0),s&&(CD=s);try{let c;n&&(RE=new Map);let l=(0,kr.join)(e,"harperdb-config.yaml");(0,vt.existsSync)(l)?c=n?(0,Ty.getConfigObj)():(0,wD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():!n&&(0,vt.existsSync)(l=(0,kr.join)(e,"config.yaml"))?c=(0,wD.parseDocument)((0,vt.readFileSync)(l,"utf8")).toJSON():c=cy;try{let m=(0,kr.join)(e,"node_modules","harperdb");(n||((0,vt.existsSync)(m)||!e.startsWith((0,OD.getHdbBasePath)()))&&(!(0,vt.existsSync)(m)||(0,vt.realpathSync)(LD.PACKAGE_ROOT)!==(0,vt.realpathSync)(m)))&&await sAe(e,m)}catch(m){ha.default.error("Error symlinking harperdb module",m),m.code=="EPERM"&&process.platform==="win32"&&ha.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=gy,d={};for(let m in c){gy=m;let h=c[m];if(RE.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,OD.getHdbBasePath)().length){O=null;break}if(O)p=await Sy(O,t,r,!1),d[m]=!0;else throw new Error(`Unable to find package ${m}:${_}`)}else p=rAe[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&&ha.default.warn(`Plugin ${m} is using the experimental handleApplication API`);let N=new fy(m,e,l,t,Le);await V4(N,p);continue}if(ND.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&&!G4.includes(N)){let O=PD.get(U.HTTP_SESSIONAFFINITY);O&&ha.default.warn("Session affinity is not recommended and may cause memory leaks"),(O||!Qg)&&(G4.push(N),qL(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),CD.set(p,!0),(p.handleFile||p.handleDirectory||p.setupFile||p.setupDirectory)&&h.files!=null){let N=new py({config:h,name:m,directory:e,module:p,resources:t});d[m]=await H4(N)}}catch(g){g.message=`Could not load component '${m}' for application '${(0,kr.basename)(e)}' due to: ${g.message}`,_y?.(g),((0,yE.getWorkerIndex)()===0?console:ha.default).error(g),t.set(h.path||"/",new sl(g),null,!0),RE.set(n?m:(0,kr.basename)(e),g.message)}}if(gy=u,ND.isMainThread&&!q4&&i&&(0,yE.watchDir)(e,async()=>$4()),c.extensionModule||c.pluginModule){let m=await jg((0,kr.join)(e,c.extensionModule||c.pluginModule));return Ey.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?`;_y?.(new Error(m)),((0,yE.getWorkerIndex)()===0?console:ha.default).error(m),RE.set((0,kr.basename)(e),m)}for(let[m,h]of Object.entries(d))h||ha.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}`,_y?.(c),t.set("",new sl(c))}}var vt,kr,ND,wD,PD,LD,ha,yE,OD,Ty,bD,CD,q4,ID,RE,rAe,G4,Ey,_y,gy,VR,lf=ce(()=>{vt=require("node:fs"),kr=require("node:path"),ND=require("node:worker_threads"),wD=require("yaml"),PD=w(oe()),LD=w(bt());k();Pk();kk();eG();aG();cG();RG();hj();Tj();yj();ha=w(Q());Lj();yE=w(nt());xN();Dr();Me();bL();OD=w(oe());VQ();PT();XQ();ss();f4();Ty=w(It());wh();ib();v4();k4();UL();Up();cD();bD=(0,Ty.resolvePath)(PD.get(U.COMPONENTSROOT)),CD=new Map,RE=new Map;o($4,"loadComponentDirectories");rAe={REST:Xg,rest:Xg,graphql:ON,graphqlSchema:NN,roles:UN,jsResource:BN,fastifyRoutes:qP,login:HN,static:$P,operationsApi:VL,customFunctions:{},http:$R,clustering:QL,replication:Go,authentication:Rp,mqtt:tD,loadEnv:VP,logging:ha.default,dataLoader:WP},G4=[],Ey=new Map;o(nAe,"setErrorReporter");VR=o(()=>gy,"getComponentName");o(sAe,"symlinkHarperModule");o(V4,"sequentiallyHandleApplication");o(Sy,"loadComponent")});var YR=M((lke,Y4)=>{var{isMainThread:K4}=require("worker_threads"),{getTables:iAe,getDatabases:ake,table:cke}=(Me(),v(Et)),{loadComponentDirectories:oAe,loadComponent:aAe}=(lf(),v(Op)),{resetResources:cAe}=(Gu(),v(xU)),lAe=bC(),uAe=It(),{dirname:dAe}=require("path"),{getConnection:fAe}=mr(),mAe=oe(),{CONFIG_PARAMS:hAe}=(k(),v(W)),{loadCertificates:pAe}=os(),DD=new Map;async function EAe(e=!1){!K4&&mAe.get(hAe.CLUSTERING_ENABLED)&&fAe();try{K4&&await lAe()}catch(n){console.error(n)}let t=cAe();iAe(),t.isWorker=e,await pAe(),await aAe(dAe(uAe.getConfigFilePath()),t,"hdb",!0,DD),await oAe(DD,t);let r=[];for(let[n]of DD)n.ready&&r.push(n.ready());r.length>0&&await Promise.all(r)}o(EAe,"loadRootComponents");Y4.exports.loadRootComponents=EAe});var nt=M((dke,Pi)=>{"use strict";fA();var{Worker:_Ae,MessageChannel:gAe,parentPort:mo,isMainThread:BD,threadId:SAe,workerData:ho}=require("worker_threads"),{PACKAGE_ROOT:TAe}=bt(),{join:Q4,isAbsolute:RAe,extname:yAe}=require("path"),{server:J4}=(Dr(),v(jf)),{watch:AAe,readdir:bAe}=require("fs/promises"),{totalmem:W4}=require("os"),{setHeapSnapshotNearHeapLimit:IAe}=require("v8"),Nc=(k(),v(W)),Ay=oe(),Ci=Q(),{randomBytes:NAe}=require("crypto"),{_assignPackageExport:wAe}=ei(),z4=1024*1024,wc=[],Qs=[],OAe=50,FD=1e4,CAe="restart",X4="request_thread_info",Z4="resource_report",eJ="thread_info",tJ="added-port",PAe="ack",MD;wAe("threads",Qs);Pi.exports={startWorker:vD,restartWorkers:kD,shutdownWorkers:UAe,workers:wc,setMonitorListener:$Ae,onMessageFromWorkers:xAe,onMessageByType:cJ,broadcast:FAe,broadcastWithAcknowledgement:kAe,setChildListenerByType:vAe,getWorkerIndex:rJ,getWorkerCount:nJ,getTicketKeys:iJ,setMainIsWorker:DAe,setTerminateTimeout:LAe,restartNumber:ho?.restartNumber||1};Qs.onMessageByType=cJ;Qs.sendToThread=function(e,t){if(!t?.type)throw new Error("A message with a type must be provided");let r=Qs.find(n=>n.threadId===e);if(r)return r.postMessage(t),!0};Pi.exports.whenThreadsStarted=new Promise(e=>{Pi.exports.threadsHaveStarted=e});Ay.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&IAe(1);var HD;function LAe(e){FD=e}o(LAe,"setTerminateTimeout");function rJ(){return ho?ho.workerIndex:HD?0:void 0}o(rJ,"getWorkerIndex");function nJ(){return ho?ho.workerCount:HD?1:void 0}o(nJ,"getWorkerCount");function DAe(e){HD=e,Pi.exports.threadsHaveStarted()}o(DAe,"setMainIsWorker");var sJ=1,Ry;function iJ(){return Ry||(Ry=BD?NAe(48):ho.ticketKeys,Ry)}o(iJ,"getTicketKeys");Object.defineProperty(J4,"workerIndex",{get(){return rJ()}});Object.defineProperty(J4,"workerCount",{get(){return nJ()}});var oJ={[X4](e,t){GAe(t)},[Z4](e,t){qAe(t,e)}};function vD(e,t={}){let r=process.constrainedMemory?.()||W4();r=Math.min(r,W4(),2e4*z4);let n=Ay.get(Nc.CONFIG_PARAMS.THREADS_MAXHEAPMEMORY)??Math.max(Math.floor(r/z4/(10+(t.threadCount||1)/4)),512),s=Math.min(Math.max(n>>6,16),64),i=[],a=[];for(let u of Qs){let d=new gAe;d.existingPort=u,i.push(d),a.push(d.port2)}yAe(e)||(e+=".js");let c=["--enable-source-maps","--expose-internals"];Ay.get(Nc.CONFIG_PARAMS.THREADS_HEAPSNAPSHOTNEARLIMIT)&&c.push("--heapsnapshot-near-heap-limit=1");let l=new _Ae(RAe(e)?e:Q4(TAe,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:sJ=t.threadCount,name:t.name,restartNumber:Pi.exports.restartNumber,ticketKeys:iJ()},transferList:a,...t});for(let{port1:u,existingPort:d}of i)d.postMessage({type:tJ,port:u,threadId:l.threadId},[u]);return by(l,!0),l.unexpectedRestarts=t.unexpectedRestarts||0,l.startCopy=()=>vD(e,t),l.on("error",u=>{Ci.error(`Worker index ${t.workerIndex} error:`,u)}),l.on("exit",u=>{wc.splice(wc.indexOf(l),1),!l.wasShutdown&&t.autoRestart!==!1&&(l.unexpectedRestarts<OAe?(t.unexpectedRestarts=l.unexpectedRestarts+1,vD(e,t)):Ci.error(`Thread has been restarted ${l.restarts} times and will not be restarted`))}),l.on("message",u=>{oJ[u.type]?.(u,l)}),wc.push(l),KAe(),t.onStarted&&t.onStarted(l),l.name=t.name,l}o(vD,"startWorker");var MAe=[Nc.THREAD_TYPES.HTTP];async function kD(e=null,t=Math.max(sJ>3,1),r=!0){if(BD){try{process.chdir(process.cwd())}catch(a){Ci.error("Unable to reestablish current working directory",a)}if(r){let{loadRootComponents:a}=YR();await a()}Pi.exports.restartNumber++,t<1&&(t=t*wc.length);let n=[],s=[];for(let a of wc.slice(0)){if(e&&a.name!==e||a.wasShutdown)continue;Ci.trace("sending shutdown request to ",a.threadId),a.postMessage({restartNumber:Pi.exports.restartNumber,type:Nc.ITC_EVENT_TYPES.SHUTDOWN}),a.wasShutdown=!0,a.emit("shutdown",{});let c=MAe.indexOf(a.name)>-1,l=new Promise(u=>{let d=setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate, terminating from the outside",a.threadId),a.terminate()},FD*2).unref();a.on("exit",()=>{clearTimeout(d),n.splice(n.indexOf(l)),!c&&r&&a.startCopy(),u()})});if(n.push(l),c&&r){let u=a.startCopy(),d=new Promise(f=>{let m=o(h=>{h.type===Nc.ITC_EVENT_TYPES.CHILD_STARTED&&(Ci.trace("Worker has started",u.threadId),f(),s.splice(s.indexOf(d)),u.off("message",m))},"startListener");Ci.trace("Waiting for worker to start",u.threadId),u.on("message",m)});s.push(d),n.length>=t&&await Promise.race(n),s.length>=t&&await Promise.race(s)}}await Promise.all(n),await Promise.all(s);let{restartService:i}=sf();r&&(e==="http"||!e)&&Ay.get(Nc.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await i({service:"clustering"})}else mo.postMessage({type:CAe,workerType:e})}o(kD,"restartWorkers");function vAe(e,t){oJ[e]=t}o(vAe,"setChildListenerByType");function UAe(e){return kD(e,1/0,!1)}o(UAe,"shutdownWorkers");var aJ=[];function xAe(e){aJ.push(e)}o(xAe,"onMessageFromWorkers");var UD=new Map;function cJ(e,t){let r=UD.get(e);r||UD.set(e,r=[]),r.push(t)}o(cJ,"onMessageByType");var BAe=10;async function FAe(e,t){let r=0;for(let n of Qs)try{n.postMessage(e),r++>BAe&&(r=0,await new Promise(setImmediate))}catch(s){Ci.error("Unable to send message to worker",s)}t&&uJ(e,null)}o(FAe,"broadcast");var yy=new Map,HAe=1;function kAe(e){return new Promise(t=>{let r=0;for(let n of Qs)try{let s=HAe++,i=o(()=>{yy.delete(s),--r===0&&t(),n!==mo&&--n.refCount===0&&n.unref()},"ackHandler");i.port=n,n.ref(),n.refCount=(n.refCount||0)+1,yy.set(e.requestId=s,i),n.hasAckCloseListener||(n.hasAckCloseListener=!0,n.on(n.close?"close":"exit",()=>{for(let[,a]of yy)a.port===n&&a()})),n.postMessage(e),r++}catch(s){Ci.error("Unable to send message to worker",s)}r===0&&t()})}o(kAe,"broadcastWithAcknowledgement");function GAe(e){e.postMessage({type:eJ,workers:lJ()})}o(GAe,"sendThreadInfo");function lJ(){let e=Date.now();return wc.map(t=>({threadId:t.threadId,name:t.name,heapTotal:t.resources?.heapTotal,heapUsed:t.resources?.heapUsed,externalMemory:t.resources?.external,arrayBuffers:t.resources?.arrayBuffers,sinceLastUpdate:e-t.resources?.updated,...t.recentELU}))}o(lJ,"getChildWorkerInfo");function qAe(e,t){e.resources=t,e.resources.updated=Date.now()}o(qAe,"recordResourceReport");var xD;function $Ae(e){xD=e}o($Ae,"setMonitorListener");var VAe=1e3,j4=!1;function KAe(){j4||(j4=!0,setInterval(()=>{for(let e of wc){let t=e.performance.eventLoopUtilization(),r;e.lastTotalELU?r=e.performance.eventLoopUtilization(t,e.lastTotalELU):r=t,e.lastTotalELU=t,e.recentELU=r}xD&&xD()},VAe).unref())}o(KAe,"startMonitoring");var YAe=1e3;if(mo&&ho?.addPorts){by(mo);for(let e=0,t=ho.addPorts.length;e<t;e++){let r=ho.addPorts[e];r.threadId=ho.addThreadIds[e],by(r)}setInterval(()=>{let e=process.memoryUsage();mo.postMessage({type:Z4,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers})},YAe).unref(),MD=o(()=>new Promise((e,t)=>{mo.on("message",r),mo.postMessage({type:X4});function r(n){n.type===eJ&&(mo.off("message",r),e(n.workers))}o(r,"receiveThreadInfo")}),"getThreadInfo")}else MD=lJ;Pi.exports.getThreadInfo=MD;function by(e,t){Qs.push(e),e.on("message",r=>{if(r.type===tJ)r.port.threadId=r.threadId,by(r.port);else if(r.type===PAe){let n=yy.get(r.id);n&&n()}else uJ(r,e)}).on("close",()=>{Qs.splice(Qs.indexOf(e),1)}).on("exit",()=>{Qs.splice(Qs.indexOf(e),1)}),t?e.refCount=100:e.unref()}o(by,"addPort");function uJ(e,t){for(let n of aJ)n(e,t);let r=UD.get(e.type);if(r)for(let n of r)try{n(e,t)}catch(s){Ci.error(s)}}o(uJ,"notifyMessageListeners");if(BD){let e,t,r=new Set,n=o(async(s,i)=>{i&&(e=i);for(let a of await bAe(s,{withFileTypes:!0}))a.isDirectory()&&a.name!=="node_modules"&&n(Q4(s,a.name));try{for await(let{filename:a}of AAe(s,{persistent:!1}))r.add(a),t&&clearTimeout(t),t=setTimeout(async()=>{e&&await e(),await kD(),console.log("Reloaded HarperDB components, changed files:",Array.from(r)),r.clear()},100)}catch(a){console.warn("Error trying to watch component directory",s,a)}},"watchDir");Pi.exports.watchDir=n,process.env.WATCH_DIR&&n(process.env.WATCH_DIR)}else mo.on("message",async e=>{let{type:t}=e;t===Nc.ITC_EVENT_TYPES.SHUTDOWN&&(Pi.exports.restartNumber=e.restartNumber,mo.unref(),setTimeout(()=>{Ci.warn("Thread did not voluntarily terminate",SAe),process.exit(0)},FD).unref())})});var EJ=M((pke,pJ)=>{"use strict";var{promises:vf,createReadStream:WAe,createWriteStream:zAe}=require("fs"),{createGzip:jAe}=require("zlib"),{promisify:QAe}=require("util"),{pipeline:JAe}=require("stream"),XAe=QAe(JAe),qD=require("path"),hJ=oe();hJ.initSync();var Iy=Q(),{CONFIG_PARAMS:ZAe,ITC_EVENT_TYPES:mke}=(k(),v(W)),{onMessageFromWorkers:hke}=nt(),{convertToMS:dJ}=ie(),{onStorageReclamation:ebe}=(g_(),v(iU)),tbe=6e4,rbe="'interval' and 'maxSize' are both undefined, to enable logging rotation at least one of these values must be defined in harperdb-config.yaml",nbe="'logging.rotation.path' is undefined, to enable logging rotation set this value in harperdb-config.yaml",GD,fJ;pJ.exports=sbe;function sbe({logger:e,maxSize:t,interval:r,retention:n,enabled:s,path:i,auditInterval:a}){if(s===!1)return;let c=0;if(ebe(e.path,f=>{c=f},!0),!t&&!r)throw new Error(rbe);if(!i)throw new Error(nbe);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=dJ(r));let d;return GD=Date.now(),Iy.trace("Log rotate enabled, maxSize:",t,"interval:",r),fJ=setInterval(async()=>{if(l){let f;f=await vf.stat(e.path),f.size>=l&&(d=await mJ(e.path,i))}if(u&&Date.now()-GD>=u&&(d=await mJ(e.path,i),GD=Date.now()),n||c){let f=dJ(n??"1M")/(1+c);c=0;let m=await vf.readdir(i);for(let h of m)try{let p=await vf.stat(qD.join(i,h));Date.now()-p.mtimeMs>f&&await vf.unlink(qD.join(i,h))}catch(p){Iy.error("Error trying to remove log",h,p)}}},a??tbe).unref(),{end(){clearInterval(fJ)},getLastRotatedLogPath(){return d}}}o(sbe,"logRotator");async function mJ(e,t){let r=hJ.get(ZAe.LOGGING_ROTATION_COMPRESS),n=qD.join(t,`HDB-${new Date(Date.now()).toISOString().replaceAll(":","-")}.log`);return await vf.rename(e,n),r&&(e=n,n+=".gz",await XAe(WAe(e),jAe(),zAe(n)),await vf.unlink(e)),Iy.closeLogFile(),Iy.notify(`hdb.log rotated, old log moved to ${n}`),n}o(mJ,"moveLogFile")});var RJ={};we(RJ,{RootConfigWatcher:()=>$D});var _J,gJ,SJ,Ny,TJ,$D,yJ=ce(()=>{_J=w(require("chokidar")),gJ=require("node:fs/promises"),SJ=w(It()),Ny=require("node:stream"),TJ=require("yaml"),$D=class extends Ny.EventEmitter{static{o(this,"RootConfigWatcher")}#e;#t;#r;constructor(){super(),this.#e=(0,SJ.getConfigFilePath)(),this.#t=_J.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,gJ.readFile)(this.#e,"utf-8").then(t=>{if(!t)return;let r=(0,TJ.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,Ny.once)(this,"ready")}close(){return this.#t.close(),this.#r=void 0,this.emit("close"),this.removeAllListeners(),this}get config(){return this.#r}}});var Q=M((Tke,vy)=>{"use strict";var pa=require("fs-extra"),{workerData:ibe,threadId:obe,isMainThread:CJ}=require("worker_threads"),IE=require("path"),PJ=require("yaml"),LJ=require("properties-reader"),Gr=(k(),v(W)),AJ=Bc(),abe=require("os"),{PACKAGE_ROOT:QD}=bt(),{_assignPackageExport:cbe}=ei(),{Console:lbe}=require("console"),bJ=process.stdout.nativeWrite||(process.stdout.nativeWrite=process.stdout.write),IJ=new Map,{join:Ea}=IE,NJ=1e4,ar={notify:7,fatal:6,error:5,warn:4,info:3,debug:2,trace:1},ube={STDOUT:"stdOut",STDERR:"stdErr"},Ske=Ea(QD,"logs"),dbe=Ea(QD,"config/yaml/",Gr.HDB_DEFAULT_CONFIG_FILE),fbe=1e4,NE,wE,wy,po,KD,VD,Cy,Ut,kn,Py,Ly,Uf,bE,AE;function Oy(e,t,r){e.rotation=t.rotation;let n=t.path;n?t.root||(t.root=IE.dirname(n)):t.root?n=Ea(t.root,KD):(n=Ut.path,t.root||(t.root=IE.dirname(n))),n?e.path=n:console.error("No path for logger",t),e.level=ar[t.level]??Ut?.level??ar.info,DJ(e),e.logToStdstreams=t.stdStreams??!1,e.tag=t.tag??(Ut.path===e.path&&r)}o(Oy,"updateLogger");function DJ(e){let t=e.conditional??(e.conditional={});t.notify=ar.notify>=e.level?e.notify.bind(e):void 0,t.fatal=ar.fatal>=e.level?e.fatal.bind(e):void 0,t.error=ar.error>=e.level?e.error.bind(e):void 0,t.warn=ar.warn>=e.level?e.warn.bind(e):void 0,t.info=ar.info>=e.level?e.info.bind(e):void 0,t.debug=ar.debug>=e.level?e.debug.bind(e):void 0,t.trace=ar.trace>=e.level?e.trace.bind(e):void 0}o(DJ,"updateConditional");async function YD(){AE||(AE=new Lbe,await AE.ready(),AE.on("change",YD));let e=AE.config,t=e.logging??{};Oy(Ut,t),Cy=Ut.path,NE=t.console??!1,t.external&&Oy(kn,t.external);for(let r in e){let n=e[r];n.logging?Oy(Ut.forComponent(r),n.logging,r):Ut.hasComponent(r)&&Oy(Ut.forComponent(r),t,r)}}o(YD,"updateLogSettings");var WD=class extends lbe{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){Tn="trace",this.level<=ar.trace&&super.info(...t),Tn="info"}debug(...t){Tn="debug",this.level<=ar.debug&&super.info(...t),Tn="info"}info(...t){Tn="info",this.level<=ar.info&&super.info(...t),Tn="info"}warn(...t){Tn="warn",this.level<=ar.warn&&super.warn(...t),Tn="info"}error(...t){Tn="error",this.level<=ar.error&&super.error(...t),Tn="info"}fatal(...t){Uf=!0;try{Tn="fatal",this.level<=ar.fatal&&super.error(...t),Tn="info"}finally{Uf=!1}}notify(...t){Uf=!0;try{Tn="notify",this.level<=ar.notify&&super.info(...t),Tn="info"}finally{Uf=!1}}withTag(t){return vJ(t,!0,this)}forComponent(t){return this}hasComponent(t){return!1}};bE===void 0&&MJ();vy.exports={notify:Tbe,fatal:Rbe,error:jD,warn:ybe,info:_be,debug:Sbe,trace:gbe,logLevel:po,loggerWithTag:vJ,suppressLogging:pbe,initLogSettings:MJ,logCustomLevel:Abe,closeLogFile:UJ,createLogger:My,logsAtLevel:mbe,getLogFilePath:o(()=>Cy,"getLogFilePath"),forComponent:o(e=>Ut.forComponent(e),"forComponent"),setMainLogger:Cbe,setLogLevel:Ibe,OUTPUTS:ube,AuthAuditLog:Pbe,start:YD,startOnMainThread:YD,errorToString:Obe};vy.exports.externalLogger={notify(...e){kn.notify(...e)},fatal(...e){kn.fatal(...e)},error(...e){kn.error(...e)},warn(...e){kn.warn(...e)},info(...e){kn.info(...e)},debug(...e){kn.debug(...e)},trace(...e){kn.trace(...e)},withTag(e){return kn.withTag(e)},loggerWithTag(e){return kn.withTag(e)}};cbe("logger",vy.exports.externalLogger);function mbe(e){return ar[po]<=ar[e]}o(mbe,"logsAtLevel");function MJ(e=!1){try{if(bE===void 0||e){UJ();let t=bbe(),r=AJ(["ROOTPATH"]);try{bE=LJ(t)}catch(s){if(!r.ROOTPATH||r.ROOTPATH&&!pa.pathExistsSync(Ea(r.ROOTPATH,Gr.HDB_CONFIG_FILE)))throw s}let n;if({level:po,configLogPath:VD,toFile:wE,logConsole:NE,rotation:n,toStream:wy}=Nbe(r.ROOTPATH?Ea(r.ROOTPATH,Gr.HDB_CONFIG_FILE):bE.get("settings_path")),KD=Gr.LOG_NAMES.HDB,Cy=Ea(VD,KD),Ut=My({path:Cy,level:po,stdStreams:wy,rotation:n}),kn=Ut.forComponent("external"),kn.tag=null,CJ)try{require("segfault-handler").registerHandler(Ea(VD,"crash.log"))}catch{}}}catch(t){if(bE=void 0,t.code===Gr.NODE_ERROR_CODES.ENOENT||t.code===Gr.NODE_ERROR_CODES.ERR_INVALID_ARG_TYPE){let r=AJ(Object.keys(Gr.CONFIG_PARAM_MAP),!0);for(let s in r){let i=Gr.CONFIG_PARAM_MAP[s];i&&i.toLowerCase();let a=r[s];if(i===Gr.CONFIG_PARAMS.LOGGING_LEVEL){po=a;continue}i===Gr.CONFIG_PARAMS.LOGGING_CONSOLE&&(NE=i)}let{defaultLevel:n}=wbe();wE=!1,wy=!0,po=po===void 0?n:po,Ut=My({level:po}),kn=Ut.forComponent("external"),kn.tag=null;return}throw jD("Error initializing log settings"),jD(t),t}process.env.DEV_MODE&&(wy=!0),hbe()}o(MJ,"initLogSettings");var Oc=!0;function hbe(){wE&&(process.stdout.write=function(e){return typeof e=="string"&&Oc&&NE&&(e=e.toString(),e[e.length-1]===`
|
|
127
127
|
`&&(e=e.slice(0,-1)),Ly(e)),bJ.apply(process.stdout,arguments)},process.stderr.write=function(e){return typeof e=="string"&&Oc&&NE&&(e[e.length-1]===`
|
|
128
128
|
`&&(e=e.slice(0,-1)),Ly(e)),bJ.apply(process.stderr,arguments)})}o(hbe,"stdioLogging");function vJ(e,t,r=Ut){return e=e.replace(/ /g,"-"),{notify:n(r.notify,"notify"),fatal:n(r.fatal,"fatal"),error:n(r.error,"error"),warn:n(r.warn,"warn"),info:n(r.info,"info"),debug:n(r.debug,"debug"),trace:n(r.trace,"trace")};function n(s,i){return!t||r.level<=ar[i]?function(...a){Dy=e;try{return s.call(r,...a)}finally{Dy=void 0}}:null}o(n,"logWithTag")}o(vJ,"loggerWithTag");function pbe(e){try{Oc=!1,e()}finally{Oc=!0}}o(pbe,"suppressLogging");var Ebe=ibe?.name?.replace(/ /g,"-")||"main",Tn="info",zD,Dy;function My({path:e,level:t,stdStreams:r,rotation:n,isExternalInstance:s,writeToLog:i,component:a}){t||(t="info");let c=ar[t],l;function u(h){if(wE)if(l.logToStdstreams){f(h.replace(/\x1b\[[0-9;]*m/g,"")),Oc=!1;try{process.stdout.write(h)}finally{Oc=!0}}else f(h);else r&&process.stdout.write(h)}o(u,"logStdOut");function d(h){if(wE){if(f(h),r){Oc=!1;try{process.stderr.write(h)}finally{Oc=!0}}}else r&&process.stderr.write(h)}o(d,"logStdErr");let f=e&&OJ(e,n,s);function m(h){return{write(p){let _=[Tn];_.unshift(zD||Ebe+"/"+obe),Dy&&_.push(Dy),l.tag&&_.push(l.tag),h(`[${_.join("] [")}]: ${p}`)}}}if(o(m,"logPrepend"),s&&(Ly=f),l=new WD({stdout:m(i??u),stderr:m(i??d),colorMode:r??!1},c),DJ(l),l.path=e,Object.defineProperty(l,"path",{get(){return e},set(h){e=h,f=OJ(e,l.rotation,s),s&&(Ly=f)},enumerable:!0}),l.closeLogFile=f?.closeLogFile,l.logToStdstreams=r,!a){let h=new Map;l.forComponent=function(p){let _=h.get(p);return _||(_=My({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(My,"createLogger");var wJ=100;function OJ(e,t,r){let n=IJ.get(e),s,i,a,c,l=0;n||(n=d,n.closeLogFile=m,n.path=e,IJ.set(e,n)),CJ&&JSON.stringify(t)!==JSON.stringify(n.rotation)&&(n.rotation=t,setTimeout(()=>{if(n.rotator?.end(),!t)return;let p=EJ();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
|
`)?"":`
|