From 77035eb865467259700cfe52a18ec72b0549b4dc Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Sun, 24 Jul 2022 15:32:20 +0800 Subject: [PATCH 1/3] rewrite dropbox to async/await --- .../src/server/provider/dropbox/adapter.js | 4 - .../src/server/provider/dropbox/index.js | 162 +++++++----------- 2 files changed, 63 insertions(+), 103 deletions(-) diff --git a/packages/@uppy/companion/src/server/provider/dropbox/adapter.js b/packages/@uppy/companion/src/server/provider/dropbox/adapter.js index 66cbcf65ed..e657ce9cb6 100644 --- a/packages/@uppy/companion/src/server/provider/dropbox/adapter.js +++ b/packages/@uppy/companion/src/server/provider/dropbox/adapter.js @@ -1,10 +1,6 @@ const mime = require('mime-types') const querystring = require('querystring') -exports.getUsername = (data) => { - return data.user_email -} - exports.isFolder = (item) => { return item['.tag'] === 'folder' } diff --git a/packages/@uppy/companion/src/server/provider/dropbox/index.js b/packages/@uppy/companion/src/server/provider/dropbox/index.js index d80dc8d96d..f78c15514b 100644 --- a/packages/@uppy/companion/src/server/provider/dropbox/index.js +++ b/packages/@uppy/companion/src/server/provider/dropbox/index.js @@ -20,6 +20,22 @@ function httpHeaderSafeJson (v) { }) } +const adaptData = (res, email, buildURL) => ({ + username: email, + items: adapter.getItemSubList(res).map((item) => ({ + isFolder: adapter.isFolder(item), + icon: adapter.getItemIcon(item), + name: adapter.getItemName(item), + mimeType: adapter.getMimeType(item), + id: adapter.getItemId(item), + thumbnail: buildURL(adapter.getItemThumbnailUrl(item), true), + requestPath: adapter.getItemRequestPath(item), + modifiedDate: adapter.getItemModifiedDate(item), + size: adapter.getItemSize(item), + })), + nextPagePath: adapter.getNextPagePath(res), +}) + /** * Adapter for API https://www.dropbox.com/developers/documentation/http/documentation */ @@ -39,77 +55,48 @@ class DropBox extends Provider { return 'dropbox' } - _userInfo ({ token }, done) { - this.client + async #userInfo ({ token }) { + const client = this.client .post('users/get_current_account') .options({ version: '2' }) .auth(token) - .request(done) + return promisify(client.request.bind(client))() } /** - * Makes 2 requests in parallel - 1. to get files, 2. to get user email - * it then waits till both requests are done before proceeding with the callback * * @param {object} options - * @param {Function} done */ - _list (options, done) { - let userInfoDone = false - let statsDone = false - let userInfo - let stats - let reqErr - const finishReq = () => { - if (reqErr) { - logger.error(reqErr, 'provider.dropbox.list.error') - done(reqErr) - } else { - stats.body.user_email = userInfo.body.email - done(null, this.adaptData(stats.body, options.companion)) - } + async list (options) { + try { + const responses = await Promise.all([ + this.#stats(options), + this.#userInfo(options), + ]) + responses.forEach((response) => { + if (response.statusCode !== 200) throw this.#error(null, response) + }) + const [{ body: stats }, { body: { email } }] = responses + return adaptData(stats, email, options.companion.buildURL) + } catch (err) { + logger.error(err, 'provider.dropbox.list.error') + throw err } - - this.stats(options, (err, resp) => { - statsDone = true - stats = resp - if (err || resp.statusCode !== 200) { - err = this._error(err, resp) - } - reqErr = reqErr || err - if (userInfoDone) { - finishReq() - } - }) - - this._userInfo(options, (err, resp) => { - userInfoDone = true - userInfo = resp - if (err || resp.statusCode !== 200) { - err = this._error(err, resp) - } - - reqErr = reqErr || err - if (statsDone) { - finishReq() - } - }) } - stats ({ directory, query, token }, done) { + async #stats ({ directory, query, token }) { if (query.cursor) { - this.client + const client = this.client .post('files/list_folder/continue') .options({ version: '2' }) .auth(token) .json({ cursor: query.cursor, }) - .request(done) - return + return promisify(client.request.bind(client))() } - this.client + const client = this.client .post('files/list_folder') .options({ version: '2' }) .qs(query) @@ -118,7 +105,8 @@ class DropBox extends Provider { path: `${directory || ''}`, include_non_downloadable_files: false, }) - .request(done) + + return promisify(client.request.bind(client))() } async download ({ id, token }) { @@ -134,7 +122,7 @@ class DropBox extends Provider { .auth(token) .request() - return await requestStream(req, async (res) => this._error(null, res)) + return await requestStream(req, async (res) => this.#error(null, res)) } catch (err) { logger.error(err, 'provider.dropbox.download.error') throw err @@ -153,67 +141,47 @@ class DropBox extends Provider { .auth(token) .request() - return await requestStream(req, (resp) => this._error(null, resp)) + return await requestStream(req, (resp) => this.#error(null, resp)) } catch (err) { logger.error(err, 'provider.dropbox.thumbnail.error') throw err } } - _size ({ id, token }, done) { - return this.client + async size ({ id, token }) { + const client = this.client .post('files/get_metadata') .options({ version: '2' }) .auth(token) .json({ path: id }) - .request((err, resp, body) => { - if (err || resp.statusCode !== 200) { - err = this._error(err, resp) - logger.error(err, 'provider.dropbox.size.error') - return done(err) - } - done(null, parseInt(body.size, 10)) - }) + + try { + const resp = await promisify(client.request.bind(client))() + if (resp.statusCode !== 200) throw this.#error(null, resp) + return parseInt(resp.body.size, 10) + } catch (err) { + logger.error(err, 'provider.dropbox.size.error') + throw err + } } - _logout ({ token }, done) { - return this.client + async logout ({ token }) { + const client = this.client .post('auth/token/revoke') .options({ version: '2' }) .auth(token) - .request((err, resp) => { - if (err || resp.statusCode !== 200) { - logger.error(err, 'provider.dropbox.logout.error') - done(this._error(err, resp)) - return - } - done(null, { revoked: true }) - }) - } - - adaptData (res, companion) { - const data = { username: adapter.getUsername(res), items: [] } - const items = adapter.getItemSubList(res) - items.forEach((item) => { - data.items.push({ - isFolder: adapter.isFolder(item), - icon: adapter.getItemIcon(item), - name: adapter.getItemName(item), - mimeType: adapter.getMimeType(item), - id: adapter.getItemId(item), - thumbnail: companion.buildURL(adapter.getItemThumbnailUrl(item), true), - requestPath: adapter.getItemRequestPath(item), - modifiedDate: adapter.getItemModifiedDate(item), - size: adapter.getItemSize(item), - }) - }) - data.nextPagePath = adapter.getNextPagePath(res) - - return data + try { + const resp = await promisify(client.request.bind(client))() + if (resp.statusCode !== 200) throw this.#error(null, resp) + return { revoked: true } + } catch (err) { + logger.error(err, 'provider.dropbox.logout.error') + throw err + } } - _error (err, resp) { + #error (err, resp) { if (resp) { const fallbackMessage = `request to ${this.authProvider} returned ${resp.statusCode}` const errMsg = (resp.body || {}).error_summary ? resp.body.error_summary : fallbackMessage @@ -226,8 +194,4 @@ class DropBox extends Provider { DropBox.version = 2 -DropBox.prototype.list = promisify(DropBox.prototype._list) -DropBox.prototype.size = promisify(DropBox.prototype._size) -DropBox.prototype.logout = promisify(DropBox.prototype._logout) - module.exports = DropBox From c355cad53da04cd57eff36034f728e205c66536a Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Sun, 24 Jul 2022 16:08:28 +0800 Subject: [PATCH 2/3] implement sort fixes #3580 --- .../src/server/provider/dropbox/index.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/@uppy/companion/src/server/provider/dropbox/index.js b/packages/@uppy/companion/src/server/provider/dropbox/index.js index f78c15514b..9790df92a2 100644 --- a/packages/@uppy/companion/src/server/provider/dropbox/index.js +++ b/packages/@uppy/companion/src/server/provider/dropbox/index.js @@ -20,9 +20,8 @@ function httpHeaderSafeJson (v) { }) } -const adaptData = (res, email, buildURL) => ({ - username: email, - items: adapter.getItemSubList(res).map((item) => ({ +function adaptData (res, email, buildURL) { + const items = adapter.getItemSubList(res).map((item) => ({ isFolder: adapter.isFolder(item), icon: adapter.getItemIcon(item), name: adapter.getItemName(item), @@ -32,9 +31,15 @@ const adaptData = (res, email, buildURL) => ({ requestPath: adapter.getItemRequestPath(item), modifiedDate: adapter.getItemModifiedDate(item), size: adapter.getItemSize(item), - })), - nextPagePath: adapter.getNextPagePath(res), -}) + })) + items.sort((a, b) => a.name.localeCompare(b.name, 'en-US', { numeric: true })) + + return { + username: email, + items, + nextPagePath: adapter.getNextPagePath(res), + } +} /** * Adapter for API https://www.dropbox.com/developers/documentation/http/documentation From 3b26d7e944f86a136a57db255350736a9519bccc Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Sun, 24 Jul 2022 16:17:20 +0800 Subject: [PATCH 3/3] revert modern features --- .../src/server/provider/dropbox/index.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/@uppy/companion/src/server/provider/dropbox/index.js b/packages/@uppy/companion/src/server/provider/dropbox/index.js index 9790df92a2..3c72ec87f2 100644 --- a/packages/@uppy/companion/src/server/provider/dropbox/index.js +++ b/packages/@uppy/companion/src/server/provider/dropbox/index.js @@ -60,7 +60,7 @@ class DropBox extends Provider { return 'dropbox' } - async #userInfo ({ token }) { + async _userInfo ({ token }) { const client = this.client .post('users/get_current_account') .options({ version: '2' }) @@ -75,11 +75,11 @@ class DropBox extends Provider { async list (options) { try { const responses = await Promise.all([ - this.#stats(options), - this.#userInfo(options), + this._stats(options), + this._userInfo(options), ]) responses.forEach((response) => { - if (response.statusCode !== 200) throw this.#error(null, response) + if (response.statusCode !== 200) throw this._error(null, response) }) const [{ body: stats }, { body: { email } }] = responses return adaptData(stats, email, options.companion.buildURL) @@ -89,7 +89,7 @@ class DropBox extends Provider { } } - async #stats ({ directory, query, token }) { + async _stats ({ directory, query, token }) { if (query.cursor) { const client = this.client .post('files/list_folder/continue') @@ -127,7 +127,7 @@ class DropBox extends Provider { .auth(token) .request() - return await requestStream(req, async (res) => this.#error(null, res)) + return await requestStream(req, async (res) => this._error(null, res)) } catch (err) { logger.error(err, 'provider.dropbox.download.error') throw err @@ -146,7 +146,7 @@ class DropBox extends Provider { .auth(token) .request() - return await requestStream(req, (resp) => this.#error(null, resp)) + return await requestStream(req, (resp) => this._error(null, resp)) } catch (err) { logger.error(err, 'provider.dropbox.thumbnail.error') throw err @@ -162,7 +162,7 @@ class DropBox extends Provider { try { const resp = await promisify(client.request.bind(client))() - if (resp.statusCode !== 200) throw this.#error(null, resp) + if (resp.statusCode !== 200) throw this._error(null, resp) return parseInt(resp.body.size, 10) } catch (err) { logger.error(err, 'provider.dropbox.size.error') @@ -178,7 +178,7 @@ class DropBox extends Provider { try { const resp = await promisify(client.request.bind(client))() - if (resp.statusCode !== 200) throw this.#error(null, resp) + if (resp.statusCode !== 200) throw this._error(null, resp) return { revoked: true } } catch (err) { logger.error(err, 'provider.dropbox.logout.error') @@ -186,7 +186,7 @@ class DropBox extends Provider { } } - #error (err, resp) { + _error (err, resp) { if (resp) { const fallbackMessage = `request to ${this.authProvider} returned ${resp.statusCode}` const errMsg = (resp.body || {}).error_summary ? resp.body.error_summary : fallbackMessage