Skip to content

Commit 9465e5a

Browse files
authored
Merge pull request #11673 from owncloud/feat/abort-signals2
feat: add abort signals
2 parents fe2e641 + 322785c commit 9465e5a

File tree

22 files changed

+206
-96
lines changed

22 files changed

+206
-96
lines changed

packages/web-app-admin-settings/src/views/Spaces.vue

+8-4
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,14 @@ export default defineComponent({
121121
122122
const loadResourcesTask = useTask(function* (signal) {
123123
const drives = yield* call(
124-
clientService.graphAuthenticated.drives.listAllDrives(sharesStore.graphRoles, {
125-
orderBy: 'name asc',
126-
filter: 'driveType eq project'
127-
})
124+
clientService.graphAuthenticated.drives.listAllDrives(
125+
sharesStore.graphRoles,
126+
{
127+
orderBy: 'name asc',
128+
filter: 'driveType eq project'
129+
},
130+
{ signal }
131+
)
128132
)
129133
spaceSettingsStore.setSpaces(drives)
130134
})

packages/web-app-admin-settings/src/views/Users.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ export default defineComponent({
306306
return
307307
}
308308
309-
const data = yield clientService.graphAuthenticated.users.getUser(user.id)
309+
const data = yield clientService.graphAuthenticated.users.getUser(user.id, {}, { signal })
310310
unref(additionalUserDataLoadedForUserIds).push(user.id)
311311
312312
Object.assign(user, data)

packages/web-app-external/src/App.vue

+2-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ export default defineComponent({
130130
131131
const url = `${baseUrl}?${query}`
132132
const response = yield makeRequest('POST', url, {
133-
validateStatus: () => true
133+
validateStatus: () => true,
134+
signal
134135
})
135136
136137
if (response.status !== 200) {

packages/web-app-files/src/services/folder/loaderFavorites.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export class FolderLoaderFavorites implements FolderLoader {
2222
resourcesStore.setAncestorMetaData({})
2323

2424
let resources = yield clientService.webdav.listFavoriteFiles({
25-
username: userStore.user?.onPremisesSamAccountName
25+
username: userStore.user?.onPremisesSamAccountName,
26+
signal: signal1
2627
})
2728

2829
resources = resources.map(buildResource)

packages/web-app-files/src/services/folder/loaderSharedViaLink.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ export class FolderLoaderSharedViaLink implements FolderLoader {
2222
resourcesStore.setAncestorMetaData({})
2323

2424
if (configStore.options.routing.fullShareOwnerPaths) {
25-
yield spacesStore.loadMountPoints({ graphClient: clientService.graphAuthenticated })
25+
yield spacesStore.loadMountPoints({
26+
graphClient: clientService.graphAuthenticated,
27+
signal: signal1
28+
})
2629
}
2730

28-
const value = yield* call(clientService.graphAuthenticated.driveItems.listSharedByMe())
31+
const value = yield* call(
32+
clientService.graphAuthenticated.driveItems.listSharedByMe({ signal: signal1 })
33+
)
2934

3035
const resources = value
3136
.filter((s) => s.permissions.some(({ link }) => !!link))

packages/web-app-files/src/services/folder/loaderSharedWithMe.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ export class FolderLoaderSharedWithMe implements FolderLoader {
2222
resourcesStore.setAncestorMetaData({})
2323

2424
if (configStore.options.routing.fullShareOwnerPaths) {
25-
yield spacesStore.loadMountPoints({ graphClient: clientService.graphAuthenticated })
25+
yield spacesStore.loadMountPoints({
26+
graphClient: clientService.graphAuthenticated,
27+
signal: signal1
28+
})
2629
}
2730

28-
const value = yield* call(clientService.graphAuthenticated.driveItems.listSharedWithMe())
31+
const value = yield* call(
32+
clientService.graphAuthenticated.driveItems.listSharedWithMe({ signal: signal1 })
33+
)
2934

3035
const resources = value.map((driveItem) =>
3136
buildIncomingShareResource({ driveItem, graphRoles: sharesStore.graphRoles })

packages/web-app-files/src/services/folder/loaderSharedWithOthers.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ export class FolderLoaderSharedWithOthers implements FolderLoader {
2222
resourcesStore.setAncestorMetaData({})
2323

2424
if (configStore.options.routing.fullShareOwnerPaths) {
25-
yield spacesStore.loadMountPoints({ graphClient: clientService.graphAuthenticated })
25+
yield spacesStore.loadMountPoints({
26+
graphClient: clientService.graphAuthenticated,
27+
signal: signal1
28+
})
2629
}
2730

28-
const value = yield* call(clientService.graphAuthenticated.driveItems.listSharedByMe())
31+
const value = yield* call(
32+
clientService.graphAuthenticated.driveItems.listSharedByMe({ signal: signal1 })
33+
)
2934

3035
const resources = value
3136
.filter((s) => s.permissions.some(({ link }) => !link))

packages/web-app-files/src/services/folder/loaderSpace.ts

+21-6
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class FolderLoaderSpace implements FolderLoader {
7070

7171
// eslint-disable-next-line prefer-const
7272
let { resource: currentFolder, children: resources } = yield* call(
73-
webdav.listFiles(space, { path, fileId })
73+
webdav.listFiles(space, { path, fileId }, { signal: signal1 })
7474
)
7575
// if current folder has no id (= singe file public link) we must not correct the route
7676
if (currentFolder.id) {
@@ -81,7 +81,9 @@ export class FolderLoaderSpace implements FolderLoader {
8181

8282
if (path === '/') {
8383
if (isShareSpaceResource(space)) {
84-
sharedDriveItem = yield* call(getSharedDriveItem({ graphClient, spacesStore, space }))
84+
sharedDriveItem = yield* call(
85+
getSharedDriveItem({ graphClient, spacesStore, space, signal: signal1 })
86+
)
8587
if (sharedDriveItem) {
8688
currentFolder = buildIncomingShareResource({
8789
graphRoles: sharesStore.graphRoles,
@@ -94,7 +96,12 @@ export class FolderLoaderSpace implements FolderLoader {
9496
}
9597
}
9698

97-
yield resourcesStore.loadAncestorMetaData({ folder: currentFolder, space, client: webdav })
99+
yield resourcesStore.loadAncestorMetaData({
100+
folder: currentFolder,
101+
space,
102+
client: webdav,
103+
signal: signal1
104+
})
98105

99106
if (options.loadShares) {
100107
const ancestorMetaData = resourcesStore.ancestorMetaData
@@ -115,7 +122,9 @@ export class FolderLoaderSpace implements FolderLoader {
115122
// add current user as space member if not already loaded
116123
if (isEmpty(space.members)) {
117124
if (!sharedDriveItem) {
118-
sharedDriveItem = yield* call(getSharedDriveItem({ graphClient, spacesStore, space }))
125+
sharedDriveItem = yield* call(
126+
getSharedDriveItem({ graphClient, spacesStore, space, signal: signal1 })
127+
)
119128
}
120129
setCurrentUserShareSpacePermissions({
121130
sharesStore,
@@ -145,13 +154,19 @@ export class FolderLoaderSpace implements FolderLoader {
145154
private async getSharedDriveItem({
146155
graphClient,
147156
spacesStore,
148-
space
157+
space,
158+
signal
149159
}: {
150160
graphClient: Graph
151161
spacesStore: SpacesStore
152162
space: SpaceResource
163+
signal?: AbortSignal
153164
}) {
154-
const matchingMountPoint = await spacesStore.getMountPointForSpace({ graphClient, space })
165+
const matchingMountPoint = await spacesStore.getMountPointForSpace({
166+
graphClient,
167+
space,
168+
signal
169+
})
155170
if (!matchingMountPoint) {
156171
return null
157172
}

packages/web-app-files/src/services/folder/loaderTrashbin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class FolderLoaderTrashbin implements FolderLoader {
2626
const { resource, children } = yield webdav.listFiles(
2727
space,
2828
{},
29-
{ depth: 1, davProperties: DavProperties.Trashbin, isTrash: true }
29+
{ depth: 1, davProperties: DavProperties.Trashbin, isTrash: true, signal: signal1 }
3030
)
3131

3232
resourcesStore.initResourceList({ currentFolder: resource, resources: children })

packages/web-app-files/src/views/spaces/Projects.vue

+5-2
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,13 @@ export default defineComponent({
251251
const { setSelection, initResourceList, clearResourceList, setAncestorMetaData } =
252252
useResourcesStore()
253253
254-
const loadResourcesTask = useTask(function* () {
254+
const loadResourcesTask = useTask(function* (signal) {
255255
clearResourceList()
256256
setAncestorMetaData({})
257-
yield spacesStore.reloadProjectSpaces({ graphClient: clientService.graphAuthenticated })
257+
yield spacesStore.reloadProjectSpaces({
258+
graphClient: clientService.graphAuthenticated,
259+
signal
260+
})
258261
initResourceList({ currentFolder: null, resources: unref(spaces) })
259262
})
260263

packages/web-app-files/src/views/trash/Overview.vue

+5-2
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,12 @@ export default defineComponent({
121121
)
122122
)
123123
124-
const loadResourcesTask = useTask(function* () {
124+
const loadResourcesTask = useTask(function* (signal) {
125125
resourcesStore.clearResourceList()
126-
yield spacesStore.reloadProjectSpaces({ graphClient: clientService.graphAuthenticated })
126+
yield spacesStore.reloadProjectSpaces({
127+
graphClient: clientService.graphAuthenticated,
128+
signal
129+
})
127130
resourcesStore.initResourceList({ currentFolder: null, resources: unref(spaces) })
128131
})
129132

packages/web-pkg/src/components/AppTemplates/AppWrapper.vue

+15-10
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ export default defineComponent({
264264
})
265265
}
266266
267-
const loadFileTask = useTask(function* () {
267+
const loadFileTask = useTask(function* (signal) {
268268
try {
269269
if (!unref(driveAliasAndItem)) {
270270
yield addMissingDriveAliasAndItem()
@@ -280,9 +280,15 @@ export default defineComponent({
280280
const timestamp = DateTime.local().toFormat('yyyyMMddHHmmss')
281281
const targetPath = `${unref(resource).name}_${timestamp}.${newExtension}`
282282
if (
283-
!(yield clientService.webdav.copyFiles(unref(space), unref(resource), unref(space), {
284-
path: targetPath
285-
}))
283+
!(yield clientService.webdav.copyFiles(
284+
unref(space),
285+
unref(resource),
286+
unref(space),
287+
{
288+
path: targetPath
289+
},
290+
{ signal }
291+
))
286292
) {
287293
throw new Error($gettext('Importing failed'))
288294
}
@@ -300,18 +306,17 @@ export default defineComponent({
300306
301307
if (unref(hasProp('currentContent'))) {
302308
const fileContentsResponse = yield* call(
303-
getFileContents(currentFileContext, props.fileContentOptions)
309+
getFileContents(currentFileContext, { ...props.fileContentOptions, signal })
304310
)
305311
serverContent.value = currentContent.value = fileContentsResponse.body
306312
currentETag.value = fileContentsResponse.headers['OC-ETag']
307313
}
308314
309315
if (unref(hasProp('url'))) {
310-
url.value = yield getUrlForResource(
311-
unref(space),
312-
unref(resource),
313-
props.urlForResourceOptions
314-
)
316+
url.value = yield getUrlForResource(unref(space), unref(resource), {
317+
...props.urlForResourceOptions,
318+
signal
319+
})
315320
}
316321
loading.value = false
317322
} catch (e) {

packages/web-pkg/src/components/SideBar/FileSideBar.vue

+15-8
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ export default defineComponent({
193193
)
194194
195195
const loadVersionsTask = useTask(function* (signal, resource: Resource) {
196-
versions.value = yield clientService.webdav.listFileVersions(resource.id)
196+
versions.value = yield clientService.webdav.listFileVersions(resource.id, { signal })
197197
})
198198
199199
const loadSharesTask = useTask(function* (signal, resource: Resource) {
@@ -207,7 +207,8 @@ export default defineComponent({
207207
if (isShareSpaceResource(props?.space)) {
208208
const matchingMountPoint = yield spacesStore.getMountPointForSpace({
209209
graphClient: clientService.graphAuthenticated,
210-
space: props.space
210+
space: props.space,
211+
signal
211212
})
212213
if (matchingMountPoint) {
213214
driveId = matchingMountPoint.root.remoteItem.rootId
@@ -216,7 +217,7 @@ export default defineComponent({
216217
217218
// load direct shares
218219
const { shares, allowedRoles } = yield* call(
219-
client.listPermissions(driveId, resource.fileId, sharesStore.graphRoles)
220+
client.listPermissions(driveId, resource.fileId, sharesStore.graphRoles, {}, { signal })
220221
)
221222
222223
const loadedCollaboratorShares = shares.filter(isCollaboratorShare)
@@ -229,10 +230,16 @@ export default defineComponent({
229230
// load external share roles
230231
if (appsStore.isAppEnabled('open-cloud-mesh')) {
231232
const { allowedRoles } = yield* call(
232-
client.listPermissions(driveId, resource.fileId, sharesStore.graphRoles, {
233-
filter: `@libre.graph.permissions.roles.allowedValues/rolePermissions/any(p:contains(p/condition, '@Subject.UserType=="Federated"'))`,
234-
select: [ListPermissionsSpaceRootSelectEnum.LibreGraphPermissionsRolesAllowedValues]
235-
})
233+
client.listPermissions(
234+
driveId,
235+
resource.fileId,
236+
sharesStore.graphRoles,
237+
{
238+
filter: `@libre.graph.permissions.roles.allowedValues/rolePermissions/any(p:contains(p/condition, '@Subject.UserType=="Federated"'))`,
239+
select: [ListPermissionsSpaceRootSelectEnum.LibreGraphPermissionsRolesAllowedValues]
240+
},
241+
{ signal }
242+
)
236243
)
237244
238245
availableExternalShareRoles.value =
@@ -296,7 +303,7 @@ export default defineComponent({
296303
const promises = [...new Set(ancestorIds)].map((id) => {
297304
return queue.add(() =>
298305
clientService.graphAuthenticated.permissions
299-
.listPermissions(driveId, id, sharesStore.graphRoles)
306+
.listPermissions(driveId, id, sharesStore.graphRoles, {}, { signal })
300307
.then((result) => {
301308
const indirectShares = result.shares.map((s) => ({ ...s, indirect: true }))
302309
loadedCollaboratorShares.push(...indirectShares.filter(isCollaboratorShare))

packages/web-pkg/src/composables/appDefaults/useAppFileHandling.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ interface AppFileHandlingOptions {
1414
clientService: ClientService
1515
}
1616

17-
export type FileContentOptions = { responseType?: 'arraybuffer' | 'blob' | 'text' } & Record<
18-
string,
19-
any
20-
>
17+
export type FileContentOptions = {
18+
responseType?: 'arraybuffer' | 'blob' | 'text'
19+
signal?: AbortSignal
20+
} & Record<string, any>
2121
export type UrlForResourceOptions = Omit<Parameters<WebDAV['getFileUrl']>[2], 'isUrlSigningEnabled'>
2222

2323
export interface AppFileHandlingResult {
@@ -61,7 +61,10 @@ export function useAppFileHandling({
6161
// TODO: support query parameters
6262
const getFileContents = (
6363
fileContext: MaybeRef<FileContext>,
64-
options: { responseType?: 'arraybuffer' | 'blob' | 'text' } & Record<string, any>
64+
options: { responseType?: 'arraybuffer' | 'blob' | 'text'; signal?: AbortSignal } & Record<
65+
string,
66+
any
67+
>
6568
) => {
6669
return clientService.webdav.getFileContents(
6770
unref(unref(fileContext).space),
@@ -90,7 +93,7 @@ export function useAppFileHandling({
9093

9194
const putFileContents = (
9295
fileContext: MaybeRef<FileContext>,
93-
options: { content?: string } & Record<string, any>
96+
options: { content?: string; signal?: AbortSignal } & Record<string, any>
9497
) => {
9598
return clientService.webdav.putFileContents(unref(unref(fileContext).space), {
9699
path: unref(unref(fileContext).item),

packages/web-pkg/src/composables/piniaStores/resources.ts

+14-10
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,13 @@ export const useResourcesStore = defineStore('resources', () => {
224224
const loadAncestorMetaData = ({
225225
folder,
226226
space,
227-
client
227+
client,
228+
signal
228229
}: {
229230
folder: Resource
230231
space: SpaceResource
231232
client: WebDAV
233+
signal?: AbortSignal
232234
}) => {
233235
const data: AncestorMetaData = {
234236
[folder.path]: {
@@ -274,15 +276,17 @@ export const useResourcesStore = defineStore('resources', () => {
274276
}
275277

276278
promises.push(
277-
client.listFiles(space, { path }, { depth: 0, davProperties }).then(({ resource }) => {
278-
data[path] = {
279-
id: resource.fileId,
280-
shareTypes: resource.shareTypes,
281-
parentFolderId: resource.parentFolderId,
282-
spaceId: space.id,
283-
path
284-
}
285-
})
279+
client
280+
.listFiles(space, { path }, { depth: 0, davProperties, signal })
281+
.then(({ resource }) => {
282+
data[path] = {
283+
id: resource.fileId,
284+
shareTypes: resource.shareTypes,
285+
parentFolderId: resource.parentFolderId,
286+
spaceId: space.id,
287+
path
288+
}
289+
})
286290
)
287291
}
288292

0 commit comments

Comments
 (0)