UNPKG

paraemu

Version:

An working enviroment that provides a simplified interface for developers who want to fully parallelize node execution

93 lines (74 loc) 2.5 kB
(()=>{ "use strict"; const beson = require( 'beson' ); const {Helper:{SetConstant}} = include( 'lib' ); const JOB_WORKER_CONN = require( './job-worker-connection' ); const EXEC_CONF = JSON.parse(process.env.paraemu); const EXPORTED = module.exports = JOB_WORKER_CONN(EXEC_CONF.groupId, EXEC_CONF.taskId); const JOB_MAP = { [EXPORTED.jobId]:EXPORTED }; const JOB_LIST = [ EXPORTED ]; // region [ Add execution constants and other apis ] SetConstant(EXPORTED, { tag:EXEC_CONF.tag, args:EXEC_CONF.args }); EXPORTED.job=()=>{ const JOB_CONN = JOB_WORKER_CONN(EXPORTED.groupId, EXPORTED.taskId); JOB_CONN.__in = EXPORTED.__in; JOB_MAP[ JOB_CONN.jobId ] = JOB_CONN; JOB_LIST.push(JOB_CONN); JOB_CONN.on( paraemu.SYSTEM_HOOK.PARAEMU_EVENT, __RECEIVING_EVENT); return JOB_CONN; }; // endregion // region [ APIs for developers ] Object.defineProperty(process, '__on', { value:process.on.bind(process), configurable:false, writable:false, enumerable:false }); process.on=(event, ...args)=>{ if ( event === 'message' ) return; return process.__on(event, ...args); }; // endregion // region [ Handle core events ] EXPORTED.on( paraemu.SYSTEM_HOOK.PARAEMU_EVENT, __RECEIVING_EVENT); process.__on( 'message', (msg)=>{ const eventData = msg.eventData; if( eventData && typeof eventData === 'string' ) msg.eventData = beson.Deserialize( Buffer.from( eventData, 'base64' ) ); if ( Object(msg) !== msg ) { return; } let [,, t_job=null] = msg.target ? msg.target.split('-') : [null, null, null]; if ( !t_job ) { for( let _job of JOB_LIST ) { _job.__dispatch(msg); } } else { let _job = JOB_MAP[t_job]; if ( _job ) { _job.__dispatch(msg, false); } } }); // endregion // region [ Prepare ready flag and start monitoring ready flag and fire worker-ready event ] let IS_TASK_READY = true; const __CHECK_READY = (delay=false)=>{ if ( !delay && IS_TASK_READY ) { process.send({ type:'worker-ready' }); return; } setTimeout(__CHECK_READY, 0); }; Object.defineProperty(EXPORTED, 'ready', { set:(val)=>{IS_TASK_READY = !!val;}, get:()=>{return IS_TASK_READY;}, configurable:false, enumerable:true }); __CHECK_READY(true); // endregion function __RECEIVING_EVENT(eventInfo){ const eventData = eventInfo.eventData; if( eventData && eventData.length > 0 ) eventInfo.eventData = Buffer.from( beson.Serialize(eventData) ).toString('base64'); process.send(eventInfo); } })();