UNPKG

@zerva/core

Version:

🌱 Simple event driven server

6 lines • 5.49 kB
'use strict';var zeed=require('zeed'),T=require('process');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var T__default=/*#__PURE__*/_interopDefault(T);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 zeed.Emitter{constructor(){super(...arguments);g(this,"name",zeed.uname("context"));g(this,"modules",[]);g(this,"eventNamesEmitted",{});g(this,"uses",{});}};var c=zeed.Logger("zerva:context"),m=new d;exports.setContext=e=>{m=e||new d;};exports.getContext=()=>m;try{let e=zeed.getGlobalContext();e?.zerva==null?e.zerva=m:m=e.zerva,exports.setContext=o=>{let t=o||new d;c("set context",t.name),e.zerva=t;},exports.getContext=()=>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=exports.getContext();return t.eventNamesEmitted[e]=true,await t.emit(e,...o)}function l(e,o){let t=exports.getContext();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=zeed.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=exports.getContext();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=zeed.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=exports.getContext();exports.setContext(e),o(e),exports.setContext(t);}function ae(e){k(void 0,e);}function $(e,o){return zeed.assert(zeed.isSchemaObjectFlat(e),"getConfig schema must be a flat object schema"),zeed.parseSchemaEnv(e,o)}function ue(){let e=[];for(let o of Object.values(exports.getContext().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(zeed.stringFromSchemaEnv(n,i));}}return e.join(` `)}var x=zeed.Logger("zerva:register");function xe(e){let o=e.toLowerCase(),t=exports.getContext();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=exports.getContext().modules.includes(t)||exports.getContext().uses[t]!=null;return o&&!n&&x.error(`module '${e}' is missing`),n}function ve(...e){return !zeed.arrayFlatten(e).map(t=>v(t,true)).some(t=>!t)}function J(...e){let t=zeed.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=zeed.arrayFlatten(o);return x(`register ${e} ${t.length?`with dependencies=${t}`:""}`),v(e)&&x.warn(`The module '${e} has been registered multiple times`),exports.getContext().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=zeed.LoggerFromConfig(C?.log??o?.log??true,a,o?.logLevel??zeed.LogLevelAll);y.info(`use ${a} with config:`,C),v(a)&&y.warn(`The module '${a} has been registered multiple times`);let b=zeed.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 exports.getContext().uses[a]=S,S}function ye(e){return o=>e.setup(Y(e.name,{options:o,...e}))}var s=zeed.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=>exports.getContext().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__default.default.on("beforeExit",Q);var W={SIGHUP:1,SIGINT:2,SIGTERM:15},M=false;Object.keys(W).forEach(e=>{T__default.default.on(e,()=>{M?s(`Ignoring: Process received a ${e} signal`):(M=true,s(`Process received a ${e} signal`),I().then(()=>{T__default.default.exit(0);}).catch(o=>{s.error(`Error on serveStop: ${o}`);}));});});exports.ZContext=d;exports.assertModules=J;exports.createContext=ae;exports.dumpConfig=ue;exports.emit=f;exports.getConfig=$;exports.getModuleContext=xe;exports.hasModule=v;exports.on=l;exports.onInit=Te;exports.onStart=be;exports.onStop=Se;exports.once=O;exports.register=Ce;exports.registerModule=Y;exports.requireModules=ve;exports.serve=K;exports.serveStop=I;exports.use=ye;exports.withContext=k;exports.zerva=ie;//# sourceMappingURL=index.cjs.map //# sourceMappingURL=index.cjs.map