@hxa-rn/rn-fetch-blob 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +290 -0
  3. package/harmony/fetch_blob/LICENSE +21 -0
  4. package/harmony/fetch_blob/NOTICE +33 -0
  5. package/harmony/fetch_blob/OAT.xml +38 -0
  6. package/harmony/fetch_blob/build-profile.json5 +16 -0
  7. package/harmony/fetch_blob/hvigorfile.ts +2 -0
  8. package/harmony/fetch_blob/index.ets +1 -0
  9. package/harmony/fetch_blob/oh-package.json5 +14 -0
  10. package/harmony/fetch_blob/src/main/cpp/CMakeLists.txt +15 -0
  11. package/harmony/fetch_blob/src/main/cpp/FetchBlobPackage.h +13 -0
  12. package/harmony/fetch_blob/src/main/cpp/generated/RNOH/generated/BaseFetchBlobPackage.h +72 -0
  13. package/harmony/fetch_blob/src/main/cpp/generated/RNOH/generated/turbo_modules/RNFetchBlob.cpp +55 -0
  14. package/harmony/fetch_blob/src/main/cpp/generated/RNOH/generated/turbo_modules/RNFetchBlob.h +16 -0
  15. package/harmony/fetch_blob/src/main/ets/FetchBlobTurboModulesFactory.ets +18 -0
  16. package/harmony/fetch_blob/src/main/ets/Logger.ts +40 -0
  17. package/harmony/fetch_blob/src/main/ets/RNFetchBlobConfig.ts +45 -0
  18. package/harmony/fetch_blob/src/main/ets/RNFetchBlobFS.ts +673 -0
  19. package/harmony/fetch_blob/src/main/ets/RNFetchBlobImpl.ts +246 -0
  20. package/harmony/fetch_blob/src/main/ets/RNFetchBlobReq.ts +530 -0
  21. package/harmony/fetch_blob/src/main/ets/RNFetchBlobStream.ts +169 -0
  22. package/harmony/fetch_blob/src/main/ets/RNFetchBlobTurboModule.ts +192 -0
  23. package/harmony/fetch_blob/src/main/ets/generated/index.ets +5 -0
  24. package/harmony/fetch_blob/src/main/ets/generated/ts.ts +5 -0
  25. package/harmony/fetch_blob/src/main/ets/generated/turboModules/RNFetchBlob.ts +92 -0
  26. package/harmony/fetch_blob/src/main/ets/generated/turboModules/ts.ts +5 -0
  27. package/harmony/fetch_blob/src/main/module.json5 +22 -0
  28. package/harmony/fetch_blob/src/main/resources/base/element/string.json +8 -0
  29. package/harmony/fetch_blob/src/main/resources/en_US/element/string.json +8 -0
  30. package/harmony/fetch_blob/src/main/resources/zh_CN/element/string.json +8 -0
  31. package/harmony/fetch_blob.har +0 -0
  32. package/package.json +59 -0
  33. package/src/android.js +62 -0
  34. package/src/class/RNFetchBlobFile.js +17 -0
  35. package/src/class/RNFetchBlobReadStream.js +82 -0
  36. package/src/class/RNFetchBlobSession.js +74 -0
  37. package/src/class/RNFetchBlobWriteStream.js +57 -0
  38. package/src/class/StatefulPromise.js +7 -0
  39. package/src/fs.js +432 -0
  40. package/src/index.d.ts +690 -0
  41. package/src/index.js +577 -0
  42. package/src/ios.js +54 -0
  43. package/src/json-stream.js +45 -0
  44. package/src/lib/oboe-browser.min.js +1 -0
  45. package/src/polyfill/Blob.js +362 -0
  46. package/src/polyfill/Event.js +11 -0
  47. package/src/polyfill/EventTarget.js +79 -0
  48. package/src/polyfill/Fetch.js +213 -0
  49. package/src/polyfill/File.js +27 -0
  50. package/src/polyfill/FileReader.js +90 -0
  51. package/src/polyfill/ProgressEvent.js +32 -0
  52. package/src/polyfill/XMLHttpRequest.js +446 -0
  53. package/src/polyfill/XMLHttpRequestEventTarget.js +118 -0
  54. package/src/polyfill/index.js +11 -0
  55. package/src/specs/v1/NativeRNFetchBlob.ts +85 -0
  56. package/src/types.js +64 -0
  57. package/src/utils/log.js +40 -0
  58. package/src/utils/unicode.js +7 -0
  59. package/src/utils/uri.js +28 -0
  60. package/src/utils/uuid.js +4 -0
