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} 124*52eeb172SŁukasz Kosmatyexport function createUploadTask(url, fileUri, options, callback) { 125*52eeb172SŁukasz Kosmaty return new UploadTask(url, fileUri, options, callback); 126*52eeb172SŁukasz Kosmaty} 127*52eeb172SŁukasz Kosmatyexport class FileSystemCancellableNetworkTask { 128*52eeb172SŁukasz Kosmaty _uuid = uuidv4(); 129*52eeb172SŁukasz Kosmaty taskWasCanceled = false; 130*52eeb172SŁukasz Kosmaty emitter = new EventEmitter(ExponentFileSystem); 131*52eeb172SŁukasz Kosmaty subscription; 132*52eeb172SŁukasz Kosmaty async cancelAsync() { 133*52eeb172SŁukasz Kosmaty if (!ExponentFileSystem.networkTaskCancelAsync) { 134*52eeb172SŁukasz Kosmaty throw new UnavailabilityError('expo-file-system', 'networkTaskCancelAsync'); 135*52eeb172SŁukasz Kosmaty } 136*52eeb172SŁukasz Kosmaty this.removeSubscription(); 137*52eeb172SŁukasz Kosmaty this.taskWasCanceled = true; 138*52eeb172SŁukasz Kosmaty return await ExponentFileSystem.networkTaskCancelAsync(this.uuid); 139*52eeb172SŁukasz Kosmaty } 140*52eeb172SŁukasz Kosmaty isTaskCancelled() { 141*52eeb172SŁukasz Kosmaty if (this.taskWasCanceled) { 142*52eeb172SŁukasz Kosmaty console.warn('This task was already canceled.'); 143*52eeb172SŁukasz Kosmaty return true; 144*52eeb172SŁukasz Kosmaty } 145*52eeb172SŁukasz Kosmaty return false; 146*52eeb172SŁukasz Kosmaty } 147*52eeb172SŁukasz Kosmaty get uuid() { 148*52eeb172SŁukasz Kosmaty return this._uuid; 149*52eeb172SŁukasz Kosmaty } 150*52eeb172SŁukasz Kosmaty addSubscription() { 151*52eeb172SŁukasz Kosmaty if (this.subscription) { 152*52eeb172SŁukasz Kosmaty return; 153*52eeb172SŁukasz Kosmaty } 154*52eeb172SŁukasz Kosmaty this.subscription = this.emitter.addListener(this.getEventName(), (event) => { 155*52eeb172SŁukasz Kosmaty if (event.uuid === this.uuid) { 156*52eeb172SŁukasz Kosmaty const callback = this.getCallback(); 157*52eeb172SŁukasz Kosmaty if (callback) { 158*52eeb172SŁukasz Kosmaty callback(event.data); 159*52eeb172SŁukasz Kosmaty } 160*52eeb172SŁukasz Kosmaty } 161*52eeb172SŁukasz Kosmaty }); 162*52eeb172SŁukasz Kosmaty } 163*52eeb172SŁukasz Kosmaty removeSubscription() { 164*52eeb172SŁukasz Kosmaty if (!this.subscription) { 165*52eeb172SŁukasz Kosmaty return; 166*52eeb172SŁukasz Kosmaty } 167*52eeb172SŁukasz Kosmaty this.emitter.removeSubscription(this.subscription); 168*52eeb172SŁukasz Kosmaty this.subscription = null; 169*52eeb172SŁukasz Kosmaty } 170*52eeb172SŁukasz Kosmaty} 171*52eeb172SŁukasz Kosmatyexport class UploadTask extends FileSystemCancellableNetworkTask { 172*52eeb172SŁukasz Kosmaty url; 173*52eeb172SŁukasz Kosmaty fileUri; 174*52eeb172SŁukasz Kosmaty callback; 175*52eeb172SŁukasz Kosmaty options; 176*52eeb172SŁukasz Kosmaty constructor(url, fileUri, options, callback) { 177*52eeb172SŁukasz Kosmaty super(); 178*52eeb172SŁukasz Kosmaty this.url = url; 179*52eeb172SŁukasz Kosmaty this.fileUri = fileUri; 180*52eeb172SŁukasz Kosmaty this.callback = callback; 181*52eeb172SŁukasz Kosmaty const httpMethod = (options?.httpMethod?.toUpperCase || 182*52eeb172SŁukasz Kosmaty 'POST'); 183*52eeb172SŁukasz Kosmaty this.options = { 184*52eeb172SŁukasz Kosmaty sessionType: FileSystemSessionType.BACKGROUND, 185*52eeb172SŁukasz Kosmaty uploadType: FileSystemUploadType.BINARY_CONTENT, 186*52eeb172SŁukasz Kosmaty ...options, 187*52eeb172SŁukasz Kosmaty httpMethod, 188*52eeb172SŁukasz Kosmaty }; 189*52eeb172SŁukasz Kosmaty } 190*52eeb172SŁukasz Kosmaty getEventName() { 191*52eeb172SŁukasz Kosmaty return 'expo-file-system.uploadProgress'; 192*52eeb172SŁukasz Kosmaty } 193*52eeb172SŁukasz Kosmaty getCallback() { 194*52eeb172SŁukasz Kosmaty return this.callback; 195*52eeb172SŁukasz Kosmaty } 196*52eeb172SŁukasz Kosmaty async uploadAsync() { 197*52eeb172SŁukasz Kosmaty if (!ExponentFileSystem.uploadTaskStartAsync) { 198*52eeb172SŁukasz Kosmaty throw new UnavailabilityError('expo-file-system', 'uploadTaskStartAsync'); 199*52eeb172SŁukasz Kosmaty } 200*52eeb172SŁukasz Kosmaty if (this.isTaskCancelled()) { 201*52eeb172SŁukasz Kosmaty return; 202*52eeb172SŁukasz Kosmaty } 203*52eeb172SŁukasz Kosmaty this.addSubscription(); 204*52eeb172SŁukasz Kosmaty const result = await ExponentFileSystem.uploadTaskStartAsync(this.url, this.fileUri, this.uuid, this.options); 205*52eeb172SŁukasz Kosmaty this.removeSubscription(); 206*52eeb172SŁukasz Kosmaty return result; 207*52eeb172SŁukasz Kosmaty } 208*52eeb172SŁukasz Kosmaty} 209*52eeb172SŁukasz Kosmatyexport class DownloadResumable extends FileSystemCancellableNetworkTask { 210*52eeb172SŁukasz Kosmaty url; 211896103abSandy _fileUri; 212*52eeb172SŁukasz Kosmaty options; 213*52eeb172SŁukasz Kosmaty callback; 214*52eeb172SŁukasz Kosmaty resumeData; 215*52eeb172SŁukasz Kosmaty constructor(url, _fileUri, options = {}, callback, resumeData) { 216*52eeb172SŁukasz Kosmaty super(); 217*52eeb172SŁukasz Kosmaty this.url = url; 218*52eeb172SŁukasz Kosmaty this._fileUri = _fileUri; 219*52eeb172SŁukasz Kosmaty this.options = options; 220*52eeb172SŁukasz Kosmaty this.callback = callback; 221*52eeb172SŁukasz Kosmaty this.resumeData = resumeData; 222*52eeb172SŁukasz Kosmaty } 223*52eeb172SŁukasz Kosmaty get fileUri() { 224*52eeb172SŁukasz Kosmaty return this._fileUri; 225*52eeb172SŁukasz Kosmaty } 226*52eeb172SŁukasz Kosmaty getEventName() { 227*52eeb172SŁukasz Kosmaty return 'expo-file-system.downloadProgress'; 228*52eeb172SŁukasz Kosmaty } 229*52eeb172SŁukasz Kosmaty getCallback() { 230*52eeb172SŁ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 } 236*52eeb172SŁukasz Kosmaty if (this.isTaskCancelled()) { 237*52eeb172SŁukasz Kosmaty return; 238*52eeb172SŁukasz Kosmaty } 239*52eeb172SŁukasz Kosmaty this.addSubscription(); 240*52eeb172SŁ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 } 246*52eeb172SŁukasz Kosmaty if (this.isTaskCancelled()) { 247*52eeb172SŁukasz Kosmaty return { 248*52eeb172SŁukasz Kosmaty fileUri: this._fileUri, 249*52eeb172SŁukasz Kosmaty options: this.options, 250*52eeb172SŁukasz Kosmaty url: this.url, 251*52eeb172SŁukasz Kosmaty }; 252*52eeb172SŁukasz Kosmaty } 253*52eeb172SŁukasz Kosmaty const pauseResult = await ExponentFileSystem.downloadResumablePauseAsync(this.uuid); 254*52eeb172SŁukasz Kosmaty this.removeSubscription(); 2552307aaceSEvan Bacon if (pauseResult) { 256*52eeb172SŁ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 } 267*52eeb172SŁukasz Kosmaty if (this.isTaskCancelled()) { 268*52eeb172SŁukasz Kosmaty return; 269*52eeb172SŁukasz Kosmaty } 270*52eeb172SŁukasz Kosmaty this.addSubscription(); 271*52eeb172SŁukasz Kosmaty return await ExponentFileSystem.downloadResumableStartAsync(this.url, this.fileUri, this.uuid, this.options, this.resumeData); 2722307aaceSEvan Bacon } 2732307aaceSEvan Bacon savable() { 2742307aaceSEvan Bacon return { 275*52eeb172SŁukasz Kosmaty url: this.url, 276*52eeb172SŁukasz Kosmaty fileUri: this.fileUri, 277*52eeb172SŁukasz Kosmaty options: this.options, 278*52eeb172SŁ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