18285c032STomasz Sapetaimport { EventEmitter, UnavailabilityError } from 'expo-modules-core';
21da2f189STomasz Sapetaimport { Platform } from 'react-native';
37f896a5fSGiau. Tran Minhimport { v4 as uuidv4 } from 'uuid';
479a5fc63SJames Ideimport ExponentFileSystem from './ExponentFileSystem';
537630a92SŁukasz Kosmatyimport { EncodingType, FileSystemSessionType, FileSystemUploadType, } from './FileSystem.types';
67e929553SEvan Baconif (!ExponentFileSystem) {
72307aaceSEvan Bacon    console.warn("No native ExponentFileSystem module found, are you sure the expo-file-system's module is linked properly?");
82307aaceSEvan Bacon}
98f6e1365SEvan Bacon// Prevent webpack from pruning this.
1079a5fc63SJames Ideconst _unused = new EventEmitter(ExponentFileSystem); // eslint-disable-line
1137630a92SŁukasz Kosmatyexport { EncodingType, FileSystemSessionType, FileSystemUploadType, };
122307aaceSEvan Baconfunction normalizeEndingSlash(p) {
132307aaceSEvan Bacon    if (p != null) {
142307aaceSEvan Bacon        return p.replace(/\/*$/, '') + '/';
152307aaceSEvan Bacon    }
162307aaceSEvan Bacon    return null;
172307aaceSEvan Bacon}
187e929553SEvan Baconexport const documentDirectory = normalizeEndingSlash(ExponentFileSystem.documentDirectory);
197e929553SEvan Baconexport const cacheDirectory = normalizeEndingSlash(ExponentFileSystem.cacheDirectory);
207e929553SEvan Baconexport const { bundledAssets, bundleDirectory } = ExponentFileSystem;
212307aaceSEvan Baconexport async function getInfoAsync(fileUri, options = {}) {
227e929553SEvan Bacon    if (!ExponentFileSystem.getInfoAsync) {
232307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'getInfoAsync');
242307aaceSEvan Bacon    }
257e929553SEvan Bacon    return await ExponentFileSystem.getInfoAsync(fileUri, options);
262307aaceSEvan Bacon}
272307aaceSEvan Baconexport async function readAsStringAsync(fileUri, options) {
287e929553SEvan Bacon    if (!ExponentFileSystem.readAsStringAsync) {
292307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'readAsStringAsync');
302307aaceSEvan Bacon    }
317e929553SEvan Bacon    return await ExponentFileSystem.readAsStringAsync(fileUri, options || {});
322307aaceSEvan Bacon}
33e4897761STongyu Zhuexport async function getContentUriAsync(fileUri) {
341da2f189STomasz Sapeta    if (Platform.OS === 'android') {
35e4897761STongyu Zhu        if (!ExponentFileSystem.getContentUriAsync) {
36e4897761STongyu Zhu            throw new UnavailabilityError('expo-file-system', 'getContentUriAsync');
37e4897761STongyu Zhu        }
38e4897761STongyu Zhu        return await ExponentFileSystem.getContentUriAsync(fileUri);
39e4897761STongyu Zhu    }
401da2f189STomasz Sapeta    else {
411da2f189STomasz Sapeta        return new Promise(function (resolve, reject) {
421da2f189STomasz Sapeta            resolve(fileUri);
431da2f189STomasz Sapeta        });
441da2f189STomasz Sapeta    }
451da2f189STomasz Sapeta}
462307aaceSEvan Baconexport async function writeAsStringAsync(fileUri, contents, options = {}) {
477e929553SEvan Bacon    if (!ExponentFileSystem.writeAsStringAsync) {
482307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'writeAsStringAsync');
492307aaceSEvan Bacon    }
507e929553SEvan Bacon    return await ExponentFileSystem.writeAsStringAsync(fileUri, contents, options);
512307aaceSEvan Bacon}
522307aaceSEvan Baconexport async function deleteAsync(fileUri, options = {}) {
537e929553SEvan Bacon    if (!ExponentFileSystem.deleteAsync) {
542307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'deleteAsync');
552307aaceSEvan Bacon    }
567e929553SEvan Bacon    return await ExponentFileSystem.deleteAsync(fileUri, options);
572307aaceSEvan Bacon}
580d6db115SEric Samelsonexport async function deleteLegacyDocumentDirectoryAndroid() {
590d6db115SEric Samelson    if (Platform.OS !== 'android' || documentDirectory == null) {
600d6db115SEric Samelson        return;
610d6db115SEric Samelson    }
620d6db115SEric Samelson    const legacyDocumentDirectory = `${documentDirectory}ExperienceData/`;
630d6db115SEric Samelson    return await deleteAsync(legacyDocumentDirectory, { idempotent: true });
640d6db115SEric Samelson}
652307aaceSEvan Baconexport async function moveAsync(options) {
667e929553SEvan Bacon    if (!ExponentFileSystem.moveAsync) {
672307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'moveAsync');
682307aaceSEvan Bacon    }
697e929553SEvan Bacon    return await ExponentFileSystem.moveAsync(options);
702307aaceSEvan Bacon}
712307aaceSEvan Baconexport async function copyAsync(options) {
727e929553SEvan Bacon    if (!ExponentFileSystem.copyAsync) {
732307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'copyAsync');
742307aaceSEvan Bacon    }
757e929553SEvan Bacon    return await ExponentFileSystem.copyAsync(options);
762307aaceSEvan Bacon}
772307aaceSEvan Baconexport async function makeDirectoryAsync(fileUri, options = {}) {
787e929553SEvan Bacon    if (!ExponentFileSystem.makeDirectoryAsync) {
792307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'makeDirectoryAsync');
802307aaceSEvan Bacon    }
817e929553SEvan Bacon    return await ExponentFileSystem.makeDirectoryAsync(fileUri, options);
822307aaceSEvan Bacon}
832307aaceSEvan Baconexport async function readDirectoryAsync(fileUri) {
847e929553SEvan Bacon    if (!ExponentFileSystem.readDirectoryAsync) {
852307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'readDirectoryAsync');
862307aaceSEvan Bacon    }
877e929553SEvan Bacon    return await ExponentFileSystem.readDirectoryAsync(fileUri, {});
882307aaceSEvan Bacon}
89ae9a5f1aSTongyu Zhuexport async function getFreeDiskStorageAsync() {
90ae9a5f1aSTongyu Zhu    if (!ExponentFileSystem.getFreeDiskStorageAsync) {
91ae9a5f1aSTongyu Zhu        throw new UnavailabilityError('expo-file-system', 'getFreeDiskStorageAsync');
92ae9a5f1aSTongyu Zhu    }
93ae9a5f1aSTongyu Zhu    return await ExponentFileSystem.getFreeDiskStorageAsync();
94ae9a5f1aSTongyu Zhu}
95ae9a5f1aSTongyu Zhuexport async function getTotalDiskCapacityAsync() {
96ae9a5f1aSTongyu Zhu    if (!ExponentFileSystem.getTotalDiskCapacityAsync) {
97ae9a5f1aSTongyu Zhu        throw new UnavailabilityError('expo-file-system', 'getTotalDiskCapacityAsync');
98ae9a5f1aSTongyu Zhu    }
99ae9a5f1aSTongyu Zhu    return await ExponentFileSystem.getTotalDiskCapacityAsync();
100ae9a5f1aSTongyu Zhu}
1012307aaceSEvan Baconexport async function downloadAsync(uri, fileUri, options = {}) {
1027e929553SEvan Bacon    if (!ExponentFileSystem.downloadAsync) {
1032307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'downloadAsync');
1042307aaceSEvan Bacon    }
105da65a760SŁukasz Kosmaty    return await ExponentFileSystem.downloadAsync(uri, fileUri, {
106da65a760SŁukasz Kosmaty        sessionType: FileSystemSessionType.BACKGROUND,
107da65a760SŁukasz Kosmaty        ...options,
108da65a760SŁukasz Kosmaty    });
109da65a760SŁukasz Kosmaty}
110da65a760SŁukasz Kosmatyexport async function uploadAsync(url, fileUri, options = {}) {
111da65a760SŁukasz Kosmaty    if (!ExponentFileSystem.uploadAsync) {
112da65a760SŁukasz Kosmaty        throw new UnavailabilityError('expo-file-system', 'uploadAsync');
113da65a760SŁukasz Kosmaty    }
114da65a760SŁukasz Kosmaty    return await ExponentFileSystem.uploadAsync(url, fileUri, {
115da65a760SŁukasz Kosmaty        sessionType: FileSystemSessionType.BACKGROUND,
11637630a92SŁukasz Kosmaty        uploadType: FileSystemUploadType.BINARY_CONTENT,
117da65a760SŁukasz Kosmaty        ...options,
118da65a760SŁukasz Kosmaty        httpMethod: (options.httpMethod || 'POST').toUpperCase(),
119da65a760SŁukasz Kosmaty    });
1202307aaceSEvan Bacon}
1212307aaceSEvan Baconexport function createDownloadResumable(uri, fileUri, options, callback, resumeData) {
1222307aaceSEvan Bacon    return new DownloadResumable(uri, fileUri, options, callback, resumeData);
1232307aaceSEvan Bacon}
12452eeb172SŁukasz Kosmatyexport function createUploadTask(url, fileUri, options, callback) {
12552eeb172SŁukasz Kosmaty    return new UploadTask(url, fileUri, options, callback);
12652eeb172SŁukasz Kosmaty}
12752eeb172SŁukasz Kosmatyexport class FileSystemCancellableNetworkTask {
12852eeb172SŁukasz Kosmaty    _uuid = uuidv4();
12952eeb172SŁukasz Kosmaty    taskWasCanceled = false;
13052eeb172SŁukasz Kosmaty    emitter = new EventEmitter(ExponentFileSystem);
13152eeb172SŁukasz Kosmaty    subscription;
13252eeb172SŁukasz Kosmaty    async cancelAsync() {
13352eeb172SŁukasz Kosmaty        if (!ExponentFileSystem.networkTaskCancelAsync) {
13452eeb172SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'networkTaskCancelAsync');
13552eeb172SŁukasz Kosmaty        }
13652eeb172SŁukasz Kosmaty        this.removeSubscription();
13752eeb172SŁukasz Kosmaty        this.taskWasCanceled = true;
13852eeb172SŁukasz Kosmaty        return await ExponentFileSystem.networkTaskCancelAsync(this.uuid);
13952eeb172SŁukasz Kosmaty    }
14052eeb172SŁukasz Kosmaty    isTaskCancelled() {
14152eeb172SŁukasz Kosmaty        if (this.taskWasCanceled) {
14252eeb172SŁukasz Kosmaty            console.warn('This task was already canceled.');
14352eeb172SŁukasz Kosmaty            return true;
14452eeb172SŁukasz Kosmaty        }
14552eeb172SŁukasz Kosmaty        return false;
14652eeb172SŁukasz Kosmaty    }
14752eeb172SŁukasz Kosmaty    get uuid() {
14852eeb172SŁukasz Kosmaty        return this._uuid;
14952eeb172SŁukasz Kosmaty    }
15052eeb172SŁukasz Kosmaty    addSubscription() {
15152eeb172SŁukasz Kosmaty        if (this.subscription) {
15252eeb172SŁukasz Kosmaty            return;
15352eeb172SŁukasz Kosmaty        }
15452eeb172SŁukasz Kosmaty        this.subscription = this.emitter.addListener(this.getEventName(), (event) => {
15552eeb172SŁukasz Kosmaty            if (event.uuid === this.uuid) {
15652eeb172SŁukasz Kosmaty                const callback = this.getCallback();
15752eeb172SŁukasz Kosmaty                if (callback) {
15852eeb172SŁukasz Kosmaty                    callback(event.data);
15952eeb172SŁukasz Kosmaty                }
16052eeb172SŁukasz Kosmaty            }
16152eeb172SŁukasz Kosmaty        });
16252eeb172SŁukasz Kosmaty    }
16352eeb172SŁukasz Kosmaty    removeSubscription() {
16452eeb172SŁukasz Kosmaty        if (!this.subscription) {
16552eeb172SŁukasz Kosmaty            return;
16652eeb172SŁukasz Kosmaty        }
16752eeb172SŁukasz Kosmaty        this.emitter.removeSubscription(this.subscription);
16852eeb172SŁukasz Kosmaty        this.subscription = null;
16952eeb172SŁukasz Kosmaty    }
17052eeb172SŁukasz Kosmaty}
17152eeb172SŁukasz Kosmatyexport class UploadTask extends FileSystemCancellableNetworkTask {
17252eeb172SŁukasz Kosmaty    url;
17352eeb172SŁukasz Kosmaty    fileUri;
17452eeb172SŁukasz Kosmaty    callback;
17552eeb172SŁukasz Kosmaty    options;
17652eeb172SŁukasz Kosmaty    constructor(url, fileUri, options, callback) {
17752eeb172SŁukasz Kosmaty        super();
17852eeb172SŁukasz Kosmaty        this.url = url;
17952eeb172SŁukasz Kosmaty        this.fileUri = fileUri;
18052eeb172SŁukasz Kosmaty        this.callback = callback;
181*00d910e2SLuke Brandon Farrell        const httpMethod = (options?.httpMethod?.toUpperCase() ||
18252eeb172SŁukasz Kosmaty            'POST');
18352eeb172SŁukasz Kosmaty        this.options = {
18452eeb172SŁukasz Kosmaty            sessionType: FileSystemSessionType.BACKGROUND,
18552eeb172SŁukasz Kosmaty            uploadType: FileSystemUploadType.BINARY_CONTENT,
18652eeb172SŁukasz Kosmaty            ...options,
18752eeb172SŁukasz Kosmaty            httpMethod,
18852eeb172SŁukasz Kosmaty        };
18952eeb172SŁukasz Kosmaty    }
19052eeb172SŁukasz Kosmaty    getEventName() {
19152eeb172SŁukasz Kosmaty        return 'expo-file-system.uploadProgress';
19252eeb172SŁukasz Kosmaty    }
19352eeb172SŁukasz Kosmaty    getCallback() {
19452eeb172SŁukasz Kosmaty        return this.callback;
19552eeb172SŁukasz Kosmaty    }
19652eeb172SŁukasz Kosmaty    async uploadAsync() {
19752eeb172SŁukasz Kosmaty        if (!ExponentFileSystem.uploadTaskStartAsync) {
19852eeb172SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'uploadTaskStartAsync');
19952eeb172SŁukasz Kosmaty        }
20052eeb172SŁukasz Kosmaty        if (this.isTaskCancelled()) {
20152eeb172SŁukasz Kosmaty            return;
20252eeb172SŁukasz Kosmaty        }
20352eeb172SŁukasz Kosmaty        this.addSubscription();
20452eeb172SŁukasz Kosmaty        const result = await ExponentFileSystem.uploadTaskStartAsync(this.url, this.fileUri, this.uuid, this.options);
20552eeb172SŁukasz Kosmaty        this.removeSubscription();
20652eeb172SŁukasz Kosmaty        return result;
20752eeb172SŁukasz Kosmaty    }
20852eeb172SŁukasz Kosmaty}
20952eeb172SŁukasz Kosmatyexport class DownloadResumable extends FileSystemCancellableNetworkTask {
21052eeb172SŁukasz Kosmaty    url;
211896103abSandy    _fileUri;
21252eeb172SŁukasz Kosmaty    options;
21352eeb172SŁukasz Kosmaty    callback;
21452eeb172SŁukasz Kosmaty    resumeData;
21552eeb172SŁukasz Kosmaty    constructor(url, _fileUri, options = {}, callback, resumeData) {
21652eeb172SŁukasz Kosmaty        super();
21752eeb172SŁukasz Kosmaty        this.url = url;
21852eeb172SŁukasz Kosmaty        this._fileUri = _fileUri;
21952eeb172SŁukasz Kosmaty        this.options = options;
22052eeb172SŁukasz Kosmaty        this.callback = callback;
22152eeb172SŁukasz Kosmaty        this.resumeData = resumeData;
22252eeb172SŁukasz Kosmaty    }
22352eeb172SŁukasz Kosmaty    get fileUri() {
22452eeb172SŁukasz Kosmaty        return this._fileUri;
22552eeb172SŁukasz Kosmaty    }
22652eeb172SŁukasz Kosmaty    getEventName() {
22752eeb172SŁukasz Kosmaty        return 'expo-file-system.downloadProgress';
22852eeb172SŁukasz Kosmaty    }
22952eeb172SŁukasz Kosmaty    getCallback() {
23052eeb172SŁukasz Kosmaty        return this.callback;
2312307aaceSEvan Bacon    }
2322307aaceSEvan Bacon    async downloadAsync() {
2337e929553SEvan Bacon        if (!ExponentFileSystem.downloadResumableStartAsync) {
2342307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
2352307aaceSEvan Bacon        }
23652eeb172SŁukasz Kosmaty        if (this.isTaskCancelled()) {
23752eeb172SŁukasz Kosmaty            return;
23852eeb172SŁukasz Kosmaty        }
23952eeb172SŁukasz Kosmaty        this.addSubscription();
24052eeb172SŁukasz Kosmaty        return await ExponentFileSystem.downloadResumableStartAsync(this.url, this._fileUri, this.uuid, this.options, this.resumeData);
2412307aaceSEvan Bacon    }
2422307aaceSEvan Bacon    async pauseAsync() {
2437e929553SEvan Bacon        if (!ExponentFileSystem.downloadResumablePauseAsync) {
2442307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumablePauseAsync');
2452307aaceSEvan Bacon        }
24652eeb172SŁukasz Kosmaty        if (this.isTaskCancelled()) {
24752eeb172SŁukasz Kosmaty            return {
24852eeb172SŁukasz Kosmaty                fileUri: this._fileUri,
24952eeb172SŁukasz Kosmaty                options: this.options,
25052eeb172SŁukasz Kosmaty                url: this.url,
25152eeb172SŁukasz Kosmaty            };
25252eeb172SŁukasz Kosmaty        }
25352eeb172SŁukasz Kosmaty        const pauseResult = await ExponentFileSystem.downloadResumablePauseAsync(this.uuid);
25452eeb172SŁukasz Kosmaty        this.removeSubscription();
2552307aaceSEvan Bacon        if (pauseResult) {
25652eeb172SŁukasz Kosmaty            this.resumeData = pauseResult.resumeData;
2572307aaceSEvan Bacon            return this.savable();
2582307aaceSEvan Bacon        }
2592307aaceSEvan Bacon        else {
2602307aaceSEvan Bacon            throw new Error('Unable to generate a savable pause state');
2612307aaceSEvan Bacon        }
2622307aaceSEvan Bacon    }
2632307aaceSEvan Bacon    async resumeAsync() {
2647e929553SEvan Bacon        if (!ExponentFileSystem.downloadResumableStartAsync) {
2652307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
2662307aaceSEvan Bacon        }
26752eeb172SŁukasz Kosmaty        if (this.isTaskCancelled()) {
26852eeb172SŁukasz Kosmaty            return;
26952eeb172SŁukasz Kosmaty        }
27052eeb172SŁukasz Kosmaty        this.addSubscription();
27152eeb172SŁukasz Kosmaty        return await ExponentFileSystem.downloadResumableStartAsync(this.url, this.fileUri, this.uuid, this.options, this.resumeData);
2722307aaceSEvan Bacon    }
2732307aaceSEvan Bacon    savable() {
2742307aaceSEvan Bacon        return {
27552eeb172SŁukasz Kosmaty            url: this.url,
27652eeb172SŁukasz Kosmaty            fileUri: this.fileUri,
27752eeb172SŁukasz Kosmaty            options: this.options,
27852eeb172SŁukasz Kosmaty            resumeData: this.resumeData,
2792307aaceSEvan Bacon        };
2802307aaceSEvan Bacon    }
2812307aaceSEvan Bacon}
282400de723SŁukasz Kosmatyconst baseReadAsStringAsync = readAsStringAsync;
283400de723SŁukasz Kosmatyconst baseWriteAsStringAsync = writeAsStringAsync;
284400de723SŁukasz Kosmatyconst baseDeleteAsync = deleteAsync;
285400de723SŁukasz Kosmatyconst baseMoveAsync = moveAsync;
286400de723SŁukasz Kosmatyconst baseCopyAsync = copyAsync;
287400de723SŁukasz Kosmaty/**
288400de723SŁukasz Kosmaty * Android only
289400de723SŁukasz Kosmaty */
290400de723SŁukasz Kosmatyexport var StorageAccessFramework;
291400de723SŁukasz Kosmaty(function (StorageAccessFramework) {
292400de723SŁukasz Kosmaty    function getUriForDirectoryInRoot(folderName) {
293400de723SŁukasz Kosmaty        return `content://com.android.externalstorage.documents/tree/primary:${folderName}/document/primary:${folderName}`;
294400de723SŁukasz Kosmaty    }
295400de723SŁukasz Kosmaty    StorageAccessFramework.getUriForDirectoryInRoot = getUriForDirectoryInRoot;
296400de723SŁukasz Kosmaty    async function requestDirectoryPermissionsAsync(initialFileUrl = null) {
297400de723SŁukasz Kosmaty        if (!ExponentFileSystem.requestDirectoryPermissionsAsync) {
298400de723SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.requestDirectoryPermissionsAsync');
299400de723SŁukasz Kosmaty        }
300400de723SŁukasz Kosmaty        return await ExponentFileSystem.requestDirectoryPermissionsAsync(initialFileUrl);
301400de723SŁukasz Kosmaty    }
302400de723SŁukasz Kosmaty    StorageAccessFramework.requestDirectoryPermissionsAsync = requestDirectoryPermissionsAsync;
303400de723SŁukasz Kosmaty    async function readDirectoryAsync(dirUri) {
304400de723SŁukasz Kosmaty        if (!ExponentFileSystem.readSAFDirectoryAsync) {
305400de723SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.readDirectoryAsync');
306400de723SŁukasz Kosmaty        }
307400de723SŁukasz Kosmaty        return await ExponentFileSystem.readSAFDirectoryAsync(dirUri, {});
308400de723SŁukasz Kosmaty    }
309400de723SŁukasz Kosmaty    StorageAccessFramework.readDirectoryAsync = readDirectoryAsync;
310400de723SŁukasz Kosmaty    async function makeDirectoryAsync(parentUri, dirName) {
311400de723SŁukasz Kosmaty        if (!ExponentFileSystem.makeSAFDirectoryAsync) {
312400de723SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.makeDirectoryAsync');
313400de723SŁukasz Kosmaty        }
314400de723SŁukasz Kosmaty        return await ExponentFileSystem.makeSAFDirectoryAsync(parentUri, dirName);
315400de723SŁukasz Kosmaty    }
316400de723SŁukasz Kosmaty    StorageAccessFramework.makeDirectoryAsync = makeDirectoryAsync;
317400de723SŁukasz Kosmaty    async function createFileAsync(parentUri, fileName, mimeType) {
318400de723SŁukasz Kosmaty        if (!ExponentFileSystem.createSAFFileAsync) {
319400de723SŁukasz Kosmaty            throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.createFileAsync');
320400de723SŁukasz Kosmaty        }
321400de723SŁukasz Kosmaty        return await ExponentFileSystem.createSAFFileAsync(parentUri, fileName, mimeType);
322400de723SŁukasz Kosmaty    }
323400de723SŁukasz Kosmaty    StorageAccessFramework.createFileAsync = createFileAsync;
324400de723SŁukasz Kosmaty    StorageAccessFramework.writeAsStringAsync = baseWriteAsStringAsync;
325400de723SŁukasz Kosmaty    StorageAccessFramework.readAsStringAsync = baseReadAsStringAsync;
326400de723SŁukasz Kosmaty    StorageAccessFramework.deleteAsync = baseDeleteAsync;
327400de723SŁukasz Kosmaty    StorageAccessFramework.moveAsync = baseMoveAsync;
328400de723SŁukasz Kosmaty    StorageAccessFramework.copyAsync = baseCopyAsync;
329400de723SŁukasz Kosmaty})(StorageAccessFramework || (StorageAccessFramework = {}));
3302307aaceSEvan Bacon//# sourceMappingURL=FileSystem.js.map