@@ -0,0 +1,192 @@
1
+ /*
2
+ * Copyright (c) 2026. All rights reserved.
3
+ * HarmonyOS adaptation of rn-fetch-blob (RNFetchBlob TurboModule).
4
+ *
5
+ * ETS TurboModule entry. Delegates all calls to RNFetchBlobImpl. The generated
6
+ * codegen spec (TM.RNFetchBlob.Spec) drives the C++ methodMap_; this class does
7
+ * not `implements` it because callback signatures are multi-arg on the native
8
+ * side while the codegen spec describes a single-array callback.
9
+ */
10
+
11
+ import { UITurboModule, UITurboModuleContext } from '@rnoh/react-native-openharmony/ts';
12
+ import common from '@ohos.app.ability.common';
13
+ import RNFetchBlobImpl, {
14
+ SimpleCallback,
15
+ DataCallback,
16
+ ExistsCallback,
17
+ WriteStreamCallback,
18
+ CancelCallback,
19
+ } from './RNFetchBlobImpl';
20
+ import { RNFetchBlobConfig } from './RNFetchBlobConfig';
21
+ import { FormData, ReqCallback } from './RNFetchBlobReq';
22
+
23
+ export class RNFetchBlobTurboModule extends UITurboModule {
24
+ private context: common.UIAbilityContext = this.ctx.uiAbilityContext;
25
+ private impl: RNFetchBlobImpl = new RNFetchBlobImpl(this.context, this.ctx);
26
+
27
+ constructor(ctx: UITurboModuleContext) {
28
+ super(ctx);
29
+ }
30
+
31
+ getConstants(): Object {
32
+ return this.impl.getSystemFolders();
33
+ }
34
+
35
+ fetchBlob(options: RNFetchBlobConfig, taskId: string, method: string, url: string, headers: Object,
36
+ body: string, callback: ReqCallback): void {
37
+ this.impl.fetchBlob(options, taskId, method, url, headers, body, callback);
38
+ }
39
+
40
+ fetchBlobForm(options: RNFetchBlobConfig, taskId: string, method: string, url: string, headers: Object,
41
+ form: FormData, callback: ReqCallback): void {
42
+ this.impl.fetchBlobForm(options, taskId, method, url, headers, form, callback);
43
+ }
44
+
45
+ cancelRequest(taskId: string, callback: CancelCallback): void {
46
+ this.impl.cancelRequest(taskId, callback);
47
+ }
48
+
49
+ enableProgressReport(taskId: string, interval: number, count: number): void {
50
+ this.impl.enableProgressReport(taskId, interval, count);
51
+ }
52
+
53
+ enableUploadProgressReport(taskId: string, interval: number, count: number): void {
54
+ this.impl.enableUploadProgressReport(taskId, interval, count);
55
+ }
56
+
57
+ createFile(path: string, content: string, encode: string): Promise<string> {
58
+ return this.impl.createFile(path, content, encode);
59
+ }
60
+
61
+ createFileASCII(path: string, dataArray: number[]): Promise<void> {
62
+ return this.impl.createFileASCII(path, dataArray);
63
+ }
64
+
65
+ writeFile(path: string, encoding: string, data: string, append: boolean): Promise<number> {
66
+ return this.impl.writeFile(path, encoding, data, append);
67
+ }
68
+
69
+ writeFileArray(path: string, data: number[], append: boolean): Promise<number> {
70
+ return this.impl.writeFileArray(path, data, append);
71
+ }
72
+
73
+ readFile(path: string, encoding: string): Promise<Object> {
74
+ return this.impl.readFile(path, encoding);
75
+ }
76
+
77
+ unlink(path: string, callback: SimpleCallback): void {
78
+ this.impl.unlink(path, callback);
79
+ }
80
+
81
+ mkdir(path: string): Promise<void> {
82
+ return this.impl.mkdir(path);
83
+ }
84
+
85
+ exists(path: string, callback: ExistsCallback): void {
86
+ this.impl.exists(path, callback);
87
+ }
88
+
89
+ cp(path: string, dest: string, callback: DataCallback): void {
90
+ this.impl.cp(path, dest, callback);
91
+ }
92
+
93
+ mv(path: string, dest: string, callback: DataCallback): void {
94
+ this.impl.mv(path, dest, callback);
95
+ }
96
+
97
+ ls(path: string): Promise<string[]> {
98
+ return this.impl.ls(path);
99
+ }
100
+
101
+ stat(path: string, callback: DataCallback): void {
102
+ this.impl.stat(path, callback);
103
+ }
104
+
105
+ lstat(path: string, callback: DataCallback): void {
106
+ this.impl.lstat(path, callback);
107
+ }
108
+
109
+ hash(path: string, algorithm: string): Promise<string> {
110
+ return this.impl.hash(path, algorithm);
111
+ }
112
+
113
+ slice(src: string, dest: string, start: number, end: number): Promise<string> {
114
+ return this.impl.slice(src, dest, start, end);
115
+ }
116
+
117
+ df(callback: DataCallback): void {
118
+ this.impl.df(callback);
119
+ }
120
+
121
+ removeSession(paths: string[], callback: SimpleCallback): void {
122
+ this.impl.removeSession(paths, callback);
123
+ }
124
+
125
+ writeStream(path: string, encoding: string, append: boolean, callback: WriteStreamCallback): void {
126
+ this.impl.writeStream(path, encoding, append, callback);
127
+ }
128
+
129
+ writeChunk(streamId: string, data: string, callback: SimpleCallback): void {
130
+ this.impl.writeChunk(streamId, data, callback);
131
+ }
132
+
133
+ writeArrayChunk(streamId: string, dataArray: number[], callback: SimpleCallback): void {
134
+ this.impl.writeArrayChunk(streamId, dataArray, callback);
135
+ }
136
+
137
+ closeStream(streamId: string, callback: SimpleCallback): void {
138
+ this.impl.closeStream(streamId, callback);
139
+ }
140
+
141
+ readStream(path: string, encoding: string, bufferSize: number, tick: number, streamId: string): void {
142
+ this.impl.readStream(path, encoding, bufferSize, tick, streamId);
143
+ }
144
+
145
+ scanFile(pairs: Object[], callback: SimpleCallback): void {
146
+ this.impl.scanFile(pairs, callback);
147
+ }
148
+
149
+ actionViewIntent(path: string, mime: string): Promise<void> {
150
+ return this.impl.actionViewIntent(path, mime);
151
+ }
152
+
153
+ getContentIntent(mime: string): Promise<string> {
154
+ return this.impl.getContentIntent(mime);
155
+ }
156
+
157
+ addCompleteDownload(config: Object): Promise<void> {
158
+ return this.impl.addCompleteDownload(config);
159
+ }
160
+
161
+ getSDCardDir(): Promise<string> {
162
+ return this.impl.getSDCardDir();
163
+ }
164
+
165
+ getSDCardApplicationDir(): Promise<string> {
166
+ return this.impl.getSDCardApplicationDir();
167
+ }
168
+
169
+ pathForAppGroup(groupName: string): Promise<string> {
170
+ return this.impl.pathForAppGroup(groupName);
171
+ }
172
+
173
+ syncPathAppGroup(groupName: string): string {
174
+ return this.impl.syncPathAppGroup(groupName);
175
+ }
176
+
177
+ previewDocument(uri: string, scheme: string): Promise<void> {
178
+ return this.impl.previewDocument(uri, scheme);
179
+ }
180
+
181
+ openDocument(uri: string, scheme: string): Promise<void> {
182
+ return this.impl.openDocument(uri, scheme);
183
+ }
184
+
185
+ excludeFromBackupKey(url: string): Promise<void> {
186
+ return this.impl.excludeFromBackupKey(url);
187
+ }
188
+
189
+ emitExpiredEvent(callback: () => void): void {
190
+ this.impl.emitExpiredEvent(callback);
191
+ }
192
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This code was generated by "react-native codegen-lib-harmony"
3
+ */
4
+
5
+ export * from './ts'
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This code was generated by "react-native codegen-lib-harmony"
3
+ */
4
+
5
+ export * as TM from "./turboModules/ts"
@@ -0,0 +1,92 @@
1
+ /**
2
+ * This code was generated by "react-native codegen-lib-harmony"
3
+ */
4
+
5
+ import { Tag } from "@rnoh/react-native-openharmony/ts"
6
+
7
+ export namespace RNFetchBlob {
8
+ export const NAME = 'RNFetchBlob' as const
9
+
10
+ export interface Spec {
11
+ getConstants(): {DocumentDir: string, CacheDir: string, PictureDir: string, MusicDir: string, MovieDir: string, DownloadDir: string, DCIMDir: string, SDCardDir: string, SDCardApplicationDir: string, MainBundleDir: string, LibraryDir: string};
12
+
13
+ fetchBlob(options: Object, taskId: string, method: string, url: string, headers: Object, body: string, callback: (value: Object[]) => void): void;
14
+
15
+ fetchBlobForm(options: Object, taskId: string, method: string, url: string, headers: Object, form: Object[], callback: (value: Object[]) => void): void;
16
+
17
+ cancelRequest(taskId: string, callback: (value: Object[]) => void): void;
18
+
19
+ enableProgressReport(taskId: string, interval: number, count: number): void;
20
+
21
+ enableUploadProgressReport(taskId: string, interval: number, count: number): void;
22
+
23
+ createFile(path: string, content: string, encode: string): Promise<string>;
24
+
25
+ createFileASCII(path: string, dataArray: number[]): Promise<void>;
26
+
27
+ writeFile(path: string, encoding: string, data: string, append: boolean): Promise<number>;
28
+
29
+ writeFileArray(path: string, data: number[], append: boolean): Promise<number>;
30
+
31
+ readFile(path: string, encoding: string): Promise<Object>;
32
+
33
+ unlink(path: string, callback: (value: Object[]) => void): void;
34
+
35
+ mkdir(path: string): Promise<void>;
36
+
37
+ exists(path: string, callback: (value: boolean, isDir: boolean) => void): void;
38
+
39
+ cp(path: string, dest: string, callback: (value: Object[]) => void): void;
40
+
41
+ mv(path: string, dest: string, callback: (value: Object[]) => void): void;
42
+
43
+ ls(path: string): Promise<string[]>;
44
+
45
+ stat(path: string, callback: (value: Object[]) => void): void;
46
+
47
+ lstat(path: string, callback: (value: Object[]) => void): void;
48
+
49
+ hash(path: string, algorithm: string): Promise<string>;
50
+
51
+ slice(src: string, dest: string, start: number, end: number): Promise<string>;
52
+
53
+ df(callback: (value: Object[]) => void): void;
54
+
55
+ removeSession(paths: string[], callback: (value: Object[]) => void): void;
56
+
57
+ writeStream(path: string, encoding: string, append: boolean, callback: (value: Object[]) => void): void;
58
+
59
+ writeChunk(streamId: string, data: string, callback: (value: Object[]) => void): void;
60
+
61
+ writeArrayChunk(streamId: string, dataArray: number[], callback: (value: Object[]) => void): void;
62
+
63
+ closeStream(streamId: string, callback: (value: Object[]) => void): void;
64
+
65
+ readStream(path: string, encoding: string, bufferSize: number, tick: number, streamId: string): void;
66
+
67
+ scanFile(pairs: Object[], callback: (value: Object[]) => void): void;
68
+
69
+ actionViewIntent(path: string, mime: string): Promise<void>;
70
+
71
+ getContentIntent(mime: string): Promise<string>;
72
+
73
+ addCompleteDownload(config: Object): Promise<void>;
74
+
75
+ getSDCardDir(): Promise<string>;
76
+
77
+ getSDCardApplicationDir(): Promise<string>;
78
+
79
+ pathForAppGroup(groupName: string): Promise<string>;
80
+
81
+ syncPathAppGroup(groupName: string): string;
82
+
83
+ previewDocument(uri: string, scheme: string): Promise<void>;
84
+
85
+ openDocument(uri: string, scheme: string): Promise<void>;
86
+
87
+ excludeFromBackupKey(url: string): Promise<void>;
88
+
89
+ emitExpiredEvent(callback: () => void): void;
90
+
91
+ }
92
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This code was generated by "react-native codegen-lib-harmony"
3
+ */
4
+
5
+ export * from "./RNFetchBlob"
@@ -0,0 +1,22 @@
1
+ {
2
+ "module": {
3
+ "name": "fetch_blob",
4
+ "type": "har",
5
+ "deviceTypes": [
6
+ "default",
7
+ "tablet",
8
+ "2in1"
9
+ ],
10
+ "requestPermissions": [
11
+ {
12
+ "name": "ohos.permission.INTERNET"
13
+ },
14
+ {
15
+ "name": "ohos.permission.GET_WIFI_INFO"
16
+ },
17
+ {
18
+ "name": "ohos.permission.GET_NETWORK_INFO"
19
+ }
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "string": [
3
+ {
4
+ "name": "page_show",
5
+ "value": "page from npm package"
6
+ }
7
+ ]
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "string": [
3
+ {
4
+ "name": "page_show",
5
+ "value": "page from npm package"
6
+ }
7
+ ]
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "string": [
3
+ {
4
+ "name": "page_show",
5
+ "value": "page from npm package"
6
+ }
7
+ ]
8
+ }
Binary file
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@hxa-rn/rn-fetch-blob",
3
+ "displayName": "@hxa-rn/rn-fetch-blob",
4
+ "version": "0.12.0",
5
+ "description": "A module provides upload, download, and files access API. Supports file stream read/write for process large files.",
6
+ "main": "./src/index.js",
7
+ "module": "./src/index.js",
8
+ "react-native": "./src/index.js",
9
+ "license": "MIT",
10
+ "private": false,
11
+ "repository": {
12
+ "url": "https://github.com/joltup/rn-fetch-blob.git"
13
+ },
14
+ "keywords": [
15
+ "react-native",
16
+ "harmony",
17
+ "harmonyos"
18
+ ],
19
+ "homepage": "https://github.com/joltup/rn-fetch-blob",
20
+ "publishConfig": {
21
+ "registry": "https://registry.npmjs.org/"
22
+ },
23
+ "files": [
24
+ "src/",
25
+ "README.md",
26
+ "LICENSE",
27
+ "harmony/"
28
+ ],
29
+ "scripts": {
30
+ "codegen-lib": "react-native codegen-lib-harmony --no-safety-check --npm-package-name fetch_blob --cpp-output-path ./harmony/fetch_blob/src/main/cpp/generated --ets-output-path ./harmony/fetch_blob/src/main/ets/generated --turbo-modules-spec-paths ./src/specs/v1/NativeRNFetchBlob.ts"
31
+ },
32
+ "peerDependencies": {
33
+ "react-native": ">=0.72"
34
+ },
35
+ "devDependencies": {
36
+ "react": "18.2.0",
37
+ "@types/react": "18.2.79",
38
+ "react-native": "0.72.5",
39
+ "jest": "^29.6.3",
40
+ "@react-native-oh/react-native-harmony-cli": "^0.77.50",
41
+ "metro": "^0.81.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
46
+ "harmony": {
47
+ "alias": "rn-fetch-blob",
48
+ "autolinking": {
49
+ "cmakeLibraryTargetName": "fetch_blob",
50
+ "ohPackageName": "@hxa-rn/rn-fetch-blob",
51
+ "etsPackageClassName": "FetchBlobPackage",
52
+ "cppPackageClassName": "FetchBlobPackage"
53
+ }
54
+ },
55
+ "dependencies": {
56
+ "base-64": "0.1.0",
57
+ "glob": "7.0.6"
58
+ }
59
+ }
package/src/android.js ADDED
@@ -0,0 +1,62 @@
1
+ // Copyright 2016 wkh237@github. All rights reserved.
2
+ // Use of this source code is governed by a MIT-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import {
6
+ DeviceEventEmitter,
7
+ Platform,
8
+ NativeAppEventEmitter,
9
+ } from 'react-native'
10
+ import NativeRNFetchBlob from './specs/v1/NativeRNFetchBlob'
11
+
12
+ const RNFetchBlob:RNFetchBlobNative = NativeRNFetchBlob
13
+
14
+ /**
15
+ * Send an intent to open the file.
16
+ * @param {string} path Path of the file to be open.
17
+ * @param {string} mime MIME type string
18
+ * @return {Promise}
19
+ */
20
+ function actionViewIntent(path:string, mime:string = 'text/plain') {
21
+ if(Platform.OS === 'android' || Platform.OS === 'harmony')
22
+ return NativeRNFetchBlob.actionViewIntent(path, mime)
23
+ else
24
+ return Promise.reject('RNFetchBlob.actionViewIntent only supports Android / HarmonyOS.')
25
+ }
26
+
27
+ function getContentIntent(mime:string) {
28
+ if(Platform.OS === 'android' || Platform.OS === 'harmony')
29
+ return NativeRNFetchBlob.getContentIntent(mime)
30
+ else
31
+ return Promise.reject('RNFetchBlob.getContentIntent only supports Android / HarmonyOS.')
32
+ }
33
+
34
+ function addCompleteDownload(config) {
35
+ if(Platform.OS === 'android' || Platform.OS === 'harmony')
36
+ return NativeRNFetchBlob.addCompleteDownload(config)
37
+ else
38
+ return Promise.reject('RNFetchBlob.addCompleteDownload only supports Android / HarmonyOS.')
39
+ }
40
+
41
+ function getSDCardDir() {
42
+ if(Platform.OS === 'android' || Platform.OS === 'harmony')
43
+ return NativeRNFetchBlob.getSDCardDir()
44
+ else
45
+ return Promise.reject('RNFetchBlob.getSDCardDir only supports Android / HarmonyOS.')
46
+ }
47
+
48
+ function getSDCardApplicationDir() {
49
+ if(Platform.OS === 'android' || Platform.OS === 'harmony')
50
+ return NativeRNFetchBlob.getSDCardApplicationDir()
51
+ else
52
+ return Promise.reject('RNFetchBlob.getSDCardApplicationDir only supports Android / HarmonyOS.')
53
+ }
54
+
55
+
56
+ export default {
57
+ actionViewIntent,
58
+ getContentIntent,
59
+ addCompleteDownload,
60
+ getSDCardDir,
61
+ getSDCardApplicationDir,
62
+ }
@@ -0,0 +1,17 @@
1
+ // Copyright 2016 wkh237@github. All rights reserved.
2
+ // Use of this source code is governed by a MIT-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+
6
+ import {
7
+ DeviceEventEmitter,
8
+ NativeAppEventEmitter,
9
+ } from 'react-native'
10
+ import NativeRNFetchBlob from '../specs/v1/NativeRNFetchBlob'
11
+
12
+ const RNFetchBlob = NativeRNFetchBlob
13
+ const emitter = DeviceEventEmitter
14
+
15
+ export default class RNFetchBlobFile {
16
+
17
+ }
@@ -0,0 +1,82 @@
1
+ // Copyright 2016 wkh237@github. All rights reserved.
2
+ // Use of this source code is governed by a MIT-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import {
6
+ DeviceEventEmitter,
7
+ NativeAppEventEmitter,
8
+ } from 'react-native'
9
+ import NativeRNFetchBlob from '../specs/v1/NativeRNFetchBlob'
10
+ import UUID from '../utils/uuid'
11
+
12
+ const RNFetchBlob = NativeRNFetchBlob
13
+ const emitter = DeviceEventEmitter
14
+
15
+ export default class RNFetchBlobReadStream {
16
+
17
+ path : string;
18
+ encoding : 'utf8' | 'ascii' | 'base64';
19
+ bufferSize : ?number;
20
+ closed : boolean;
21
+ tick : number = 10;
22
+
23
+ constructor(path:string, encoding:string, bufferSize?:?number, tick:number) {
24
+ if(!path)
25
+ throw Error('RNFetchBlob could not open file stream with empty `path`')
26
+ this.encoding = encoding || 'utf8'
27
+ this.bufferSize = bufferSize
28
+ this.path = path
29
+ this.closed = false
30
+ this.tick = tick
31
+ this._onData = () => {}
32
+ this._onEnd = () => {}
33
+ this._onError = () => {}
34
+ this.streamId = 'RNFBRS'+ UUID()
35
+
36
+ // register for file stream event
37
+ let subscription = emitter.addListener(this.streamId, (e) => {
38
+ let {event, code, detail} = e
39
+ if(this._onData && event === 'data') {
40
+ this._onData(detail)
41
+ return
42
+ }
43
+ else if (this._onEnd && event === 'end') {
44
+ this._onEnd(detail)
45
+ }
46
+ else {
47
+ const err = new Error(detail)
48
+ err.code = code || 'EUNSPECIFIED'
49
+ if(this._onError)
50
+ this._onError(err)
51
+ else
52
+ throw err
53
+ }
54
+ // when stream closed or error, remove event handler
55
+ if (event === 'error' || event === 'end') {
56
+ subscription.remove()
57
+ this.closed = true
58
+ }
59
+ })
60
+
61
+ }
62
+
63
+ open() {
64
+ if(!this.closed)
65
+ NativeRNFetchBlob.readStream(this.path, this.encoding, this.bufferSize || 10240 , this.tick || -1, this.streamId)
66
+ else
67
+ throw new Error('Stream closed')
68
+ }
69
+
70
+ onData(fn:() => void) {
71
+ this._onData = fn
72
+ }
73
+
74
+ onError(fn) {
75
+ this._onError = fn
76
+ }
77
+
78
+ onEnd (fn) {
79
+ this._onEnd = fn
80
+ }
81
+
82
+ }
@@ -0,0 +1,74 @@
1
+ // Copyright 2016 wkh237@github. All rights reserved.
2
+ // Use of this source code is governed by a MIT-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import {
6
+ DeviceEventEmitter,
7
+ NativeAppEventEmitter,
8
+ } from 'react-native'
9
+ import NativeRNFetchBlob from '../specs/v1/NativeRNFetchBlob'
10
+
11
+ const RNFetchBlob = NativeRNFetchBlob
12
+
13
+ let sessions = {}
14
+
15
+ export default class RNFetchBlobSession {
16
+
17
+ name : string;
18
+
19
+ static getSession(name:string):any {
20
+ return sessions[name]
21
+ }
22
+
23
+ static setSession(name:string, val:any) {
24
+ sessions[name] = val
25
+ }
26
+
27
+ static removeSession(name:string) {
28
+ delete sessions[name]
29
+ }
30
+
31
+ constructor(name:string, list:Array<string>) {
32
+ this.name = name
33
+ if(!sessions[name]) {
34
+ if(Array.isArray(list))
35
+ sessions[name] = list
36
+ else
37
+ sessions[name] = []
38
+ }
39
+ }
40
+
41
+ add(path:string):RNFetchBlobSession {
42
+ sessions[this.name].push(path)
43
+ return this
44
+ }
45
+
46
+ remove(path:string):RNFetchBlobSession {
47
+ let list = sessions[this.name]
48
+ for(let i of list) {
49
+ if(list[i] === path) {
50
+ sessions[this.name].splice(i, 1)
51
+ break;
52
+ }
53
+ }
54
+ return this
55
+ }
56
+
57
+ list():Array<string> {
58
+ return sessions[this.name]
59
+ }
60
+
61
+ dispose():Promise {
62
+ return new Promise((resolve, reject) => {
63
+ NativeRNFetchBlob.removeSession(sessions[this.name], (err) => {
64
+ if(err)
65
+ reject(new Error(err))
66
+ else {
67
+ delete sessions[this.name]
68
+ resolve()
69
+ }
70
+ })
71
+ })
72
+ }
73
+
74
+ }