react-native-nitro-fetch 1.3.2 → 1.4.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.
- package/NitroFetch.podspec +1 -3
- package/README.md +39 -11
- package/android/src/main/java/com/margelo/nitro/nitrofetch/AutoPrefetcher.kt +6 -2
- package/android/src/main/java/com/margelo/nitro/nitrofetch/DevToolsReporterImpl.kt +27 -36
- package/android/src/main/java/com/margelo/nitro/nitrofetch/NitroFetchClient.kt +45 -0
- package/ios/NitroAutoPrefetcher.swift +4 -0
- package/ios/NitroDevToolsReporter.mm +37 -31
- package/ios/NitroFetchClient.swift +56 -0
- package/lib/module/CurlGenerator.js.map +1 -2
- package/lib/module/Headers.js.map +2 -1
- package/lib/module/HermesProfiler.js.map +2 -1
- package/lib/module/NetworkInspector.js +1 -5
- package/lib/module/NetworkInspector.js.map +2 -1
- package/lib/module/NitroCronet.nitro.js.map +2 -1
- package/lib/module/NitroFetch.nitro.js.map +2 -1
- package/lib/module/NitroInstances.js.map +2 -1
- package/lib/module/Request.js.map +1 -2
- package/lib/module/Response.js.map +2 -2
- package/lib/module/fetch.js +147 -1
- package/lib/module/fetch.js.map +1 -1
- package/lib/module/index.web.js +1 -0
- package/lib/module/index.web.js.map +1 -2
- package/lib/module/tokenRefresh.js.map +1 -2
- package/lib/module/utf8.js.map +1 -2
- package/lib/typescript/src/fetch.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/CurlGenerator.js +26 -23
- package/src/Headers.js +116 -108
- package/src/HermesProfiler.js +18 -16
- package/src/NetworkInspector.js +179 -171
- package/src/NitroInstances.js +1 -2
- package/src/Request.js +164 -167
- package/src/Response.js +242 -244
- package/src/fetch.js +842 -706
- package/src/fetch.ts +170 -1
- package/src/index.js +2 -17
- package/src/index.web.js +67 -69
- package/src/tokenRefresh.js +77 -75
- package/src/utf8.js +27 -28
package/NitroFetch.podspec
CHANGED
|
@@ -22,9 +22,7 @@ Pod::Spec.new do |s|
|
|
|
22
22
|
|
|
23
23
|
s.dependency 'React-jsi'
|
|
24
24
|
s.dependency 'React-callinvoker'
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Expose the DevTools reporter Obj-C facade to Swift via the pod's umbrella module.
|
|
25
|
+
|
|
28
26
|
s.public_header_files = [
|
|
29
27
|
"ios/NitroDevToolsReporter.h",
|
|
30
28
|
"ios/NitroAutoPrefetcher.h",
|
package/README.md
CHANGED
|
@@ -134,8 +134,46 @@ registerTokenRefresh({
|
|
|
134
134
|
- Default `responseType` is `'json'`. Use **`mappings`** to copy fields from the JSON body into header names (dot paths supported, e.g. `data.token`).
|
|
135
135
|
- Use **`compositeHeaders`** to build a header from a template and multiple JSON paths (`{{placeholder}}` in the template).
|
|
136
136
|
- For a plain-text body, set `responseType: 'text'` and use **`textHeader`** / optional **`textTemplate`** (with `{{value}}`).
|
|
137
|
+
- To inject into the prefetch's **JSON body** or **form-data** (the `fetch` path only), use **`bodyMappings`** / **`formDataMappings`** (see below).
|
|
137
138
|
|
|
139
|
+
**Example: header + JSON body + form-data mappings**
|
|
138
140
|
|
|
141
|
+
One config can fan the same refreshed value into all three destinations. Each mapping only applies to a prefetch whose body it matches — `bodyMappings` won't synthesize a JSON body on a GET/form request, and `formDataMappings` won't make a request multipart.
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
import { registerTokenRefresh } from 'react-native-nitro-fetch'
|
|
145
|
+
|
|
146
|
+
// Refresh endpoint returns e.g. { "data": { "accessToken": "abc123" } }
|
|
147
|
+
registerTokenRefresh({
|
|
148
|
+
target: 'fetch',
|
|
149
|
+
url: 'https://api.example.com/oauth/token',
|
|
150
|
+
method: 'POST',
|
|
151
|
+
responseType: 'json',
|
|
152
|
+
|
|
153
|
+
// 1) header mapping → sets a request header
|
|
154
|
+
mappings: [
|
|
155
|
+
{ jsonPath: 'data.accessToken', header: 'Authorization', valueTemplate: 'Bearer {{value}}' },
|
|
156
|
+
],
|
|
157
|
+
|
|
158
|
+
// 2) JSON-body mapping → sets a (nested) dot-path key in the prefetch's JSON body
|
|
159
|
+
bodyMappings: [
|
|
160
|
+
{ jsonPath: 'data.accessToken', bodyPath: 'auth.token' },
|
|
161
|
+
],
|
|
162
|
+
|
|
163
|
+
// 3) form-data mapping → replaces/appends a multipart field by name
|
|
164
|
+
formDataMappings: [
|
|
165
|
+
{ jsonPath: 'data.accessToken', field: 'token' },
|
|
166
|
+
],
|
|
167
|
+
|
|
168
|
+
onFailure: 'useStoredHeaders',
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Result, per prefetch:
|
|
173
|
+
- a JSON prefetch of `{ "deviceId": "d-1" }` → `Authorization: Bearer abc123` **and** body `{ "deviceId": "d-1", "auth": { "token": "abc123" } }`
|
|
174
|
+
- a form-data prefetch → `Authorization: Bearer abc123` **and** a `token=abc123` part
|
|
175
|
+
|
|
176
|
+
> For `responseType: 'text'`, the body/form equivalents of `textHeader` are **`bodyTextPath`** / **`formDataTextField`**.
|
|
139
177
|
|
|
140
178
|
**Example: token refresh + WebSocket prewarm**
|
|
141
179
|
|
|
@@ -333,17 +371,7 @@ More detail: **[docs/websockets.md](docs/websockets.md)** · UI sample: **[examp
|
|
|
333
371
|
- **WebSockets** are not part of `react-native-nitro-fetch` itself; use the companion package **[react-native-nitro-websockets](docs/websockets.md)** (with **react-native-nitro-text-decoder**). For other stacks, [react-native-fast-io](https://github.com/callstackincubator/react-native-fast-io) is another option.
|
|
334
372
|
|
|
335
373
|
## Documentation
|
|
336
|
-
|
|
337
|
-
- [Getting Started](docs/getting-started.md)
|
|
338
|
-
- [API Reference](docs/api.md)
|
|
339
|
-
- [Android Details](docs/android.md)
|
|
340
|
-
- [iOS Details](docs/ios.md)
|
|
341
|
-
- [Prefetch & Auto-Prefetch](docs/prefetch.md)
|
|
342
|
-
- [WebSockets & prewarm](docs/websockets.md)
|
|
343
|
-
- [Worklets](docs/worklets.md)
|
|
344
|
-
- [Troubleshooting](docs/troubleshooting.md)
|
|
345
|
-
- [Cronet (Android) notes](docs/cronet-android.md)
|
|
346
|
-
- [Cronet (iOS) notes](docs/cronet-ios.md)
|
|
374
|
+
You can find documentation at https://fetch.margelo.com
|
|
347
375
|
|
|
348
376
|
## Margelo
|
|
349
377
|
|
|
@@ -101,7 +101,9 @@ object AutoPrefetcher {
|
|
|
101
101
|
|
|
102
102
|
val tokens: TokenRefreshResult = if (refreshed != null) {
|
|
103
103
|
android.util.Log.d("NitroFetch", "[TokenRefresh] ✅ Success — got ${refreshed.headers.size} header(s)")
|
|
104
|
-
|
|
104
|
+
if (BuildConfig.DEBUG) {
|
|
105
|
+
refreshed.headers.forEach { (k, v) -> android.util.Log.d("NitroFetch", "[TokenRefresh] $k: $v") }
|
|
106
|
+
}
|
|
105
107
|
// Cache fresh tokens for useStoredHeaders fallback on next cold start
|
|
106
108
|
NitroFetchSecureAtRest.putEncrypted(prefs, KEY_TOKEN_CACHE, serializeCache(refreshed))
|
|
107
109
|
refreshed
|
|
@@ -148,7 +150,9 @@ object AutoPrefetcher {
|
|
|
148
150
|
merged["prefetchKey"] = prefetchKey
|
|
149
151
|
|
|
150
152
|
android.util.Log.d("NitroFetch", "[TokenRefresh] Prefetching $url with ${merged.size} header(s)")
|
|
151
|
-
|
|
153
|
+
if (BuildConfig.DEBUG) {
|
|
154
|
+
merged.forEach { (k, v) -> android.util.Log.d("NitroFetch", "[TokenRefresh] $k: $v") }
|
|
155
|
+
}
|
|
152
156
|
val req = buildNitroRequestFromEntry(url, merged, o, tokens)
|
|
153
157
|
|
|
154
158
|
if (FetchCache.getPending(prefetchKey) != null) continue
|
|
@@ -1,67 +1,58 @@
|
|
|
1
1
|
package com.margelo.nitro.nitrofetch
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* from loading — the facade itself stays intact and degrades to a no-op.
|
|
7
|
-
*
|
|
8
|
-
* Once loaded, every call here is a plain JVM static invoke. No reflection, no boxing,
|
|
9
|
-
* no method-handle lookups. The `@Suppress` annotations bypass RN's `internal` visibility
|
|
10
|
-
* (RN has no public surface here) — this is the documented integration point.
|
|
11
|
-
*/
|
|
12
|
-
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
|
|
3
|
+
import java.lang.reflect.Method
|
|
4
|
+
|
|
5
|
+
|
|
13
6
|
internal class DevToolsReporterImpl : DevToolsReporter.Impl {
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
private val cls = Class.forName("com.facebook.react.modules.network.InspectorNetworkReporter")
|
|
8
|
+
|
|
9
|
+
private fun m(name: String): Method = cls.methods.first { it.name == name }
|
|
10
|
+
|
|
11
|
+
// All targets are `public static final` on the reporter object — invoke with a null receiver.
|
|
12
|
+
private val mIsDebuggingEnabled = m("isDebuggingEnabled")
|
|
13
|
+
private val mReportRequestStart = m("reportRequestStart")
|
|
14
|
+
private val mReportConnectionTiming = m("reportConnectionTiming")
|
|
15
|
+
private val mReportResponseStart = m("reportResponseStart")
|
|
16
|
+
private val mReportDataReceivedImpl = m("reportDataReceivedImpl")
|
|
17
|
+
private val mReportResponseEnd = m("reportResponseEnd")
|
|
18
|
+
private val mReportRequestFailed = m("reportRequestFailed")
|
|
19
|
+
private val mMaybeStoreResponseBody = m("maybeStoreResponseBody")
|
|
20
|
+
private val mMaybeStoreResponseBodyIncremental = m("maybeStoreResponseBodyIncremental")
|
|
21
|
+
|
|
22
|
+
override fun isDebuggingEnabled(): Boolean = mIsDebuggingEnabled.invoke(null) as Boolean
|
|
16
23
|
|
|
17
24
|
override fun reportRequestStart(
|
|
18
25
|
requestId: String, url: String, method: String,
|
|
19
26
|
headers: Map<String, String>, body: String, encodedDataLength: Long
|
|
20
27
|
) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
)
|
|
24
|
-
com.facebook.react.modules.network.InspectorNetworkReporter.reportConnectionTiming(
|
|
25
|
-
requestId, headers
|
|
26
|
-
)
|
|
28
|
+
mReportRequestStart.invoke(null, requestId, url, method, headers, body, encodedDataLength)
|
|
29
|
+
mReportConnectionTiming.invoke(null, requestId, headers)
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
override fun reportResponseStart(
|
|
30
33
|
requestId: String, url: String, statusCode: Int,
|
|
31
34
|
headers: Map<String, String>, expectedDataLength: Long
|
|
32
35
|
) {
|
|
33
|
-
|
|
34
|
-
requestId, url, statusCode, headers, expectedDataLength
|
|
35
|
-
)
|
|
36
|
+
mReportResponseStart.invoke(null, requestId, url, statusCode, headers, expectedDataLength)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
override fun reportDataReceived(requestId: String, length: Int) {
|
|
39
|
-
|
|
40
|
-
requestId, length
|
|
41
|
-
)
|
|
40
|
+
mReportDataReceivedImpl.invoke(null, requestId, length)
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
override fun reportResponseEnd(requestId: String, encodedDataLength: Long) {
|
|
45
|
-
|
|
46
|
-
requestId, encodedDataLength
|
|
47
|
-
)
|
|
44
|
+
mReportResponseEnd.invoke(null, requestId, encodedDataLength)
|
|
48
45
|
}
|
|
49
46
|
|
|
50
47
|
override fun reportRequestFailed(requestId: String, cancelled: Boolean) {
|
|
51
|
-
|
|
52
|
-
requestId, cancelled
|
|
53
|
-
)
|
|
48
|
+
mReportRequestFailed.invoke(null, requestId, cancelled)
|
|
54
49
|
}
|
|
55
50
|
|
|
56
51
|
override fun storeResponseBody(requestId: String, body: String, base64Encoded: Boolean) {
|
|
57
|
-
|
|
58
|
-
requestId, body, base64Encoded
|
|
59
|
-
)
|
|
52
|
+
mMaybeStoreResponseBody.invoke(null, requestId, body, base64Encoded)
|
|
60
53
|
}
|
|
61
54
|
|
|
62
55
|
override fun storeResponseBodyIncremental(requestId: String, data: String) {
|
|
63
|
-
|
|
64
|
-
requestId, data
|
|
65
|
-
)
|
|
56
|
+
mMaybeStoreResponseBodyIncremental.invoke(null, requestId, data)
|
|
66
57
|
}
|
|
67
58
|
}
|
|
@@ -85,6 +85,11 @@ class NitroFetchClient(private val engine: CronetEngine, private val executor: E
|
|
|
85
85
|
onFail: (Throwable) -> Unit
|
|
86
86
|
): UrlRequest? {
|
|
87
87
|
return try {
|
|
88
|
+
// Local resources (file://, content://, scheme-less paths) aren't HTTP; read off disk -> 200.
|
|
89
|
+
if (!isHttpURL(req.url)) {
|
|
90
|
+
onSuccess(makeLocalFileResponse(req))
|
|
91
|
+
return null
|
|
92
|
+
}
|
|
88
93
|
val engine = NitroFetch.getEngine()
|
|
89
94
|
val executor = NitroFetch.ioExecutor
|
|
90
95
|
startCronet(engine, executor, req, onSuccess, onFail)
|
|
@@ -375,6 +380,46 @@ class NitroFetchClient(private val engine: CronetEngine, private val executor: E
|
|
|
375
380
|
val path = if (uri.startsWith("file://")) uri.removePrefix("file://") else uri
|
|
376
381
|
return File(path).readBytes()
|
|
377
382
|
}
|
|
383
|
+
|
|
384
|
+
private fun isHttpURL(url: String): Boolean =
|
|
385
|
+
url.startsWith("http://") || url.startsWith("https://")
|
|
386
|
+
|
|
387
|
+
private fun guessMime(uri: String): String {
|
|
388
|
+
if (uri.startsWith("content://")) {
|
|
389
|
+
NitroModules.applicationContext?.contentResolver?.getType(Uri.parse(uri))?.let { return it }
|
|
390
|
+
}
|
|
391
|
+
val path = if (uri.startsWith("file://")) uri.removePrefix("file://") else uri
|
|
392
|
+
val ext = path.substringAfterLast('.', "").lowercase()
|
|
393
|
+
if (ext.isNotEmpty()) {
|
|
394
|
+
android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext)?.let { return it }
|
|
395
|
+
}
|
|
396
|
+
return java.net.URLConnection.guessContentTypeFromName(path) ?: "application/octet-stream"
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Read a local file -> synthetic 200, mirroring the HTTP path's strict text/bytes choice.
|
|
400
|
+
private fun makeLocalFileResponse(req: NitroRequest): NitroResponse {
|
|
401
|
+
val bytes = readFileBytes(req.url)
|
|
402
|
+
val mime = guessMime(req.url)
|
|
403
|
+
val bodyStr: String? = try {
|
|
404
|
+
strictDecoderFor(Charsets.UTF_8).decode(ByteBuffer.wrap(bytes)).toString()
|
|
405
|
+
} catch (_: Throwable) { null }
|
|
406
|
+
val bodyBytesAb: ArrayBuffer? = if (bodyStr == null && bytes.isNotEmpty())
|
|
407
|
+
bytes.toArrayBuffer()
|
|
408
|
+
else null
|
|
409
|
+
return NitroResponse(
|
|
410
|
+
url = req.url,
|
|
411
|
+
status = 200.0,
|
|
412
|
+
statusText = "OK",
|
|
413
|
+
ok = true,
|
|
414
|
+
redirected = false,
|
|
415
|
+
headers = arrayOf(
|
|
416
|
+
NitroHeader("Content-Type", mime),
|
|
417
|
+
NitroHeader("Content-Length", bytes.size.toString())
|
|
418
|
+
),
|
|
419
|
+
bodyString = bodyStr,
|
|
420
|
+
bodyBytes = bodyBytesAb
|
|
421
|
+
)
|
|
422
|
+
}
|
|
378
423
|
}
|
|
379
424
|
|
|
380
425
|
// Helper function to add prefetch header to response (reused by both sync/async)
|
|
@@ -150,7 +150,9 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
150
150
|
let refreshed = try? await callTokenRefresh(config: refreshObj)
|
|
151
151
|
if let refreshed = refreshed {
|
|
152
152
|
print("[NitroFetch][TokenRefresh] ✅ Success — got \(refreshed.headers.count) header(s)")
|
|
153
|
+
#if DEBUG
|
|
153
154
|
for (k, v) in refreshed.headers { print("[NitroFetch][TokenRefresh] \(k): \(v)") }
|
|
155
|
+
#endif
|
|
154
156
|
// Cache fresh tokens for useStoredHeaders fallback on next cold start
|
|
155
157
|
if let cacheStr = serializeCache(refreshed) {
|
|
156
158
|
try? NitroFetchSecureAtRest.setEncrypted(cacheStr, forKey: tokenCacheKey, defaults: userDefaults)
|
|
@@ -188,7 +190,9 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
188
190
|
headers.append(NitroHeader(key: "prefetchKey", value: prefetchKey))
|
|
189
191
|
|
|
190
192
|
print("[NitroFetch][TokenRefresh] Prefetching \(url) with \(merged.count) header(s)")
|
|
193
|
+
#if DEBUG
|
|
191
194
|
for (k, v) in merged { print("[NitroFetch][TokenRefresh] \(k): \(v)") }
|
|
195
|
+
#endif
|
|
192
196
|
|
|
193
197
|
let req = buildNitroRequest(from: obj, mergedHeaders: headers, tokens: tokens)
|
|
194
198
|
Task {
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
#import "NitroDevToolsReporter.h"
|
|
2
|
+
#import <React/RCTVersion.h>
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
|
|
5
|
+
@interface RCTInspectorNetworkReporter : NSObject
|
|
6
|
+
+ (void)reportRequestStart:(NSString *)requestId
|
|
7
|
+
request:(NSURLRequest *)request
|
|
8
|
+
encodedDataLength:(int)encodedDataLength;
|
|
9
|
+
+ (void)reportConnectionTiming:(NSString *)requestId request:(NSURLRequest *)request;
|
|
10
|
+
+ (void)reportResponseStart:(NSString *)requestId
|
|
11
|
+
response:(NSURLResponse *)response
|
|
12
|
+
statusCode:(int)statusCode
|
|
13
|
+
headers:(NSDictionary<NSString *, NSString *> *)headers;
|
|
14
|
+
+ (void)reportDataReceived:(NSString *)requestId data:(NSData *)data;
|
|
15
|
+
+ (void)reportResponseEnd:(NSString *)requestId encodedDataLength:(int)encodedDataLength;
|
|
16
|
+
+ (void)reportRequestFailed:(NSString *)requestId cancelled:(BOOL)cancelled;
|
|
17
|
+
+ (void)maybeStoreResponseBody:(NSString *)requestId data:(NSData *)data base64Encoded:(bool)base64Encoded;
|
|
18
|
+
+ (void)maybeStoreResponseBodyIncremental:(NSString *)requestId data:(NSString *)data;
|
|
19
|
+
@end
|
|
12
20
|
|
|
13
21
|
// During cold-start prefetch, RN's RCTInspectorNetworkReporter class may not
|
|
14
22
|
// be realized yet (its underlying C++ NetworkReporter singleton is brought up
|
|
@@ -18,16 +26,30 @@
|
|
|
18
26
|
|
|
19
27
|
@implementation NitroDevToolsReporter
|
|
20
28
|
|
|
29
|
+
// The reporter's `requestId` API switched from NSNumber to NSString in RN 0.83. We build against
|
|
30
|
+
// the NSString shape, so only engage on RN >= 0.83; everything else stays a no-op.
|
|
31
|
+
+ (BOOL)reporterAPIAvailable {
|
|
32
|
+
static BOOL available = NO;
|
|
33
|
+
static dispatch_once_t onceToken;
|
|
34
|
+
dispatch_once(&onceToken, ^{
|
|
35
|
+
NSDictionary *v = RCTGetReactNativeVersion();
|
|
36
|
+
NSInteger major = [v[RCTVersionMajor] integerValue];
|
|
37
|
+
NSInteger minor = [v[RCTVersionMinor] integerValue];
|
|
38
|
+
available = (major > 0) || (minor >= 83);
|
|
39
|
+
});
|
|
40
|
+
return available;
|
|
41
|
+
}
|
|
42
|
+
|
|
21
43
|
+ (Class _Nullable)reporterClass {
|
|
22
|
-
|
|
44
|
+
if (![self reporterAPIAvailable]) {
|
|
45
|
+
return Nil;
|
|
46
|
+
}
|
|
23
47
|
static Class cached = Nil;
|
|
24
|
-
|
|
48
|
+
static dispatch_once_t onceToken;
|
|
49
|
+
dispatch_once(&onceToken, ^{
|
|
25
50
|
cached = NSClassFromString(@"RCTInspectorNetworkReporter");
|
|
26
|
-
}
|
|
51
|
+
});
|
|
27
52
|
return cached;
|
|
28
|
-
#else
|
|
29
|
-
return Nil;
|
|
30
|
-
#endif
|
|
31
53
|
}
|
|
32
54
|
|
|
33
55
|
+ (BOOL)isDebuggingEnabled {
|
|
@@ -36,14 +58,12 @@
|
|
|
36
58
|
|
|
37
59
|
+ (void)reportRequestStartWithRequest:(NSString *)requestId
|
|
38
60
|
request:(NSURLRequest *)request {
|
|
39
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
40
61
|
if (request == nil) return;
|
|
41
62
|
Class cls = [self reporterClass];
|
|
42
63
|
if (cls == Nil) return;
|
|
43
64
|
int encoded = (int)(request.HTTPBody.length);
|
|
44
65
|
[cls reportRequestStart:requestId request:request encodedDataLength:encoded];
|
|
45
66
|
[cls reportConnectionTiming:requestId request:request];
|
|
46
|
-
#endif
|
|
47
67
|
}
|
|
48
68
|
|
|
49
69
|
+ (void)reportRequestStart:(NSString *)requestId
|
|
@@ -51,7 +71,6 @@
|
|
|
51
71
|
method:(NSString *)method
|
|
52
72
|
headers:(NSDictionary<NSString *, NSString *> *)headers
|
|
53
73
|
bodyString:(NSString *)bodyString {
|
|
54
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
55
74
|
Class cls = [self reporterClass];
|
|
56
75
|
if (cls == Nil) return;
|
|
57
76
|
NSURL *u = [NSURL URLWithString:url];
|
|
@@ -67,14 +86,12 @@
|
|
|
67
86
|
NSInteger encoded = bodyString ? (NSInteger)[bodyString lengthOfBytesUsingEncoding:NSUTF8StringEncoding] : 0;
|
|
68
87
|
[cls reportRequestStart:requestId request:req encodedDataLength:(int)encoded];
|
|
69
88
|
[cls reportConnectionTiming:requestId request:req];
|
|
70
|
-
#endif
|
|
71
89
|
}
|
|
72
90
|
|
|
73
91
|
+ (void)reportResponseStart:(NSString *)requestId
|
|
74
92
|
url:(NSString *)url
|
|
75
93
|
statusCode:(NSInteger)statusCode
|
|
76
94
|
headers:(NSDictionary<NSString *, NSString *> *)headers {
|
|
77
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
78
95
|
Class cls = [self reporterClass];
|
|
79
96
|
if (cls == Nil) return;
|
|
80
97
|
NSURL *u = [NSURL URLWithString:url];
|
|
@@ -87,11 +104,9 @@
|
|
|
87
104
|
response:resp
|
|
88
105
|
statusCode:(int)statusCode
|
|
89
106
|
headers:headers];
|
|
90
|
-
#endif
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
+ (void)reportDataReceived:(NSString *)requestId length:(NSInteger)length {
|
|
94
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
95
110
|
if (length <= 0) return;
|
|
96
111
|
Class cls = [self reporterClass];
|
|
97
112
|
if (cls == Nil) return;
|
|
@@ -101,41 +116,32 @@
|
|
|
101
116
|
static uint8_t sentinel;
|
|
102
117
|
NSData *sized = [NSData dataWithBytesNoCopy:&sentinel length:(NSUInteger)length freeWhenDone:NO];
|
|
103
118
|
[cls reportDataReceived:requestId data:sized];
|
|
104
|
-
#endif
|
|
105
119
|
}
|
|
106
120
|
|
|
107
121
|
+ (void)reportResponseEnd:(NSString *)requestId encodedDataLength:(NSInteger)length {
|
|
108
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
109
122
|
Class cls = [self reporterClass];
|
|
110
123
|
if (cls == Nil) return;
|
|
111
124
|
[cls reportResponseEnd:requestId encodedDataLength:(int)length];
|
|
112
|
-
#endif
|
|
113
125
|
}
|
|
114
126
|
|
|
115
127
|
+ (void)reportRequestFailed:(NSString *)requestId cancelled:(BOOL)cancelled {
|
|
116
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
117
128
|
Class cls = [self reporterClass];
|
|
118
129
|
if (cls == Nil) return;
|
|
119
130
|
[cls reportRequestFailed:requestId cancelled:cancelled];
|
|
120
|
-
#endif
|
|
121
131
|
}
|
|
122
132
|
|
|
123
133
|
+ (void)storeResponseBody:(NSString *)requestId
|
|
124
134
|
data:(NSData *)data
|
|
125
135
|
base64Encoded:(BOOL)base64Encoded {
|
|
126
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
127
136
|
Class cls = [self reporterClass];
|
|
128
137
|
if (cls == Nil) return;
|
|
129
138
|
[cls maybeStoreResponseBody:requestId data:data base64Encoded:base64Encoded];
|
|
130
|
-
#endif
|
|
131
139
|
}
|
|
132
140
|
|
|
133
141
|
+ (void)storeResponseBodyIncremental:(NSString *)requestId text:(NSString *)text {
|
|
134
|
-
#if NITRO_HAS_NETWORK_REPORTER
|
|
135
142
|
Class cls = [self reporterClass];
|
|
136
143
|
if (cls == Nil) return;
|
|
137
144
|
[cls maybeStoreResponseBodyIncremental:requestId data:text];
|
|
138
|
-
#endif
|
|
139
145
|
}
|
|
140
146
|
|
|
141
147
|
+ (BOOL)isTextualContentType:(NSString *)contentType {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import NitroModules
|
|
3
3
|
import os
|
|
4
|
+
import UniformTypeIdentifiers
|
|
4
5
|
|
|
5
6
|
#if NITROFETCH_TRACING
|
|
6
7
|
private let fetchLog = OSLog(subsystem: "com.margelo.nitrofetch", category: "network")
|
|
@@ -117,6 +118,10 @@ final class NitroFetchClient: HybridNitroFetchClientSpec {
|
|
|
117
118
|
|
|
118
119
|
|
|
119
120
|
public class func requestStatic(_ req: NitroRequest) async throws -> NitroResponse {
|
|
121
|
+
// Local resources (file://, scheme-less paths) aren't HTTP; read off disk -> 200.
|
|
122
|
+
if !isHttpURL(req.url) {
|
|
123
|
+
return try makeLocalFileResponse(req)
|
|
124
|
+
}
|
|
120
125
|
if let key = findPrefetchKey(req) {
|
|
121
126
|
// If a prefetched result is fresh, return immediately
|
|
122
127
|
if let cached = FetchCache.getResultIfFresh(key, maxAgeMs: Int64(req.prefetchCacheTtlMs ?? 5_000)) {
|
|
@@ -380,6 +385,57 @@ final class NitroFetchClient: HybridNitroFetchClientSpec {
|
|
|
380
385
|
return data
|
|
381
386
|
}
|
|
382
387
|
|
|
388
|
+
private static func isHttpURL(_ url: String) -> Bool {
|
|
389
|
+
return url.hasPrefix("http://") || url.hasPrefix("https://")
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
private static func localData(forURI uri: String) throws -> Data {
|
|
393
|
+
// file:// via URL (honors percent-encoding); bare paths read directly.
|
|
394
|
+
if uri.hasPrefix("file://"), let fileURL = URL(string: uri) {
|
|
395
|
+
return try Data(contentsOf: fileURL)
|
|
396
|
+
}
|
|
397
|
+
let path = uri.hasPrefix("file://") ? String(uri.dropFirst(7)) : uri
|
|
398
|
+
guard let data = FileManager.default.contents(atPath: path) else {
|
|
399
|
+
throw NSError(domain: "NitroFetch", code: -4,
|
|
400
|
+
userInfo: [NSLocalizedDescriptionKey: "Cannot read file at: \(uri)"])
|
|
401
|
+
}
|
|
402
|
+
return data
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
private static func mimeType(forURI uri: String) -> String {
|
|
406
|
+
let path = uri.hasPrefix("file://") ? String(uri.dropFirst(7)) : uri
|
|
407
|
+
let ext = (path as NSString).pathExtension
|
|
408
|
+
if !ext.isEmpty, let type = UTType(filenameExtension: ext),
|
|
409
|
+
let mime = type.preferredMIMEType {
|
|
410
|
+
return mime
|
|
411
|
+
}
|
|
412
|
+
return "application/octet-stream"
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Read a local file -> synthetic 200, mirroring the HTTP path's text/bytes choice.
|
|
416
|
+
private static func makeLocalFileResponse(_ req: NitroRequest) throws -> NitroResponse {
|
|
417
|
+
let data = try localData(forURI: req.url)
|
|
418
|
+
let mime = mimeType(forURI: req.url)
|
|
419
|
+
let bodyStr = String(data: data, encoding: .utf8)
|
|
420
|
+
var bodyBytesAb: ArrayBuffer? = nil
|
|
421
|
+
if bodyStr == nil && !data.isEmpty {
|
|
422
|
+
bodyBytesAb = try ArrayBuffer.copy(data: data)
|
|
423
|
+
}
|
|
424
|
+
return NitroResponse(
|
|
425
|
+
url: req.url,
|
|
426
|
+
status: 200,
|
|
427
|
+
statusText: "OK",
|
|
428
|
+
ok: true,
|
|
429
|
+
redirected: false,
|
|
430
|
+
headers: [
|
|
431
|
+
NitroHeader(key: "Content-Type", value: mime),
|
|
432
|
+
NitroHeader(key: "Content-Length", value: String(data.count)),
|
|
433
|
+
],
|
|
434
|
+
bodyString: bodyStr,
|
|
435
|
+
bodyBytes: bodyBytesAb
|
|
436
|
+
)
|
|
437
|
+
}
|
|
438
|
+
|
|
383
439
|
private static func detectCharset(from http: HTTPURLResponse) -> String.Encoding? {
|
|
384
440
|
if let ct = http.value(forHTTPHeaderField: "Content-Type")?.lowercased() {
|
|
385
441
|
if let range = ct.range(of: "charset=") {
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
{"version":3,"names":["shellEscape","str","test","replace","generateCurl","options","parts","method","push","headers","h","key","toLowerCase","value","body","maxLen","truncated","length","slice","verbose","compressed","url","join"],"sourceRoot":"../../src","sources":["CurlGenerator.
|
|
2
|
-
|
|
1
|
+
{"version":3,"names":["shellEscape","str","test","replace","generateCurl","options","parts","method","push","headers","h","key","toLowerCase","value","body","maxLen","truncated","length","slice","verbose","compressed","url","join"],"sourceRoot":"../../src","sources":["CurlGenerator.ts"],"mappings":";;AASA,SAASA,WAAWA,CAACC,GAAW,EAAU;EACxC,IAAI,0BAA0B,CAACC,IAAI,CAACD,GAAG,CAAC,EAAE,OAAOA,GAAG;EACpD,OAAO,GAAG,GAAGA,GAAG,CAACE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG;AAC/C;AAEA,OAAO,SAASC,YAAYA,CAACC,OAAoB,EAAU;EACzD,MAAMC,KAAe,GAAG,CAAC,MAAM,CAAC;EAEhC,IAAID,OAAO,CAACE,MAAM,IAAIF,OAAO,CAACE,MAAM,KAAK,KAAK,EAAE;IAC9CD,KAAK,CAACE,IAAI,CAAC,IAAI,EAAER,WAAW,CAACK,OAAO,CAACE,MAAM,CAAC,CAAC;EAC/C;EAEA,IAAIF,OAAO,CAACI,OAAO,EAAE;IACnB,KAAK,MAAMC,CAAC,IAAIL,OAAO,CAACI,OAAO,EAAE;MAC/B,IAAIC,CAAC,CAACC,GAAG,CAACC,WAAW,CAAC,CAAC,KAAK,aAAa,EAAE;MAC3CN,KAAK,CAACE,IAAI,CAAC,IAAI,EAAER,WAAW,CAAC,GAAGU,CAAC,CAACC,GAAG,KAAKD,CAAC,CAACG,KAAK,EAAE,CAAC,CAAC;IACvD;EACF;EAEA,IAAIR,OAAO,CAACS,IAAI,EAAE;IAChB,MAAMC,MAAM,GAAG,MAAM;IACrB,MAAMC,SAAS,GACbX,OAAO,CAACS,IAAI,CAACG,MAAM,GAAGF,MAAM,GACxBV,OAAO,CAACS,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEH,MAAM,CAAC,GAAG,gBAAgB,GAChDV,OAAO,CAACS,IAAI;IAClBR,KAAK,CAACE,IAAI,CAAC,IAAI,EAAER,WAAW,CAACgB,SAAS,CAAC,CAAC;EAC1C;EAEA,IAAIX,OAAO,CAACc,OAAO,EAAEb,KAAK,CAACE,IAAI,CAAC,IAAI,CAAC;EACrC,IAAIH,OAAO,CAACe,UAAU,EAAEd,KAAK,CAACE,IAAI,CAAC,cAAc,CAAC;EAElDF,KAAK,CAACE,IAAI,CAACR,WAAW,CAACK,OAAO,CAACgB,GAAG,CAAC,CAAC;EAEpC,OAAOf,KAAK,CAACgB,IAAI,CAAC,GAAG,CAAC;AACxB","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":["normalizeName","name","toLowerCase","NitroHeaders","constructor","init","_map","Map","forEach","values","key","set","Array","isArray","get","value","entry","length","String","existing","push","keys","Object","i","k","v","undefined","append","delete","join","getSetCookie","has","callback","thisArg","sortedKeys","from","sort","call","entries","map","gen","Symbol","iterator"],"sourceRoot":"../../src","sources":["Headers.
|
|
1
|
+
{"version":3,"names":["normalizeName","name","toLowerCase","NitroHeaders","constructor","init","_map","Map","forEach","values","key","set","Array","isArray","get","value","entry","length","String","existing","push","keys","Object","i","k","v","undefined","append","delete","join","getSetCookie","has","callback","thisArg","sortedKeys","from","sort","call","entries","map","gen","Symbol","iterator"],"sourceRoot":"../../src","sources":["Headers.js"],"mappings":"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","ignoreList":[]}
|
|
2
|
+
AACF","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":["profileFetch","fn","outputPath","hermes","global","HermesInternal","result","path","Date","now","enableSamplingProfiler","profilePath","disableSamplingProfiler","dumpSamplingProfiler"],"sourceRoot":"../../src","sources":["HermesProfiler.
|
|
1
|
+
{"version":3,"names":["profileFetch","fn","outputPath","hermes","global","HermesInternal","result","path","Date","now","enableSamplingProfiler","profilePath","disableSamplingProfiler","dumpSamplingProfiler"],"sourceRoot":"../../src","sources":["HermesProfiler.js"],"mappings":";;AAAA,OAAO,eAAeA,YAAYA,CAACC,EAAE,EAAEC,UAAU,EAAE;EAC/C,MAAMC,MAAM,GAAGC,MAAM,CAACC,cAAc;EACpC,IAAI,CAACF,MAAM,EAAE;IACT,MAAMG,MAAM,GAAG,MAAML,EAAE,CAAC,CAAC;IACzB,OAAO;MAAEK;IAAO,CAAC;EACrB;EACA,MAAMC,IAAI,GAAGL,UAAU,IAAI,2BAA2BM,IAAI,CAACC,GAAG,CAAC,CAAC,aAAa;EAC7EN,MAAM,CAACO,sBAAsB,CAAC,CAAC;EAC/B,IAAI;IACA,MAAMJ,MAAM,GAAG,MAAML,EAAE,CAAC,CAAC;IACzB,OAAO;MAAEK,MAAM;MAAEK,WAAW,EAAEJ;IAAK,CAAC;EACxC,CAAC,SACO;IACJJ,MAAM,CAACS,uBAAuB,CAAC,CAAC;IAChC,IAAI;MACAT,MAAM,CAACU,oBAAoB,CAACN,IAAI,CAAC;IACrC,CAAC,CACD,MAAM;MACF;IAAA;EAER;AACJ","ignoreList":[]}
|
|
2
|
+
[]}
|
|
@@ -53,9 +53,7 @@ class NetworkInspectorImpl {
|
|
|
53
53
|
this._entries.shift();
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
|
|
57
56
|
// --- HTTP recording ---
|
|
58
|
-
|
|
59
57
|
_recordStart(id, url, method, headers, body) {
|
|
60
58
|
if (!this._enabled) return;
|
|
61
59
|
const bodySize = body ? body.length : 0;
|
|
@@ -106,9 +104,7 @@ class NetworkInspectorImpl {
|
|
|
106
104
|
}
|
|
107
105
|
this._notify(entry);
|
|
108
106
|
}
|
|
109
|
-
|
|
110
107
|
// --- WebSocket recording ---
|
|
111
|
-
|
|
112
108
|
_recordWsOpen(id, url, protocols, headers) {
|
|
113
109
|
if (!this._enabled) return;
|
|
114
110
|
const entry = {
|
|
@@ -181,4 +177,4 @@ class NetworkInspectorImpl {
|
|
|
181
177
|
}
|
|
182
178
|
}
|
|
183
179
|
export const NetworkInspector = new NetworkInspectorImpl();
|
|
184
|
-
//# sourceMappingURL=NetworkInspector.js.map
|
|
180
|
+
//# sourceMappingURL=NetworkInspector.js.map.map
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":["generateCurl","NetworkInspectorImpl","_enabled","_entries","_maxEntries","_maxBodyCapture","_listeners","Set","enable","options","maxEntries","maxBodyCapture","disable","isEnabled","getEntries","getHttpEntries","filter","e","type","getWebSocketEntries","getEntry","id","find","clear","onEntry","callback","add","delete","_notify","entry","cb","_trimEntries","length","shift","_recordStart","url","method","headers","body","bodySize","requestHeaders","map","h","key","value","requestBody","slice","undefined","requestBodySize","status","statusText","responseHeaders","responseBodySize","startTime","performance","now","endTime","duration","curl","push","_recordEnd","error","responseBody","_recordWsOpen","protocols","readyState","messages","messagesSent","messagesReceived","bytesSent","bytesReceived","_recordWsConnected","_recordWsMessage","direction","data","size","isBinary","timestamp","_recordWsClose","code","reason","closeCode","closeReason","_recordWsError","NetworkInspector"],"sourceRoot":"../../src","sources":["NetworkInspector.
|
|
1
|
+
{"version":3,"names":["generateCurl","NetworkInspectorImpl","_enabled","_entries","_maxEntries","_maxBodyCapture","_listeners","Set","enable","options","maxEntries","maxBodyCapture","disable","isEnabled","getEntries","getHttpEntries","filter","e","type","getWebSocketEntries","getEntry","id","find","clear","onEntry","callback","add","delete","_notify","entry","cb","_trimEntries","length","shift","_recordStart","url","method","headers","body","bodySize","requestHeaders","map","h","key","value","requestBody","slice","undefined","requestBodySize","status","statusText","responseHeaders","responseBodySize","startTime","performance","now","endTime","duration","curl","push","_recordEnd","error","responseBody","_recordWsOpen","protocols","readyState","messages","messagesSent","messagesReceived","bytesSent","bytesReceived","_recordWsConnected","_recordWsMessage","direction","data","size","isBinary","timestamp","_recordWsClose","code","reason","closeCode","closeReason","_recordWsError","NetworkInspector"],"sourceRoot":"../../src","sources":["NetworkInspector.js"],"mappings":"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","ignoreList":[]}
|
|
2
|
+
O,MAAMuD,gBAAgB,GAAG,IAAInF,oBAAoB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroCronet.nitro.
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroCronet.nitro.ts"],"mappings":"","ignoreList":[]}
|
|
2
|
+
":[]}
|