Brak opisu

fs.js 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /**
  2. * @name react-native-fetch-blob-fs
  3. * @author wkh237
  4. * @version 0.1.0
  5. * @flow
  6. */
  7. import {
  8. NativeModules,
  9. DeviceEventEmitter,
  10. NativeAppEventEmitter,
  11. } from 'react-native'
  12. import RNFetchBlobSession from './class/RNFetchBlobSession'
  13. import RNFetchBlobWriteStream from './class/RNFetchBlobWriteStream'
  14. import RNFetchBlobReadStream from './class/RNFetchBlobReadStream'
  15. import RNFetchBlobFile from './class/RNFetchBlobFile'
  16. import type {
  17. RNFetchBlobNative,
  18. RNFetchBlobConfig,
  19. RNFetchBlobStream
  20. } from './types'
  21. const RNFetchBlob:RNFetchBlobNative = NativeModules.RNFetchBlob
  22. const emitter = DeviceEventEmitter
  23. // session table
  24. let sessions = {}
  25. /**
  26. * Get path of system directories.
  27. * @return {object} Map contains DocumentDir, CacheDir, DCIMDir, DownloadDir,
  28. * , some directory might not be supported by platform.
  29. */
  30. function getSystemDirs() {
  31. return new Promise((resolve, reject) => {
  32. try {
  33. RNFetchBlob.getEnvironmentDirs((...dirs) => {
  34. let [
  35. DocumentDir,
  36. CacheDir,
  37. // Android only
  38. DCIMDir,
  39. DownloadDir,
  40. PictureDir,
  41. MusicDir,
  42. MovieDir,
  43. RingToneDir] = [...dirs]
  44. resolve({
  45. DocumentDir,
  46. CacheDir,
  47. DCIMDir,
  48. DownloadDir,
  49. PictureDir,
  50. MusicDir,
  51. MovieDir,
  52. RingToneDir
  53. })
  54. })
  55. } catch(err) {
  56. reject(err)
  57. }
  58. })
  59. }
  60. /**
  61. * Get a file cache session
  62. * @param {string} name Stream ID
  63. * @return {RNFetchBlobSession}
  64. */
  65. function session(name:string):RNFetchBlobSession {
  66. let s = sessions[name]
  67. if(s)
  68. return new RNFetchBlobSession(name)
  69. else {
  70. sessions[name] = []
  71. return new RNFetchBlobSession(name, [])
  72. }
  73. }
  74. function createFile(path:string, data:string, encoding: 'base64' | 'ascii' | 'utf8'):Promise {
  75. encoding = encoding || 'utf8'
  76. return new Promise((resolve, reject) => {
  77. let handler = (err) => {
  78. if(err)
  79. reject(err)
  80. else
  81. resolve()
  82. }
  83. if(encoding.toLowerCase() === 'ascii') {
  84. if(Array.isArray(data))
  85. RNFetchBlob.createFileASCII(path, data, handler)
  86. else
  87. reject('`data` of ASCII file must be an array contains numbers')
  88. }
  89. else {
  90. RNFetchBlob.createFile(path, data, encoding, handler)
  91. }
  92. })
  93. }
  94. /**
  95. * Create write stream to a file.
  96. * @param {string} path Target path of file stream.
  97. * @param {string} encoding Encoding of input data.
  98. * @param {bool} append A flag represent if data append to existing ones.
  99. * @return {Promise<WriteStream>} A promise resolves a `WriteStream` object.
  100. */
  101. function writeStream(
  102. path : string,
  103. encoding : 'utf8' | 'ascii' | 'base64',
  104. append? : ?bool,
  105. ):Promise<RNFetchBlobWriteStream> {
  106. if(!path)
  107. throw Error('RNFetchBlob could not open file stream with empty `path`')
  108. encoding = encoding || 'utf8'
  109. append = append || false
  110. return new Promise((resolve, reject) => {
  111. RNFetchBlob.writeStream(path, encoding || 'base64', append || false, (err, streamId:string) => {
  112. if(err)
  113. reject(err)
  114. else
  115. resolve(new RNFetchBlobWriteStream(streamId, encoding))
  116. })
  117. })
  118. }
  119. /**
  120. * Create file stream from file at `path`.
  121. * @param {string} path The file path.
  122. * @param {string} encoding Data encoding, should be one of `base64`, `utf8`, `ascii`
  123. * @param {boolean} bufferSize Size of stream buffer.
  124. * @return {RNFetchBlobStream} RNFetchBlobStream stream instance.
  125. */
  126. function readStream(
  127. path : string,
  128. encoding : 'utf8' | 'ascii' | 'base64',
  129. bufferSize? : ?number
  130. ):Promise<RNFetchBlobReadStream> {
  131. return Promise.resolve(new RNFetchBlobReadStream(path, encoding, bufferSize))
  132. }
  133. /**
  134. * Create a directory.
  135. * @param {string} path Path of directory to be created
  136. * @return {Promise}
  137. */
  138. function mkdir(path:string):Promise {
  139. return new Promise((resolve, reject) => {
  140. RNFetchBlob.mkdir(path, (err, res) => {
  141. if(err)
  142. reject(err)
  143. else
  144. resolve()
  145. })
  146. })
  147. }
  148. /**
  149. * Show statistic data of a path.
  150. * @param {string} path Target path
  151. * @return {RNFetchBlobFile}
  152. */
  153. function stat(path:string):Promise<RNFetchBlobFile> {
  154. return new Promise((resolve, reject) => {
  155. RNFetchBlob.stat(path, (err, stat) => {
  156. if(err)
  157. reject(err)
  158. else
  159. resolve(stat)
  160. })
  161. })
  162. }
  163. /**
  164. * Android only method, request media scanner to scan the file.
  165. * @param {Array<Object<string, string>>} Array contains Key value pairs with key `path` and `mime`.
  166. * @return {Promise}
  167. */
  168. function scanFile(pairs:any):Promise {
  169. return new Promise((resolve, reject) => {
  170. RNFetchBlob.scanFile(pairs, (err) => {
  171. if(err)
  172. reject(err)
  173. else
  174. resolve()
  175. })
  176. })
  177. }
  178. function cp(path:string, dest:string):Promise<boolean> {
  179. return new Promise((resolve, reject) => {
  180. RNFetchBlob.cp(path, dest, (err, res) => {
  181. if(err)
  182. reject(err)
  183. else
  184. resolve(res)
  185. })
  186. })
  187. }
  188. function mv(path:string, dest:string):Promise<boolean> {
  189. return new Promise((resolve, reject) => {
  190. RNFetchBlob.mv(path, dest, (err, res) => {
  191. if(err)
  192. reject(err)
  193. else
  194. resolve(res)
  195. })
  196. })
  197. }
  198. function lstat(path:string):Promise<Array<RNFetchBlobFile>> {
  199. return new Promise((resolve, reject) => {
  200. RNFetchBlob.lstat(path, (err, stat) => {
  201. if(err)
  202. reject(err)
  203. else
  204. resolve(stat)
  205. })
  206. })
  207. }
  208. function ls(path:string):Promise<Array<String>> {
  209. return new Promise((resolve, reject) => {
  210. RNFetchBlob.ls(path, (err, res) => {
  211. if(err)
  212. reject(err)
  213. else
  214. resolve(res)
  215. })
  216. })
  217. }
  218. /**
  219. * Remove file at path.
  220. * @param {string} path:string Path of target file.
  221. * @return {Promise}
  222. */
  223. function unlink(path:string):Promise {
  224. return new Promise((resolve, reject) => {
  225. RNFetchBlob.unlink(path, (err) => {
  226. if(err)
  227. reject(err)
  228. else
  229. resolve()
  230. })
  231. })
  232. }
  233. /**
  234. * Check if file exists and if it is a folder.
  235. * @param {string} path Path to check
  236. * @return {Promise<bool, bool>}
  237. */
  238. function exists(path:string):Promise<bool, bool> {
  239. return new Promise((resolve, reject) => {
  240. try {
  241. RNFetchBlob.exists(path, (exist) => {
  242. resolve(exist)
  243. })
  244. } catch(err) {
  245. reject(err)
  246. }
  247. })
  248. }
  249. function isDir(path:string):Promise<bool, bool> {
  250. return new Promise((resolve, reject) => {
  251. try {
  252. RNFetchBlob.exists(path, (exist, isDir) => {
  253. resolve(isDir)
  254. })
  255. } catch(err) {
  256. reject(err)
  257. }
  258. })
  259. }
  260. export default {
  261. RNFetchBlobSession,
  262. unlink,
  263. mkdir,
  264. session,
  265. ls,
  266. readStream,
  267. getSystemDirs,
  268. mv,
  269. cp,
  270. writeStream,
  271. exists,
  272. createFile,
  273. isDir,
  274. stat,
  275. lstat,
  276. scanFile
  277. }