You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
13 KiB
330 lines
13 KiB
import { EventEmitter, UnavailabilityError } from 'expo-modules-core';
|
|
import { Platform } from 'react-native';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
import ExponentFileSystem from './ExponentFileSystem';
|
|
import { EncodingType, FileSystemSessionType, FileSystemUploadType, } from './FileSystem.types';
|
|
if (!ExponentFileSystem) {
|
|
console.warn("No native ExponentFileSystem module found, are you sure the expo-file-system's module is linked properly?");
|
|
}
|
|
// Prevent webpack from pruning this.
|
|
const _unused = new EventEmitter(ExponentFileSystem); // eslint-disable-line
|
|
export { EncodingType, FileSystemSessionType, FileSystemUploadType, };
|
|
function normalizeEndingSlash(p) {
|
|
if (p != null) {
|
|
return p.replace(/\/*$/, '') + '/';
|
|
}
|
|
return null;
|
|
}
|
|
export const documentDirectory = normalizeEndingSlash(ExponentFileSystem.documentDirectory);
|
|
export const cacheDirectory = normalizeEndingSlash(ExponentFileSystem.cacheDirectory);
|
|
export const { bundledAssets, bundleDirectory } = ExponentFileSystem;
|
|
export async function getInfoAsync(fileUri, options = {}) {
|
|
if (!ExponentFileSystem.getInfoAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'getInfoAsync');
|
|
}
|
|
return await ExponentFileSystem.getInfoAsync(fileUri, options);
|
|
}
|
|
export async function readAsStringAsync(fileUri, options) {
|
|
if (!ExponentFileSystem.readAsStringAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'readAsStringAsync');
|
|
}
|
|
return await ExponentFileSystem.readAsStringAsync(fileUri, options || {});
|
|
}
|
|
export async function getContentUriAsync(fileUri) {
|
|
if (Platform.OS === 'android') {
|
|
if (!ExponentFileSystem.getContentUriAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'getContentUriAsync');
|
|
}
|
|
return await ExponentFileSystem.getContentUriAsync(fileUri);
|
|
}
|
|
else {
|
|
return new Promise(function (resolve, reject) {
|
|
resolve(fileUri);
|
|
});
|
|
}
|
|
}
|
|
export async function writeAsStringAsync(fileUri, contents, options = {}) {
|
|
if (!ExponentFileSystem.writeAsStringAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'writeAsStringAsync');
|
|
}
|
|
return await ExponentFileSystem.writeAsStringAsync(fileUri, contents, options);
|
|
}
|
|
export async function deleteAsync(fileUri, options = {}) {
|
|
if (!ExponentFileSystem.deleteAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'deleteAsync');
|
|
}
|
|
return await ExponentFileSystem.deleteAsync(fileUri, options);
|
|
}
|
|
export async function deleteLegacyDocumentDirectoryAndroid() {
|
|
if (Platform.OS !== 'android' || documentDirectory == null) {
|
|
return;
|
|
}
|
|
const legacyDocumentDirectory = `${documentDirectory}ExperienceData/`;
|
|
return await deleteAsync(legacyDocumentDirectory, { idempotent: true });
|
|
}
|
|
export async function moveAsync(options) {
|
|
if (!ExponentFileSystem.moveAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'moveAsync');
|
|
}
|
|
return await ExponentFileSystem.moveAsync(options);
|
|
}
|
|
export async function copyAsync(options) {
|
|
if (!ExponentFileSystem.copyAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'copyAsync');
|
|
}
|
|
return await ExponentFileSystem.copyAsync(options);
|
|
}
|
|
export async function makeDirectoryAsync(fileUri, options = {}) {
|
|
if (!ExponentFileSystem.makeDirectoryAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'makeDirectoryAsync');
|
|
}
|
|
return await ExponentFileSystem.makeDirectoryAsync(fileUri, options);
|
|
}
|
|
export async function readDirectoryAsync(fileUri) {
|
|
if (!ExponentFileSystem.readDirectoryAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'readDirectoryAsync');
|
|
}
|
|
return await ExponentFileSystem.readDirectoryAsync(fileUri, {});
|
|
}
|
|
export async function getFreeDiskStorageAsync() {
|
|
if (!ExponentFileSystem.getFreeDiskStorageAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'getFreeDiskStorageAsync');
|
|
}
|
|
return await ExponentFileSystem.getFreeDiskStorageAsync();
|
|
}
|
|
export async function getTotalDiskCapacityAsync() {
|
|
if (!ExponentFileSystem.getTotalDiskCapacityAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'getTotalDiskCapacityAsync');
|
|
}
|
|
return await ExponentFileSystem.getTotalDiskCapacityAsync();
|
|
}
|
|
export async function downloadAsync(uri, fileUri, options = {}) {
|
|
if (!ExponentFileSystem.downloadAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'downloadAsync');
|
|
}
|
|
return await ExponentFileSystem.downloadAsync(uri, fileUri, {
|
|
sessionType: FileSystemSessionType.BACKGROUND,
|
|
...options,
|
|
});
|
|
}
|
|
export async function uploadAsync(url, fileUri, options = {}) {
|
|
if (!ExponentFileSystem.uploadAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'uploadAsync');
|
|
}
|
|
return await ExponentFileSystem.uploadAsync(url, fileUri, {
|
|
sessionType: FileSystemSessionType.BACKGROUND,
|
|
uploadType: FileSystemUploadType.BINARY_CONTENT,
|
|
...options,
|
|
httpMethod: (options.httpMethod || 'POST').toUpperCase(),
|
|
});
|
|
}
|
|
export function createDownloadResumable(uri, fileUri, options, callback, resumeData) {
|
|
return new DownloadResumable(uri, fileUri, options, callback, resumeData);
|
|
}
|
|
export function createUploadTask(url, fileUri, options, callback) {
|
|
return new UploadTask(url, fileUri, options, callback);
|
|
}
|
|
export class FileSystemCancellableNetworkTask {
|
|
_uuid = uuidv4();
|
|
taskWasCanceled = false;
|
|
emitter = new EventEmitter(ExponentFileSystem);
|
|
subscription;
|
|
async cancelAsync() {
|
|
if (!ExponentFileSystem.networkTaskCancelAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'networkTaskCancelAsync');
|
|
}
|
|
this.removeSubscription();
|
|
this.taskWasCanceled = true;
|
|
return await ExponentFileSystem.networkTaskCancelAsync(this.uuid);
|
|
}
|
|
isTaskCancelled() {
|
|
if (this.taskWasCanceled) {
|
|
console.warn('This task was already canceled.');
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
get uuid() {
|
|
return this._uuid;
|
|
}
|
|
addSubscription() {
|
|
if (this.subscription) {
|
|
return;
|
|
}
|
|
this.subscription = this.emitter.addListener(this.getEventName(), (event) => {
|
|
if (event.uuid === this.uuid) {
|
|
const callback = this.getCallback();
|
|
if (callback) {
|
|
callback(event.data);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
removeSubscription() {
|
|
if (!this.subscription) {
|
|
return;
|
|
}
|
|
this.emitter.removeSubscription(this.subscription);
|
|
this.subscription = null;
|
|
}
|
|
}
|
|
export class UploadTask extends FileSystemCancellableNetworkTask {
|
|
url;
|
|
fileUri;
|
|
callback;
|
|
options;
|
|
constructor(url, fileUri, options, callback) {
|
|
super();
|
|
this.url = url;
|
|
this.fileUri = fileUri;
|
|
this.callback = callback;
|
|
const httpMethod = (options?.httpMethod?.toUpperCase() ||
|
|
'POST');
|
|
this.options = {
|
|
sessionType: FileSystemSessionType.BACKGROUND,
|
|
uploadType: FileSystemUploadType.BINARY_CONTENT,
|
|
...options,
|
|
httpMethod,
|
|
};
|
|
}
|
|
getEventName() {
|
|
return 'expo-file-system.uploadProgress';
|
|
}
|
|
getCallback() {
|
|
return this.callback;
|
|
}
|
|
async uploadAsync() {
|
|
if (!ExponentFileSystem.uploadTaskStartAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'uploadTaskStartAsync');
|
|
}
|
|
if (this.isTaskCancelled()) {
|
|
return;
|
|
}
|
|
this.addSubscription();
|
|
const result = await ExponentFileSystem.uploadTaskStartAsync(this.url, this.fileUri, this.uuid, this.options);
|
|
this.removeSubscription();
|
|
return result;
|
|
}
|
|
}
|
|
export class DownloadResumable extends FileSystemCancellableNetworkTask {
|
|
url;
|
|
_fileUri;
|
|
options;
|
|
callback;
|
|
resumeData;
|
|
constructor(url, _fileUri, options = {}, callback, resumeData) {
|
|
super();
|
|
this.url = url;
|
|
this._fileUri = _fileUri;
|
|
this.options = options;
|
|
this.callback = callback;
|
|
this.resumeData = resumeData;
|
|
}
|
|
get fileUri() {
|
|
return this._fileUri;
|
|
}
|
|
getEventName() {
|
|
return 'expo-file-system.downloadProgress';
|
|
}
|
|
getCallback() {
|
|
return this.callback;
|
|
}
|
|
async downloadAsync() {
|
|
if (!ExponentFileSystem.downloadResumableStartAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
|
|
}
|
|
if (this.isTaskCancelled()) {
|
|
return;
|
|
}
|
|
this.addSubscription();
|
|
return await ExponentFileSystem.downloadResumableStartAsync(this.url, this._fileUri, this.uuid, this.options, this.resumeData);
|
|
}
|
|
async pauseAsync() {
|
|
if (!ExponentFileSystem.downloadResumablePauseAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'downloadResumablePauseAsync');
|
|
}
|
|
if (this.isTaskCancelled()) {
|
|
return {
|
|
fileUri: this._fileUri,
|
|
options: this.options,
|
|
url: this.url,
|
|
};
|
|
}
|
|
const pauseResult = await ExponentFileSystem.downloadResumablePauseAsync(this.uuid);
|
|
this.removeSubscription();
|
|
if (pauseResult) {
|
|
this.resumeData = pauseResult.resumeData;
|
|
return this.savable();
|
|
}
|
|
else {
|
|
throw new Error('Unable to generate a savable pause state');
|
|
}
|
|
}
|
|
async resumeAsync() {
|
|
if (!ExponentFileSystem.downloadResumableStartAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'downloadResumableStartAsync');
|
|
}
|
|
if (this.isTaskCancelled()) {
|
|
return;
|
|
}
|
|
this.addSubscription();
|
|
return await ExponentFileSystem.downloadResumableStartAsync(this.url, this.fileUri, this.uuid, this.options, this.resumeData);
|
|
}
|
|
savable() {
|
|
return {
|
|
url: this.url,
|
|
fileUri: this.fileUri,
|
|
options: this.options,
|
|
resumeData: this.resumeData,
|
|
};
|
|
}
|
|
}
|
|
const baseReadAsStringAsync = readAsStringAsync;
|
|
const baseWriteAsStringAsync = writeAsStringAsync;
|
|
const baseDeleteAsync = deleteAsync;
|
|
const baseMoveAsync = moveAsync;
|
|
const baseCopyAsync = copyAsync;
|
|
/**
|
|
* Android only
|
|
*/
|
|
export var StorageAccessFramework;
|
|
(function (StorageAccessFramework) {
|
|
function getUriForDirectoryInRoot(folderName) {
|
|
return `content://com.android.externalstorage.documents/tree/primary:${folderName}/document/primary:${folderName}`;
|
|
}
|
|
StorageAccessFramework.getUriForDirectoryInRoot = getUriForDirectoryInRoot;
|
|
async function requestDirectoryPermissionsAsync(initialFileUrl = null) {
|
|
if (!ExponentFileSystem.requestDirectoryPermissionsAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.requestDirectoryPermissionsAsync');
|
|
}
|
|
return await ExponentFileSystem.requestDirectoryPermissionsAsync(initialFileUrl);
|
|
}
|
|
StorageAccessFramework.requestDirectoryPermissionsAsync = requestDirectoryPermissionsAsync;
|
|
async function readDirectoryAsync(dirUri) {
|
|
if (!ExponentFileSystem.readSAFDirectoryAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.readDirectoryAsync');
|
|
}
|
|
return await ExponentFileSystem.readSAFDirectoryAsync(dirUri, {});
|
|
}
|
|
StorageAccessFramework.readDirectoryAsync = readDirectoryAsync;
|
|
async function makeDirectoryAsync(parentUri, dirName) {
|
|
if (!ExponentFileSystem.makeSAFDirectoryAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.makeDirectoryAsync');
|
|
}
|
|
return await ExponentFileSystem.makeSAFDirectoryAsync(parentUri, dirName);
|
|
}
|
|
StorageAccessFramework.makeDirectoryAsync = makeDirectoryAsync;
|
|
async function createFileAsync(parentUri, fileName, mimeType) {
|
|
if (!ExponentFileSystem.createSAFFileAsync) {
|
|
throw new UnavailabilityError('expo-file-system', 'StorageAccessFramework.createFileAsync');
|
|
}
|
|
return await ExponentFileSystem.createSAFFileAsync(parentUri, fileName, mimeType);
|
|
}
|
|
StorageAccessFramework.createFileAsync = createFileAsync;
|
|
StorageAccessFramework.writeAsStringAsync = baseWriteAsStringAsync;
|
|
StorageAccessFramework.readAsStringAsync = baseReadAsStringAsync;
|
|
StorageAccessFramework.deleteAsync = baseDeleteAsync;
|
|
StorageAccessFramework.moveAsync = baseMoveAsync;
|
|
StorageAccessFramework.copyAsync = baseCopyAsync;
|
|
})(StorageAccessFramework || (StorageAccessFramework = {}));
|
|
//# sourceMappingURL=FileSystem.js.map
|