diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index cfd0665..c61a243 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2287,7 +2287,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('eJy9Vd9v0zAQfo+U/+HYA0lGSWE80WoPXTcgGmrRMkB7Qm5ySay5drCd/tDU/51z06G1K6MIhF8qn8/3ffd957R77HtDVS81LysLJ69ev4VEWhQwVLpWmlmupO/53keeoTSYQyNz1GArhEHNMvrZnHTgC2pD2XASv4LQJRxtjo6ivu8tVQNTtgSpLDQGqQI3UHCBgIsMawtcQqamteBMZghzbqs1yqZG7Hs3mwpqYhklM0qvaVc8TANmHVugVVlb97rd+XweszXTWOmyK9o80/2YDC9G6cVLYutufJYCjQGN3xuuqc3JElhNZDI2IYqCzUFpYKVGOrPKkZ1rbrksO2BUYedMo+/l3FjNJ43d0umeGvX7MIGUYhKOBikk6RGcDdIk7fje1+T6w/jzNXwdXF0NRtfJRQrjKxiOR+fJdTIe0e4dDEY3cJmMzjuApBKh4KLWjj1R5E5BzEmuFHELvlAtHVNjxgueUVOybFiJUKoZakm9QI16yo1z0RC53PcEn3K7HgLzuCMCOe468YpGZi4Hvk3RVCOVY5KHke/dtU7MmCZhLZxCEPTbkCF/swrCWquMmMe1YJYITqP2eHPRrYwR90Bw2SyC3m44Z3rO5cO4W1YvtwN329t7TvmEKG0cD4PUSYfnzLLUKo1BFA81Mos/OeICs0+MxvIFBHE+CTpwR7dZPpZi2SPQBmEV9R9Dta3/xLHCUG2hWD5EbZ0TDuQO6mLRI0rxe7RnTVGgJkooCqemSwyiDtTMmLrS1HoPgornOcqAMOMS7SUuPzBThVFsVUozJsswqHAR7BJabW8JO6tCjJ7Ua+fOhJq+7e9aQT68Odl1otuFd1wbC8MKs1vg7Vsl3YdKukds1vv1wJz/Vw9jjTRyGV1xIbJy7Wh0qKUOeUbAT9m15xr1H86ix/E9ve3V4Df5bv3JsM3+yUTdr9X+8P4JO6ATp69shDgcbk9orTictpXg+fP1bse2dvyCKIJnbd7hDrVqzw5QaPX7Zwh/+Q5zLFgjbO/XWZsCxLrREkL6dVRX7hM+VXkjkB4D/elbQ009+JT3XcIP9UUm2g==', 'base64'));"); // Mesh Agent Status Helper, refer to modules/_agentStatus.js - duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJyNVUtv2zgQvgfwf+CNFOoyRpOTvdmim+aQxa7TR3qqF4ZCjWx6ZVIlqSZG4P++Q+phSs7G1cUwOY9vvvk4Mzr7mRpSGr2VFsgVMfCjkgYYbY5oMhsFE6UzkFlssUxXoNwcz28zmrDWUJbiU+rWaIkhBFjLyyJ1uTZbcnVF6KNUF+8oeU8YXeDHF4tSlrBYUPKmzfGG0LcfP9x+uqYJmRLWhhGPGUv85XlziQlHZ3mlhJNakR8VmN0HD4nph00yOnsenRH8PCYDDvEoeGwrZZ0bM2DHaLBJyDNxa2n5Ek9CnXbWHWzCwWZG9j6rD4sh+RIT4cUzEdtsSmhAQMeYsahgSvzlPrIWhURwMYMKHE24MJA6uNZKQYDEnkmJBE47Jns56yg87pg7vsYoVNQREdCh2KS2bKjxX6jQm2epS3u2Yl2pf5ODZeTU8lqAmvVPZd44crxbIfjfyGXHbKXsWuauiTzzgCujkNTjGAzdsbg6FBKUfbtV7uLdXzdskiTkdxLnOBV/73UyhO7L7RLYQgpgl2NfECrsMpkdO5TprtCpfwGqKoqBgTO7/sGALP8dAvz59W7Oy9SgDj0M7vRXZ6RasWSYeMCMSJ1YEwbJyWSBj0YkQcCM3ioUJj6vL2BLrVA7X0CA/AkZHWb1X8Pdq3B+perz8yEUyxomsK+2Ktz7/t8pfRHPqSi/whx7ep24/9OhVwQK+bTmWiGhB5phN+OQ+xhi9+xAZS+90BfQvdBSUWg76N++HovtX69cP6P+qPIcDM/RnQX52aA4me9YP66fnXE8H+Chyg8h0qLQIpS4abmIzNGUPxrpoHuvrZVncUwmsfGGC13uGPqM+28uQAph/GV7E89B1KYf3aHt+94esC41jh3mP45BqwvghV4x+tmPaKyb/A12TcK28A4OOOcdjatCP6QFX/qLyjrcW8SCu5db0JVjrw3TXq5vKn0ogDjtj10qXJQ0Tue/dsct4Uk61hU8JheTyeTQ0WjHteMdkeAOcWtQ/Z12DM7LOay2eoJ5Bdebjn6f392T67v5/Ob6/ubjP7Qn215NEW1NfsiwQlx+2F6fNaqp7VIMOgMrjCydNpYmh77W+KNMRxV5tEOSvGP9rk/atSrZ6qzCDPBUauNs2N1BL9P6B/f1f80shHM=', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v4zYQvQfwf+CNFNZVgk1OdtNFmg3QFFtnu5s91YWhSGObLk1qScqJEfi/d0bWByU7Sbe8JCbffHHePGpwskksy61ZSwfskln4XkgLgldbPBoPSog2GcgsRMySBWg/wf3bjEeiBso8/Zz4JSLRRQrOxblK/NzYNbu8ZPxR6vP3nH1ggk9xxdNpLnOYTjl7V8d4x/hPH69uP1/ziI2YqN2kj5mI6PC0OsSAg5N5oVMvjWZZ4pPfEp0psCJdFvqfaHDyPDhhuCgtBXq8/yXnbA+IcW+Bmf7MLiL2zPxSurjQbinnvvIwxmp9YfWY7VpbgWZY3d6FhST7dqv9+ftPN+IsitgvLPT9X/y2OVIJjWenZAriYkiZY9UX0bgF5slWmYS6oQulqgNvt/t/qqpptcDfv95N4jyxDgSFib356q3UCxHVjqsS08SnSyYgOnBWFlLxIp5ZWAl+qzeJwpZ9AZcbjQz6AinIDWS89kqrKrYT5li2p6f9EE5UFeBFu0L5D92fI96J85b1sEQcr/epW2+/39QAJMrbva37hhYIw8slV7uAp98LsNsrGh1hHlZDnBLYdKmK10Wdhcd6LkVjLLCQIQJWTXAqs5xKN242VuXGCkPXtaLLeIbh8OCZpetsxHiZBx9iRFXAiNHhLpgQSosGlgh2SAXylyqJRYSKoMHzKE5xJjxcG62hTFo8Iw39ctQow67HjcpTjFCe7s0wr7bmqEUHKTQNJzOiNNoEGhDG6EBBZy95PxLhBd6nyrgeyUvW7DUp3KKG0rX/WsznYOM5uhHlLLpy/OR8K+rmRH13ZPtQzFvrRCmTltxa1STsmSA8frTSQyNKNZIoPGRnfYNVnJp8K9Bu2GpMp/LSHQHC011vikA5eJ0lRKjjfbewNhu4UuqTdB40WFc19AWeHMNTV1+h1ev86IFfYcgx/r3JjB4r/i8jfpANP8SEF1kQXM0BD3attlSQ8DvCt9KD4k/K5clw13m0nU+sF6384fg7oyBWZiH4n6RQeCPsD3BLVkomGXiI47i54IUyD4mKZ3RQOI8fGcyBv5drMIUXB00MGtiJ9U0nDwqYN7Ttk9QHQcNwtOoPkhk8SS+a2xiy87Ozs7bXgdDXsoaZoED6Jei+pLeAw0RJjkuVr9QYJXwv+vyvyd09u76bTG6u728+/s2b75SD+oIrrEJBhtXiO4BsQG+HzzUTYQEZuNTK3BvreCfbpvyDujaUaJjEhh7DAxih+jdKsPJdfhtXU2ptsgLjwFNurHflO1eSa7T/g2/bv6RlHoI=', 'base64'));"); // Task Scheduler, refer to modules/task-scheduler.js duk_peval_string_noresult(ctx, "addCompressedModule('task-scheduler', Buffer.from('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', 'base64'));"); diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index 4600e62..7de93ae 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -968,56 +968,15 @@ BOOL ILibDuktape_server_ipc_ReadSink(void *chain, HANDLE h, ILibWaitHandle_Error winIPC->endCalled = 0; ILibDuktape_DuplexStream_Closed(winIPC->ds); - if (winIPC->endCalled == 0) + if (ILibMemory_CanaryOK(winIPC) && winIPC->endCalled == 0) { + duk_context *_ctx = winIPC->ctx; duk_push_heapptr(winIPC->ctx, winIPC->ds->readableStream->object); // [obj] duk_prepare_method_call(winIPC->ctx, -1, "end"); // [obj][end][this] - if (duk_pcall_method(winIPC->ctx, 0) != 0) { ILibDuktape_Process_UncaughtExceptionEx(winIPC->ctx, "net.ipcServer.end() Error: "); } - duk_pop_2(winIPC->ctx); // ... + if (duk_pcall_method(winIPC->ctx, 0) != 0) { ILibDuktape_Process_UncaughtExceptionEx(_ctx, "net.ipcServer.end() Error: "); } + duk_pop_2(_ctx); // ... } - if (winIPC->mServer != NULL) - { - duk_push_heapptr(winIPC->ctx, winIPC->mServer); // [server] - if (duk_has_prop_string(winIPC->ctx, -1, ILibDuktape_net_server_closed_needEmit)) - { - ILibDuktape_EventEmitter_SetupEmit(winIPC->ctx, winIPC->mServer, "close"); // [server][emit][this][close] - if (duk_pcall_method(winIPC->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(winIPC->ctx, "net.ipcServer.onClose() Error: "); } - duk_pop(winIPC->ctx); // [server] - } - duk_pop(winIPC->ctx); // ... - } - - duk_context *_ctx = winIPC->ctx; - duk_push_heapptr(winIPC->ctx, winIPC->mServer); // [server] - duk_get_prop_string(winIPC->ctx, -1, ILibDuktape_net_ConcurrencyArray); // [server][array] - duk_prepare_method_call(winIPC->ctx, -1, "indexOf"); // [server][array][indexOf][this] - duk_push_heapptr(winIPC->ctx, winIPC->ipcreserved); // [server][array][indexOf][this][buffer] - if (duk_pcall_method(winIPC->ctx, 1) == 0) - { - int ix = duk_get_int(winIPC->ctx, -1); // [server][array][index] - int setup = 0; - if (ix >= 0) - { - if (duk_get_length(_ctx, -2) == Duktape_GetIntPropertyValue(_ctx, -3, ILibDuktape_net_ConcurrencyMaxSize, -1)) - { - // We are at the maximum number of concurrent sessions, so after we remove ourselves from the list - // we must prepare for another connection - setup = 1; - } - duk_array_remove(winIPC->ctx, -2, ix); - - if (setup != 0) - { - duk_prepare_method_call(_ctx, -3, "listen"); // [server][array][index][listen][this] - duk_get_prop_string(_ctx, -1, ILibDuktape_SERVER2LISTENOPTIONS);// [server][array][index][listen][this][options] - duk_pcall_method(_ctx, 1); duk_pop(_ctx); // [server][array][index] - } - } - } - duk_pop_3(_ctx); // ... - - return(FALSE); } } @@ -1157,22 +1116,60 @@ void ILibDuktape_net_server_IPC_EndSink(ILibDuktape_DuplexStream *stream, void * if (winIPC->read_overlapped.hEvent != NULL) { CloseHandle(winIPC->read_overlapped.hEvent); winIPC->read_overlapped.hEvent = NULL; } if (winIPC->write_overlapped.hEvent != NULL) { CloseHandle(winIPC->write_overlapped.hEvent); winIPC->write_overlapped.hEvent = NULL; } - if (winIPC->mServer != NULL && winIPC->backlog == 0) + if (winIPC != NULL && winIPC->mServer != NULL) { - // Server IPC, so we can create a new Instance, and listen for a connection - // We need to dereference this, because winIPC will go out of scope when we call listen - duk_context *ctx = winIPC->ctx; - CloseHandle(winIPC->overlapped.hEvent); winIPC->overlapped.hEvent = NULL; + duk_context *_ctx = winIPC->ctx; + duk_push_heapptr(winIPC->ctx, winIPC->mServer); // [server] + int needEmitClose = Duktape_GetBooleanProperty(winIPC->ctx, -1, ILibDuktape_net_server_closed_needEmit, 0); - duk_push_heapptr(ctx, winIPC->mServer); // [server] - if (Duktape_GetBooleanProperty(ctx, -1, ILibDuktape_net_server_closed_needEmit, 0) == 0) + duk_get_prop_string(winIPC->ctx, -1, ILibDuktape_net_ConcurrencyArray); // [server][array] + duk_prepare_method_call(winIPC->ctx, -1, "indexOf"); // [server][array][indexOf][this] + duk_push_heapptr(winIPC->ctx, winIPC->ipcreserved); // [server][array][indexOf][this][buffer] + if (duk_pcall_method(winIPC->ctx, 1) == 0) // [server][array][index] { - duk_get_prop_string(ctx, -1, "listen"); // [server][listen] - duk_swap_top(ctx, -2); // [listen][this] - duk_get_prop_string(ctx, -1, ILibDuktape_SERVER2LISTENOPTIONS); // [listen][this][options] - duk_pcall_method(ctx, 1); // [ret] + int ix = duk_get_int(winIPC->ctx, -1); + if (ix >= 0) + { + duk_uarridx_t numObjects = (duk_uarridx_t)duk_get_length(_ctx, -2); + int maxLen = Duktape_GetIntPropertyValue(_ctx, -3, ILibDuktape_net_ConcurrencyMaxSize, 1); + duk_uarridx_t z; + int setup = numObjects == maxLen ? 1 : 0; + int connected = 0; + + for (z = 0; z < numObjects; ++z) + { + duk_get_prop_index(winIPC->ctx, -2, z); // [server][array][index][winIPC] + if (z != ix && ((ILibDuktape_net_WindowsIPC*)Duktape_GetBuffer(winIPC->ctx, -1, NULL))->clientConnected == FALSE) + { + setup = 0; + } + if (((ILibDuktape_net_WindowsIPC*)Duktape_GetBuffer(winIPC->ctx, -1, NULL))->clientConnected == TRUE) + { + ++connected; + } + duk_pop(winIPC->ctx); // [server][array][index] + } + + duk_array_remove(winIPC->ctx, -2, ix); + + if (setup != 0 && needEmitClose == 0) + { + duk_prepare_method_call(_ctx, -3, "listen"); // [server][array][index][listen][this] + duk_get_prop_string(_ctx, -1, ILibDuktape_SERVER2LISTENOPTIONS);// [server][array][index][listen][this][options] + duk_pcall_method(_ctx, 1); duk_pop(_ctx); // [server][array][index] + } + else + { + if (needEmitClose != 0 && connected == 0) + { + // All connections are now closed, so we can emit 'close' + ILibDuktape_EventEmitter_SetupEmitEx(_ctx, -3, "close"); // [server][array][index][emit][this][close] + duk_pcall_method(_ctx, 1); duk_pop(_ctx); // [server][array][index] + } + } + } } - duk_pop(ctx); // ... + duk_pop_3(_ctx); // ... } } duk_ret_t ILibDuktape_net_server_IPC_ConnectSink_Finalizer(duk_context *ctx) @@ -1386,7 +1383,8 @@ duk_ret_t ILibDuktape_net_server_listen(duk_context *ctx) duk_array_push(ctx, -3); // [server][array][buffer] duk_remove(ctx, -2); // [server][buffer] winIPC->ipcreserved = duk_get_heapptr(ctx, -1); - duk_put_prop_string(ctx, -2, ILibDuktape_net_WindowsIPC_Buffer); + duk_pop(ctx); // [server] + winIPC->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); winIPC->read_overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); winIPC->write_overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -1432,7 +1430,6 @@ duk_ret_t ILibDuktape_net_server_listen(duk_context *ctx) { DWORD err = GetLastError(); CloseHandle(winIPC->overlapped.hEvent); winIPC->overlapped.hEvent = NULL; - duk_del_prop_string(ctx, -1, ILibDuktape_net_WindowsIPC_Buffer); return(ILibDuktape_Error(ctx, "Error Creating Named Pipe: %s", ipc)); } //printf("ConnectNamedPipe(%s)\n", ipc); @@ -1538,12 +1535,19 @@ duk_ret_t ILibDuktape_net_server_Finalizer(duk_context *ctx) } #ifdef WIN32 - ILibDuktape_net_WindowsIPC *ipc = Duktape_GetBufferProperty(ctx, 0, ILibDuktape_net_WindowsIPC_Buffer); - if (ipc != NULL && ipc->overlapped.hEvent != NULL) + ILibDuktape_net_WindowsIPC *ipc = NULL; + duk_get_prop_string(ctx, 0, ILibDuktape_net_ConcurrencyArray); // [array] + while (duk_get_length(ctx, -1) > 0) { - ILibChain_RemoveWaitHandle(duk_ctx_chain(ctx), ipc->overlapped.hEvent); - if (ipc->mPipeHandle != NULL) { CloseHandle(ipc->mPipeHandle); ipc->mPipeHandle = NULL; } - if (ipc->overlapped.hEvent != NULL) { CloseHandle(ipc->overlapped.hEvent); ipc->overlapped.hEvent = NULL; } + duk_array_pop(ctx, -1); // [array][winipc] + ipc = (ILibDuktape_net_WindowsIPC*)Duktape_GetBuffer(ctx, -1, NULL); + if (ipc != NULL && ipc->overlapped.hEvent != NULL) + { + ILibChain_RemoveWaitHandle(duk_ctx_chain(ctx), ipc->overlapped.hEvent); + if (ipc->mPipeHandle != NULL) { CloseHandle(ipc->mPipeHandle); ipc->mPipeHandle = NULL; } + if (ipc->overlapped.hEvent != NULL) { CloseHandle(ipc->overlapped.hEvent); ipc->overlapped.hEvent = NULL; } + } + duk_pop(ctx); // [array] } #endif @@ -1615,28 +1619,48 @@ duk_ret_t ILibDuktape_net_server_close(duk_context *ctx) #ifdef WIN32 else { - duk_push_this(ctx); - ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_net_WindowsIPC_Buffer); - if (winIPC != NULL && winIPC->mPipeHandle != NULL) - { - if (winIPC->clientConnected == FALSE) - { - // Listening - DisconnectNamedPipe(winIPC->mPipeHandle); - CancelIoEx(winIPC->mPipeHandle, NULL); - CloseHandle(winIPC->mPipeHandle); - winIPC->mPipeHandle = NULL; + duk_push_this(ctx); // [server] + duk_get_prop_string(ctx, -1, ILibDuktape_net_ConcurrencyArray); // [server][array] - ILibDuktape_EventEmitter_SetupEmit(ctx, server->self, "close"); // [emit][this][close] - duk_call_method(ctx, 1); - } - else + int connections = 0; + ILibDuktape_net_WindowsIPC *winIPC = NULL; + duk_uarridx_t i; + duk_size_t len = duk_get_length(ctx, -1); + for (i = 0; i < len; ++i) + { + duk_get_prop_index(ctx, -1, i); // [server][array][winipc] + winIPC = (ILibDuktape_net_WindowsIPC*)Duktape_GetBuffer(ctx, -1, NULL); + if (winIPC != NULL && winIPC->mPipeHandle != NULL) { - // Connected - duk_push_this(ctx); - duk_push_true(ctx); - duk_put_prop_string(ctx, -2, ILibDuktape_net_server_closed_needEmit); + if (winIPC->clientConnected == FALSE) + { + // This object is listening for a new connection + DisconnectNamedPipe(winIPC->mPipeHandle); + CancelIoEx(winIPC->mPipeHandle, NULL); + CloseHandle(winIPC->mPipeHandle); + winIPC->mPipeHandle = NULL; + ILibChain_RemoveWaitHandle(duk_ctx_chain(ctx), winIPC->overlapped.hEvent); + } + else + { + ++connections; + } } + duk_pop(ctx); // [server][array] + } + + if (connections == 0) + { + // No active connections, so we can emit 'close' now + ILibDuktape_EventEmitter_SetupEmit(ctx, server->self, "close"); // [emit][this][close] + duk_call_method(ctx, 1); + } + else + { + // Set a flag, so we emit this when all connections are closed + duk_push_this(ctx); + duk_push_true(ctx); + duk_put_prop_string(ctx, -2, ILibDuktape_net_server_closed_needEmit); } } #endif diff --git a/modules/_agentStatus.js b/modules/_agentStatus.js index 4b75e89..1ebf52a 100644 --- a/modules/_agentStatus.js +++ b/modules/_agentStatus.js @@ -34,13 +34,11 @@ function queryAgent(obj, prev) { var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; }); ret._obj = { cmd: 'query', value: obj }; - console.log(obj, prev); if (prev == null) { ret.client = require('net').createConnection({ path: ipcPath }); ret.client.on('connect', function () { - console.log('ON CONNECT'); this.on('data', dataHandler); this.on('end', function () { @@ -89,7 +87,7 @@ function start() if (res == null) { res = '[NOT CONNECTED]'; } console.log('Mesh Agent connected to: ' + res); return (queryAgent('descriptors', connection)); - }).then(console.log).then(function () { process._exit(); }).catch(function () { process._exit(); }); + }).then(function (v) { console.log(v); }).then(function () { process._exit(); }).catch(function () { process._exit(); }); } module.exports = { start: start }; \ No newline at end of file