UNPKG

@zerva/core

Version:

🌱 Simple event driven server

6 lines • 5.01 kB
import {Logger,getGlobalContext,Emitter,uname,useDispose,parseSchemaEnv,assert,isSchemaObjectFlat,stringFromSchemaEnv,arrayFlatten,LoggerFromConfig,LogLevelAll}from'zeed';import T from'process';var P=Object.defineProperty;var z=(e,o,t)=>o in e?P(e,o,{enumerable:true,configurable:true,writable:true,value:t}):e[o]=t;var g=(e,o,t)=>z(e,typeof o!="symbol"?o+"":o,t);var d=class extends Emitter{constructor(){super(...arguments);g(this,"name",uname("context"));g(this,"modules",[]);g(this,"eventNamesEmitted",{});g(this,"uses",{});}};var c=Logger("zerva:context"),m=new d,w=e=>{m=e||new d;},r=()=>m;try{let e=getGlobalContext();e?.zerva==null?e.zerva=m:m=e.zerva,w=o=>{let t=o||new d;c("set context",t.name),e.zerva=t;},r=()=>e.zerva;}catch{c.warn("Unable to register Zerva Context globally");}var ie=m;async function f(e,...o){c("emit",e,JSON.stringify(o.map(n=>typeof n)));let t=r();return t.eventNamesEmitted[e]=true,await t.emit(e,...o)}function l(e,o){let t=r();if(typeof e=="string"&&o!=null)return t.eventNamesEmitted[e]&&c.warn(`Event '${e}' has already been emitted before listener was added`),t.on(e,o);let n=useDispose();return Object.entries(e).forEach(([i,u])=>{t.eventNamesEmitted[i]&&c.warn(`Event '${e}' has already been emitted before listener was added`),n.add(t.on(i,u));}),n}function O(e,o){let t=r();if(typeof e=="string"&&o!=null)return t.eventNamesEmitted[e]&&c.warn(`Event '${e}' has already been emitted before listener was added`),t.once(e,o);let n=useDispose();return Object.entries(e).forEach(([i,u])=>{t.eventNamesEmitted[i]&&c.warn(`Event '${e}' has already been emitted before listener was added`),n.add(t.once(i,u));}),n}function k(e,o){c("withContext");let t=r();w(e),o(e),w(t);}function ae(e){k(void 0,e);}function $(e,o){return assert(isSchemaObjectFlat(e),"getConfig schema must be a flat object schema"),parseSchemaEnv(e,o)}function ue(){let e=[];for(let o of Object.values(r().uses)){let t=o.name;t&&e.push(`# # Module: ${t} # `);let n=o.moduleOptions?.configSchema;if(n){let i=o.moduleOptions?.configOptions?.prefix??`${t.toUpperCase()}_`;e.push(stringFromSchemaEnv(n,i));}}return e.join(` `)}var x=Logger("zerva:register");function xe(e){let o=e.toLowerCase(),t=r();if(t.uses[o]!=null)return t.uses[o];x.warn(`Module '${o}' not found in context uses`);}function v(e,o=false){let t=e.toLowerCase(),n=r().modules.includes(t)||r().uses[t]!=null;return o&&!n&&x.error(`module '${e}' is missing`),n}function ve(...e){return !arrayFlatten(e).map(t=>v(t,true)).some(t=>!t)}function J(...e){let t=arrayFlatten(e).filter(n=>!v(n));if(t.length>0)throw x.error(`Zerva modules required: ${t}`),new Error(`Zerva modules required: ${t}`)}function Ce(e,...o){e=e.toLowerCase();let t=arrayFlatten(o);return x(`register ${e} ${t.length?`with dependencies=${t}`:""}`),v(e)&&x.warn(`The module '${e} has been registered multiple times`),r().modules.push(e),J(t),true}function Y(e,o){let{requires:t=[],configOptions:n,configSchema:i,options:u}=o||{},a=e.toLowerCase(),C={...u};if(i!=null){let p=$(i,{existing:u,prefix:`${a.toUpperCase()}_`,moduleName:a,...n});Object.assign(C,p);}let y=LoggerFromConfig(C?.log??o?.log??true,a,o?.logLevel??LogLevelAll);y.info(`use ${a} with config:`,C),v(a)&&y.warn(`The module '${a} has been registered multiple times`);let b=arrayFlatten(t).filter(p=>!v(p));if(b.length>0){let p=`Zerva module '${a}' requires modules: ${b}`;throw y.error(p),new Error(p)}let S={name:a,log:y,config:C,on:l,once:O,emit:f,moduleOptions:o};return r().uses[a]=S,S}function ye(e){return o=>e.setup(Y(e.name,{options:o,...e}))}var s=Logger("zerva:serve"),U=false,h=false,E=false;function Te(e){l("serveInit",e);}function be(e){l("serveStart",e);}function Se(e){l("serveStop",e);}async function I(){E?await new Promise(e=>r().once("serveDispose",()=>e(true))):h&&(h=false,E=true,await f("serveStop"),E=false,await f("serveDispose"));}l("serveStart",()=>{h=true;});l("serveStop",()=>{E!==true&&(s.warn("You should call `serveStop` instead of emitting `serveStop`!"),console.trace());});async function K(e){s("serve"),U=true,e&&(s("launch"),e()),s("init"),await f("serveInit"),s("start"),await f("serveStart"),s("serve");}async function Q(){U!==true?(s.info("Zerva has not been started manually, will start now!"),K()):h===true&&(s("Reached the end, will finish gracefully."),await I());}T.on("beforeExit",Q);var W={SIGHUP:1,SIGINT:2,SIGTERM:15},M=false;Object.keys(W).forEach(e=>{T.on(e,()=>{M?s(`Ignoring: Process received a ${e} signal`):(M=true,s(`Process received a ${e} signal`),I().then(()=>{T.exit(0);}).catch(o=>{s.error(`Error on serveStop: ${o}`);}));});});export{d as ZContext,J as assertModules,ae as createContext,ue as dumpConfig,f as emit,$ as getConfig,r as getContext,xe as getModuleContext,v as hasModule,l as on,Te as onInit,be as onStart,Se as onStop,O as once,Ce as register,Y as registerModule,ve as requireModules,K as serve,I as serveStop,w as setContext,ye as use,k as withContext,ie as zerva};//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map