From b0828c7ac40a3c5539d9545697c3e3c2cb5b0ce1 Mon Sep 17 00:00:00 2001 From: gena Date: Wed, 10 Jun 2015 03:05:09 +0200 Subject: [PATCH 1/4] improve sync calls, use deasync to wait until async requests are finished, avoid spawn - very limited since it passes string to send using command-line --- lib/XMLHttpRequest.js | 61 +++++++------------------------------------ 1 file changed, 9 insertions(+), 52 deletions(-) diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 949fdf9..187c485 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -366,11 +366,11 @@ exports.XMLHttpRequest = function() { agent: false }; + var done = false; + // Reset error flag errorFlag = false; - // Handle async requests - if (settings.async) { // Use the proper protocol var doRequest = ssl ? https.request : http.request; @@ -431,10 +431,12 @@ exports.XMLHttpRequest = function() { setState(self.DONE); sendFlag = false; } + done = true; }); response.on("error", function(error) { self.handleError(error); + done = true; }); }; @@ -454,58 +456,13 @@ exports.XMLHttpRequest = function() { request.end(); self.dispatchEvent("loadstart"); - } else { // Synchronous - // Create a temporary file for communication with the other Node process - var contentFile = ".node-xmlhttprequest-content-" + process.pid; - var syncFile = ".node-xmlhttprequest-sync-" + process.pid; - fs.writeFileSync(syncFile, "", "utf8"); - // The async request the other Node process executes - var execString = "var http = require('http'), https = require('https'), fs = require('fs');" - + "var doRequest = http" + (ssl ? "s" : "") + ".request;" - + "var options = " + JSON.stringify(options) + ";" - + "var responseText = '';" - + "var req = doRequest(options, function(response) {" - + "response.setEncoding('utf8');" - + "response.on('data', function(chunk) {" - + " responseText += chunk;" - + "});" - + "response.on('end', function() {" - + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText}}), 'utf8');" - + "fs.unlinkSync('" + syncFile + "');" - + "});" - + "response.on('error', function(error) {" - + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');" - + "fs.unlinkSync('" + syncFile + "');" - + "});" - + "}).on('error', function(error) {" - + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');" - + "fs.unlinkSync('" + syncFile + "');" - + "});" - + (data ? "req.write('" + JSON.stringify(data).slice(1,-1).replace(/'/g, "\\'") + "');":"") - + "req.end();"; - // Start the other Node Process, executing this string - var syncProc = spawn(process.argv[0], ["-e", execString]); - while(fs.existsSync(syncFile)) { - // Wait while the sync file is empty - } - var resp = JSON.parse(fs.readFileSync(contentFile, 'utf8')); - // Kill the child process once the file has data - syncProc.stdin.end(); - // Remove the temporary file - fs.unlinkSync(contentFile); - - if (resp.err) { - self.handleError(resp.err); - } else { - response = resp.data; - self.status = resp.data.statusCode; - self.responseText = resp.data.text; - setState(self.DONE); + + while(!done) { + require('deasync').sleep(100); } - } - }; - /** + } + /** * Called when an error is encountered to deal with it. */ this.handleError = function(error) { From 45e333937ad376b7e147980831b982b3e2e48b1c Mon Sep 17 00:00:00 2001 From: gena Date: Wed, 10 Jun 2015 10:09:24 +0200 Subject: [PATCH 2/4] add dependencies --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index d6aa638..e73be7d 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,9 @@ "type": "git", "url": "git://github.com/driverdan/node-XMLHttpRequest.git" }, + "dependencies": { + "deasync": ">= 0.1.0" + }, "bugs": "http://github.com/driverdan/node-XMLHttpRequest/issues", "engines": { "node": ">=0.4.0" From 923d98aa201a25a57d61dba924c16e6c0c337f77 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 13 Oct 2016 19:29:43 +1100 Subject: [PATCH 3/4] Remove redundant require for child_process module --- lib/XMLHttpRequest.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 311cedb..5094970 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -12,7 +12,6 @@ */ var Url = require("url"); -var spawn = require("child_process").spawn; var fs = require("fs"); exports.XMLHttpRequest = function() { From 302518055dc4b9e54f639ff924fd9f3b1e252609 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Thu, 13 Oct 2016 20:02:02 +1100 Subject: [PATCH 4/4] Sleep for an order of magnitude less with deasync --- lib/XMLHttpRequest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 5094970..80ce0ea 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -473,7 +473,7 @@ exports.XMLHttpRequest = function() { self.dispatchEvent("loadstart"); while(!done) { - require('deasync').sleep(100); + require('deasync').sleep(10); } }