react-native-nitro-fetch 1.3.0 → 1.3.2
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/android/build.gradle +12 -0
- package/android/src/main/java/com/margelo/nitro/nitrofetch/AutoPrefetcher.kt +258 -82
- package/android/src/main/java/com/margelo/nitro/nitrofetch/NitroFetchClient.kt +4 -4
- package/ios/NitroAutoPrefetcher.h +21 -0
- package/ios/NitroAutoPrefetcher.swift +292 -74
- package/ios/NitroFetchClient.swift +4 -3
- package/lib/module/CurlGenerator.js.map +2 -1
- package/lib/module/NitroCronet.nitro.js.map +1 -1
- package/lib/module/NitroFetch.nitro.js.map +1 -1
- package/lib/module/Request.js.map +2 -1
- package/lib/module/Response.js.map +2 -1
- package/lib/module/fetch.js +30 -11
- package/lib/module/fetch.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +0 -1
- package/lib/module/index.web.js.map +2 -1
- package/lib/module/tokenRefresh.js +1 -4
- package/lib/module/tokenRefresh.js.map +2 -1
- package/lib/module/utf8.js.map +2 -1
- package/lib/typescript/src/NitroFetch.nitro.d.ts +1 -0
- package/lib/typescript/src/NitroFetch.nitro.d.ts.map +1 -1
- package/lib/typescript/src/fetch.d.ts +4 -1
- package/lib/typescript/src/fetch.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/tokenRefresh.d.ts +14 -0
- package/lib/typescript/src/tokenRefresh.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JNitroRequest.hpp +5 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrofetch/NitroRequest.kt +5 -2
- package/nitrogen/generated/ios/swift/NitroRequest.swift +19 -1
- package/nitrogen/generated/shared/c++/NitroRequest.hpp +5 -1
- package/package.json +1 -1
- package/src/CurlGenerator.js +28 -0
- package/src/Headers.js +119 -0
- package/src/HermesProfiler.js +20 -0
- package/src/NetworkInspector.js +175 -0
- package/src/NitroCronet.nitro.js +1 -0
- package/src/NitroFetch.nitro.js +1 -0
- package/src/NitroFetch.nitro.ts +3 -0
- package/src/NitroInstances.js +7 -0
- package/src/Request.js +176 -0
- package/src/Response.js +260 -0
- package/src/fetch.js +787 -0
- package/src/fetch.ts +55 -17
- package/src/index.js +25 -0
- package/src/index.tsx +1 -0
- package/src/index.web.js +106 -0
- package/src/tokenRefresh.js +102 -0
- package/src/tokenRefresh.ts +16 -0
- package/src/utf8.js +41 -0
|
@@ -20,8 +20,80 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
20
20
|
url: String,
|
|
21
21
|
prefetchKey: String,
|
|
22
22
|
headers: [String: String]
|
|
23
|
+
) {
|
|
24
|
+
registerPrefetchInternal(
|
|
25
|
+
url: url, prefetchKey: prefetchKey, headers: headers,
|
|
26
|
+
method: nil, bodyString: nil, bodyBytes: nil,
|
|
27
|
+
bodyFormData: nil, timeoutMs: nil, followRedirects: nil,
|
|
28
|
+
prefetchCacheTtlMs: nil
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@objc(registerPrefetchWithURL:prefetchKey:headers:method:bodyString:bodyBytes:bodyFormData:timeoutMs:followRedirects:)
|
|
33
|
+
public static func registerPrefetch(
|
|
34
|
+
url: String,
|
|
35
|
+
prefetchKey: String,
|
|
36
|
+
headers: [String: String],
|
|
37
|
+
method: String?,
|
|
38
|
+
bodyString: String?,
|
|
39
|
+
bodyBytes: String?,
|
|
40
|
+
bodyFormData: [[String: String]]?,
|
|
41
|
+
timeoutMs: NSNumber?,
|
|
42
|
+
followRedirects: NSNumber?
|
|
43
|
+
) {
|
|
44
|
+
registerPrefetchInternal(
|
|
45
|
+
url: url, prefetchKey: prefetchKey, headers: headers,
|
|
46
|
+
method: method, bodyString: bodyString, bodyBytes: bodyBytes,
|
|
47
|
+
bodyFormData: bodyFormData,
|
|
48
|
+
timeoutMs: timeoutMs?.doubleValue,
|
|
49
|
+
followRedirects: followRedirects?.boolValue,
|
|
50
|
+
prefetchCacheTtlMs: nil
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@objc(registerPrefetchWithURL:prefetchKey:headers:method:bodyString:bodyBytes:bodyFormData:timeoutMs:followRedirects:prefetchCacheTtlMs:)
|
|
55
|
+
public static func registerPrefetch(
|
|
56
|
+
url: String,
|
|
57
|
+
prefetchKey: String,
|
|
58
|
+
headers: [String: String],
|
|
59
|
+
method: String?,
|
|
60
|
+
bodyString: String?,
|
|
61
|
+
bodyBytes: String?,
|
|
62
|
+
bodyFormData: [[String: String]]?,
|
|
63
|
+
timeoutMs: NSNumber?,
|
|
64
|
+
followRedirects: NSNumber?,
|
|
65
|
+
prefetchCacheTtlMs: NSNumber?
|
|
66
|
+
) {
|
|
67
|
+
registerPrefetchInternal(
|
|
68
|
+
url: url, prefetchKey: prefetchKey, headers: headers,
|
|
69
|
+
method: method, bodyString: bodyString, bodyBytes: bodyBytes,
|
|
70
|
+
bodyFormData: bodyFormData,
|
|
71
|
+
timeoutMs: timeoutMs?.doubleValue,
|
|
72
|
+
followRedirects: followRedirects?.boolValue,
|
|
73
|
+
prefetchCacheTtlMs: prefetchCacheTtlMs?.doubleValue
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private static func registerPrefetchInternal(
|
|
78
|
+
url: String,
|
|
79
|
+
prefetchKey: String,
|
|
80
|
+
headers: [String: String],
|
|
81
|
+
method: String?,
|
|
82
|
+
bodyString: String?,
|
|
83
|
+
bodyBytes: String?,
|
|
84
|
+
bodyFormData: [[String: String]]?,
|
|
85
|
+
timeoutMs: Double?,
|
|
86
|
+
followRedirects: Bool?,
|
|
87
|
+
prefetchCacheTtlMs: Double?
|
|
23
88
|
) {
|
|
24
89
|
if url.isEmpty || prefetchKey.isEmpty { return }
|
|
90
|
+
let entry = buildEntryDict(
|
|
91
|
+
url: url, prefetchKey: prefetchKey, headers: headers,
|
|
92
|
+
method: method, bodyString: bodyString, bodyBytes: bodyBytes,
|
|
93
|
+
bodyFormData: bodyFormData, timeoutMs: timeoutMs,
|
|
94
|
+
followRedirects: followRedirects,
|
|
95
|
+
prefetchCacheTtlMs: prefetchCacheTtlMs
|
|
96
|
+
)
|
|
25
97
|
let userDefaults = UserDefaults(suiteName: suiteName) ?? UserDefaults.standard
|
|
26
98
|
|
|
27
99
|
var arr: [[String: Any]] = []
|
|
@@ -32,40 +104,21 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
32
104
|
arr = parsed
|
|
33
105
|
}
|
|
34
106
|
arr.removeAll { ($0["prefetchKey"] as? String) == prefetchKey }
|
|
35
|
-
arr.append(
|
|
36
|
-
"url": url,
|
|
37
|
-
"prefetchKey": prefetchKey,
|
|
38
|
-
"headers": headers,
|
|
39
|
-
])
|
|
107
|
+
arr.append(entry)
|
|
40
108
|
if let data = try? JSONSerialization.data(withJSONObject: arr),
|
|
41
109
|
let str = String(data: data, encoding: .utf8) {
|
|
42
110
|
userDefaults.set(str, forKey: queueKey)
|
|
43
111
|
}
|
|
44
112
|
|
|
45
113
|
if initialized {
|
|
46
|
-
// Late path — apply cached
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
!cacheRaw.isEmpty,
|
|
50
|
-
let cacheData = cacheRaw.data(using: .utf8),
|
|
51
|
-
let cacheObj = try? JSONSerialization.jsonObject(with: cacheData) as? [String: String] {
|
|
52
|
-
tokenHeaders = cacheObj
|
|
53
|
-
}
|
|
114
|
+
// Late path — apply cached tokens + kick immediate prefetch
|
|
115
|
+
let tokens = deserializeCache(
|
|
116
|
+
NitroFetchSecureAtRest.decryptedString(forKey: tokenCacheKey, defaults: userDefaults))
|
|
54
117
|
var merged: [String: String] = headers
|
|
55
|
-
for (k, v) in
|
|
118
|
+
for (k, v) in tokens.headers { merged[k] = v }
|
|
56
119
|
var hdrs: [NitroHeader] = merged.map { NitroHeader(key: $0.key, value: $0.value) }
|
|
57
120
|
hdrs.append(NitroHeader(key: "prefetchKey", value: prefetchKey))
|
|
58
|
-
let req =
|
|
59
|
-
url: url,
|
|
60
|
-
method: nil,
|
|
61
|
-
headers: hdrs,
|
|
62
|
-
bodyString: nil,
|
|
63
|
-
bodyBytes: nil,
|
|
64
|
-
bodyFormData: nil,
|
|
65
|
-
timeoutMs: nil,
|
|
66
|
-
followRedirects: true,
|
|
67
|
-
requestId: nil
|
|
68
|
-
)
|
|
121
|
+
let req = buildNitroRequest(from: entry, mergedHeaders: hdrs, tokens: tokens)
|
|
69
122
|
Task {
|
|
70
123
|
do { try await NitroFetchClient.prefetchStatic(req) } catch { /* best-effort */ }
|
|
71
124
|
}
|
|
@@ -85,8 +138,8 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
85
138
|
let refreshRaw = NitroFetchSecureAtRest.decryptedString(forKey: tokenRefreshKey, defaults: userDefaults)
|
|
86
139
|
|
|
87
140
|
Task {
|
|
88
|
-
// Resolve
|
|
89
|
-
let
|
|
141
|
+
// Resolve tokens (may require a network call)
|
|
142
|
+
let tokens: TokenRefreshResult
|
|
90
143
|
if let refreshRaw = refreshRaw,
|
|
91
144
|
!refreshRaw.isEmpty,
|
|
92
145
|
let refreshData = refreshRaw.data(using: .utf8),
|
|
@@ -96,35 +149,29 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
96
149
|
print("[NitroFetch][TokenRefresh] Calling refresh endpoint: \(refreshURL)")
|
|
97
150
|
let refreshed = try? await callTokenRefresh(config: refreshObj)
|
|
98
151
|
if let refreshed = refreshed {
|
|
99
|
-
print("[NitroFetch][TokenRefresh] ✅ Success — got \(refreshed.count) header(s)")
|
|
100
|
-
for (k, v) in refreshed { print("[NitroFetch][TokenRefresh] \(k): \(v)") }
|
|
101
|
-
// Cache fresh
|
|
102
|
-
if let
|
|
103
|
-
let cacheStr = String(data: cacheData, encoding: .utf8) {
|
|
152
|
+
print("[NitroFetch][TokenRefresh] ✅ Success — got \(refreshed.headers.count) header(s)")
|
|
153
|
+
for (k, v) in refreshed.headers { print("[NitroFetch][TokenRefresh] \(k): \(v)") }
|
|
154
|
+
// Cache fresh tokens for useStoredHeaders fallback on next cold start
|
|
155
|
+
if let cacheStr = serializeCache(refreshed) {
|
|
104
156
|
try? NitroFetchSecureAtRest.setEncrypted(cacheStr, forKey: tokenCacheKey, defaults: userDefaults)
|
|
105
157
|
}
|
|
106
|
-
|
|
158
|
+
tokens = refreshed
|
|
107
159
|
} else {
|
|
108
160
|
print("[NitroFetch][TokenRefresh] ❌ Refresh failed — onFailure: \(onFailure)")
|
|
109
161
|
if onFailure == "skip" {
|
|
110
162
|
print("[NitroFetch][TokenRefresh] Skipping all prefetches")
|
|
111
163
|
return
|
|
112
164
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
let cacheObj = try? JSONSerialization.jsonObject(with: cacheData) as? [String: String] {
|
|
118
|
-
cached = cacheObj
|
|
119
|
-
}
|
|
120
|
-
print("[NitroFetch][TokenRefresh] Using cached headers (\(cached.count) header(s))")
|
|
121
|
-
tokenHeaders = cached
|
|
165
|
+
let cached = deserializeCache(
|
|
166
|
+
NitroFetchSecureAtRest.decryptedString(forKey: tokenCacheKey, defaults: userDefaults))
|
|
167
|
+
print("[NitroFetch][TokenRefresh] Using cached headers (\(cached.headers.count) header(s))")
|
|
168
|
+
tokens = cached
|
|
122
169
|
}
|
|
123
170
|
} else {
|
|
124
|
-
|
|
171
|
+
tokens = .empty
|
|
125
172
|
}
|
|
126
173
|
|
|
127
|
-
// Launch a prefetch task per entry with merged headers
|
|
174
|
+
// Launch a prefetch task per entry with merged headers + body/form injection
|
|
128
175
|
print("[NitroFetch][TokenRefresh] Injecting token headers into \(arr.count) prefetch URL(s)")
|
|
129
176
|
for item in arr {
|
|
130
177
|
guard let obj = item as? [String: Any] else { continue }
|
|
@@ -135,7 +182,7 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
135
182
|
// Merge: static headers first, token headers override
|
|
136
183
|
var merged: [String: String] = [:]
|
|
137
184
|
for (k, v) in headersDict { merged[k] = String(describing: v) }
|
|
138
|
-
for (k, v) in
|
|
185
|
+
for (k, v) in tokens.headers { merged[k] = v }
|
|
139
186
|
|
|
140
187
|
var headers: [NitroHeader] = merged.map { NitroHeader(key: $0.key, value: $0.value) }
|
|
141
188
|
headers.append(NitroHeader(key: "prefetchKey", value: prefetchKey))
|
|
@@ -143,17 +190,7 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
143
190
|
print("[NitroFetch][TokenRefresh] Prefetching \(url) with \(merged.count) header(s)")
|
|
144
191
|
for (k, v) in merged { print("[NitroFetch][TokenRefresh] \(k): \(v)") }
|
|
145
192
|
|
|
146
|
-
let req =
|
|
147
|
-
url: url,
|
|
148
|
-
method: nil,
|
|
149
|
-
headers: headers,
|
|
150
|
-
bodyString: nil,
|
|
151
|
-
bodyBytes: nil,
|
|
152
|
-
bodyFormData: nil,
|
|
153
|
-
timeoutMs: nil,
|
|
154
|
-
followRedirects: true,
|
|
155
|
-
requestId: nil
|
|
156
|
-
)
|
|
193
|
+
let req = buildNitroRequest(from: obj, mergedHeaders: headers, tokens: tokens)
|
|
157
194
|
Task {
|
|
158
195
|
do { try await NitroFetchClient.prefetchStatic(req) } catch { /* ignore – best effort */ }
|
|
159
196
|
}
|
|
@@ -161,9 +198,92 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
161
198
|
}
|
|
162
199
|
}
|
|
163
200
|
|
|
201
|
+
private static func buildEntryDict(
|
|
202
|
+
url: String,
|
|
203
|
+
prefetchKey: String,
|
|
204
|
+
headers: [String: String],
|
|
205
|
+
method: String?,
|
|
206
|
+
bodyString: String?,
|
|
207
|
+
bodyBytes: String?,
|
|
208
|
+
bodyFormData: [[String: String]]?,
|
|
209
|
+
timeoutMs: Double?,
|
|
210
|
+
followRedirects: Bool?,
|
|
211
|
+
prefetchCacheTtlMs: Double? = nil
|
|
212
|
+
) -> [String: Any] {
|
|
213
|
+
var entry: [String: Any] = [
|
|
214
|
+
"url": url,
|
|
215
|
+
"prefetchKey": prefetchKey,
|
|
216
|
+
"headers": headers,
|
|
217
|
+
]
|
|
218
|
+
if let method = method, !method.isEmpty, method != "GET" { entry["method"] = method }
|
|
219
|
+
if let bodyString = bodyString { entry["bodyString"] = bodyString }
|
|
220
|
+
if let bodyBytes = bodyBytes { entry["bodyBytes"] = bodyBytes }
|
|
221
|
+
if let parts = bodyFormData, !parts.isEmpty {
|
|
222
|
+
entry["bodyFormData"] = parts.map { part -> [String: String] in
|
|
223
|
+
var clean: [String: String] = [:]
|
|
224
|
+
if let v = part["name"] { clean["name"] = v }
|
|
225
|
+
if let v = part["value"] { clean["value"] = v }
|
|
226
|
+
if let v = part["fileUri"] { clean["fileUri"] = v }
|
|
227
|
+
if let v = part["fileName"] { clean["fileName"] = v }
|
|
228
|
+
if let v = part["mimeType"] { clean["mimeType"] = v }
|
|
229
|
+
return clean
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if let timeoutMs = timeoutMs { entry["timeoutMs"] = timeoutMs }
|
|
233
|
+
if followRedirects == false { entry["followRedirects"] = false }
|
|
234
|
+
if let prefetchCacheTtlMs = prefetchCacheTtlMs { entry["prefetchCacheTtlMs"] = prefetchCacheTtlMs }
|
|
235
|
+
return entry
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
private static func buildNitroRequest(
|
|
239
|
+
from entry: [String: Any],
|
|
240
|
+
mergedHeaders: [NitroHeader],
|
|
241
|
+
tokens: TokenRefreshResult = .empty
|
|
242
|
+
) -> NitroRequest {
|
|
243
|
+
let url = (entry["url"] as? String) ?? ""
|
|
244
|
+
let methodStr = entry["method"] as? String
|
|
245
|
+
let method: NitroRequestMethod? = methodStr.flatMap { NitroRequestMethod(fromString: $0) }
|
|
246
|
+
let bodyString = injectBodyFields(entry["bodyString"] as? String, fields: tokens.bodyFields)
|
|
247
|
+
let bodyBytes = entry["bodyBytes"] as? String
|
|
248
|
+
let timeoutMs = (entry["timeoutMs"] as? NSNumber)?.doubleValue
|
|
249
|
+
let followRedirects = (entry["followRedirects"] as? Bool) ?? true
|
|
250
|
+
let prefetchCacheTtlMs = (entry["prefetchCacheTtlMs"] as? NSNumber)?.doubleValue
|
|
251
|
+
|
|
252
|
+
let baseParts: [NitroFormDataPart] = (entry["bodyFormData"] as? [[String: Any]])?.map { p in
|
|
253
|
+
NitroFormDataPart(
|
|
254
|
+
name: (p["name"] as? String) ?? "",
|
|
255
|
+
value: p["value"] as? String,
|
|
256
|
+
fileUri: p["fileUri"] as? String,
|
|
257
|
+
fileName: p["fileName"] as? String,
|
|
258
|
+
mimeType: p["mimeType"] as? String
|
|
259
|
+
)
|
|
260
|
+
} ?? []
|
|
261
|
+
let formData: [NitroFormDataPart]? = injectFormFields(baseParts, fields: tokens.formFields)
|
|
262
|
+
|
|
263
|
+
return NitroRequest(
|
|
264
|
+
url: url,
|
|
265
|
+
method: method,
|
|
266
|
+
headers: mergedHeaders,
|
|
267
|
+
bodyString: bodyString,
|
|
268
|
+
bodyBytes: bodyBytes,
|
|
269
|
+
bodyFormData: formData,
|
|
270
|
+
timeoutMs: timeoutMs,
|
|
271
|
+
followRedirects: followRedirects,
|
|
272
|
+
prefetchCacheTtlMs: prefetchCacheTtlMs,
|
|
273
|
+
requestId: nil
|
|
274
|
+
)
|
|
275
|
+
}
|
|
276
|
+
|
|
164
277
|
// MARK: - Token refresh
|
|
165
278
|
|
|
166
|
-
|
|
279
|
+
struct TokenRefreshResult {
|
|
280
|
+
var headers: [String: String]
|
|
281
|
+
var bodyFields: [String: String]
|
|
282
|
+
var formFields: [String: String]
|
|
283
|
+
static let empty = TokenRefreshResult(headers: [:], bodyFields: [:], formFields: [:])
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
private static func callTokenRefresh(config: [String: Any]) async throws -> TokenRefreshResult {
|
|
167
287
|
guard let urlStr = config["url"] as? String,
|
|
168
288
|
let url = URL(string: urlStr) else {
|
|
169
289
|
throw NSError(domain: "NitroAutoPrefetcher", code: -1,
|
|
@@ -193,18 +313,22 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
193
313
|
private static func parseTokenResponse(
|
|
194
314
|
data: Data,
|
|
195
315
|
config: [String: Any]
|
|
196
|
-
) throws ->
|
|
316
|
+
) throws -> TokenRefreshResult {
|
|
197
317
|
let responseType = config["responseType"] as? String ?? "json"
|
|
198
|
-
var
|
|
318
|
+
var headers: [String: String] = [:]
|
|
319
|
+
var bodyFields: [String: String] = [:]
|
|
320
|
+
var formFields: [String: String] = [:]
|
|
199
321
|
|
|
200
322
|
if responseType == "text" {
|
|
201
323
|
let text = String(data: data, encoding: .utf8) ?? ""
|
|
202
324
|
if let textHeader = config["textHeader"] as? String {
|
|
203
|
-
|
|
325
|
+
headers[textHeader] = (config["textTemplate"] as? String)
|
|
204
326
|
.map { $0.replacingOccurrences(of: "{{value}}", with: text) }
|
|
205
327
|
?? text
|
|
206
328
|
}
|
|
207
|
-
|
|
329
|
+
if let bodyTextPath = config["bodyTextPath"] as? String { bodyFields[bodyTextPath] = text }
|
|
330
|
+
if let formDataTextField = config["formDataTextField"] as? String { formFields[formDataTextField] = text }
|
|
331
|
+
return TokenRefreshResult(headers: headers, bodyFields: bodyFields, formFields: formFields)
|
|
208
332
|
}
|
|
209
333
|
|
|
210
334
|
guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
|
|
@@ -212,17 +336,9 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
212
336
|
userInfo: [NSLocalizedDescriptionKey: "Token refresh: invalid JSON response"])
|
|
213
337
|
}
|
|
214
338
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
let header = m["header"] as? String else { continue }
|
|
219
|
-
if let value = getNestedField(json, dotPath: jsonPath) {
|
|
220
|
-
result[header] = (m["valueTemplate"] as? String)
|
|
221
|
-
.map { $0.replacingOccurrences(of: "{{value}}", with: value) }
|
|
222
|
-
?? value
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
339
|
+
collectMappings(json, config["mappings"] as? [[String: Any]], destKey: "header", into: &headers)
|
|
340
|
+
collectMappings(json, config["bodyMappings"] as? [[String: Any]], destKey: "bodyPath", into: &bodyFields)
|
|
341
|
+
collectMappings(json, config["formDataMappings"] as? [[String: Any]], destKey: "field", into: &formFields)
|
|
226
342
|
|
|
227
343
|
if let compositeHeaders = config["compositeHeaders"] as? [[String: Any]] {
|
|
228
344
|
for comp in compositeHeaders {
|
|
@@ -234,11 +350,29 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
234
350
|
let val = getNestedField(json, dotPath: jsonPath) ?? ""
|
|
235
351
|
built = built.replacingOccurrences(of: "{{\(ph)}}", with: val)
|
|
236
352
|
}
|
|
237
|
-
|
|
353
|
+
headers[header] = built
|
|
238
354
|
}
|
|
239
355
|
}
|
|
240
356
|
|
|
241
|
-
return
|
|
357
|
+
return TokenRefreshResult(headers: headers, bodyFields: bodyFields, formFields: formFields)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// jsonPath -> value (optionally templated), keyed by each mapping's `destKey` field.
|
|
361
|
+
private static func collectMappings(
|
|
362
|
+
_ json: [String: Any],
|
|
363
|
+
_ arr: [[String: Any]]?,
|
|
364
|
+
destKey: String,
|
|
365
|
+
into: inout [String: String]
|
|
366
|
+
) {
|
|
367
|
+
guard let arr = arr else { return }
|
|
368
|
+
for m in arr {
|
|
369
|
+
guard let jsonPath = m["jsonPath"] as? String,
|
|
370
|
+
let dest = m[destKey] as? String,
|
|
371
|
+
let value = getNestedField(json, dotPath: jsonPath) else { continue }
|
|
372
|
+
into[dest] = (m["valueTemplate"] as? String)
|
|
373
|
+
.map { $0.replacingOccurrences(of: "{{value}}", with: value) }
|
|
374
|
+
?? value
|
|
375
|
+
}
|
|
242
376
|
}
|
|
243
377
|
|
|
244
378
|
private static func getNestedField(_ obj: [String: Any], dotPath: String) -> String? {
|
|
@@ -252,6 +386,90 @@ public final class NitroAutoPrefetcher: NSObject {
|
|
|
252
386
|
if let s = current as? String { return s }
|
|
253
387
|
return String(describing: current)
|
|
254
388
|
}
|
|
389
|
+
|
|
390
|
+
private static func setNestedField(_ root: inout [String: Any], dotPath: String, value: String) {
|
|
391
|
+
let parts = dotPath.split(separator: ".").map(String.init)
|
|
392
|
+
guard !parts.isEmpty else { return }
|
|
393
|
+
if parts.count == 1 {
|
|
394
|
+
root[parts[0]] = value
|
|
395
|
+
return
|
|
396
|
+
}
|
|
397
|
+
var child = (root[parts[0]] as? [String: Any]) ?? [:]
|
|
398
|
+
setNestedField(&child, dotPath: parts.dropFirst().joined(separator: "."), value: value)
|
|
399
|
+
root[parts[0]] = child
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// MARK: - Body / form-data injection
|
|
403
|
+
|
|
404
|
+
private static func injectBodyFields(_ rawBody: String?, fields: [String: String]) -> String? {
|
|
405
|
+
if fields.isEmpty { return rawBody }
|
|
406
|
+
// Don't synthesize a JSON body where there wasn't one (e.g. a GET or a
|
|
407
|
+
// form-data request) — only rewrite an existing JSON body.
|
|
408
|
+
guard let rawBody = rawBody, !rawBody.isEmpty else { return rawBody }
|
|
409
|
+
guard let data = rawBody.data(using: .utf8),
|
|
410
|
+
let obj = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
|
|
411
|
+
return rawBody
|
|
412
|
+
}
|
|
413
|
+
var root = obj
|
|
414
|
+
for (path, value) in fields {
|
|
415
|
+
setNestedField(&root, dotPath: path, value: value)
|
|
416
|
+
}
|
|
417
|
+
guard let out = try? JSONSerialization.data(withJSONObject: root),
|
|
418
|
+
let str = String(data: out, encoding: .utf8) else { return rawBody }
|
|
419
|
+
return str
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private static func injectFormFields(
|
|
423
|
+
_ parts: [NitroFormDataPart],
|
|
424
|
+
fields: [String: String]
|
|
425
|
+
) -> [NitroFormDataPart]? {
|
|
426
|
+
if fields.isEmpty { return parts.isEmpty ? nil : parts }
|
|
427
|
+
// Don't synthesize a multipart body where there wasn't one.
|
|
428
|
+
if parts.isEmpty { return nil }
|
|
429
|
+
var result = parts
|
|
430
|
+
for (name, value) in fields {
|
|
431
|
+
if let idx = result.firstIndex(where: { $0.name == name }) {
|
|
432
|
+
let old = result[idx]
|
|
433
|
+
result[idx] = NitroFormDataPart(
|
|
434
|
+
name: old.name, value: value,
|
|
435
|
+
fileUri: nil, fileName: old.fileName, mimeType: old.mimeType
|
|
436
|
+
)
|
|
437
|
+
} else {
|
|
438
|
+
result.append(NitroFormDataPart(name: name, value: value, fileUri: nil, fileName: nil, mimeType: nil))
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return result
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// MARK: - Structured token cache (back-compatible with old flat-header maps)
|
|
445
|
+
|
|
446
|
+
private static func serializeCache(_ result: TokenRefreshResult) -> String? {
|
|
447
|
+
let obj: [String: Any] = [
|
|
448
|
+
"headers": result.headers,
|
|
449
|
+
"bodyFields": result.bodyFields,
|
|
450
|
+
"formFields": result.formFields,
|
|
451
|
+
]
|
|
452
|
+
guard let data = try? JSONSerialization.data(withJSONObject: obj) else { return nil }
|
|
453
|
+
return String(data: data, encoding: .utf8)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private static func deserializeCache(_ raw: String?) -> TokenRefreshResult {
|
|
457
|
+
guard let raw = raw, !raw.isEmpty,
|
|
458
|
+
let data = raw.data(using: .utf8),
|
|
459
|
+
let obj = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
|
|
460
|
+
return .empty
|
|
461
|
+
}
|
|
462
|
+
if obj["headers"] == nil && obj["bodyFields"] == nil && obj["formFields"] == nil {
|
|
463
|
+
// Old flat-header-map cache.
|
|
464
|
+
let headers = (obj as? [String: String]) ?? [:]
|
|
465
|
+
return TokenRefreshResult(headers: headers, bodyFields: [:], formFields: [:])
|
|
466
|
+
}
|
|
467
|
+
return TokenRefreshResult(
|
|
468
|
+
headers: (obj["headers"] as? [String: String]) ?? [:],
|
|
469
|
+
bodyFields: (obj["bodyFields"] as? [String: String]) ?? [:],
|
|
470
|
+
formFields: (obj["formFields"] as? [String: String]) ?? [:]
|
|
471
|
+
)
|
|
472
|
+
}
|
|
255
473
|
}
|
|
256
474
|
|
|
257
475
|
// Expose a C-ABI symbol the ObjC++ file can call
|
|
@@ -119,7 +119,7 @@ final class NitroFetchClient: HybridNitroFetchClientSpec {
|
|
|
119
119
|
public class func requestStatic(_ req: NitroRequest) async throws -> NitroResponse {
|
|
120
120
|
if let key = findPrefetchKey(req) {
|
|
121
121
|
// If a prefetched result is fresh, return immediately
|
|
122
|
-
if let cached = FetchCache.getResultIfFresh(key, maxAgeMs: 5_000) {
|
|
122
|
+
if let cached = FetchCache.getResultIfFresh(key, maxAgeMs: Int64(req.prefetchCacheTtlMs ?? 5_000)) {
|
|
123
123
|
var headers = cached.headers ?? []
|
|
124
124
|
headers.append(NitroHeader(key: "nitroPrefetched", value: "true"))
|
|
125
125
|
return NitroResponse(url: cached.url,
|
|
@@ -267,7 +267,7 @@ final class NitroFetchClient: HybridNitroFetchClientSpec {
|
|
|
267
267
|
throw NSError(domain: "NitroFetch", code: -2, userInfo: [NSLocalizedDescriptionKey: "prefetch: missing 'prefetchKey' header"])
|
|
268
268
|
}
|
|
269
269
|
|
|
270
|
-
if FetchCache.getResultIfFresh(key, maxAgeMs: 5_000) != nil {
|
|
270
|
+
if FetchCache.getResultIfFresh(key, maxAgeMs: Int64(req.prefetchCacheTtlMs ?? 5_000)) != nil {
|
|
271
271
|
return // already have a fresh result
|
|
272
272
|
}
|
|
273
273
|
|
|
@@ -310,7 +310,8 @@ final class NitroFetchClient: HybridNitroFetchClientSpec {
|
|
|
310
310
|
}
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
|
-
|
|
313
|
+
|
|
314
|
+
|
|
314
315
|
private static func reqToHttpMethod(_ req: NitroRequest) -> String? {
|
|
315
316
|
return req.method?.stringValue
|
|
316
317
|
}
|
|
@@ -1 +1,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.
|
|
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.js"],"mappings":";;AAAA,SAASA,WAAWA,CAACC,GAAG,EAAE;EACxB,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;AACA,OAAO,SAASC,YAAYA,CAACC,OAAO,EAAE;EACpC,MAAMC,KAAK,GAAG,CAAC,MAAM,CAAC;EACtB,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;EACA,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;EACA,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;EACA,IAAIX,OAAO,CAACc,OAAO,EAAEb,KAAK,CAACE,IAAI,CAAC,IAAI,CAAC;EACrC,IAAIH,OAAO,CAACe,UAAU,EAAEd,KAAK,CAACE,IAAI,CAAC,cAAc,CAAC;EAClDF,KAAK,CAACE,IAAI,CAACR,WAAW,CAACK,OAAO,CAACgB,GAAG,CAAC,CAAC;EACpC,OAAOf,KAAK,CAACgB,IAAI,CAAC,GAAG,CAAC;AACxB","ignoreList":[]}
|
|
2
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroCronet.nitro.
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroCronet.nitro.js"],"mappings":";;AAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroFetch.nitro.
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["NitroFetch.nitro.js"],"mappings":";;AAAA","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":["NitroHeaders","stringToUTF8","utf8ToString","NitroRequest","_bodyUsed","constructor","input","init","url","method","toUpperCase","headers","redirect","signal","cache","credentials","mode","referrer","referrerPolicy","integrity","keepalive","_body","body","undefined","URL","String","AbortController","destination","bodyUsed","bodyBytes","_getBodyBytes","ReadableStream","start","controller","enqueue","Uint8Array","close","_throwIfBodyUsed","TypeError","encoded","buffer","slice","byteOffset","byteLength","ArrayBuffer","isView","view","_getBodyString","bytes","text","json","t","JSON","parse","arrayBuffer","blob","contentType","get","Blob","type","clone","formData"],"sourceRoot":"../../src","sources":["Request.
|
|
1
|
+
{"version":3,"names":["NitroHeaders","stringToUTF8","utf8ToString","NitroRequest","_bodyUsed","constructor","input","init","url","method","toUpperCase","headers","redirect","signal","cache","credentials","mode","referrer","referrerPolicy","integrity","keepalive","_body","body","undefined","URL","String","AbortController","destination","bodyUsed","bodyBytes","_getBodyBytes","ReadableStream","start","controller","enqueue","Uint8Array","close","_throwIfBodyUsed","TypeError","encoded","buffer","slice","byteOffset","byteLength","ArrayBuffer","isView","view","_getBodyString","bytes","text","json","t","JSON","parse","arrayBuffer","blob","contentType","get","Blob","type","clone","formData"],"sourceRoot":"../../src","sources":["Request.js"],"mappings":"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","ignoreList":[]}
|
|
2
|
+
CAAC;EACpE;AACF","ignoreList":[]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
{"version":3,"names":["NitroHeaders","stringToUTF8","utf8ToString","isNitroResponseInit","arg","NitroResponse","_bodyUsed","constructor","bodyOrInit","init","nitroInit","url","ok","status","statusText","redirected","type","headers","_bodyBytes","bodyBytes","_bodyString","bodyString","_bodyStream","body","ArrayBuffer","isView","view","buffer","slice","byteOffset","byteLength","ReadableStream","URLSearchParams","toString","has","set","Blob","stream","bodyUsed","bytes","_getBodyBytes","start","controller","enqueue","Uint8Array","close","_throwIfBodyUsed","TypeError","encoded","undefined","_getBodyString","text","reader","getReader","chunks","done","value","read","push","totalLen","c","merged","offset","json","t","JSON","parse","arrayBuffer","blob","bodyStr","contentType","get","clone","formData","error","data","stringify","redirect","validStatuses","includes","RangeError","join"],"sourceRoot":"../../src","sources":["Response.
|
|
1
|
+
{"version":3,"names":["NitroHeaders","stringToUTF8","utf8ToString","isNitroResponseInit","arg","NitroResponse","_bodyUsed","constructor","bodyOrInit","init","nitroInit","url","ok","status","statusText","redirected","type","headers","_bodyBytes","bodyBytes","_bodyString","bodyString","_bodyStream","body","ArrayBuffer","isView","view","buffer","slice","byteOffset","byteLength","ReadableStream","URLSearchParams","toString","has","set","Blob","stream","bodyUsed","bytes","_getBodyBytes","start","controller","enqueue","Uint8Array","close","_throwIfBodyUsed","TypeError","encoded","undefined","_getBodyString","text","reader","getReader","chunks","done","value","read","push","totalLen","c","merged","offset","json","t","JSON","parse","arrayBuffer","blob","bodyStr","contentType","get","clone","formData","error","data","stringify","redirect","validStatuses","includes","RangeError","join"],"sourceRoot":"../../src","sources":["Response.js"],"mappings":"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","ignoreList":[]}
|
|
2
|
+
C,CAAC;EACJ;AACF","ignoreList":[]}
|