From 7056135b5523a25ebeb12287a4cf0529212c9798 Mon Sep 17 00:00:00 2001 From: J30 Date: Thu, 2 Apr 2020 20:49:05 +0800 Subject: [PATCH 1/4] Add upload progress --- package-lock.json | 26 ++++++++++++++------------ src/RESTController.js | 25 +++++++++++++++++++++---- src/__tests__/ParseFile-test.js | 4 ++-- src/__tests__/RESTController-test.js | 7 ++++--- src/__tests__/test_helpers/mockXHR.js | 2 ++ 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27c16cc54..060954583 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3240,6 +3240,18 @@ "util": "~0.10.1", "vm-browserify": "^1.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } } }, "browserify-aes": { @@ -3340,16 +3352,6 @@ "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==", "dev": true }, - "buffer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", - "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", @@ -10898,7 +10900,7 @@ "cors": "2.8.5", "deepcopy": "2.0.0", "express": "4.17.1", - "follow-redirects": "1.10.0", + "follow-redirects": "1.11.0", "graphql": "14.6.0", "graphql-list-fields": "2.0.2", "graphql-relay": "^0.6.0", @@ -10912,7 +10914,7 @@ "lru-cache": "5.1.1", "mime": "2.4.4", "mongodb": "3.5.5", - "parse": "2.11.0", + "parse": "2.12.0", "pg-promise": "10.4.4", "pluralize": "^8.0.0", "redis": "3.0.2", diff --git a/src/RESTController.js b/src/RESTController.js index 392c8d4ce..5ea1fb432 100644 --- a/src/RESTController.js +++ b/src/RESTController.js @@ -158,15 +158,32 @@ const RESTController = { for (const key in customHeaders) { headers[key] = customHeaders[key]; } - xhr.onprogress = (event) => { - if(options && typeof options.progress === 'function') { + + function handleProgress(type, event) { + if (options && typeof options.progress === 'function') { if (event.lengthComputable) { - options.progress(event.loaded / event.total, event.loaded, event.total); + options.progress( + type, + event.loaded / event.total, + event.loaded, + event.total + ); } else { - options.progress(null); + options.progress(type, null); } } + } + + xhr.onprogress = (event) => { + handleProgress('download', event); }; + + if (xhr.upload) { + xhr.upload.onprogress = (event) => { + handleProgress('upload', event); + } + } + xhr.open(method, url, true); for (const h in headers) { diff --git a/src/__tests__/ParseFile-test.js b/src/__tests__/ParseFile-test.js index d04e0421a..c7f63428c 100644 --- a/src/__tests__/ParseFile-test.js +++ b/src/__tests__/ParseFile-test.js @@ -30,7 +30,7 @@ jest.setMock('../LocalDatastore', mockLocalDatastore); function generateSaveMock(prefix) { return function(name, payload, options) { if (options && typeof options.progress === 'function') { - options.progress(0.5); + options.progress('upload', 0.5, 5, 10); } return Promise.resolve({ name: name, @@ -236,7 +236,7 @@ describe('ParseFile', () => { jest.spyOn(options, 'progress'); return file.save(options).then(function(f) { - expect(options.progress).toHaveBeenCalledWith(0.5); + expect(options.progress).toHaveBeenCalledWith('upload', 0.5, 5, 10); expect(f).toBe(file); expect(f.name()).toBe('progress.txt'); expect(f.url()).toBe('http://files.parsetfss.com/a/progress.txt'); diff --git a/src/__tests__/RESTController-test.js b/src/__tests__/RESTController-test.js index 1b5fa9c23..ebc4e5fff 100644 --- a/src/__tests__/RESTController-test.js +++ b/src/__tests__/RESTController-test.js @@ -428,7 +428,7 @@ describe('RESTController', () => { CoreManager.set('SERVER_AUTH_TOKEN', null); }); - it('reports upload progress of the AJAX request when callback is provided', (done) => { + it('reports upload/download progress of the AJAX request when callback is provided', (done) => { const xhr = mockXHR([{ status: 200, response: { success: true } }], { progress: { lengthComputable: true, @@ -444,7 +444,8 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10); + expect(options.progress).toHaveBeenCalledWith('download', 0.5, 5, 10); + expect(options.progress).toHaveBeenCalledWith('upload', 0.5, 5, 10); expect(response).toEqual({ success: true }); expect(status).toBe(200); done(); @@ -467,7 +468,7 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith(null); + expect(options.progress).toHaveBeenCalledWith('upload', null); expect(response).toEqual({ success: true }); expect(status).toBe(200); done(); diff --git a/src/__tests__/test_helpers/mockXHR.js b/src/__tests__/test_helpers/mockXHR.js index 75ee661b7..cd23a6c3f 100644 --- a/src/__tests__/test_helpers/mockXHR.js +++ b/src/__tests__/test_helpers/mockXHR.js @@ -22,6 +22,7 @@ function mockXHR(results, options = {}) { XHR.prototype = { open: function() { }, setRequestHeader: function() { }, + upload: function() { }, send: function() { this.status = results[attempts].status; this.responseText = JSON.stringify(results[attempts].response || {}); @@ -29,6 +30,7 @@ function mockXHR(results, options = {}) { attempts++; this.onreadystatechange(); this.onprogress(options.progress); + this.upload.onprogress(options.progress); } }; return XHR; From 8f7283018284a6e35aa2b2e00eccbba451fa9a1e Mon Sep 17 00:00:00 2001 From: Jerome De Leon <32805276+JeromeDeLeon@users.noreply.github.com> Date: Tue, 7 Apr 2020 07:35:35 +0800 Subject: [PATCH 2/4] Remove type parameter --- src/RESTController.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/RESTController.js b/src/RESTController.js index 5ea1fb432..d24226b15 100644 --- a/src/RESTController.js +++ b/src/RESTController.js @@ -159,28 +159,27 @@ const RESTController = { headers[key] = customHeaders[key]; } - function handleProgress(type, event) { + function handleProgress(event) { if (options && typeof options.progress === 'function') { if (event.lengthComputable) { options.progress( - type, event.loaded / event.total, event.loaded, event.total ); } else { - options.progress(type, null); + options.progress(null); } } } xhr.onprogress = (event) => { - handleProgress('download', event); + handleProgress(event); }; if (xhr.upload) { xhr.upload.onprogress = (event) => { - handleProgress('upload', event); + handleProgress(event); } } From 2ff7c08439d3dcb7cc5ce625016fe228d257982f Mon Sep 17 00:00:00 2001 From: Jerome De Leon <32805276+JeromeDeLeon@users.noreply.github.com> Date: Tue, 7 Apr 2020 08:49:21 +0800 Subject: [PATCH 3/4] Fix ParseFile test --- src/__tests__/ParseFile-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/ParseFile-test.js b/src/__tests__/ParseFile-test.js index c7f63428c..4c14d50ee 100644 --- a/src/__tests__/ParseFile-test.js +++ b/src/__tests__/ParseFile-test.js @@ -30,7 +30,7 @@ jest.setMock('../LocalDatastore', mockLocalDatastore); function generateSaveMock(prefix) { return function(name, payload, options) { if (options && typeof options.progress === 'function') { - options.progress('upload', 0.5, 5, 10); + options.progress(0.5, 5, 10); } return Promise.resolve({ name: name, @@ -236,7 +236,7 @@ describe('ParseFile', () => { jest.spyOn(options, 'progress'); return file.save(options).then(function(f) { - expect(options.progress).toHaveBeenCalledWith('upload', 0.5, 5, 10); + expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10); expect(f).toBe(file); expect(f.name()).toBe('progress.txt'); expect(f.url()).toBe('http://files.parsetfss.com/a/progress.txt'); From a3a7fb6488f123ceffa2db75013713e96bde1461 Mon Sep 17 00:00:00 2001 From: Jerome De Leon <32805276+JeromeDeLeon@users.noreply.github.com> Date: Tue, 7 Apr 2020 08:52:29 +0800 Subject: [PATCH 4/4] Fix RESTController test --- src/__tests__/RESTController-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/__tests__/RESTController-test.js b/src/__tests__/RESTController-test.js index ebc4e5fff..7859a1289 100644 --- a/src/__tests__/RESTController-test.js +++ b/src/__tests__/RESTController-test.js @@ -444,8 +444,8 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith('download', 0.5, 5, 10); - expect(options.progress).toHaveBeenCalledWith('upload', 0.5, 5, 10); + expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10); + expect(options.progress).toHaveBeenCalledTimes(2); expect(response).toEqual({ success: true }); expect(status).toBe(200); done(); @@ -468,7 +468,7 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith('upload', null); + expect(options.progress).toHaveBeenCalledWith(null); expect(response).toEqual({ success: true }); expect(status).toBe(200); done();