From cd6daf2941620f1464c874430b226affc1d4140e Mon Sep 17 00:00:00 2001 From: Christopher Ng Date: Thu, 11 Apr 2024 10:06:46 -0700 Subject: [PATCH] feat(dav): Make getFavoriteNodes cancelable Signed-off-by: Christopher Ng --- lib/dav/dav.ts | 39 +++++++++++++++++++++++++-------------- package-lock.json | 6 ++++++ package.json | 1 + 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/dav/dav.ts b/lib/dav/dav.ts index a6916bbe..5741c53c 100644 --- a/lib/dav/dav.ts +++ b/lib/dav/dav.ts @@ -32,6 +32,7 @@ import { davGetFavoritesReport } from './davProperties' import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' import { generateRemoteUrl } from '@nextcloud/router' import { createClient, getPatcher } from 'webdav' +import { CancelablePromise } from 'cancelable-promise' /** * Nextcloud DAV result response @@ -119,20 +120,30 @@ export const davGetClient = function(remoteURL = davRemoteURL, headers: Record { - const contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, { - details: true, - data: davGetFavoritesReport(), - headers: { - // see davGetClient for patched webdav client - method: 'REPORT', - }, - includeSelf: true, - }) as ResponseDataDetailed - - return contentsResponse.data - .filter(node => node.filename !== path) // exclude current dir - .map((result) => davResultToNode(result, davRoot)) +export const getFavoriteNodes = (davClient: WebDAVClient, path = '/', davRoot = davRootPath): CancelablePromise => { + const controller = new AbortController() + return new CancelablePromise(async (resolve, reject, onCancel) => { + onCancel(() => controller.abort()) + try { + const contentsResponse = await davClient.getDirectoryContents(`${davRoot}${path}`, { + signal: controller.signal, + details: true, + data: davGetFavoritesReport(), + headers: { + // see davGetClient for patched webdav client + method: 'REPORT', + }, + includeSelf: true, + }) as ResponseDataDetailed + + const nodes = contentsResponse.data + .filter(node => node.filename !== path) // exclude current dir + .map((result) => davResultToNode(result, davRoot)) + resolve(nodes) + } catch (error) { + reject(error) + } + }) } /** diff --git a/package-lock.json b/package-lock.json index 4ea1a975..e1fb1ab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@nextcloud/logger": "^2.7.0", "@nextcloud/paths": "^2.1.0", "@nextcloud/router": "^3.0.0", + "cancelable-promise": "^4.3.1", "is-svg": "^5.0.0", "webdav": "^5.5.0" }, @@ -4322,6 +4323,11 @@ "node": ">=6" } }, + "node_modules/cancelable-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cancelable-promise/-/cancelable-promise-4.3.1.tgz", + "integrity": "sha512-A/8PwLk/T7IJDfUdQ68NR24QHa8rIlnN/stiJEBo6dmVUkD4K14LswG0w3VwdeK/o7qOwRUR1k2MhK5Rpy2m7A==" + }, "node_modules/caniuse-lite": { "version": "1.0.30001571", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", diff --git a/package.json b/package.json index 1f539b5c..cc356040 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "@nextcloud/logger": "^2.7.0", "@nextcloud/paths": "^2.1.0", "@nextcloud/router": "^3.0.0", + "cancelable-promise": "^4.3.1", "is-svg": "^5.0.0", "webdav": "^5.5.0" }