1*2307aaceSEvan Baconimport { UnavailabilityError } from 'expo-errors';
2*2307aaceSEvan Baconimport { EventEmitter } from 'expo-core';
3*2307aaceSEvan Baconimport UUID from 'uuid-js';
4*2307aaceSEvan Baconimport FS from './ExponentFileSystem';
5*2307aaceSEvan Baconimport { EncodingType, } from './FileSystem.types';
6*2307aaceSEvan Baconif (!FS) {
7*2307aaceSEvan Bacon    console.warn("No native ExponentFileSystem module found, are you sure the expo-file-system's module is linked properly?");
8*2307aaceSEvan Bacon}
9*2307aaceSEvan Baconexport { EncodingType, };
10*2307aaceSEvan Baconfunction normalizeEndingSlash(p) {
11*2307aaceSEvan Bacon    if (p != null) {
12*2307aaceSEvan Bacon        return p.replace(/\/*$/, '') + '/';
13*2307aaceSEvan Bacon    }
14*2307aaceSEvan Bacon    return null;
15*2307aaceSEvan Bacon}
16*2307aaceSEvan BaconFS.documentDirectory = normalizeEndingSlash(FS.documentDirectory);
17*2307aaceSEvan BaconFS.cacheDirectory = normalizeEndingSlash(FS.cacheDirectory);
18*2307aaceSEvan Baconexport const { documentDirectory, cacheDirectory, bundledAssets, bundleDirectory } = FS;
19*2307aaceSEvan Baconexport async function getInfoAsync(fileUri, options = {}) {
20*2307aaceSEvan Bacon    if (!FS.getInfoAsync) {
21*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'getInfoAsync');
22*2307aaceSEvan Bacon    }
23*2307aaceSEvan Bacon    return await FS.getInfoAsync(fileUri, options);
24*2307aaceSEvan Bacon}
25*2307aaceSEvan Baconexport async function readAsStringAsync(fileUri, options) {
26*2307aaceSEvan Bacon    if (!FS.readAsStringAsync) {
27*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'readAsStringAsync');
28*2307aaceSEvan Bacon    }
29*2307aaceSEvan Bacon    return await FS.readAsStringAsync(fileUri, options || {});
30*2307aaceSEvan Bacon}
31*2307aaceSEvan Baconexport async function writeAsStringAsync(fileUri, contents, options = {}) {
32*2307aaceSEvan Bacon    if (!FS.writeAsStringAsync) {
33*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'writeAsStringAsync');
34*2307aaceSEvan Bacon    }
35*2307aaceSEvan Bacon    return await FS.writeAsStringAsync(fileUri, contents, options);
36*2307aaceSEvan Bacon}
37*2307aaceSEvan Baconexport async function deleteAsync(fileUri, options = {}) {
38*2307aaceSEvan Bacon    if (!FS.deleteAsync) {
39*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'deleteAsync');
40*2307aaceSEvan Bacon    }
41*2307aaceSEvan Bacon    return await FS.deleteAsync(fileUri, options);
42*2307aaceSEvan Bacon}
43*2307aaceSEvan Baconexport async function moveAsync(options) {
44*2307aaceSEvan Bacon    if (!FS.moveAsync) {
45*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'moveAsync');
46*2307aaceSEvan Bacon    }
47*2307aaceSEvan Bacon    return await FS.moveAsync(options);
48*2307aaceSEvan Bacon}
49*2307aaceSEvan Baconexport async function copyAsync(options) {
50*2307aaceSEvan Bacon    if (!FS.copyAsync) {
51*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'copyAsync');
52*2307aaceSEvan Bacon    }
53*2307aaceSEvan Bacon    return await FS.copyAsync(options);
54*2307aaceSEvan Bacon}
55*2307aaceSEvan Baconexport async function makeDirectoryAsync(fileUri, options = {}) {
56*2307aaceSEvan Bacon    if (!FS.makeDirectoryAsync) {
57*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'makeDirectoryAsync');
58*2307aaceSEvan Bacon    }
59*2307aaceSEvan Bacon    return await FS.makeDirectoryAsync(fileUri, options);
60*2307aaceSEvan Bacon}
61*2307aaceSEvan Baconexport async function readDirectoryAsync(fileUri) {
62*2307aaceSEvan Bacon    if (!FS.readDirectoryAsync) {
63*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'readDirectoryAsync');
64*2307aaceSEvan Bacon    }
65*2307aaceSEvan Bacon    return await FS.readDirectoryAsync(fileUri, {});
66*2307aaceSEvan Bacon}
67*2307aaceSEvan Baconexport async function downloadAsync(uri, fileUri, options = {}) {
68*2307aaceSEvan Bacon    if (!FS.downloadAsync) {
69*2307aaceSEvan Bacon        throw new UnavailabilityError('expo-file-system', 'downloadAsync');
70*2307aaceSEvan Bacon    }
71*2307aaceSEvan Bacon    return await FS.downloadAsync(uri, fileUri, options);
72*2307aaceSEvan Bacon}
73*2307aaceSEvan Baconexport function createDownloadResumable(uri, fileUri, options, callback, resumeData) {
74*2307aaceSEvan Bacon    return new DownloadResumable(uri, fileUri, options, callback, resumeData);
75*2307aaceSEvan Bacon}
76*2307aaceSEvan Baconexport class DownloadResumable {
77*2307aaceSEvan Bacon    constructor(url, fileUri, options = {}, callback, resumeData) {
78*2307aaceSEvan Bacon        this._uuid = UUID.create(4).toString();
79*2307aaceSEvan Bacon        this._url = url;
80*2307aaceSEvan Bacon        this._fileUri = fileUri;
81*2307aaceSEvan Bacon        this._options = options;
82*2307aaceSEvan Bacon        this._resumeData = resumeData;
83*2307aaceSEvan Bacon        this._callback = callback;
84*2307aaceSEvan Bacon        this._subscription = null;
85*2307aaceSEvan Bacon        this._emitter = new EventEmitter(FS);
86*2307aaceSEvan Bacon    }
87*2307aaceSEvan Bacon    async downloadAsync() {
88*2307aaceSEvan Bacon        if (!FS.downloadResumableStartAsync) {
89*2307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
90*2307aaceSEvan Bacon        }
91*2307aaceSEvan Bacon        this._addSubscription();
92*2307aaceSEvan Bacon        return await FS.downloadResumableStartAsync(this._url, this._fileUri, this._uuid, this._options, this._resumeData);
93*2307aaceSEvan Bacon    }
94*2307aaceSEvan Bacon    async pauseAsync() {
95*2307aaceSEvan Bacon        if (!FS.downloadResumablePauseAsync) {
96*2307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumablePauseAsync');
97*2307aaceSEvan Bacon        }
98*2307aaceSEvan Bacon        const pauseResult = await FS.downloadResumablePauseAsync(this._uuid);
99*2307aaceSEvan Bacon        this._removeSubscription();
100*2307aaceSEvan Bacon        if (pauseResult) {
101*2307aaceSEvan Bacon            this._resumeData = pauseResult.resumeData;
102*2307aaceSEvan Bacon            return this.savable();
103*2307aaceSEvan Bacon        }
104*2307aaceSEvan Bacon        else {
105*2307aaceSEvan Bacon            throw new Error('Unable to generate a savable pause state');
106*2307aaceSEvan Bacon        }
107*2307aaceSEvan Bacon    }
108*2307aaceSEvan Bacon    async resumeAsync() {
109*2307aaceSEvan Bacon        if (!FS.downloadResumableStartAsync) {
110*2307aaceSEvan Bacon            throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
111*2307aaceSEvan Bacon        }
112*2307aaceSEvan Bacon        this._addSubscription();
113*2307aaceSEvan Bacon        return await FS.downloadResumableStartAsync(this._url, this._fileUri, this._uuid, this._options, this._resumeData);
114*2307aaceSEvan Bacon    }
115*2307aaceSEvan Bacon    savable() {
116*2307aaceSEvan Bacon        return {
117*2307aaceSEvan Bacon            url: this._url,
118*2307aaceSEvan Bacon            fileUri: this._fileUri,
119*2307aaceSEvan Bacon            options: this._options,
120*2307aaceSEvan Bacon            resumeData: this._resumeData,
121*2307aaceSEvan Bacon        };
122*2307aaceSEvan Bacon    }
123*2307aaceSEvan Bacon    _addSubscription() {
124*2307aaceSEvan Bacon        if (this._subscription) {
125*2307aaceSEvan Bacon            return;
126*2307aaceSEvan Bacon        }
127*2307aaceSEvan Bacon        this._subscription = this._emitter.addListener('Exponent.downloadProgress', (event) => {
128*2307aaceSEvan Bacon            if (event.uuid === this._uuid) {
129*2307aaceSEvan Bacon                const callback = this._callback;
130*2307aaceSEvan Bacon                if (callback) {
131*2307aaceSEvan Bacon                    callback(event.data);
132*2307aaceSEvan Bacon                }
133*2307aaceSEvan Bacon            }
134*2307aaceSEvan Bacon        });
135*2307aaceSEvan Bacon    }
136*2307aaceSEvan Bacon    _removeSubscription() {
137*2307aaceSEvan Bacon        if (!this._subscription) {
138*2307aaceSEvan Bacon            return;
139*2307aaceSEvan Bacon        }
140*2307aaceSEvan Bacon        this._emitter.removeSubscription(this._subscription);
141*2307aaceSEvan Bacon        this._subscription = null;
142*2307aaceSEvan Bacon    }
143*2307aaceSEvan Bacon}
144*2307aaceSEvan Bacon//# sourceMappingURL=FileSystem.js.map