equipped 5.0.8 → 5.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/cjs/cache.cjs +2 -2
- package/dist/cjs/{chunk-UBQPLHM4.cjs → chunk-46TJFKXX.cjs} +3 -3
- package/dist/cjs/chunk-46TJFKXX.cjs.map +1 -0
- package/dist/cjs/dbs.cjs +2 -2
- package/dist/cjs/errors.cjs +2 -2
- package/dist/cjs/events.cjs +2 -2
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/jobs.cjs +2 -2
- package/dist/cjs/server.cjs +2 -2
- package/dist/cjs/utilities.cjs +2 -2
- package/dist/cjs/validations.cjs +2 -2
- package/dist/esm/cache.min.mjs +1 -1
- package/dist/esm/cache.mjs +1 -1
- package/dist/esm/chunk-7LLFKFXJ.min.mjs +32 -0
- package/dist/esm/chunk-7LLFKFXJ.min.mjs.map +1 -0
- package/dist/esm/{chunk-SHJLDB4M.mjs → chunk-DXTIVHEC.mjs} +3 -3
- package/dist/esm/chunk-DXTIVHEC.mjs.map +1 -0
- package/dist/esm/dbs.min.mjs +1 -1
- package/dist/esm/dbs.mjs +1 -1
- package/dist/esm/errors.min.mjs +1 -1
- package/dist/esm/errors.mjs +1 -1
- package/dist/esm/events.min.mjs +1 -1
- package/dist/esm/events.mjs +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/jobs.min.mjs +1 -1
- package/dist/esm/jobs.mjs +1 -1
- package/dist/esm/server.min.mjs +1 -1
- package/dist/esm/server.mjs +1 -1
- package/dist/esm/utilities.min.mjs +1 -1
- package/dist/esm/utilities.mjs +1 -1
- package/dist/esm/validations.min.mjs +1 -1
- package/dist/esm/validations.mjs +1 -1
- package/dist/types/cache.js +1 -1
- package/dist/types/{chunk-XNSFFTXR.js → chunk-SK64OMPG.js} +2 -2
- package/dist/types/dbs.js +1 -1
- package/dist/types/errors.js +1 -1
- package/dist/types/events.js +1 -1
- package/dist/types/{index-D-NoC-on.d.ts → index-DNvs4IZN.d.ts} +3 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/jobs.js +1 -1
- package/dist/types/server.d.ts +2 -2
- package/dist/types/server.js +1 -1
- package/dist/types/utilities.js +1 -1
- package/dist/types/validations.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/chunk-UBQPLHM4.cjs.map +0 -1
- package/dist/esm/chunk-SHJLDB4M.mjs.map +0 -1
- package/dist/esm/chunk-WKZT3EQO.min.mjs +0 -32
- package/dist/esm/chunk-WKZT3EQO.min.mjs.map +0 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var at=Object.defineProperty;var W=(s,e)=>{for(var t in e)at(s,t,{get:e[t],enumerable:!0})};export*from"valleyed";var nt={};W(nt,{incomingFile:()=>tr,incomingFiles:()=>rr,requestLocalStorage:()=>ie,responseLocalStorage:()=>pe,withRequest:()=>sr,withResponse:()=>or});import{AsyncLocalStorage as st}from"async_hooks";import{PipeError as Se,v as O}from"valleyed";import{DataClass as er,v as rt}from"valleyed";async function G(s,e=t=>{throw t}){let t=s.reduce((o,a)=>{let n=a.order.toString();return o[n]||(o[n]=[]),o[n].push(a),o},{}),r=Object.keys(t).sort((o,a)=>parseInt(o)-parseInt(a)).map(o=>t[o]);for(let o of r)await Promise.all(o.map(async a=>{try{return typeof a.cb=="function"?await a.cb():await a.cb}catch(n){return e(n instanceof Error?n:new Error(`${n}`))}}))}import _ from"pino";import{v as c}from"valleyed";var X=class{};import{v as S}from"valleyed";var Y=S.meta(S.object({host:S.string(),port:S.optional(S.number()),password:S.optional(S.string()),username:S.optional(S.string()),tls:S.optional(S.boolean()),cluster:S.optional(S.boolean())}),{title:"Redis Config",$refId:"RedisConfig"});import{Cluster as Bt,Redis as Ft}from"ioredis";var g=class extends Error{constructor(t,r,o){super(t,{cause:o});this.message=t;this.context=r;this.cause=o}};var T=class extends g{constructor(t,r,o){super(t,{serializedErrors:r},o);this.message=t;this.serializedErrors=r}};import{Server as xt}from"socket.io";import kt from"supertest";import{PipeError as Tt,v as E}from"valleyed";var C={head:"head",get:"get",post:"post",put:"put",patch:"patch",delete:"delete",options:"options"},b={Ok:200,Found:302,BadRequest:400,NotAuthenticated:401,NotAuthorized:403,NotFound:404,ValidationError:422,TooManyRequests:429,AuthorizationExpired:461};function De(s,e){return{cb:s,onSetup:e}}var q=(...s)=>De(...s),yr=(...s)=>De(...s);var Ie=q(async s=>{let e=d.get().settings.server?.requestsAuth;if(!e)return;let{Authorization:t,ApiKey:r}=s.headers;function o(a){return function(n){s.users[a].error=n instanceof T?n:new Z("failed to parse auth user",n),s.users[a].error.context[a]=a}}e.tokens&&t?s.users.access.value=await e.tokens.verifyAccessToken(t).catch(o("access")):e.apiKey&&r&&(s.users.apiKey.value=await e.apiKey.verifyApiKey(r).catch(o("apiKey")))});import{convert as te}from"@openapi-contrib/json-schema-to-openapi-schema";import{capitalize as ct}from"valleyed";import{v as it}from"valleyed";function pt(...s){let e={params:"",headers:"",query:"",body:"",response:"",responseHeaders:"",defaultStatusCode:"",defaultContentType:"",context:""};function t(r,o){return r?o?typeof r=="number"||typeof r=="string"||typeof r=="function"?o:it.merge(r,o):r:o}return Object.fromEntries(Object.keys(e).map(r=>[r,s.map(o=>o[r]).reduce(t,null)]))}var Oe=(s,e)=>e.map(t=>({...s,...t,path:`${s.path}/${t.path}`,groups:[...s.groups??[],...t.groups??[]],middlewares:[...s.middlewares??[],...t.middlewares??[]],schema:pt(s.schema??{},t.schema??{}),security:[...s.security??[],...t.security??[]]})),ee=class{#e={path:""};#t=[];#r=[];constructor(e={path:""}){this.#e=e}#s(e){return(t,r={})=>o=>{let a=Oe(this.#e,[{...r,path:t,method:e,handler:o}])[0];return this.#t.push(a),a}}head=this.#s(C.head);get=this.#s(C.get);post=this.#s(C.post);put=this.#s(C.put);patch=this.#s(C.patch);delete=this.#s(C.delete);options=this.#s(C.options);nest(...e){e.forEach(t=>this.#r.push(t))}get routes(){return[...this.#t].concat(this.#r.flatMap(e=>Oe(this.#e,e.routes)))}};var re=class{constructor(e){this.config=e;this.#r={openapi:"3.0.0",info:{title:`${e.app.name} ${e.app.id}`,version:e.config.openapi.docsVersion??""},servers:e.config.openapi.docsBaseUrl?.map(t=>({url:t})),paths:{},components:{schemas:{},securitySchemes:{Authorization:{type:"apiKey",name:"authorization",in:"header"},RefreshToken:{type:"apiKey",name:"x-refresh-token",in:"header"},ApiKey:{type:"apiKey",name:"x-api-key",in:"header"}}},tags:[],"x-tagGroups":[]}}#e={};#t={};#r;cleanPath(e){let t=e.replace(/(\/\s*)+/g,"/");return t.startsWith("/")||(t=`/${t}`),t!=="/"&&t.endsWith("/")&&(t=t.slice(0,-1)),t}async register(e,t){if(e.hide)return;let r=this.#a(e.groups??[]),o=this.cleanPath(e.path),a=`(${e.method.toUpperCase()}) ${o}`;await this.#s(o,e.method.toLowerCase(),t,{operationId:a,summary:e.title??o,description:e.descriptions?.join(`
|
|
2
|
+
|
|
3
|
+
`),tags:r?[r]:void 0,security:e.security})}async#s(e,t,r,o){if(r.response.response?.length){o.responses??={};for(let p of r.response.response){o.responses[p.status]??={description:"",content:{}};let u=o.responses[p.status];u.content[p.contentType]={schema:await te(this.#o(p.schema))}}}if(r.response.responseHeaders?.length){o.responses??={};for(let p of r.response.responseHeaders){o.responses[p.status]??={description:"",content:{}},o.responses[p.status];let u=o.responses[p.status];u.headers={schema:await te(this.#o(p.schema))}}}r.request.body&&(o.requestBody={required:!0,content:{"application/json":{schema:await te(this.#o(r.request.body))}}});let a=[],n=async(p,u)=>{if(!u)return;let f=this.#n(u);for(let h of f)if(h.properties)for(let[P,y]of Object.entries(h.properties))a.push({name:P,in:p,schema:await te(this.#o(y)),required:(h.required||[]).includes(P)})};await Promise.all([n("query",r.request.query),n("path",r.request.params),n("header",r.request.headers)]),a.length&&(o.parameters=a);let i=this.#r;i.paths||(i.paths={}),i.paths[e]||(i.paths[e]={}),i.paths[e][t]=o}router(){let e="/openapi.json",t=new ee({path:this.config.config.openapi.docsPath??"/",hide:!0});return t.get("/")(r=>r.res({body:this.#i(`.${e}`),contentType:"text/html"})),t.get(e)(r=>r.res({body:this.#r})),t}#n(e){let{allOf:t,oneOf:r,anyOf:o,...a}=e;return t?t.flatMap(n=>this.#n(n)):[a]}#o(e){if(!e||typeof e!="object")return e;if(typeof e.$refId=="string"){let{$refId:t,...r}=e,o=this.#o(r);return this.#r.components?.schemas?(this.#r.components.schemas[t]=o,{$ref:`#/components/schemas/${t}`}):o}return Array.isArray(e)?e.map(t=>this.#o(t)):Object.fromEntries(Object.entries(e).map(([t,r])=>[t,this.#o(r)]))}#a(e){if(!e.length)return;let t=e.map(n=>typeof n=="string"?{name:n}:n),r=t.map(n=>n.name).join(" > "),o=t.at(-1)?.name??"",a=t.map(n=>n.description?.trim()??"").filter(Boolean).join(`
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
`);if(!this.#e[r]){this.#e[r]=!0,this.#r.tags.push({name:r,"x-displayName":o,description:a});let i=t.slice(0,-1).map(p=>p.name).join(" > ")||"default";if(!this.#t[i]){let p={name:i,tags:[]};this.#r["x-tagGroups"].push(p),this.#t[i]=p}this.#t[i].tags=[...new Set([...this.#t[i].tags,r])]}return r}#i(e){return`
|
|
8
|
+
<!doctype html>
|
|
9
|
+
<html>
|
|
10
|
+
<head>
|
|
11
|
+
<title>${ct(`${this.config.app.name} ${this.config.app.id}`)}</title>
|
|
12
|
+
<meta charset="utf-8" />
|
|
13
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
14
|
+
<style>
|
|
15
|
+
.darklight-reference {
|
|
16
|
+
display: none;
|
|
17
|
+
}
|
|
18
|
+
</style>
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
<script id="api-reference" data-url="${e}"></script>
|
|
22
|
+
<script>
|
|
23
|
+
const configuration = { theme: 'purple' };
|
|
24
|
+
document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);
|
|
25
|
+
</script>
|
|
26
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.28.33"></script>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
29
|
+
`}};var je={};W(je,{signinWithApple:()=>lt,signinWithFacebook:()=>ft,signinWithGoogle:()=>dt});import qe from"axios";import Ae from"jsonwebtoken";import ut from"jwks-rsa";var dt=async s=>{let e=`https://oauth2.googleapis.com/tokeninfo?id_token=${s}`,{data:t}=await qe.get(e).catch(r=>{throw new g("Failed to sign in with google",{idToken:s},r)});return t.first_name=t.given_name,t.last_name=t.family_name,t},lt=async s=>{try{let e="https://appleid.apple.com",t=Ae.decode(s,{complete:!0});if(!t?.header)throw new Error("");let{kid:r,alg:o}=t.header,a=await ut({jwksUri:`${e}/auth/keys`,cache:!0}).getSigningKey(r).then(i=>i.getPublicKey()).catch(()=>null);if(!a)throw new g("no publicKey",{idToken:s,publicKey:a,json:t});let n=Ae.verify(s,a,{algorithms:[o]});if(!n)throw new g("no data",{idToken:s,data:n});if(n.iss!==e)throw new g("iss doesnt match",{idToken:s,data:n});if(n.exp*1e3<Date.now())throw new g("expired idToken",{idToken:s,data:n});return n}catch(e){throw new g("Failed to sign in with apple",{idToken:s},e)}},ft=async(s,e=[])=>{e=[...new Set([...e,"name","picture","email"])];let{data:t}=await qe.request({method:"get",url:"https://graph.facebook.com/v15.0/me",params:{fields:e.join(","),access_token:s}}).catch(o=>{throw new g("Failed to sign in with facebook",{accessToken:s,fields:e},o)});if(!e.every(o=>o in t))throw new Error("Incomplete scope for access token");return t.email_verified="true",t};var Me={};W(Me,{compare:()=>yt,hash:()=>mt});import*as se from"bcryptjs";var mt=async s=>(s=s.trim(),s?await se.hash(s,d.get().settings.utils.hashSaltRounds):""),yt=async(s,e)=>(s=s.trim(),!s&&s===e?!0:await se.compare(s,e));var B=s=>{try{return s?.constructor?.name!=="String"?s:JSON.parse(s)}catch{return s}};function xe(s){return Object.fromEntries(Object.entries(s).map(([e,t])=>[e,B(t)]))}import{parseBuffer as ht}from"music-metadata";var oe=async s=>{try{return(await ht(s)).format.duration??0}catch{return 0}};var gt=s=>new Promise(e=>setTimeout(e,s)),ke=async(s,e,t)=>{if(e<=0)throw new g("out of tries",{tries:e,waitTimeInMs:t});let r=await s();return r.done===!0?r.value:(await gt(t),await ke(s,e-1,t))};var A={};W(A,{number:()=>Rt,string:()=>bt});import Ke from"crypto";function bt(s=20){return Ke.randomBytes(s).toString("hex").slice(0,s)}function Rt(s=0,e=2**48-1){return Ke.randomInt(s,e)}var M=class{ip;method;path;body;params;query;headers;context;cookies;users={access:{},refresh:{},apiKey:{}};authUser;constructor({ip:e,body:t,cookies:r,params:o,query:a,method:n,path:i,context:p,headers:u,files:f}){this.ip=e,this.method=n,this.path=i,this.params=o,this.cookies=r,this.headers=u,this.query=xe(a),this.body=Object.assign(xe(t),f),this.context=p}pipe(e,t={}){return new D({...t,piped:!0,body:e})}res(e){return new D({...e,piped:!1})}error(e){return new D({...e,piped:!1})}},D=class{body;headers;status;contentType;piped;constructor({body:e,status:t=200,headers:r={},piped:o=!1,contentType:a="application/json"}){this.body=e,this.status=t,this.contentType=a,this.headers=r,this.piped=o,this.piped||(this.headers["Content-Type"]=a)}};import{match as wt}from"path-to-regexp";var He="__listener_emitter",Je="*",ne=class{socketInstance;#e={onConnect:async()=>{},onDisconnect:async()=>{}};#t={};#r=async()=>{};constructor(e,t){this.socketInstance=e,this.#o(),d.on("setup",()=>{this.#r=t?t.createPublisher(He):async r=>{e.to(r.channel).emit(r.channel,r)},t?.createSubscriber(He,async r=>{e.to(r.channel).emit(r.channel,r)},{fanout:!0})},1)}async created(e,t,r){await this.#s(e,"created",{after:t.toJSON(),before:null},r)}async updated(e,{after:t,before:r},o){await this.#s(e,"updated",{after:t.toJSON(),before:r.toJSON()},o)}async deleted(e,t,r){await this.#s(e,"deleted",{before:t.toJSON(),after:null},r)}async#s(e,t,{before:r,after:o},a){let n=Array.isArray(a)?a:[a??Je],i=e.flatMap(p=>n.map(u=>`${u}:${p}`));await Promise.all(i.map(async p=>this.#r({channel:p,type:t,before:r,after:o})))}set connectionCallbacks(e){this.#e=e,this.#o()}register(e,t){return this.#t[e]=t,this.#t[e+"/:id"]=t,this}#n(e){let t=a=>wt(a)(e),r=Object.keys(this.#t).find(t)??null;if(!r)return null;let o=t(r);return o?{config:this.#t[r],params:o.params}:null}#o=()=>{this.socketInstance.removeAllListeners("connection"),this.socketInstance.on("connection",async e=>{let t=e.id,r=null,o=d.get().settings.server?.requestsAuth.tokens;e.handshake.auth.authorization&&o&&(r=await o.verifyAccessToken(e.handshake.auth.authorization??"").catch(()=>null)),e.on("leave",async(a,n)=>a.channel?(e.leave(a.channel),typeof n=="function"&&n({code:b.Ok,message:"",channel:a.channel})):typeof n=="function"&&n({code:b.ValidationError,message:"channel is required",channel:""})),e.on("join",async(a,n)=>{if(!a.channel)return typeof n=="function"&&n({code:b.ValidationError,message:"channel is required",channel:""});let i=a.channel,p=this.#n(i)??null;if(!p)return typeof n=="function"&&n({code:b.BadRequest,message:"unknown channel",channel:i});let f=`${await p.config({channel:i,user:r},p.params,a.query??{})??Je}:${i}`;return e.join(f),typeof n=="function"&&n({code:b.Ok,message:"",channel:f})}),r&&await this.#e.onConnect(r.id,t),e.on("disconnect",async()=>{r&&await this.#e.onDisconnect(r.id,t)})})}};var vt=Object.entries(b).filter(([,s])=>s>399).map(([s,e])=>({status:e,contentType:"application/json",pipe:E.meta(E.array(E.object({message:E.string(),field:E.optional(E.string())})),{$refId:`Errors.${s}Response`,description:`${s} Response`})})),K=class{constructor(e,t,r){this.config=t;this.implementations=r;this.server=e,this.#r=new re(this.config);let o=new xt(e,{cors:this.cors});this.socket=new ne(o,t.eventBus),this.addRouter(this.#r.router())}#e=[];#t=new Map;#r;socket;server;cors={origin:"*",methods:Object.values(C).filter(e=>e!==C.options).map(e=>e.toUpperCase())};addRouter(...e){e.map(t=>t.routes).forEach(t=>this.addRoute(...t))}addRoute(...e){e.forEach(t=>{this.#e.push(async()=>{let{method:r,path:o,schema:a={},onError:n,middlewares:i=[]}=t,p=`(${r.toUpperCase()}) ${this.#r.cleanPath(o)}`;if(this.#t.get(p))throw new g(`Route key ${p} already registered. All route keys must be unique`,{route:t,key:p});i.unshift(Ie),i.forEach(P=>P.onSetup?.(t)),n?.onSetup?.(t);let{validateRequest:u,validateResponse:f,jsonSchema:h}=this.#s(r,a);this.#t.set(p,!0),await this.#r.register(t,h),this.implementations.registerRoute(r,this.#r.cleanPath(o),async(P,y)=>{let R=await u(await this.implementations.parseRequest(P));try{for(let k of i)await k.cb(R);let w=await t.handler(R),x=w instanceof D?w:new D({body:w,status:b.Ok,headers:{},piped:!1});return await this.implementations.handleResponse(y,await f(x))}catch(w){if(n?.cb){let x=await n.cb(R,w),k=x instanceof D?x:new D({body:x,status:b.BadRequest,headers:{}});return await this.implementations.handleResponse(y,await f(k))}throw w}})})})}#s(e,t){let r=t?.defaultStatusCode??b.Ok,o=t?.defaultContentType??"application/json",a=r,n=o,i={response:{},request:{}},p={},u={};return[{key:"params",type:"request"},{key:"headers",type:"request"},{key:"query",type:"request"},{key:"body",type:"request",skip:![C.post,C.put,C.patch].includes(e)},{key:"response",type:"response"},{key:"responseHeaders",type:"response"}].forEach(y=>{let R=t[y.key]??E.any();if(!y.skip&&(y.type==="request"&&(p[y.key]=R,i.request[y.key]=E.schema(R)),y.type==="response")){let w=vt.concat({status:r,contentType:n,pipe:R});u[y.key]=E.any().pipe(x=>{let k=w.find(we=>we.status===a)?.pipe;if(!k)throw Tt.root(`schema not defined for status code: ${a}`,x);return E.assert(k,x)}),i.response[y.key]=w.map(x=>({status:x.status,contentType:x.contentType,schema:E.schema(x.pipe)}))}}),{jsonSchema:i,validateRequest:async y=>{if(!Object.keys(p))return y;let R=t.context?await t.context(y):{};y.context=R;let w=ie.run(y,()=>E.validate(E.object(p),{params:y.params,headers:y.headers,query:y.query,body:y.body}));if(!w.valid)throw ae(w.error);return y.params=w.value.params,y.headers=w.value.headers,y.query=w.value.query,y.body=w.value.body,y},validateResponse:async y=>{if(!Object.keys(u))return y;a=y.status,n=y.contentType;let R=pe.run(y,()=>E.validate(E.object(u),{responseHeaders:y.headers,response:y.body}));if(!R.valid)throw ae(R.error);return y.body=R.value.response,y.headers=R.value.responseHeaders,y}}}test(){return kt(this.server)}async start(){let e=this.config.config.port;this.config.config.healthPath&&this.addRoute({method:C.get,path:this.config.config.healthPath,handler:async r=>r.res({body:`${this.config.app.id}(${this.config.app.name}) service running`,contentType:"text/plain"})}),this.implementations.registerNotFoundHandler(async r=>{let o=await this.implementations.parseRequest(r);throw new ce(`Route ${o.path} not found`)}),this.implementations.registerErrorHandler(async(r,o,a)=>{d.get().log.error(r);let n=r instanceof T?new D({body:r.serializedErrors,status:r.statusCode}):new D({body:[{message:"Something went wrong",data:r.message}],status:b.BadRequest});return await this.implementations.handleResponse(a,n)}),await Promise.all(this.#e.map(r=>r()));let t=await this.implementations.start(e);return t&&d.get().log.info(`${this.config.app.id}(${this.config.app.name}) service listening on port ${e}`),t}};import Pt from"http";import Ct from"cookie-parser";import Et from"cors";import F from"express";import St from"express-fileupload";import{rateLimit as Dt}from"express-rate-limit";import It from"helmet";import{pinoHttp as Ot}from"pino-http";var ue=class extends K{#e;constructor(e){let t=F();super(Pt.createServer(t),e,{parseRequest:async r=>{let a={...Object.fromEntries(Object.entries(r.headers).map(([i,p])=>[i,p??null])),Authorization:r.get("authorization"),RefreshToken:r.get("x-refresh-token"),ApiKey:r.get("x-api-key"),ContentType:r.get("content-type"),Referer:r.get("referer"),UserAgent:r.get("user-agent")},n=Object.fromEntries(await Promise.all(Object.entries(r.files??{}).map(async([i,p])=>{let u=Array.isArray(p)?p:[p],f=await Promise.all(u.map(async h=>({name:h.name,type:h.mimetype,size:h.size,isTruncated:h.truncated,data:h.data,duration:await oe(h.data)})));return[i,f]})));return new M({ip:r.ip,body:r.body??{},cookies:r.cookies??{},params:r.params??{},query:r.query??{},method:r.method,path:r.path,headers:a,files:n,context:{}})},handleResponse:async(r,o)=>{if(o.piped)o.body.pipe(r);else{Object.entries(o.headers).forEach(([n,i])=>r.header(n,i));let a=o.body===null||o.body===void 0?"json":"send";r.status(o.status)[a](o.body).end()}},registerRoute:(r,o,a)=>{this.#e[r]?.(o,a)},registerErrorHandler:r=>{this.#e.use(async(o,a,n,i)=>r(o,a,n))},registerNotFoundHandler:r=>{this.#e.use(r)},start:async r=>new Promise((o,a)=>{try{let n=this.server.listen({host:"0.0.0.0",port:r},async()=>o(!0));d.on("close",n.close,1)}catch(n){a(n)}})}),this.#e=t,t.disable("x-powered-by"),e.config.requests.log&&t.use(Ot({logger:e.log})),t.use(F.json()),t.use(F.text()),t.use(Ct()),t.use(It({crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1})),t.use(Et(this.cors)),t.use(F.urlencoded({extended:!1})),e.config.publicPath&&t.use(F.static(e.config.publicPath)),t.use(St({limits:{fileSize:e.config.requests.maxFileUploadSizeInMb*1024*1024},useTempFiles:!1})),e.config.requests.rateLimit.enabled&&t.use(Dt({windowMs:e.config.requests.rateLimit.periodInMs,limit:e.config.requests.rateLimit.limit,handler:(r,o)=>o.status(b.TooManyRequests).json([{message:"Too Many Requests"}])}))}};import At from"@fastify/cookie";import qt from"@fastify/cors";import jt from"@fastify/formbody";import Mt from"@fastify/helmet";import Kt from"@fastify/multipart";import Ht from"@fastify/rate-limit";import Jt from"@fastify/static";import Ut from"fastify";import $t from"qs";var de=class extends K{constructor(e){let t=Ut({ignoreTrailingSlash:!0,caseSensitive:!1,disableRequestLogging:!e.config.requests.log,loggerInstance:e.config.requests.log?e.log:void 0,ajv:{customOptions:{coerceTypes:!1}},schemaErrorFormatter:(r,o)=>new H(r.map(a=>({messages:[a.message??""],field:`${o}${a.instancePath}`.replaceAll("/",".")})))});super(t.server,e,{parseRequest:async r=>{let a={...Object.fromEntries(Object.entries(r.headers).map(([p,u])=>[p,u??null])),Authorization:r.headers.authorization?.toString(),RefreshToken:r.headers["x-refresh-token"]?.toString(),ApiKey:r.headers["x-api-key"]?.toString(),ContentType:r.headers["content-type"]?.toString(),Referer:r.headers.referer?.toString(),UserAgent:r.headers["user-agent"]?.toString()},{body:n,files:i}=Nt(r.body??{});return new M({ip:r.ip,body:n,cookies:r.cookies??{},params:r.params??{},query:r.query??{},method:r.method,path:r.url,headers:a,files:i,context:{}})},handleResponse:async(r,o)=>{await r.status(o.status).headers(o.headers).send(o.body)},registerRoute:(r,o,a)=>{t.register(async n=>{n.route({url:o,method:r,handler:a})})},registerErrorHandler:r=>{t.setErrorHandler(r)},registerNotFoundHandler:r=>{t.setNotFoundHandler(r)},start:async r=>(await t.ready(),await t.listen({port:r,host:"0.0.0.0"}),d.on("close",t.close,1),!0)}),t.decorateRequest("savedReq",null),t.setValidatorCompiler(()=>()=>!0),t.setSerializerCompiler(()=>r=>JSON.stringify(r)),e.config.publicPath&&t.register(Jt,{root:e.config.publicPath}),t.register(At,{}),t.register(qt,this.cors),t.register(jt,{parser:r=>$t.parse(r)}),t.register(Mt,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),t.register(Kt,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:e.config.requests.maxFileUploadSizeInMb*1024*1024},onFile:async r=>{let o=await r.toBuffer(),a={name:r.filename,type:r.mimetype,size:o.byteLength,isTruncated:r.file.truncated,data:o,duration:await oe(o)};r.value=a}}),e.config.requests.rateLimit.enabled&&t.register(Ht,{max:e.config.requests.rateLimit.limit,timeWindow:e.config.requests.rateLimit.periodInMs,errorResponseBuilder:(r,o)=>({statusCode:b.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${o.after}`}])})})}};function Nt(s){if(typeof s!="object")return{body:s,files:{}};let e=Object.entries(s??{}),t=a=>Array.isArray(a)?t(a.at(0)):Buffer.isBuffer(a?.data),r=e.filter(([a,n])=>t(n)).map(([a,n])=>[a,Array.isArray(n)?n:[n]]),o=e.filter(([a,n])=>!t(n));return{body:Object.fromEntries(o),files:Object.fromEntries(r)}}var ro=q(async s=>{let e=s.users.access.value||s.users.apiKey.value,t=s.users.access.error||s.users.apiKey.error;if(!e&&t)throw t;if(s.authUser=e,!s.authUser)throw new I},s=>{s.security??=[],s.security.push({Authorization:[]},{ApiKey:[]}),s.descriptions??=[],s.descriptions.push("Requires a valid means of authentication.")}),so=q(async s=>{if(s.users.access.error)throw s.users.access.error;if(s.authUser=s.users.access.value,!s.authUser)throw new I},s=>{s.security??=[],s.security.push({Authorization:[]}),s.descriptions??=[],s.descriptions.push("Requires a valid authorization header.")}),oo=q(async s=>{if(s.users.apiKey.error)throw s.users.apiKey.error;if(s.authUser=s.users.apiKey.value,!s.authUser)throw new I},s=>{s.security??=[],s.security.push({ApiKey:[]}),s.descriptions??=[],s.descriptions.push("Requires a valid x-api-key header.")}),no=q(async s=>{if(s.users.refresh.error)throw s.users.refresh.error;let e=s.headers.RefreshToken;if(!e)throw new L("x-refresh-token header missing");if(s.users.refresh.value=await d.get().settings.server?.requestsAuth.tokens?.verifyRefreshToken(e),!s.users.refresh.value)throw new L},s=>{s.security??=[],s.security.push({RefreshToken:[]}),s.descriptions??=[],s.descriptions.push("Requires a valid x-refresh-token header.")});import{v as m}from"valleyed";var J=class{};import z from"jsonwebtoken";var j=class{extractAccessTokenValue(e){if(!e.startsWith("Bearer "))throw new g("authorization header must begin with 'Bearer '",{headerValue:e});return e.slice(7)}async exchangeTokens(e,t){if(await this.verifyAccessToken(e.accessToken).catch(n=>{if(n.statusCode===b.AuthorizationExpired)return null;throw n}))return e;let o=await this.verifyRefreshToken(e.refreshToken),a=await t(o.id);return{accessToken:await this.createAccessToken(a.access),refreshToken:await this.createRefreshToken(a.refresh)}}},Ue=class extends j{#e;#t;options;constructor(e){super(),this.options={accessTokenKey:"accessTokenKey",refreshTokenKey:"refreshTokenKey",accessTokenTTL:60*60,refreshTokenTTL:14*24*60*60,accessTokenPrefix:"tokens:access:",refreshTokenPrefix:"tokens:refresh:",...e},this.#e=t=>`${this.options.accessTokenPrefix}${t}`,this.#t=t=>`${this.options.refreshTokenPrefix}${t}`}async createAccessToken(e){let t=z.sign(e,this.options.accessTokenKey,{expiresIn:this.options.accessTokenTTL});return await d.get().cache.set(this.#e(e.id),t,this.options.accessTokenTTL),t}async createRefreshToken(e){let t=z.sign(e,this.options.refreshTokenKey,{expiresIn:this.options.refreshTokenTTL});return await d.get().cache.set(this.#t(e.id),t,this.options.refreshTokenTTL),t}async verifyAccessToken(e){try{let t=this.extractAccessTokenValue(e),r=z.verify(t,this.options.accessTokenKey);if(!r)throw new I;let o=await this.retrieveAccessTokenFor(r.id);if(t&&t!==o)throw new U;return r}catch(t){throw t instanceof U?t:t instanceof z.TokenExpiredError?new U(void 0,t):new I(void 0,t)}}async verifyRefreshToken(e){try{let t=z.verify(e,this.options.refreshTokenKey);if(!t)throw new I;return t}catch(t){throw new I(void 0,t)}}async retrieveAccessTokenFor(e){return d.get().cache.get(this.#e(e))}async retrieveRefreshTokenFor(e){return d.get().cache.get(this.#t(e))}async deleteAccessTokenFor(e){await d.get().cache.delete(this.#e(e))}async deleteRefreshTokenFor(e){await d.get().cache.delete(this.#t(e))}};var go=m.object({type:m.in(["fastify","express"]),port:m.number(),publicPath:m.optional(m.string()),healthPath:m.optional(m.string()),openapi:m.defaults(m.object({docsVersion:m.defaults(m.string(),"1.0.0"),docsBaseUrl:m.defaults(m.array(m.string()),["/"]),docsPath:m.defaults(m.string(),"/__docs")}),{}),requests:m.defaults(m.object({log:m.defaults(m.boolean(),!0),paginationDefaultLimit:m.defaults(m.number(),100),maxFileUploadSizeInMb:m.defaults(m.number(),500),rateLimit:m.defaults(m.object({enabled:m.defaults(m.boolean(),!1),periodInMs:m.defaults(m.number(),60*60*1e3),limit:m.defaults(m.number(),5e3)}),{}),slowdown:m.defaults(m.object({enabled:m.defaults(m.boolean(),!1),periodInMs:m.defaults(m.number(),10*60*1e3),delayAfter:m.defaults(m.number(),2e3),delayInMs:m.defaults(m.number(),500)}),{})}),{}),requestsAuth:m.defaults(m.object({tokens:m.optional(m.instanceOf(j)),apiKey:m.optional(m.instanceOf(J))}),{})});var U=class extends T{statusCode=b.AuthorizationExpired;constructor(e="Access token expired",t){super(e,[{message:e}],t)}};var Z=class extends T{statusCode=b.BadRequest;constructor(e,t){super(e,[{message:e}],t)}};var I=class extends T{statusCode=b.NotAuthenticated;constructor(e="Not authenticated",t){super(e,[{message:e}],t)}};var L=class extends T{statusCode=b.NotAuthorized;constructor(e="Not authorized",t){super(e,[{message:e}],t)}};var ce=class extends T{statusCode=b.NotFound;constructor(e="Not found",t){super(e,[{message:e}],t)}};var $e=class extends T{statusCode=b.NotAuthenticated;constructor(e="Refresh token misused",t){super(e,[{message:e}],t)}};var H=class extends T{statusCode=b.ValidationError;constructor(e,t){super("Unprocessable Entity",e.flatMap(({field:r,messages:o})=>o.map(a=>({message:a,field:r}))),t)}};var $=class extends X{client;constructor(e,t){super();let r={...e.host?{host:e.host}:{},...e.port?{port:e.port}:{}},o={...t,...e.password?{password:e.password}:{},...e.username?{username:e.username}:{},...e.tls?{tls:{}}:{},lazyConnect:!0};this.client=e.cluster?new Bt([r],{...t,redisOptions:o,lazyConnect:!0}):new Ft({...o,...r}),this.client.on("error",async a=>{d.crash(new g("Redis failed with error",{},a))}),t||d.on("start",async()=>this.client.connect(),1),d.on("close",async()=>this.client.quit(),1)}async delete(e){await this.client.del(d.get().getScopedName(e,":"))}async get(e){return await this.client.get(d.get().getScopedName(e,":"))}async set(e,t,r){r>0?await this.client.setex(d.get().getScopedName(e,":"),r,t):this.client.set(d.get().getScopedName(e),t)}async getOrSet(e,t,r){let o=await this.get(d.get().getScopedName(e,":"));if(o)return JSON.parse(o);let a=await t();await this.set(d.get().getScopedName(e,":"),JSON.stringify(a),r)}};import Lt from"axios";var Te="db-changes",le=class{constructor(e){this.config=e}getScopedDb(e){return d.get().getScopedName(e).replaceAll(".","-")}},fe=class{constructor(e,t,r){this.config=e;this.#e=t,this.#t=r}#e={};#t;get callbacks(){return Object.freeze(this.#e)}get mapper(){return this.#t}async configureConnector(e,t){let r=Lt.create({baseURL:this.config.debeziumUrl});return await r.put(`/connectors/${e}/config`,{"topic.prefix":Te,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...t}).then(async()=>(await r.get(`/connectors/${e}/topics`)).data[e]?.topics?.includes?.(e)??!1).catch(o=>{throw new g("Failed to configure watcher",{key:e},o)})}};import{ObjectId as zt}from"mongodb";import{differ as Ne}from"valleyed";var me=class extends fe{#e=!1;constructor(e,t,r,o,a,n,i){super(t,n,i);let p=R=>R._id?{...R,_id:Be(R._id.$oid??R._id)}:void 0,u=`${o}.${a}`,f=`${Te}.${u}`,P=Be("5f5f65717569707065645f5f"),y={_id:P};t.eventBus.createSubscriber(f,async R=>{let w=R.op,x=JSON.parse(R.before??"null"),k=JSON.parse(R.after??"null");x&&(x=p(x)),k&&(k=p(k)),!(x?.__id===P||k?.__id===P)&&(w==="c"&&this.callbacks.created&&k?await this.callbacks.created({before:null,after:this.mapper(k)}):w==="u"&&this.callbacks.updated&&x&&k?await this.callbacks.updated({before:this.mapper(x),after:this.mapper(k),changes:Ne.from(Ne.diff(x,k))}):w==="d"&&this.callbacks.deleted&&x&&await this.callbacks.deleted({before:this.mapper(x),after:null}))},{skipScope:!0}),d.on("start",async()=>{if(this.#e)return;this.#e=!0;let R=r.db(o).collection(a);await ke(async()=>await this.configureConnector(f,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":e.uri,"collection.include.list":u,"snapshot.mode":"when_needed"})?{done:!0,value:!0}:(await R.findOneAndUpdate(y,{$set:{colName:a}},{upsert:!0}),await R.findOneAndDelete(y),d.get().log.warn(`Waiting for db changes for ${u} to start...`),{done:!1}),6,1e4).catch(w=>d.crash(new g("Failed to start db changes",{dbColName:u},w)))},10)}},Be=s=>{try{return new zt(s)}catch{return s}};import{MongoClient as Gt,ObjectId as Xt}from"mongodb";import{ObjectId as ye}from"mongodb";import{v as l}from"valleyed";var ve=(t=>(t.and="and",t.or="or",t))(ve||{}),Fe=(u=>(u.lt="lt",u.lte="lte",u.gt="gt",u.gte="gte",u.eq="eq",u.ne="ne",u.in="in",u.nin="nin",u.exists="exists",u))(Fe||{}),Le=l.catch(l.defaults(l.in(["and","or"]),"and"),"and"),ze=l.object({field:l.string(),value:l.any(),condition:l.catch(l.defaults(l.in(Object.values(Fe)),"eq"),"eq")}),Qt=l.object({condition:Le,value:l.array(ze)}),Vt=l.defaults(l.array(l.or([ze,Qt])),[]);function _t(){let s=d.get().settings.server?.requests.paginationDefaultLimit??100;return l.meta(l.object({all:l.defaults(l.boolean(),!1),limit:l.catch(l.defaults(l.number().pipe(l.lte(s)),s),s),page:l.catch(l.defaults(l.number().pipe(l.gte(1)),1),1),search:l.defaults(l.nullish(l.object({value:l.string(),fields:l.array(l.string())})),null),sort:l.defaults(l.array(l.object({field:l.string(),desc:l.defaults(l.boolean(),!1)})),[]),whereType:Le,where:Vt}).pipe(e=>({...e,auth:[],authType:"and"})),{title:"Query Params",$refId:"QueryParams"})}function Kn(s){return l.object({pages:l.object({current:l.number(),start:l.number(),last:l.number(),previous:l.nullable(l.number()),next:l.nullable(l.number())}),docs:l.object({limit:l.number(),total:l.number(),count:l.number()}),results:l.array(s)})}function Hn(s){return l.assert(_t(),s)}var Qe=l.meta(l.object({uri:l.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});var Ve=async(s,e)=>{let t=[],r=Pe(e.where,e.whereType);r&&t.push(r);let o=Pe(e.auth,e.authType);if(o&&t.push(o),e.search&&e.search.fields.length>0){let k=e.search.fields.map(we=>({[we]:{$regex:new RegExp(e.search.value,"i")}}));t.push({$or:k})}let a={};t.length>0&&(a.$and=t);let n=e.sort.map(k=>[k.field,k.desc?"desc":"asc"]),i=e.all??!1,p=e.limit,u=e.page,f=await s.countDocuments(a),h=s.find(a);n.length&&(h=h.sort(Object.fromEntries(n))),!i&&p&&(h=h.limit(p),u&&(h=h.skip((u-1)*p)));let P=await h.toArray(),y=1,R=Math.ceil(f/p)||1,w=u>=R?null:u+1,x=u<=y?null:u-1;return{pages:{start:y,last:R,next:w,previous:x,current:u},docs:{limit:p,total:f,count:P.length},results:P}};function Wt(s){return Object.values(ve).includes(s.condition)}var Pe=(s,e="and")=>{let t=(Array.isArray(s)?s:[]).map(r=>{if(Wt(r))return Pe(r.value,r.condition);let{field:o}=r,a=o==="id"?"_id":o??"",n=r.value===void 0?"":r.value;return{field:a,value:n,condition:r.condition,isWhere:!0}}).filter(r=>!!r).map(r=>r.isWhere?{[`${r.field}`]:{[`$${r.condition}`]:r.value}}:r);return t.length>0?{[`$${e}`]:t}:null};var Q="_id";function _e(s,e){async function t(n){let p=(Array.isArray(n)?n:[n]).map(u=>s.mapper(u));return Array.isArray(n)?p:p[0]}function r(n,i,p,u){let f={[Q]:i,...s.options?.skipAudit?{}:{createdAt:p.getTime(),...u?{}:{updatedAt:p.getTime()}}};return{...n,...f}}function o(n,i){return{...n,$set:{...n.$set,...Object.keys(n).length>0&&!s.options?.skipAudit?{updatedAt:i.getTime()}:{}}}}let a={config:s,extras:{collection:e},query:async n=>{let i=await Ve(e,n);return{...i,results:await t(i.results)}},findMany:async(n,i={})=>{let u=(Array.isArray(i.sort)?i.sort:i.sort?[i.sort]:[]).map(h=>[h.field,h.desc?"desc":"asc"]),f=await e.find(n,{session:i.session,limit:i.limit,sort:u}).toArray();return t(f)},findOne:async(n,i={})=>(await a.findMany(n,{...i,limit:1})).at(0)??null,findById:async(n,i={})=>await a.findOne({[Q]:n},i),insertMany:async(n,i={})=>{let p=i.getTime?.()??new Date,u=n.map((h,P)=>r(h,i.makeId?.(P)??new ye().toString(),p));return await e.insertMany(u,{session:i.session}),(await Promise.all(u.map(async h=>await a.findById(h[Q],i)))).filter(h=>!!h)},insertOne:async(n,i={})=>(await a.insertMany([n],i))[0],updateMany:async(n,i,p={})=>{let u=p.getTime?.()??new Date;return await e.updateMany(n,o(i,u),{session:p.session}),a.findMany(n,p)},updateOne:async(n,i,p={})=>{let u=p.getTime?.()??new Date,f=await e.findOneAndUpdate(n,o(i,u),{returnDocument:"after",session:p.session});return f?t(f):null},updateById:async(n,i,p={})=>await a.updateOne({[Q]:n},i,p),upsertOne:async(n,i,p={})=>{let u=p.getTime?.()??new Date,f=await e.findOneAndUpdate(n,{...o("update"in i?i.update:{},u),$setOnInsert:r(i.insert,p.makeId?.()??new ye().toString(),u,!0)},{returnDocument:"after",session:p.session,upsert:!0});return t(f)},deleteMany:async(n,i={})=>{let p=await a.findMany(n,i);return await e.deleteMany(n,{session:i.session}),p},deleteOne:async(n,i)=>{let p=await e.findOneAndDelete(n,{session:i?.session});return p?t(p):null},deleteById:async(n,i)=>await a.deleteOne({[Q]:n},i),bulkWrite:async(n,i={})=>{let p=e.initializeUnorderedBulkOp({session:i.session}),u=i.getTime?.()??new Date;n.forEach((f,h)=>{switch(f.op){case"insert":p.insert(r(f.value,f.makeId?.(h)??new ye().toString(),u));break;case"delete":p.find(f.filter).delete();break;case"update":p.find(f.filter).update(o(f.value,u));break;case"upsert":p.find(f.filter).upsert().update({...o("update"in f?f.update:{},u),$setOnInsert:r(f.insert,f.makeId?.(h)??new ye().toString(),u,!0)});break;default:throw new g("Unknown bulkWrite operation",{operation:f})}}),await p.execute({session:i.session})}};return a}var he=class extends le{constructor(t,r){super(r);this.mongoConfig=t;this.#e=new Gt(t.uri),d.on("start",async()=>{await this.#e.connect();let o=this.#t.reduce((n,i)=>(n[i.db]||(n[i.db]=[]),n[i.db].push(i.col),n),{}),a={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(o).map(async([n,i])=>{let p=this.#e.db(n),u=await p.listCollections().toArray();return i.map(async f=>{let h=u.find(P=>P.name===f);h?h.options?.changeStreamPreAndPostImages?.enabled!==a.changeStreamPreAndPostImages.enabled&&await p.command({collMod:f,...a}):await p.createCollection(f,a)})}))},3),d.on("close",async()=>this.#e.close(),1)}#e;#t=[];async session(t){return this.#e.withSession(t)}id(){return new Xt}use(t){t.change&&(this.config.changes||d.crash(new g("Db changes are not enabled in the configuration.",{config:t})),new me(this.mongoConfig,this.config.changes,this.#e,this.getScopedDb(t.db),t.col,t.change,t.mapper)),this.#t.push({db:this.getScopedDb(t.db),col:t.col});let r=this.#e.db(this.getScopedDb(t.db)).collection(t.col);return _e(t,r)}};var N=class{},ge={fanout:!1};import{v}from"valleyed";var We=v.meta(v.object({uri:v.string(),eventColumnName:v.string()}),{title:"Rabbitmq Config",$refId:"RabbitmqConfig"}),Ce=v.meta(v.object({brokers:v.array(v.string()),ssl:v.optional(v.boolean()),sasl:v.optional(v.object({mechanism:v.is("plain"),username:v.string(),password:v.string()})),confluent:v.optional(v.boolean()),clientId:v.optional(v.string())}),{title:"Kafka Config",$refId:"KafkaConfig"});import Ge from"@confluentinc/kafka-javascript";import Xe from"kafkajs";var V=class extends N{#e;#t;#r;constructor(e){super();let{confluent:t=!1,...r}=e;this.#t=t,this.#e=t?new Ge.KafkaJS.Kafka({kafkaJS:{...r,logLevel:Ge.KafkaJS.logLevel.NOTHING}}):new Xe.Kafka({...r,logLevel:Xe.logLevel.NOTHING})}createPublisher(e,t={}){let r=t.skipScope?e:d.get().getScopedName(e);return async o=>{try{let a=this.#e.producer();return await a.connect(),await a.send({topic:r,messages:[{value:JSON.stringify(o)}]}),!0}catch{return!1}}}createSubscriber(e,t,r={}){r={...ge,...r};let o=r.skipScope?e:d.get().getScopedName(e),a=async()=>{await this.#n(o);let n=r.fanout?d.get().getScopedName(`${d.get().settings.app.id}-fanout-${A.string(10)}`):o,i=this.#e.consumer(this.#t?{kafkaJS:{groupId:n}}:{groupId:n});await i.connect(),await i.subscribe({topic:o}),await i.run({eachMessage:async({message:p})=>{d.resolveBeforeCrash(async()=>{p.value&&await t(B(p.value.toString()))})}}),r.fanout&&d.on("close",async()=>{await i.disconnect(),await this.#o(n)},10)};d.on("start",a,2)}async#s(){return this.#r||(this.#r=this.#e.admin(),await this.#r.connect()),this.#r}async#n(e){await(await this.#s()).createTopics({topics:[{topic:e}],timeout:5e3})}async#o(e){await(await this.#s()).deleteGroups([e]).catch(()=>{})}};import{connect as Yt}from"amqp-connection-manager";var be=class extends N{#e;#t;constructor(e){super(),this.#t=e.eventColumnName,this.#e=Yt([e.uri]).createChannel({json:!1,setup:async t=>{await t.assertExchange(this.#t,"direct",{durable:!0}),await t.prefetch(1)}})}createPublisher(e,t={}){let r=t.skipScope?e:d.get().getScopedName(e);return async o=>await this.#e.publish(this.#t,r,JSON.stringify(o),{persistent:!0})}createSubscriber(e,t,r={}){r={...ge,...r};let o=r.skipScope?e:d.get().getScopedName(e),a=async()=>{await this.#e.addSetup(async n=>{let i=r.fanout?d.get().getScopedName(`${d.get().settings.app.id}-fanout-${A.string(10)}`):o,{queue:p}=await n.assertQueue(i,{durable:!r.fanout,exclusive:r.fanout});await n.bindQueue(p,this.#t,o),n.consume(p,async u=>{d.resolveBeforeCrash(async()=>{if(u)try{await t(B(u.content.toString())),n.ack(u)}catch{n.nack(u)}})},{noAck:!1})})};d.on("start",a,2)}};import{v as Ee}from"valleyed";var Ye=Ee.meta(Ee.object({redisConfig:Y,queueName:Ee.string()}),{title:"Redis Jobs Config",$refId:"RedisJobsConfig"});import Zt from"bull";var Re=class s{#e;#t={};#r=[];constructor(e){let t=new $(e.redisConfig,{maxRetriesPerRequest:null,enableReadyCheck:!1});this.#e=new Zt(e.queueName,{createClient:()=>t.client}),d.on("start",async()=>{await this.#o(),await Promise.all(this.#r.map(({cron:r,name:o})=>this.#n(o,r))),Promise.all([this.#e.process("DelayedJob",async r=>await this.#t.onDelayed?.(r.data)),this.#e.process("CronJob",async r=>await this.#t.onCron?.(r.data.type)),this.#e.process("RepeatableJob",async r=>await this.#t.onRepeatable?.(r.data))])},10)}set callbacks(e){this.#t=e}set crons(e){this.#r=e}static#s(){return[Date.now(),A.string()].join(":")}async addDelayed(e,t){return(await this.#e.add("DelayedJob",e,{jobId:s.#s(),delay:t,removeOnComplete:!0,backoff:1e3,attempts:3})).id.toString()}async addRepeatable(e,t,r){return(await this.#e.add("RepeatableJob",e,{jobId:s.#s(),repeat:{cron:t,...r?{tz:r}:{}},removeOnComplete:!0,backoff:1e3,attempts:3})).opts?.repeat?.key??""}async removeDelayed(e){let t=await this.#e.getJob(e);t&&await t.discard()}async removeRepeatable(e){await this.#e.removeRepeatableByKey(e)}async retryAllFailedJobs(){let e=await this.#e.getFailed();await Promise.all(e.map(t=>t.retry()))}async#n(e,t){return(await this.#e.add("CronJob",{type:e},{jobId:s.#s(),repeat:{cron:t},removeOnComplete:!0,backoff:1e3,attempts:3})).id.toString()}async#o(){await this.retryAllFailedJobs();let e=await this.#e.getRepeatableJobs();await Promise.all(e.filter(t=>t.name==="CronJob").map(t=>this.#e.removeRepeatableByKey(t.key)))}};var et=()=>c.object({app:c.object({id:c.string(),name:c.string()}),log:c.defaults(c.object({level:c.defaults(c.in(["fatal","error","warn","info","debug","trace","silent"]),"info")}),{}),dbs:c.optional(c.object({types:c.record(c.string(),c.discriminate(s=>s?.type,{mongo:c.merge(Qe,c.object({type:c.is("mongo")}))})),changes:c.optional(c.object({debeziumUrl:c.string(),kafkaConfig:Ce}))})),eventBus:c.optional(c.discriminate(s=>s?.type,{kafka:c.merge(Ce,c.object({type:c.is("kafka")})),rabbitmq:c.merge(We,c.object({type:c.is("rabbitmq")}))})),cache:c.discriminate(s=>s?.type,{redis:c.merge(Y,c.object({type:c.is("redis")}))}),jobs:c.optional(c.merge(Ye,c.object({type:c.is("redis")}))),server:c.optional(c.object({type:c.in(["fastify","express"]),port:c.number(),publicPath:c.optional(c.string()),healthPath:c.optional(c.string()),openapi:c.defaults(c.object({docsVersion:c.defaults(c.string(),"1.0.0"),docsBaseUrl:c.defaults(c.array(c.string()),["/"]),docsPath:c.defaults(c.string(),"/__docs")}),{}),requests:c.defaults(c.object({log:c.defaults(c.boolean(),!0),paginationDefaultLimit:c.defaults(c.number(),100),maxFileUploadSizeInMb:c.defaults(c.number(),500),rateLimit:c.defaults(c.object({enabled:c.defaults(c.boolean(),!1),periodInMs:c.defaults(c.number(),60*60*1e3),limit:c.defaults(c.number(),5e3)}),{}),slowdown:c.defaults(c.object({enabled:c.defaults(c.boolean(),!1),periodInMs:c.defaults(c.number(),10*60*1e3),delayAfter:c.defaults(c.number(),2e3),delayInMs:c.defaults(c.number(),500)}),{})}),{}),requestsAuth:c.defaults(c.object({tokens:c.optional(c.instanceOf(j)),apiKey:c.optional(c.instanceOf(J))}),{})})),utils:c.defaults(c.object({hashSaltRounds:c.defaults(c.number(),10)}),{})});function tt(s){let e=_({level:s.log.level,serializers:{err:_.stdSerializers.err,error:_.stdSerializers.err,req:_.stdSerializers.req,res:_.stdSerializers.res}}),t=new $(s.cache),r=s.jobs?new Re(s.jobs):void 0,o=s.eventBus?.type==="kafka"?new V(Ze(s.eventBus,["type"])):s.eventBus?.type==="rabbitmq"?new be(Ze(s.eventBus,["type"])):void 0,a={app:s.app,log:e,eventBus:o},n=s.server?.type==="express"?new ue({...a,config:s.server}):s.server?.type==="fastify"?new de({...a,config:s.server}):void 0,i=s.dbs?.changes?{debeziumUrl:s.dbs.changes.debeziumUrl,eventBus:new V(s.dbs.changes.kafkaConfig)}:void 0,p=Object.fromEntries(Object.entries(s.dbs?.types??{}).map(([u,f])=>[u,f.type==="mongo"?new he(f,{changes:i}):void 0]));return{app:s.app,utils:s.utils,log:e,eventBus:o,cache:t,jobs:r,server:n,dbs:p}}function Ze(s,e){for(let t of e)delete s[t];return s}var d=class s extends er{static#e;static#t={};envs;settings;constructor(e,t){super(tt(t)),s.#e=this,this.envs=Object.freeze(e),this.settings=Object.freeze(t),s.#r()}getScopedName(e,t="."){return[this.settings.app.name,e].join(t)}async start(){try{await G(s.#t.setup??[]),await G(s.#t.start??[])}catch(e){s.crash(new g("Error starting instance",{},e))}}static create(e,t){if(s.#e)throw s.crash(new g("An instance has already been created. Use that instead",{}));let r=rt.validate(e,process.env);r.valid||s.crash(new g(`Environment variables are not valid
|
|
30
|
+
${r.error.toString()}`,{messages:r.error.messages}));let o=rt.validate(et(),t(r.value));return o.valid||s.crash(new g(`Settings are not valid
|
|
31
|
+
${o.error.toString()}`,{messages:o.error.messages})),new s(r.value,o.value)}static get(){return s.#e?s.#e:s.crash(new g("Has not been initialized. Make sure an instance has been created before you get an instance",{}))}static on(e,t,r){s.#t[e]??=[],s.#t[e].push({cb:t,order:r})}static#r(){Object.entries({SIGHUP:1,SIGINT:2,SIGTERM:15}).forEach(([t,r])=>{process.on(t,async()=>{await G(s.#t.close??[],()=>{}),process.exit(128+r)})})}static resolveBeforeCrash(e){let t=e();return s.on("close",async()=>await t,10),t}static crash(e){console.error(e),process.exit(1)}};var ot=s=>O.array(O.file(s).pipe(e=>{let t=`is larger than allowed limit of ${d.get().settings.server?.requests.maxFileUploadSizeInMb}mb`;if(e?!e.isTruncated:!0)return e;throw Se.root(t,e)})),tr=s=>O.pipe(e=>O.assert(ot(s).pipe(O.min(1,"no file provided")).pipe(t=>t[0]),e),{schema:()=>({type:"string",format:"binary"})}),rr=s=>O.pipe(e=>O.assert(ot(s),e),{schema:()=>({type:"string",format:"binary"})}),ie=new st,pe=new st,sr=s=>O.pipe(e=>{let t=ie.getStore();if(!t)throw Se.root("Request not found in context",e);return O.assert(s(t),e)}),or=s=>O.pipe(e=>{let t=pe.getStore();if(!t)throw Se.root("Response not found in context",e);return O.assert(s(t),e)});import{v as nr}from"valleyed";function ae(s){let e=s.messages.reduce((t,{path:r="",message:o})=>(t[r]?t[r].messages.push(o):t[r]={field:r,messages:[o]},t),{});return new H(Object.values(e))}function Ai(s,e){let t=nr.validate(s,e);if(t.valid)return t.value;throw ae(t.error)}export{X as a,Y as b,g as c,T as d,nt as e,ae as f,Ai as g,C as h,b as i,q as j,yr as k,ee as l,je as m,Me as n,B as o,xe as p,oe as q,gt as r,ke as s,A as t,M as u,D as v,K as w,ue as x,de as y,ro as z,so as A,oo as B,no as C,J as D,j as E,Ue as F,go as G,U as H,Z as I,I as J,L as K,ce as L,$e as M,H as N,$ as O,Te as P,le as Q,fe as R,me as S,ve as T,Fe as U,_t as V,Kn as W,Hn as X,Qe as Y,he as Z,N as _,ge as $,We as aa,Ce as ba,V as ca,be as da,Ye as ea,Re as fa,d as ga};
|
|
32
|
+
//# sourceMappingURL=chunk-7LLFKFXJ.min.mjs.map
|