/** * @name react-native-fetch-blob-fs * @author wkh237 * @version 0.1.0 * @flow */ import { NativeModules, DeviceEventEmitter, NativeAppEventEmitter, } from 'react-native' import RNFetchBlobSession from './class/RNFetchBlobSession' import RNFetchBlobWriteStream from './class/RNFetchBlobWriteStream' import RNFetchBlobReadStream from './class/RNFetchBlobReadStream' import RNFetchBlobFile from './class/RNFetchBlobFile' import type { RNFetchBlobNative, RNFetchBlobConfig, RNFetchBlobStream } from './types' const RNFetchBlob:RNFetchBlobNative = NativeModules.RNFetchBlob const emitter = DeviceEventEmitter // session table let sessions = {} /** * Get path of system directories. * @return {object} Map contains DocumentDir, CacheDir, DCIMDir, DownloadDir, * , some directory might not be supported by platform. */ function getSystemDirs() { return new Promise((resolve, reject) => { try { RNFetchBlob.getEnvironmentDirs((...dirs) => { let [ DocumentDir, CacheDir, // Android only DCIMDir, DownloadDir, PictureDir, MusicDir, MovieDir, RingToneDir] = [...dirs] resolve({ DocumentDir, CacheDir, DCIMDir, DownloadDir, PictureDir, MusicDir, MovieDir, RingToneDir }) }) } catch(err) { reject(err) } }) } /** * Get a file cache session * @param {string} name Stream ID * @return {RNFetchBlobSession} */ function session(name:string):RNFetchBlobSession { let s = sessions[name] if(s) return new RNFetchBlobSession(name) else { sessions[name] = [] return new RNFetchBlobSession(name, []) } } function createFile(path:string, data:string, encoding: 'base64' | 'ascii' | 'utf8'):Promise { encoding = encoding || 'utf8' return new Promise((resolve, reject) => { let handler = (err) => { if(err) reject(err) else resolve() } if(encoding.toLowerCase() === 'ascii') { if(Array.isArray(data)) RNFetchBlob.createFileASCII(path, data, handler) else reject('`data` of ASCII file must be an array contains numbers') } else { RNFetchBlob.createFile(path, data, encoding, handler) } }) } /** * Create write stream to a file. * @param {string} path Target path of file stream. * @param {string} encoding Encoding of input data. * @param {bool} append A flag represent if data append to existing ones. * @return {Promise} A promise resolves a `WriteStream` object. */ function writeStream( path : string, encoding : 'utf8' | 'ascii' | 'base64', append? : ?bool, ):Promise { if(!path) throw Error('RNFetchBlob could not open file stream with empty `path`') encoding = encoding || 'utf8' append = append || false return new Promise((resolve, reject) => { RNFetchBlob.writeStream(path, encoding || 'base64', append || false, (err, streamId:string) => { if(err) reject(err) else resolve(new RNFetchBlobWriteStream(streamId, encoding)) }) }) } /** * Create file stream from file at `path`. * @param {string} path The file path. * @param {string} encoding Data encoding, should be one of `base64`, `utf8`, `ascii` * @param {boolean} bufferSize Size of stream buffer. * @return {RNFetchBlobStream} RNFetchBlobStream stream instance. */ function readStream( path : string, encoding : 'utf8' | 'ascii' | 'base64', bufferSize? : ?number ):Promise { return Promise.resolve(new RNFetchBlobReadStream(path, encoding, bufferSize)) } /** * Create a directory. * @param {string} path Path of directory to be created * @return {Promise} */ function mkdir(path:string):Promise { return new Promise((resolve, reject) => { RNFetchBlob.mkdir(path, (err, res) => { if(err) reject(err) else resolve() }) }) } /** * Show statistic data of a path. * @param {string} path Target path * @return {RNFetchBlobFile} */ function stat(path:string):Promise { return new Promise((resolve, reject) => { RNFetchBlob.stat(path, (err, stat) => { if(err) reject(err) else resolve(stat) }) }) } /** * Android only method, request media scanner to scan the file. * @param {Array>} Array contains Key value pairs with key `path` and `mime`. * @return {Promise} */ function scanFile(pairs:any):Promise { return new Promise((resolve, reject) => { RNFetchBlob.scanFile(pairs, (err) => { if(err) reject(err) else resolve() }) }) } function cp(path:string, dest:string):Promise { return new Promise((resolve, reject) => { RNFetchBlob.cp(path, dest, (err, res) => { if(err) reject(err) else resolve(res) }) }) } function mv(path:string, dest:string):Promise { return new Promise((resolve, reject) => { RNFetchBlob.mv(path, dest, (err, res) => { if(err) reject(err) else resolve(res) }) }) } function lstat(path:string):Promise> { return new Promise((resolve, reject) => { RNFetchBlob.lstat(path, (err, stat) => { if(err) reject(err) else resolve(stat) }) }) } function ls(path:string):Promise> { return new Promise((resolve, reject) => { RNFetchBlob.ls(path, (err, res) => { if(err) reject(err) else resolve(res) }) }) } /** * Remove file at path. * @param {string} path:string Path of target file. * @return {Promise} */ function unlink(path:string):Promise { return new Promise((resolve, reject) => { RNFetchBlob.unlink(path, (err) => { if(err) reject(err) else resolve() }) }) } /** * Check if file exists and if it is a folder. * @param {string} path Path to check * @return {Promise} */ function exists(path:string):Promise { return new Promise((resolve, reject) => { try { RNFetchBlob.exists(path, (exist) => { resolve(exist) }) } catch(err) { reject(err) } }) } function isDir(path:string):Promise { return new Promise((resolve, reject) => { try { RNFetchBlob.exists(path, (exist, isDir) => { resolve(isDir) }) } catch(err) { reject(err) } }) } export default { RNFetchBlobSession, unlink, mkdir, session, ls, readStream, getSystemDirs, mv, cp, writeStream, exists, createFile, isDir, stat, lstat, scanFile }