diff --git a/microscript/ILibDuktape_Dgram.c b/microscript/ILibDuktape_Dgram.c index 781bb23..928b573 100644 --- a/microscript/ILibDuktape_Dgram.c +++ b/microscript/ILibDuktape_Dgram.c @@ -103,8 +103,9 @@ void ILibDuktape_Dgram_Socket_OnData(ILibAsyncUDPSocket_SocketModule socketModul duk_push_int(ptrs->ctx, bufferLength); duk_put_prop_string(ptrs->ctx, -2, "size"); + duk_context *X = ptrs->ctx; if (duk_pcall_method(ptrs->ctx, 3) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ptrs->ctx, "dgram.message() dispatch error"); } - duk_pop(ptrs->ctx); // ... + duk_pop(X); // ... } } void ILibDuktape_Dgram_Socket_OnSendOK(ILibAsyncUDPSocket_SocketModule socketModule, void *user1, void *user2) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 067c6be..2ed0223 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2014,6 +2014,20 @@ duk_ret_t ILibDuktape_Polyfills_Object_keys(duk_context *ctx) duk_pop(ctx); // [obj][keys] return(1); } +duk_ret_t ILibDuktape_Polyfills_function_getter(duk_context *ctx) +{ + duk_push_this(ctx); // [Function] + duk_push_true(ctx); + duk_put_prop_string(ctx, -2, ILibDuktape_EventEmitter_InfrastructureEvent); + return(1); +} +void ILibDuktape_Polyfills_function(duk_context *ctx) +{ + duk_get_prop_string(ctx, -1, "Function"); // [g][Function] + duk_get_prop_string(ctx, -1, "prototype"); // [g][Function][prototype] + ILibDuktape_CreateEventWithGetter(ctx, "internal", ILibDuktape_Polyfills_function_getter); + duk_pop_2(ctx); // [g] +} void ILibDuktape_Polyfills_object(duk_context *ctx) { // Polyfill Object._hashCode() @@ -2277,7 +2291,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('clipboard', Buffer.from('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', 'base64'));"); // Promise: This is very important, as it is used everywhere. Refer to /modules/promise.js to see a human readable version of promise.js - duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('eJy9Gk1v2zj2bsD/gclhLE+9dqanRYwcsmmK9W6RDJJMO4MgMBiZtpVRJC8lxzU6/u/7HimKpEjKbhqMLrbIx/f9RVKjn7udi3y15cliWZL3J7/8k0yykqXkIuernNMyybNup9v5lMQsK9iMrLMZ46RcMnK+ojH8VDMD8pnxAqDJ++EJiRDguJo67o+7nW2+Js90S7K8JOuCAYakIPMkZYR9jdmqJElG4vx5lSY0ixnZJOVSUKlwDLudPyoM+WNJAZgC+Are5iYYoSVyS+BZluXqdDTabDZDKjgd5nwxSiVcMfo0ubi8ur38B3CLK37LUlYUhLP/rRMOYj5uCV0BMzF9BBZTuiE5J3TBGcyVOTK74UmZZIsBKfJ5uaGcdTuzpCh58rguLT0p1kBeEwA0RTNyfH5LJrfH5F/nt5PbQbfzZXL37+vf7siX85ub86u7yeUtub4hF9dXHyZ3k+srePtIzq/+IP+dXH0YEAZaAirs64oj98BighpkM1DXLWMW+Xku2SlWLE7mSQxCZYs1XTCyyF8Yz0AWsmL8OSnQigUwN+t20uQ5KYUTFK5EQOTnESrvhXLQ3PxO6OqMfNuNcXS+zmJcSRasvMnz8leeA3IW5Y9P/W7nm7TSZgkugEPDFagwU0B9OVsB4QMggNoBHEuInfzhrFzzjAgSMLOz2GAvsGxagGeBM/DpkqUgbjRjBRp8GtM0ZeDFJeXA7wDVBUadaU7RYYfT68cnFpeTD8BLz0bYGxtwSBRAatr4J3KFQsUBvQJA7x/GejyZkwiXDCsuyNEZydZp2iffBPxwtS6WFkR/rHSADwxGiDtBR4UF62fgtOhrAIMHfDTOGvg+eegbHBnIlZIFeamuIcbKVo5UCh0IpH2FY9fUjoID0W0TOICSBMDJP8680tGZspkDUbB0juthQHpFwCcCzqB9QImesc13uVM/5I0Vx7CwyNc8ZuBemFDw7xV9rteLYfkXhzVD9aphnkXmOtLGpIMUETCIdItIXygPHEs8Tf5VNK/k70cEbYmVCswKkmpMW0YvTaAG8YymmE1Ijei0xjNUAL0BqYZOxdKBCLVTYrA1kHWFQdI9JXOaYq1inOe8qF9rgHPw2VOIxQFRBC7ydVaekpMBma5XpyIKa2euqkUkM0HR6w8v8c8laBIWD9EHIlseFQ5SIoiBeZIxUCVYpdxGUoBjK8EdD4JRC4Y61SkmwuSgHFRSXa8wLQzsVYW96oWma9a3QRp0VEYSoCoVkZ9+IooKOavSk7vOgwqf0Yh8gWLNGfQDJM2zBVQWqIbQcyxp5l+CHNjKHIIQdI19y1GQfgsP+MQpo3zy/MxmCS1ZCL+ZCJtPiCXJUWDhzh32DGn1EqH6BjJjxa4vKq5qfRo8QWroQTL4BM0Hy6BQDQzzC8+VKUP8vQCffaTxn26tGo1i6ALylA3TfNFEaKDpydga9cg7yYh8h7eejjM9Ww+ZShYNhVahXRhrWuh2PWh88vSFzXrokEcmQeWgmkIwkpCWJX5V0GRA2lgwRTQdIplH/OjM44Ie15MsQoqYymD9jKaNtBwDwpvoTUvv0wbmlUobkS2SzqlVBP/1FwlDiMzYD6tMmAhds9HdmZm9KQdfGV7JvtYpvuSOc9fRvifGPQr2xXRbJNtkvHG7c5mzZPlhJr3YfMz6ye5j+nu85pUh9Nrw2bUxBrWqTE2+foiRe19Hu+t7G49hFY/c7OKnatDTyiPz9fxwii2nwW1dmq02vQlfab0KvnEYsEbsBk8Q9NyzzzD3HzoDNXci3oylXSWcyvqeeGhYq5VduSXZS6UZJ/R1Sw3DMFB/kGXcSIvdFQ3trjyLDpRVb7/ogy/8fRs1F3IXDC+xPmXZolxigL1HK+LY/S8Psn4Js25XLJ9H1XhfRGIuGtaeAW/290aD314xVtytGE21BIpHTfb3208fAUtjWQC6XLIsMgMY3eCmsn+032aCacqfW0JEPdovgtvuFkL4CEKOeROvJwT7RVSP8Hkj98nRgSTgeEtjg+BqS1aH6IBtgsGC2qlNp/EySWe/qlcoNpFj3N1rAtFJn1roxlR1GDHevz6qa46vVoRKBSoob5YKORguFXL+8FJhwdelwk3/frzfAXpApaj6BRNif1p0zRemvz/J7U+FVtejthRu8rGY8CQfNFfEvZ2rbqRD87KNxrTJvY3bvvroX4WbeN086t0c7ZO9IQoSxqwoKm9XOC/FITwggf1HfciiJmUGgMlTgvu2/9xeXw3xIDtbJPMtEHUzirb//UnYJo5TWwFsTrkB7FvrBu+eiDV2PCo6DPiYlvHSCGqhaP8hLi/9OyGTY2dXHotWpAqlQfMsUp9mqYO4SiSDw3kCmNKtmXgCTHqJK20dTttUJ5ZWi7KqjrCDraTy5z4Fh6kuoJR6L+xlrEagTih3TQIWeU8gvMoWNVpLJ4ZN3KfhJaz8LHwNj2aVmxj6G5AnrROgBpBPY7s2ShT2HYg+QPX07VrIA/ZOoxG5w3s5dTK7oQWhKWd0tiXaukVOAE9BQDXxn0gJ74SWNJuljFe1C+oNVVg85wYvFctm0mzp0j2nLS+HHrcI4P29agsGofaXkMoD0C0uXZnQ3WqGjhm96GpX9aCTye3ArtFusfbpIcQ7KPkAeo1Xl3SwpXwjde6L+4OV6d9itbarbybImwhhcC3xWW06+LfEYqcecbcgJ8yS0HqAIuuzE/B7CnNgkSbGt05tMe589N3LIMSXZ8LWUqUh0QVEnhvpZgILdOShLHw4pOrH2UMYWLY/ZgVraT0CvZLSLaTMoz21w7oXILf0heEHAAwyZMzkJxlQReSZgelA8hOB+wby6ZIWy4t8xqL+Q8hPgn6vexj7JmzGkN8mTYOSUVgrS7deytUaOB6Y0jfv4MKNvHUz51Fs4GhSWEVtnivfNbuuaijSl6/f0WnUGvB9iFBv6LzHGYZ47V8P6E8z/Nmtavib83bH7+YezDtaLWg4Wys4go7w9+jkLdRRZb4fVwekPlMXmAmr1Ig3do6jhDXCZNMbSn31FkxUiycnUuvzFTFfuPMGVwBivLmgszxjnoNxVbrwkh6mT8ZG5PgsZuuhIZUxCQZrHB22hDZmwHWMm2qnT333DhSsGRRV1Ra8Oo3d38jKlZUePDdmGkb3ZE1ibV2MmUDB11rF/UiTdM2ZI+6RZvJtBarO0pCvFhEaMYZ7IFfTaIUT1/gN1XmU1vjGDH5V4HU7z/lsnbIh+7rKeYkZQ3+eZk8N7Z2luneuB0IL6g+F6hX1yPj/S0YAbA==', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('promise', Buffer.from('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', 'base64'));"); // util-agentlog, used to parse agent error logs. Refer to modules/util-agentlog.js duk_peval_string_noresult(ctx, "addCompressedModule('util-agentlog', Buffer.from('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', 'base64'));"); @@ -3297,6 +3311,7 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) ILibDuktape_Polyfills_byte_ordering(ctx); ILibDuktape_Polyfills_timer(ctx); ILibDuktape_Polyfills_object(ctx); + ILibDuktape_Polyfills_function(ctx); ILibDuktape_CreateInstanceMethod(ctx, "addModuleObject", ILibDuktape_Polyfills_addModuleObject, 2); ILibDuktape_CreateInstanceMethod(ctx, "addModule", ILibDuktape_Polyfills_addModule, 2); diff --git a/microstack/ILibWebClient.c b/microstack/ILibWebClient.c index b8fb45e..5374c65 100644 --- a/microstack/ILibWebClient.c +++ b/microstack/ILibWebClient.c @@ -2328,8 +2328,8 @@ void ILibWebClient_PreProcess(void* WebClientModule, fd_set *readset, fd_set *wr NULL, wcdo->proxy_remoteHostAndPort, (struct sockaddr*)&wcdo->proxy, - wcdo->proxy_username[0]==NULL?NULL:wcdo->proxy_username, - wcdo->proxy_password[0]==NULL?NULL:wcdo->proxy_password, + wcdo->proxy_username[0]==0?NULL:wcdo->proxy_username, + wcdo->proxy_password[0]==0?NULL:wcdo->proxy_password, ILibWebClient_OnInterrupt, wcdo); } diff --git a/modules/dhcp.js b/modules/dhcp.js index ce98d7c..92b9bd5 100644 --- a/modules/dhcp.js +++ b/modules/dhcp.js @@ -193,9 +193,7 @@ function createPacket(messageType, data) function raw(localAddress, port, buffer, handler) { var ret = new promise(promise_default); - ret.handler = handler; ret.socket = require('dgram').createSocket({ type: 'udp4' }); - ret.socket.promise = ret; try { ret.socket.bind({ address: localAddress, port: (port != null && port != 0) ? port : null }); @@ -205,6 +203,7 @@ function raw(localAddress, port, buffer, handler) ret._rej('Unable to bind to ' + localAddress); return (ret); } + ret.socket.setBroadcast(true); ret.socket.setMulticastInterface(localAddress); ret.socket.setMulticastTTL(1); @@ -213,6 +212,7 @@ function raw(localAddress, port, buffer, handler) ret.socket.send(buffer, 67, '255.255.255.255'); return (ret); } + function info(interfaceName, port) { var f = require('os').networkInterfaces(); @@ -226,18 +226,23 @@ function info(interfaceName, port) try { var b = createPacket(8, { ciaddress: f[interfaceName][i].address, chaddress: f[interfaceName][i].mac }); - var p = raw(f[interfaceName][i].address, port, b, function infoHandler(msg) + _hide(raw(f[interfaceName][i].address, port, b, function infoHandler(msg) { var res = parseDHCP(msg); if (res.chaddr.toUpperCase() == this.hwaddr.toUpperCase() && res.options != null && res.options.lease != null) { clearTimeout(this.timeout); + setImmediate(function (s) { s.removeAllListeners('message'); }, this.socket); // Works around bug in older dgram.js this._res(res); } - }); - p.hwaddr = f[interfaceName][i].mac; - p.timeout = setTimeout(function (x) { x._rej('timeout'); }, 2000, p); - return (p); + })); + _hide().hwaddr = f[interfaceName][i].mac; + _hide().timeout = setTimeout(function (x) + { + x.socket.removeAllListeners('message'); + x._rej('timeout'); + }, 2000, _hide()); + return (_hide(true)); } catch(e) { diff --git a/modules/promise.js b/modules/promise.js index 67d2179..4d385bb 100644 --- a/modules/promise.js +++ b/modules/promise.js @@ -16,6 +16,12 @@ limitations under the License. var refTable = {}; +function promiseInitializer(r,j) +{ + this._res = r; + this._rej = j; +} + function getRootPromise(obj) { while(obj.parentPromise) @@ -25,39 +31,39 @@ function getRootPromise(obj) return (obj); } -function event_switcher_helper(desired_callee, target, forward) -{ - this._ObjectID = 'event_switcher'; - this.func = function func() - { - var args = []; - if (func.forward != null) { args.push(func.forward); } - for(var i in arguments) - { - args.push(arguments[i]); - } - return (func.target.apply(func.desired, args)); - }; - this.func.desired = desired_callee; - this.func.target = target; - this.func.forward = forward; - this.func.self = this; -} function event_switcher(desired_callee, target) { - return (new event_switcher_helper(desired_callee, target)); + return ({ _ObjectID: 'event_switcher', func: target.bind(desired_callee) }); } function event_forwarder(sourceObj, sourceName, targetObj, targetName) { - sourceObj.on(sourceName, (new event_switcher_helper(targetObj, targetObj.emit, targetName)).func); + sourceObj.on(sourceName, targetObj.emit.bind(targetObj)); } + +function return_resolved() +{ + var parms = ['resolved']; + for (var ai in arguments) + { + parms.push(arguments[ai]); + } + this._XSLF.emit.apply(this._XSLF, parms); +} +function return_rejected() +{ + this._XSLF.promise.__childPromise._rej(e); +} +function emitreject(a) +{ + process.emit('uncaughtException', 'promise.uncaughtRejection: ' + JSON.stringify(a)); +} function Promise(promiseFunc) { this._ObjectID = 'promise'; this.promise = this; - this._internal = { _ObjectID: 'promise.internal', promise: this, func: promiseFunc, completed: false, errors: false, completedArgs: [], internalCount: 0, _up: null }; + this._internal = { _ObjectID: 'promise.internal', promise: this, completed: false, errors: false, completedArgs: [], internalCount: 0, _up: null }; require('events').EventEmitter.call(this._internal); Object.defineProperty(this, "parentPromise", { @@ -76,10 +82,22 @@ function Promise(promiseFunc) this._up = value; } }); - - - - this._internal.on('newListener', function (eventName, eventCallback) + Object.defineProperty(this, "descriptorMetadata", + { + get: function () + { + return (require('events').getProperty.call(this._internal, '?_FinalizerDebugMessage')); + }, + set: function (value) + { + require('events').setProperty.call(this._internal, '?_FinalizerDebugMessage', value); + } + }); + this._internal.on('~', function () + { + this.completedArgs = []; + }); + this._internal.on('newListener2', (function (eventName, eventCallback) { //console.log('newListener', eventName, 'errors/' + this.errors + ' completed/' + this.completed); var r = null; @@ -91,9 +109,12 @@ function Promise(promiseFunc) { this.emit_returnValue('resolved', r); } + this.removeAllListeners('resolved'); + this.removeAllListeners('rejected'); } - if (eventName == 'rejected' && (eventCallback.internal == null || eventCallback.internal == false)) + //if (eventName == 'rejected' && (eventCallback.internal == null || eventCallback.internal == false)) + if (eventName == 'rejected') { var rp = getRootPromise(this.promise); rp._internal.external = true; @@ -112,101 +133,100 @@ function Promise(promiseFunc) if (eventName == 'rejected' && this.errors && this.completed) { eventCallback.apply(this, this.completedArgs); + this.removeAllListeners('resolved'); + this.removeAllListeners('rejected'); } if (eventName == 'settled' && this.completed) { eventCallback.apply(this, []); } - }); + }).internal); this._internal.resolver = function _resolver() { - if (_resolver._self.completed) { return; } - _resolver._self.errors = false; - _resolver._self.completed = true; - _resolver._self.completedArgs = []; + if (this.completed) { return; } + this.errors = false; + this.completed = true; + this.completedArgs = []; var args = ['resolved']; if (this.emit_returnValue && this.emit_returnValue('resolved') != null) { - _resolver._self.completedArgs.push(this.emit_returnValue('resolved')); + this.completedArgs.push(this.emit_returnValue('resolved')); args.push(this.emit_returnValue('resolved')); } else { for (var a in arguments) { - _resolver._self.completedArgs.push(arguments[a]); + this.completedArgs.push(arguments[a]); args.push(arguments[a]); } } if (args.length == 2 && args[1]!=null && typeof(args[1]) == 'object' && args[1]._ObjectID == 'promise') { - var pr = getRootPromise(_resolver._self.promise); - args[1]._XSLF = _resolver._self; - args[1].then(function _returnResolved() - { - var parms = ['resolved']; - for (var ai in arguments) - { - parms.push(arguments[ai]); - } - this._XSLF.emit.apply(this._XSLF, parms); - }, - function _returnRejected(e) - { - this._XSLF.promise.__childPromise._rej(e); - }); + var pr = getRootPromise(this.promise); + args[1]._XSLF = this; + args[1].then(return_resolved, return_rejected); } else { - _resolver._self.emit.apply(_resolver._self, args); - _resolver._self.emit('settled'); + this.emit.apply(this, args); + this.emit('settled'); } }; + this._internal.rejector = function _rejector() { - if (_rejector._self.completed) { return; } - _rejector._self.errors = true; - _rejector._self.completed = true; - _rejector._self.completedArgs = []; + if (this.completed) { return; } + this.errors = true; + this.completed = true; + this.completedArgs = []; var args = ['rejected']; for (var a in arguments) { - _rejector._self.completedArgs.push(arguments[a]); + this.completedArgs.push(arguments[a]); args.push(arguments[a]); } - var r = getRootPromise(_rejector._self.promise); + var r = getRootPromise(this.promise); if ((r._internal.external == null || r._internal.external == false) && r._internal.uncaught == null) { - r._internal.uncaught = setImmediate(function (a) - { - process.emit('uncaughtException', 'promise.uncaughtRejection: ' + JSON.stringify(a)); - }, arguments[0]); + r._internal.uncaught = setImmediate(emitreject, arguments[0]); } - _rejector._self.emit.apply(_rejector._self, args); - _rejector._self.emit('settled'); + this.emit.apply(this, args); + this.emit('settled'); }; - this._internal.rejector.internal = true; this.catch = function(func) { var rt = getRootPromise(this); - this._internal.once('rejected', event_switcher(this, func).func); + if (rt._internal.uncaught != null) { clearImmediate(rt._internal.uncaught); } + this._internal.once('rejected', event_switcher(this, func).func.internal); } this.finally = function (func) { - this._internal.once('settled', event_switcher(this, func).func); + this._internal.once('settled', event_switcher(this, func).func.internal); }; this.then = function (resolved, rejected) { - if (resolved) { this._internal.once('resolved', event_switcher(this, resolved).func); } + if (resolved) + { + this._internal.once('resolved', event_switcher(this, resolved).func.internal); + } if (rejected) { - this._internal.once('rejected', event_switcher(this, rejected).func); + if (this._internal.completed) + { + var r = getRootPromise(this); + if(r._internal.uncaught != null) + { + clearImmediate(r._internal.uncaught); + } + } + this._internal.once('rejected', event_switcher(this, rejected).func.internal); } - - var retVal = new Promise(function (r, j) { this._rej = j; }); + + var retVal = new Promise(promiseInitializer); retVal.parentPromise = this; if (this._internal.completed) @@ -218,37 +238,35 @@ function Promise(promiseFunc) if(rv._ObjectID == 'promise') { rv.parentPromise = this; - rv._internal.once('resolved', retVal._internal.resolver); - rv._internal.once('rejected', retVal._internal.rejector); + rv._internal.once('resolved', retVal._internal.resolver.bind(retVal._internal).internal); + rv._internal.once('rejected', retVal._internal.rejector.bind(retVal._internal).internal); } else { - retVal._internal.resolver(rv); + retVal._internal.resolver.call(retVal._internal, rv); } } else { - this._internal.once('resolved', retVal._internal.resolver); - this._internal.once('rejected', retVal._internal.rejector); + this._internal.once('resolved', retVal._internal.resolver.bind(retVal._internal).internal); + this._internal.once('rejected', retVal._internal.rejector.bind(retVal._internal).internal); } } else { - this._internal.once('resolved', retVal._internal.resolver); - this._internal.once('rejected', retVal._internal.rejector); + this._internal.once('resolved', retVal._internal.resolver.bind(retVal._internal).internal); + this._internal.once('rejected', retVal._internal.rejector.bind(retVal._internal).internal); } - this.__childPromise = retVal; - return (retVal); - }; - this._internal.resolver._self = this._internal; - this._internal.rejector._self = this._internal;; + this.__childPromise = retVal; + return(retVal); + }; try { - promiseFunc.call(this, this._internal.resolver, this._internal.rejector); + promiseFunc.call(this, this._internal.resolver.bind(this._internal), this._internal.rejector.bind(this._internal)); } - catch(e) + catch (e) { this._internal.errors = true; this._internal.completed = true; @@ -261,7 +279,10 @@ function Promise(promiseFunc) { // Save reference of this object refTable[this._internal._hashCode()] = this._internal; - this._internal.once('settled', function () { delete refTable[this._hashCode()]; }); + this._internal.once('settled', function () + { + delete refTable[this._hashCode()]; + }); } Object.defineProperty(this, "completed", { get: function () @@ -269,6 +290,19 @@ function Promise(promiseFunc) return (this._internal.completed); } }); + + this._internal.once('settled', (function () + { + delete this.promise._up; + delete this.promise.__childPromise; + delete this.promise.promise; + + delete this._up; + delete this.__childPromise; + delete this.promise; + this.removeAllListeners('resolved'); + this.removeAllListeners('rejected'); + }).internal); } Promise.resolve = function resolve() @@ -331,4 +365,5 @@ Promise.all = function all(promiseList) module.exports = Promise; module.exports.event_switcher = event_switcher; -module.exports.event_forwarder = event_forwarder; \ No newline at end of file +module.exports.event_forwarder = event_forwarder; +module.exports.defaultInit = function defaultInit(res, rej) { this.resolve = res; this.reject = rej; } \ No newline at end of file