@dr.pogodin/react-native-fs
Version:
Native filesystem access for React Native
380 lines (363 loc) • 15.6 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TemporaryDirectoryPath = exports.RoamingDirectoryPath = exports.PicturesDirectoryPath = exports.MainBundlePath = exports.LibraryDirectoryPath = exports.FileProtectionKeys = exports.ExternalStorageDirectoryPath = exports.ExternalDirectoryPath = exports.ExternalCachesDirectoryPath = exports.DownloadDirectoryPath = exports.DocumentDirectoryPath = exports.CachesDirectoryPath = void 0;
exports.appendFile = appendFile;
exports.completeHandlerIOS = void 0;
exports.copyAssetsFileIOS = copyAssetsFileIOS;
exports.copyAssetsVideoIOS = void 0;
exports.copyFile = copyFile;
exports.copyFileAssets = copyFileAssets;
exports.copyFileRes = copyFileRes;
exports.copyFolder = copyFolder;
exports.downloadFile = downloadFile;
exports.exists = exists;
exports.existsAssets = existsAssets;
exports.existsRes = existsRes;
exports.getFSInfo = exports.getAllExternalFilesDirs = void 0;
exports.hash = hash;
exports.isResumable = void 0;
exports.mkdir = mkdir;
exports.moveFile = moveFile;
exports.pathForGroup = exports.pathForBundle = void 0;
exports.pickFile = pickFile;
exports.read = read;
exports.readDir = readDir;
exports.readDirAssets = readDirAssets;
exports.readFile = readFile;
exports.readFileAssets = readFileAssets;
exports.readFileRes = readFileRes;
exports.readdir = readdir;
exports.setReadable = exports.scanFile = exports.resumeDownload = void 0;
exports.stat = stat;
exports.stopUpload = exports.stopDownload = void 0;
exports.touch = touch;
exports.unlink = unlink;
exports.uploadFiles = uploadFiles;
exports.write = write;
exports.writeFile = writeFile;
var _reactNative = require("react-native");
var _ReactNativeFs = _interopRequireDefault(require("./ReactNativeFs"));
var _utils = require("./utils");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const nativeEventEmitter = new _reactNative.NativeEventEmitter(_ReactNativeFs.default);
let lastJobId = 0;
// Internal functions.
/**
* Generic function used by readDir and readDirAssets.
*/
async function readDirGeneric(dirpath, command) {
const files = await command((0, _utils.normalizeFilePath)(dirpath));
const {
FileTypeDirectory,
FileTypeRegular
} = _ReactNativeFs.default.getConstants();
return files.map(file => ({
ctime: file.ctime && new Date(file.ctime * 1000) || null,
mtime: file.mtime && new Date(file.mtime * 1000) || null,
name: file.name,
path: file.path,
size: file.size,
isFile: () => file.type === FileTypeRegular,
isDirectory: () => file.type === FileTypeDirectory
}));
}
// Common exports.
function appendFile(filepath, contents, encodingOrOptions) {
const b64 = (0, _utils.encode)(contents, (0, _utils.toEncoding)(encodingOrOptions));
return _ReactNativeFs.default.appendFile((0, _utils.normalizeFilePath)(filepath), b64);
}
function copyFile(from, into, options = {}) {
return _ReactNativeFs.default.copyFile((0, _utils.normalizeFilePath)(from), (0, _utils.normalizeFilePath)(into), options);
}
function downloadFile(options) {
if (typeof options !== 'object') {
throw new Error('downloadFile: Invalid value for argument `options`');
}
if (typeof options.fromUrl !== 'string') {
throw new Error('downloadFile: Invalid value for property `fromUrl`');
}
if (typeof options.toFile !== 'string') {
throw new Error('downloadFile: Invalid value for property `toFile`');
}
if (options.headers && typeof options.headers !== 'object') {
throw new Error('downloadFile: Invalid value for property `headers`');
}
if (options.background && typeof options.background !== 'boolean') {
throw new Error('downloadFile: Invalid value for property `background`');
}
if (options.progressDivider && typeof options.progressDivider !== 'number') {
throw new Error('downloadFile: Invalid value for property `progressDivider`');
}
if (options.progressInterval && typeof options.progressInterval !== 'number') {
throw new Error('downloadFile: Invalid value for property `progressInterval`');
}
if (options.readTimeout && typeof options.readTimeout !== 'number') {
throw new Error('downloadFile: Invalid value for property `readTimeout`');
}
if (options.connectionTimeout && typeof options.connectionTimeout !== 'number') {
throw new Error('downloadFile: Invalid value for property `connectionTimeout`');
}
if (options.backgroundTimeout && typeof options.backgroundTimeout !== 'number') {
throw new Error('downloadFile: Invalid value for property `backgroundTimeout`');
}
const jobId = ++lastJobId;
const subscriptions = [];
if (options.begin) {
subscriptions.push(nativeEventEmitter.addListener('DownloadBegin', res => {
if (res.jobId === jobId && options.begin) options.begin(res);
}));
}
if (options.progress) {
subscriptions.push(nativeEventEmitter.addListener('DownloadProgress', res => {
if (res.jobId === jobId && options.progress) options.progress(res);
}));
}
if (options.resumable) {
subscriptions.push(nativeEventEmitter.addListener('DownloadResumable', res => {
if (res.jobId === jobId && options.resumable) options.resumable(res);
}));
}
var nativeOptions = {
jobId: jobId,
fromUrl: options.fromUrl,
toFile: (0, _utils.normalizeFilePath)(options.toFile),
background: !!options.background,
backgroundTimeout: options.backgroundTimeout || 3600000,
// 1 hour
cacheable: options.cacheable ?? true,
connectionTimeout: options.connectionTimeout || 5000,
discretionary: !!options.discretionary,
headers: options.headers || {},
progressDivider: options.progressDivider || 0,
progressInterval: options.progressInterval || 0,
readTimeout: options.readTimeout || 15000,
hasBeginCallback: !!options.begin,
hasProgressCallback: !!options.progress,
hasResumableCallback: !!options.resumable
};
return {
jobId,
promise: (async () => {
try {
return await _ReactNativeFs.default.downloadFile(nativeOptions);
} finally {
subscriptions.forEach(sub => sub.remove());
}
})()
};
}
function exists(filepath) {
return _ReactNativeFs.default.exists((0, _utils.normalizeFilePath)(filepath));
}
const getFSInfo = exports.getFSInfo = _ReactNativeFs.default.getFSInfo;
const isResumable = exports.isResumable = _ReactNativeFs.default.isResumable;
function mkdir(path, options = {}) {
return _ReactNativeFs.default.mkdir((0, _utils.normalizeFilePath)(path), options);
}
function moveFile(filepath, destPath, options = {}) {
return _ReactNativeFs.default.moveFile((0, _utils.normalizeFilePath)(filepath), (0, _utils.normalizeFilePath)(destPath), options);
}
function pickFile(options = {}) {
return _ReactNativeFs.default.pickFile({
mimeTypes: options.mimeTypes || ['*/*']
});
}
async function read(path,
// TODO: It would make more sense to read entire file by the default,
// or, if the position is given, to read from that position to the end.
length = 0, position = 0, encodingOrOptions) {
const b64 = await _ReactNativeFs.default.read((0, _utils.normalizeFilePath)(path), length, position);
return (0, _utils.decode)(b64, (0, _utils.toEncoding)(encodingOrOptions));
}
function readFile(path, encodingOrOptions) {
return (0, _utils.readFileGeneric)(path, encodingOrOptions, _ReactNativeFs.default.readFile);
}
function readDir(dirpath) {
return readDirGeneric(dirpath, _ReactNativeFs.default.readDir);
}
// Node style version (lowercase d). Returns just the names
async function readdir(dirpath) {
const files = await _ReactNativeFs.default.readDir((0, _utils.normalizeFilePath)(dirpath));
return files.map(file => file.name || '');
}
async function stat(filepath) {
const result = await _ReactNativeFs.default.stat((0, _utils.normalizeFilePath)(filepath));
const {
FileTypeDirectory,
FileTypeRegular
} = _ReactNativeFs.default.getConstants();
return {
path: filepath,
ctime: new Date(result.ctime * 1000),
mtime: new Date(result.mtime * 1000),
size: result.size,
mode: result.mode,
originalFilepath: result.originalFilepath,
isFile: () => result.type === FileTypeRegular,
isDirectory: () => result.type === FileTypeDirectory
};
}
const stopDownload = exports.stopDownload = _ReactNativeFs.default.stopDownload;
function touch(filepath, mtime, ctime) {
if (ctime && !(ctime instanceof Date)) {
throw new Error('touch: Invalid value for argument `ctime`');
}
if (mtime && !(mtime instanceof Date)) {
throw new Error('touch: Invalid value for argument `mtime`');
}
return _ReactNativeFs.default.touch((0, _utils.normalizeFilePath)(filepath), {
ctime: ctime && ctime.getTime(),
mtime: mtime && mtime.getTime()
});
}
function unlink(path) {
return _ReactNativeFs.default.unlink((0, _utils.normalizeFilePath)(path));
}
function uploadFiles(options) {
const jobId = ++lastJobId;
const subscriptions = [];
if (typeof options !== 'object') {
throw new Error('uploadFiles: Invalid value for argument `options`');
}
if (typeof options.toUrl !== 'string') {
throw new Error('uploadFiles: Invalid value for property `toUrl`');
}
if (!Array.isArray(options.files)) {
throw new Error('uploadFiles: Invalid value for property `files`');
}
if (options.headers && typeof options.headers !== 'object') {
throw new Error('uploadFiles: Invalid value for property `headers`');
}
if (options.fields && typeof options.fields !== 'object') {
throw new Error('uploadFiles: Invalid value for property `fields`');
}
if (options.method && typeof options.method !== 'string') {
throw new Error('uploadFiles: Invalid value for property `method`');
}
if (options.begin) {
subscriptions.push(nativeEventEmitter.addListener('UploadBegin', options.begin));
} else if (options.beginCallback) {
// Deprecated
subscriptions.push(nativeEventEmitter.addListener('UploadBegin', options.beginCallback));
}
if (options.progress) {
subscriptions.push(nativeEventEmitter.addListener('UploadProgress', options.progress));
} else if (options.progressCallback) {
// Deprecated
subscriptions.push(nativeEventEmitter.addListener('UploadProgress', options.progressCallback));
}
var nativeOptions = {
jobId: jobId,
toUrl: options.toUrl,
files: options.files,
binaryStreamOnly: options.binaryStreamOnly || false,
headers: options.headers || {},
fields: options.fields || {},
method: options.method || 'POST',
hasBeginCallback: options.begin instanceof Function || options.beginCallback instanceof Function,
hasProgressCallback: options.progress instanceof Function || options.progressCallback instanceof Function
};
return {
jobId,
promise: _ReactNativeFs.default.uploadFiles(nativeOptions).then(res => {
subscriptions.forEach(sub => sub.remove());
return res;
})
};
}
function write(filepath, contents, position = -1, encodingOrOptions) {
const b64 = (0, _utils.encode)(contents, (0, _utils.toEncoding)(encodingOrOptions));
return _ReactNativeFs.default.write((0, _utils.normalizeFilePath)(filepath), b64, position);
}
function writeFile(path, content, encodingOrOptions) {
const b64 = (0, _utils.encode)(content, (0, _utils.toEncoding)(encodingOrOptions));
return _ReactNativeFs.default.writeFile((0, _utils.normalizeFilePath)(path), b64, typeof encodingOrOptions === 'object' ? encodingOrOptions : {});
}
// Android-specific.
function copyFileAssets(from, into) {
return _ReactNativeFs.default.copyFileAssets((0, _utils.normalizeFilePath)(from), (0, _utils.normalizeFilePath)(into));
}
function copyFileRes(from, into) {
return _ReactNativeFs.default.copyFileRes(from, (0, _utils.normalizeFilePath)(into));
}
function existsAssets(filepath) {
return _ReactNativeFs.default.existsAssets(filepath);
}
function existsRes(filename) {
return _ReactNativeFs.default.existsRes(filename);
}
const getAllExternalFilesDirs = exports.getAllExternalFilesDirs = _ReactNativeFs.default.getAllExternalFilesDirs;
// TODO: algorithm should have a dedicated type, effectively enumerating all
// correct values.
function hash(filepath, algorithm) {
return _ReactNativeFs.default.hash((0, _utils.normalizeFilePath)(filepath), algorithm);
}
async function readDirAssets(path) {
const res = await readDirGeneric(path, _ReactNativeFs.default.readDirAssets);
return res;
}
function readFileAssets(path, encodingOrOptions) {
return (0, _utils.readFileGeneric)(path, encodingOrOptions, _ReactNativeFs.default.readFileAssets);
}
function readFileRes(filename, encodingOrOptions) {
return (0, _utils.readFileGeneric)(filename, encodingOrOptions, _ReactNativeFs.default.readFileRes);
}
const scanFile = exports.scanFile = _ReactNativeFs.default.scanFile;
// TODO: Not documented!
// setReadable for Android
const setReadable = exports.setReadable = _ReactNativeFs.default.setReadable;
// iOS-specific
const completeHandlerIOS = exports.completeHandlerIOS = _ReactNativeFs.default.completeHandlerIOS;
// iOS only
// Copies fotos from asset-library (camera-roll) to a specific location
// with a given width or height
// @see: https://developer.apple.com/reference/photos/phimagemanager/1616964-requestimageforasset
function copyAssetsFileIOS(imageUri, destPath, width, height, scale = 1.0, compression = 1.0, resizeMode = 'contain') {
return _ReactNativeFs.default.copyAssetsFileIOS(imageUri, destPath, width, height, scale, compression, resizeMode);
}
// iOS only
// Copies fotos from asset-library (camera-roll) to a specific location
// with a given width or height
// @see: https://developer.apple.com/reference/photos/phimagemanager/1616964-requestimageforasset
const copyAssetsVideoIOS = exports.copyAssetsVideoIOS = _ReactNativeFs.default.copyAssetsVideoIOS;
// TODO: This is presumably iOS-specific, it is not documented,
// so it should be double-checked, what it does.
const pathForBundle = exports.pathForBundle = _ReactNativeFs.default.pathForBundle;
const pathForGroup = exports.pathForGroup = _ReactNativeFs.default.pathForGroup;
const resumeDownload = exports.resumeDownload = _ReactNativeFs.default.resumeDownload;
const stopUpload = exports.stopUpload = _ReactNativeFs.default.stopUpload;
// Windows-specific.
// Windows workaround for slow copying of large folders of files
function copyFolder(from, into) {
return _ReactNativeFs.default.copyFolder((0, _utils.normalizeFilePath)(from), (0, _utils.normalizeFilePath)(into));
}
const {
MainBundlePath,
CachesDirectoryPath,
ExternalCachesDirectoryPath,
DocumentDirectoryPath,
DownloadDirectoryPath,
ExternalDirectoryPath,
ExternalStorageDirectoryPath,
TemporaryDirectoryPath,
LibraryDirectoryPath,
PicturesDirectoryPath,
// For Windows
FileProtectionKeys,
RoamingDirectoryPath // For Windows
} = _ReactNativeFs.default.getConstants();
exports.RoamingDirectoryPath = RoamingDirectoryPath;
exports.FileProtectionKeys = FileProtectionKeys;
exports.PicturesDirectoryPath = PicturesDirectoryPath;
exports.LibraryDirectoryPath = LibraryDirectoryPath;
exports.TemporaryDirectoryPath = TemporaryDirectoryPath;
exports.ExternalStorageDirectoryPath = ExternalStorageDirectoryPath;
exports.ExternalDirectoryPath = ExternalDirectoryPath;
exports.DownloadDirectoryPath = DownloadDirectoryPath;
exports.DocumentDirectoryPath = DocumentDirectoryPath;
exports.ExternalCachesDirectoryPath = ExternalCachesDirectoryPath;
exports.CachesDirectoryPath = CachesDirectoryPath;
exports.MainBundlePath = MainBundlePath;
//# sourceMappingURL=index.js.map
;