1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
6 static create(config?: Partial<WebDAVDefaults>, createRequest?: () => XMLHttpRequest) {
7 return new WebDAV(config, createRequest);
10 defaults: WebDAVDefaults = {
15 propfind = (url: string, config: PropfindConfig = {}) =>
21 put = (url: string, config: PutConfig = {}) =>
27 copy = (url: string, { destination, ...config }: CopyConfig) =>
31 headers: { ...config.headers, Destination: this.defaults.baseUrl + destination }
34 move = (url: string, { destination, ...config }: MoveConfig) =>
38 headers: { ...config.headers, Destination: this.defaults.baseUrl + destination }
41 delete = (url: string, config: DeleteConfig = {}) =>
47 private constructor(config?: Partial<WebDAVDefaults>, private createRequest = () => new XMLHttpRequest()) {
49 this.defaults = { ...this.defaults, ...config };
53 private request = (config: RequestConfig) => {
54 return new Promise<XMLHttpRequest>((resolve, reject) => {
55 const r = this.createRequest();
56 r.open(config.method, this.defaults.baseUrl + config.url);
58 const headers = { ...this.defaults.headers, ...config.headers };
61 .forEach(key => r.setRequestHeader(key, headers[key]));
63 if (config.onProgress) {
64 r.addEventListener('progress', config.onProgress);
67 r.addEventListener('load', () => resolve(r));
68 r.addEventListener('error', () => reject(r));
76 export interface PropfindConfig extends BaseConfig { }
78 export interface PutConfig extends BaseConfig {
80 onProgress?: (event: ProgressEvent) => void;
83 export interface CopyConfig extends BaseConfig {
87 export interface MoveConfig extends BaseConfig {
91 export interface DeleteConfig extends BaseConfig { }
93 interface BaseConfig {
95 [key: string]: string;
99 interface WebDAVDefaults {
101 headers: { [key: string]: string };
104 interface RequestConfig {
107 headers?: { [key: string]: string };
109 onProgress?: (event: ProgressEvent) => void;