diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index f654785..209606e 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -40,6 +40,7 @@ extern void ILibWebClient_ResetWCDO(struct ILibWebClientDataObject *wcdo); #define ILibDuktape_Agent_SocketJustCreated "\xFF_Agent_SocketJustCreated" #define ILibDuktape_ClientRequest "\xFF_CR" +#define ILibDuktape_CR_AbortCalled "\xFF_CR_AbortCalled" #define ILibDuktape_CR_EndCalled "\xFF_CR_EndCalled" #define ILibDuktape_CR_RequestBuffer "\xFF_CR_RequestBuffer" #define ILibDuktape_CR2Agent "\xFF_CR2Agent" @@ -69,6 +70,7 @@ extern void ILibWebClient_ResetWCDO(struct ILibWebClientDataObject *wcdo); #define ILibDuktape_Socket2Agent "\xFF_Socket2Agent" #define ILibDuktape_Socket2AgentKey "\xFF_Socket2AgentKey" #define ILibDuktape_Socket2CR "\xFF_Socket2CR" +#define ILibDuktape_Socket2CR_Abort "\xFF_Socket2CR_Abort" #define ILibDuktape_Socket2HttpServer "\xFF_Socket2HttpServer" #define ILibDuktape_Socket2HttpStream "\xFF_Socket2HttpStream" #define ILibDuktape_Socket2DiedListener "\xFF_Socket2DiedListener" @@ -673,8 +675,6 @@ duk_ret_t ILibDuktape_HttpStream_http_OnSocketClosed(duk_context *ctx) duk_push_this(ctx); // [socket] if (duk_has_prop_string(ctx, -1, ILibDuktape_Socket2HttpStream)) { - duk_get_prop_string(ctx, -1, ILibDuktape_Socket2HttpStream); // [socket][stream] - duk_pop(ctx); // [socket] duk_del_prop_string(ctx, -1, ILibDuktape_Socket2HttpStream); } duk_pop(ctx); // ... @@ -687,9 +687,27 @@ duk_ret_t ILibDuktape_HttpStream_http_OnSocketReady(duk_context *ctx) duk_dup(ctx, 0); // [socket] duk_push_c_function(ctx, ILibDuktape_HttpStream_http_SocketDiedPrematurely, DUK_VARARGS); duk_put_prop_string(ctx, -2, ILibDuktape_Socket2DiedListener); // [socket] - duk_push_this(ctx); // [socket][clientRequest] + if (Duktape_GetBooleanProperty(ctx, -1, ILibDuktape_CR_AbortCalled, 0)) + { + // We were aborted, so instead of continuing, lets just put the socket back, so someone else can use it + duk_del_prop_string(ctx, -2, ILibDuktape_Socket2DiedListener); + + duk_get_prop_string(ctx, -2, ILibDuktape_Socket2Agent); // [socket][clientRequest][Agent] + duk_get_prop_string(ctx, -1, "keepSocketAlive"); // [socket][clientRequest][Agent][keepAlive] + duk_swap_top(ctx, -2); // [socket][clientRequest][keepAlive][this] + duk_dup(ctx, -4); // [socket][clientRequest][keepAlive][this][socket] + duk_call_method(ctx, 1); + + duk_push_this(ctx); + ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "abort"); // [emit][this][abort] + duk_call_method(ctx, 1); + return(0); + } + + + // Register ourselves for the close event, becuase we'll need to put ourselves back in the Queue if the socket dies before we are done duk_get_prop_string(ctx, -2, "prependOnceListener"); // [socket][clientRequest][prependOnce] duk_dup(ctx, -3); // [socket][clientRequest][prependOnce][this] @@ -1056,6 +1074,38 @@ duk_ret_t ILibDuktape_ClientRequest_Finalizer(duk_context *ctx) } return(0); } + +duk_ret_t ILibDuktape_HttpStream_http_request_abort_closed(duk_context *ctx) +{ + duk_push_this(ctx); // [socket] + duk_get_prop_string(ctx, -1, ILibDuktape_Socket2CR_Abort); // [socket][ClientRequest] + ILibDuktape_EventEmitter_SetupEmit(ctx, duk_get_heapptr(ctx, -1), "abort"); // [socket][ClientRequest][emit][this][abort] + duk_call_method(ctx, 1); duk_pop(ctx); // [socket][ClientRequest] + duk_del_prop_string(ctx, -2, ILibDuktape_Socket2CR_Abort); + return(0); +} +duk_ret_t ILibDuktape_HttpStream_http_request_abort(duk_context *ctx) +{ + duk_push_this(ctx); // [ClientRequest] + duk_push_true(ctx); // [ClientRequest][true] + duk_put_prop_string(ctx, -2, ILibDuktape_CR_AbortCalled); // [ClientRequest] + + if (duk_has_prop_string(ctx, -1, ILibDuktape_CR2HTTPStream)) + { + duk_get_prop_string(ctx, -1, ILibDuktape_CR2HTTPStream); // [ClientRequest][HTTPStream] + duk_get_prop_string(ctx, -1, ILibDuktape_HTTPStream2Socket);// [ClientRequest][HTTPStream][socket] + + // Need to hookup close event, so we can propagate 'abort' + ILibDuktape_EventEmitter_AddOnceEx3(ctx, -1, "close", ILibDuktape_HttpStream_http_request_abort_closed); + duk_dup(ctx, -3); duk_put_prop_string(ctx, -2, ILibDuktape_Socket2CR_Abort); + + duk_get_prop_string(ctx, -1, "end"); // [ClientRequest][HTTPStream][socket][end] + duk_swap_top(ctx, -2); // [ClientRequest][HTTPStream][end][this] + duk_call_method(ctx, 0); // [ClientRequest][HTTPStream][...] + } + return(0); +} + duk_ret_t ILibDuktape_HttpStream_http_request(duk_context *ctx) { char *proto; @@ -1149,6 +1199,7 @@ duk_ret_t ILibDuktape_HttpStream_http_request(duk_context *ctx) ILibDuktape_EventEmitter_CreateEventEx(emitter, "error"); ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "socket", ILibDuktape_HttpStream_http_OnSocketReady); ILibDuktape_EventEmitter_AddOnEx(ctx, -1, "~", ILibDuktape_ClientRequest_Finalizer); + ILibDuktape_CreateProperty_InstanceMethod(ctx, "abort", ILibDuktape_HttpStream_http_request_abort, 0); if (nargs > 1 && duk_is_function(ctx, 1)) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index fddb385..633531f 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1875,7 +1875,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) #endif // wget: Refer to modules/wget.js for a human readable version. - duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('DQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpOw0KdmFyIHdyaXRhYmxlID0gcmVxdWlyZSgnc3RyZWFtJykuV3JpdGFibGU7DQoNCg0KZnVuY3Rpb24gd2dldChyZW1vdGVVcmksIGxvY2FsRmlsZVBhdGgpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnYnl0ZXMnKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgYWdlbnRDb25uZWN0ZWQgPSByZXF1aXJlKCdNZXNoQWdlbnQnKS5pc0NvbnRyb2xDaGFubmVsQ29ubmVjdGVkOw0KICAgIH0NCiAgICBjYXRjaCAoZSkNCiAgICB7DQogICAgfQ0KDQogICAgLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIHByb3h5IHNldHRpbmdzIGlmIHRoZSBhZ2VudCBpcyBub3QgY29ubmVjdGVkLCBiZWNhdXNlIHdoZW4gdGhlIGFnZW50DQogICAgLy8gY29ubmVjdHMsIGl0IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgcHJveHkgZm9yIEphdmFTY3JpcHQuDQogICAgaWYgKCFhZ2VudENvbm5lY3RlZCkNCiAgICB7DQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgIGlmIChyZWcuUXVlcnlLZXkocmVnLkhLRVkuQ3VycmVudFVzZXIsICdTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3MnLCAnUHJveHlFbmFibGUnKSA9PSAxKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBwcm94eVVyaSA9IHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eVNlcnZlcicpOw0KICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gcmVxdWlyZSgnaHR0cCcpLnBhcnNlVXJpKCdodHRwOi8vJyArIHByb3h5VXJpKTsNCg0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcm94eSA9PiAnICsgcHJveHlVcmkpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2dsb2JhbC10dW5uZWwnKS5pbml0aWFsaXplKG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0Ll90b3RhbEJ5dGVzID0gMDsNCiAgICByZXQuX3JlcXVlc3QgPSBodHRwLmdldChyZW1vdGVVcmkpOw0KICAgIHJldC5fbG9jYWxGaWxlUGF0aCA9IGxvY2FsRmlsZVBhdGg7DQogICAgcmV0Ll9yZXF1ZXN0LnByb21pc2UgPSByZXQ7DQogICAgcmV0Ll9yZXF1ZXN0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7IHRoaXMucHJvbWlzZS5fcmVqKGUpOyB9KTsNCiAgICByZXQuX3JlcXVlc3Qub24oJ3Jlc3BvbnNlJywgZnVuY3Rpb24gKGltc2cpDQogICAgew0KICAgICAgICBpZihpbXNnLnN0YXR1c0NvZGUgIT0gMjAwKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignU2VydmVyIHJlc3BvbnNlZCB3aXRoIFN0YXR1cyBDb2RlOiAnICsgaW1zZy5zdGF0dXNDb2RlKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGUgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMucHJvbWlzZS5fbG9jYWxGaWxlUGF0aCwgeyBmbGFnczogJ3diJyB9KTsNCiAgICAgICAgICAgICAgICB0aGlzLl9zaGEgPSByZXF1aXJlKCdTSEEzODRTdHJlYW0nKS5jcmVhdGUoKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9zaGEucHJvbWlzZSA9IHRoaXMucHJvbWlzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5fc2hhLm9uKCdoYXNoJywgZnVuY3Rpb24gKGgpIHsgdGhpcy5wcm9taXNlLl9yZXMoaC50b1N0cmluZygnaGV4JykpOyB9KTsNCiAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yID0gbmV3IHdyaXRhYmxlKA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNodW5rLCBjYWxsYmFjaykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl90b3RhbEJ5dGVzICs9IGNodW5rLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5lbWl0KCdieXRlcycsIHRoaXMucHJvbWlzZS5fdG90YWxCeXRlcyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICBmaW5hbDogZnVuY3Rpb24oY2FsbGJhY2spDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdG9yLnByb21pc2UgPSB0aGlzLnByb21pc2U7DQogICAgICAgICAgICBpbXNnLnBpcGUodGhpcy5fZmlsZSk7DQogICAgICAgICAgICBpbXNnLnBpcGUodGhpcy5fYWNjdW11bGF0b3IpOw0KICAgICAgICAgICAgaW1zZy5waXBlKHRoaXMuX3NoYSk7DQogICAgICAgIH0NCiAgICB9KTsNCiAgICByZXQucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5fdG90YWxCeXRlcyk7IH07DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IHdnZXQ7DQoNCg0K', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('wget', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpOw0KdmFyIHdyaXRhYmxlID0gcmVxdWlyZSgnc3RyZWFtJykuV3JpdGFibGU7DQoNCg0KZnVuY3Rpb24gd2dldChyZW1vdGVVcmksIGxvY2FsRmlsZVBhdGgpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7DQogICAgdmFyIGFnZW50Q29ubmVjdGVkID0gZmFsc2U7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnYnl0ZXMnKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgYWdlbnRDb25uZWN0ZWQgPSByZXF1aXJlKCdNZXNoQWdlbnQnKS5pc0NvbnRyb2xDaGFubmVsQ29ubmVjdGVkOw0KICAgIH0NCiAgICBjYXRjaCAoZSkNCiAgICB7DQogICAgfQ0KDQogICAgLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIHByb3h5IHNldHRpbmdzIGlmIHRoZSBhZ2VudCBpcyBub3QgY29ubmVjdGVkLCBiZWNhdXNlIHdoZW4gdGhlIGFnZW50DQogICAgLy8gY29ubmVjdHMsIGl0IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB0aGUgcHJveHkgZm9yIEphdmFTY3JpcHQuDQogICAgaWYgKCFhZ2VudENvbm5lY3RlZCkNCiAgICB7DQogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciByZWcgPSByZXF1aXJlKCd3aW4tcmVnaXN0cnknKTsNCiAgICAgICAgICAgIGlmIChyZWcuUXVlcnlLZXkocmVnLkhLRVkuQ3VycmVudFVzZXIsICdTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3MnLCAnUHJveHlFbmFibGUnKSA9PSAxKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBwcm94eVVyaSA9IHJlZy5RdWVyeUtleShyZWcuSEtFWS5DdXJyZW50VXNlciwgJ1NvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxJbnRlcm5ldCBTZXR0aW5ncycsICdQcm94eVNlcnZlcicpOw0KICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gcmVxdWlyZSgnaHR0cCcpLnBhcnNlVXJpKCdodHRwOi8vJyArIHByb3h5VXJpKTsNCg0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcm94eSA9PiAnICsgcHJveHlVcmkpOw0KICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2dsb2JhbC10dW5uZWwnKS5pbml0aWFsaXplKG9wdGlvbnMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0Ll90b3RhbEJ5dGVzID0gMDsNCiAgICByZXQuYWJvcnQgPSBmdW5jdGlvbigpDQogICAgew0KICAgICAgICB0aGlzLl9yZXF1ZXN0LmFib3J0KCk7DQogICAgfQ0KICAgIHJldC5fcmVxdWVzdCA9IGh0dHAuZ2V0KHJlbW90ZVVyaSk7DQogICAgcmV0Ll9sb2NhbEZpbGVQYXRoID0gbG9jYWxGaWxlUGF0aDsNCiAgICByZXQuX3JlcXVlc3QucHJvbWlzZSA9IHJldDsNCiAgICByZXQuX3JlcXVlc3Qub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHsgdGhpcy5wcm9taXNlLl9yZWooZSk7IH0pOw0KICAgIHJldC5fcmVxdWVzdC5vbigncmVzcG9uc2UnLCBmdW5jdGlvbiAoaW1zZykNCiAgICB7DQogICAgICAgIGlmKGltc2cuc3RhdHVzQ29kZSAhPSAyMDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVqKCdTZXJ2ZXIgcmVzcG9uc2VkIHdpdGggU3RhdHVzIENvZGU6ICcgKyBpbXNnLnN0YXR1c0NvZGUpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fZmlsZSA9IHJlcXVpcmUoJ2ZzJykuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5wcm9taXNlLl9sb2NhbEZpbGVQYXRoLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgICAgIHRoaXMuX3NoYSA9IHJlcXVpcmUoJ1NIQTM4NFN0cmVhbScpLmNyZWF0ZSgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3NoYS5wcm9taXNlID0gdGhpcy5wcm9taXNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaihlKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLl9zaGEub24oJ2hhc2gnLCBmdW5jdGlvbiAoaCkgeyB0aGlzLnByb21pc2UuX3JlcyhoLnRvU3RyaW5nKCdoZXgnKSk7IH0pOw0KICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0b3IgPSBuZXcgd3JpdGFibGUoDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oY2h1bmssIGNhbGxiYWNrKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3RvdGFsQnl0ZXMgKz0gY2h1bmsubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLmVtaXQoJ2J5dGVzJywgdGhpcy5wcm9taXNlLl90b3RhbEJ5dGVzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIGZpbmFsOiBmdW5jdGlvbihjYWxsYmFjaykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0b3IucHJvbWlzZSA9IHRoaXMucHJvbWlzZTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9maWxlKTsNCiAgICAgICAgICAgIGltc2cucGlwZSh0aGlzLl9hY2N1bXVsYXRvcik7DQogICAgICAgICAgICBpbXNnLnBpcGUodGhpcy5fc2hhKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJldC5wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLl90b3RhbEJ5dGVzKTsgfTsNCiAgICByZXR1cm4gKHJldCk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gd2dldDsNCg0KDQo=', 'base64').toString());"); duk_peval_string_noresult(ctx, "Object.defineProperty(this, 'wget', {value: require('wget')});"); } diff --git a/modules/wget.js b/modules/wget.js index 19a11fe..d96f188 100644 --- a/modules/wget.js +++ b/modules/wget.js @@ -53,6 +53,10 @@ function wget(remoteUri, localFilePath) } ret._totalBytes = 0; + ret.abort = function() + { + this._request.abort(); + } ret._request = http.get(remoteUri); ret._localFilePath = localFilePath; ret._request.promise = ret;