expo-modules-core 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/CHANGELOG.md +23 -0
- package/ExpoModulesCore.podspec +26 -5
- package/android/ExpoModulesCorePlugin.gradle +4 -0
- package/android/build.gradle +13 -14
- package/android/src/main/AndroidManifest.xml +1 -2
- package/android/src/main/cpp/ExpoModulesHostObject.cpp +3 -0
- package/android/src/main/cpp/JNIDeallocator.cpp +17 -0
- package/android/src/main/cpp/JNIDeallocator.h +25 -0
- package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +8 -1
- package/android/src/main/cpp/JSIInteropModuleRegistry.h +6 -1
- package/android/src/main/cpp/JavaCallback.cpp +9 -0
- package/android/src/main/cpp/JavaCallback.h +12 -2
- package/android/src/main/cpp/JavaScriptFunction.cpp +13 -0
- package/android/src/main/cpp/JavaScriptFunction.h +7 -1
- package/android/src/main/cpp/JavaScriptModuleObject.cpp +2 -1
- package/android/src/main/cpp/JavaScriptObject.cpp +17 -2
- package/android/src/main/cpp/JavaScriptObject.h +10 -3
- package/android/src/main/cpp/JavaScriptRuntime.cpp +5 -4
- package/android/src/main/cpp/JavaScriptRuntime.h +5 -3
- package/android/src/main/cpp/JavaScriptTypedArray.cpp +14 -0
- package/android/src/main/cpp/JavaScriptTypedArray.h +6 -0
- package/android/src/main/cpp/JavaScriptValue.cpp +32 -4
- package/android/src/main/cpp/JavaScriptValue.h +10 -3
- package/android/src/main/cpp/MethodMetadata.cpp +1 -1
- package/android/src/main/cpp/types/FrontendConverter.cpp +8 -4
- package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +14 -0
- package/android/src/main/java/expo/modules/kotlin/AppContext.kt +4 -1
- package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -3
- package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +19 -12
- package/android/src/main/java/expo/modules/kotlin/devtools/ExpoNetworkInspectOkHttpInterceptors.kt +70 -0
- package/android/src/main/java/expo/modules/kotlin/devtools/ExpoRequestCdpInterceptor.kt +72 -0
- package/android/src/main/java/expo/modules/kotlin/devtools/OkHttpHeadersExtension.kt +18 -0
- package/android/src/main/java/expo/modules/kotlin/devtools/cdp/CdpNetworkTypes.kt +257 -0
- package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +24 -15
- package/android/src/main/java/expo/modules/kotlin/jni/JSIInteropModuleRegistry.kt +8 -1
- package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +0 -4
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +0 -4
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +5 -2
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +0 -5
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +0 -4
- package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/types/ColorTypeConverter.kt +3 -0
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +1 -2
- package/android-annotation/build.gradle +2 -2
- package/android-annotation-processor/build.gradle +2 -2
- package/ios/JSI/EXJSIInstaller.h +2 -2
- package/ios/JSI/EXJSIInstaller.mm +6 -6
- package/ios/JSI/EXJavaScriptRuntime.h +0 -6
- package/ios/JSI/EXJavaScriptRuntime.mm +0 -23
- package/ios/RCTComponentData+Privates.h +17 -0
- package/ios/RCTComponentData+Privates.m +15 -0
- package/ios/Swift/AppContext.swift +20 -11
- package/ios/Swift/DevTools/CdpNetworkTypes.swift +163 -0
- package/ios/Swift/DevTools/ExpoRequestCdpInterceptor.swift +71 -0
- package/ios/Swift/DevTools/ExpoRequestInterceptorProtocol.swift +183 -0
- package/ios/Swift/DevTools/URLRequest+httpBodyData.swift +43 -0
- package/ios/Swift/ExpoRuntime.swift +28 -0
- package/ios/Swift/Modules/CoreModule.swift +7 -0
- package/ios/Swift/SharedObjects/SharedRef.swift +12 -0
- package/ios/Swift/Views/ComponentData.swift +1 -1
- package/ios/Tests/CoreModuleSpec.swift +27 -0
- package/ios/Tests/ExpoRequestCdpInterceptorSpec.swift +165 -0
- package/ios/Tests/SharedRefSpec.swift +60 -0
- package/package.json +2 -2
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
import ExpoModulesTestCore
|
|
4
|
+
|
|
5
|
+
@testable import ExpoModulesCore
|
|
6
|
+
|
|
7
|
+
final class MockCdpInterceptorDelegate: ExpoRequestCdpInterceptorDelegate {
|
|
8
|
+
var events: [String] = []
|
|
9
|
+
|
|
10
|
+
// ExpoRequestCdpInterceptorDelegate implementations
|
|
11
|
+
|
|
12
|
+
func dispatch(_ event: String) {
|
|
13
|
+
self.events.append(event)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
final class ExpoRequestCdpInterceptorSpec: ExpoSpec {
|
|
18
|
+
private let mockDelegate = MockCdpInterceptorDelegate()
|
|
19
|
+
private lazy var session: URLSession = {
|
|
20
|
+
let configuration = URLSessionConfiguration.default
|
|
21
|
+
let protocolClasses = configuration.protocolClasses
|
|
22
|
+
if var protocolClasses = protocolClasses {
|
|
23
|
+
protocolClasses.insert(ExpoRequestInterceptorProtocol.self, at: 0)
|
|
24
|
+
configuration.protocolClasses = protocolClasses
|
|
25
|
+
} else {
|
|
26
|
+
configuration.protocolClasses = [ExpoRequestInterceptorProtocol.self]
|
|
27
|
+
}
|
|
28
|
+
return URLSession(configuration: configuration)
|
|
29
|
+
}()
|
|
30
|
+
|
|
31
|
+
private func parseJSON(data: String) -> [String: Any] {
|
|
32
|
+
var result: [String: Any]?
|
|
33
|
+
if let data = data.data(using: .utf8) {
|
|
34
|
+
result = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
|
|
35
|
+
}
|
|
36
|
+
return result ?? [:]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override func spec() {
|
|
40
|
+
beforeSuite {
|
|
41
|
+
ExpoRequestCdpInterceptor.shared.dispatchQueue = DispatchQueue.main
|
|
42
|
+
ExpoRequestCdpInterceptor.shared.setDelegate(self.mockDelegate)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
beforeEach {
|
|
46
|
+
self.mockDelegate.events.removeAll()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
it("simple json data") {
|
|
50
|
+
waitUntil(timeout: .seconds(2)) { done in
|
|
51
|
+
self.session.dataTask(with: URL(string: "https://raw.githubusercontent.com/expo/expo/main/package.json")!) { (data, response, error) in
|
|
52
|
+
DispatchQueue.main.async {
|
|
53
|
+
expect(self.mockDelegate.events.count).to(equal(5))
|
|
54
|
+
|
|
55
|
+
// Network.requestWillBeSent
|
|
56
|
+
var json = self.parseJSON(data: self.mockDelegate.events[0])
|
|
57
|
+
var method = json["method"] as! String
|
|
58
|
+
var params = json["params"] as! [String: Any]
|
|
59
|
+
let request = params["request"] as! [String: Any]
|
|
60
|
+
let requestId = params["requestId"] as! String
|
|
61
|
+
expect(method).to(equal("Network.requestWillBeSent"))
|
|
62
|
+
expect(request["url"] as? String).to(equal("https://raw.githubusercontent.com/expo/expo/main/package.json"))
|
|
63
|
+
|
|
64
|
+
// Network.requestWillBeSentExtraInfo
|
|
65
|
+
json = self.parseJSON(data: self.mockDelegate.events[1])
|
|
66
|
+
method = json["method"] as! String
|
|
67
|
+
params = json["params"] as! [String: Any]
|
|
68
|
+
expect(method).to(equal("Network.requestWillBeSentExtraInfo"))
|
|
69
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
70
|
+
|
|
71
|
+
// Network.responseReceived
|
|
72
|
+
json = self.parseJSON(data: self.mockDelegate.events[2])
|
|
73
|
+
method = json["method"] as! String
|
|
74
|
+
params = json["params"] as! [String: Any]
|
|
75
|
+
let response = params["response"] as! [String: Any]
|
|
76
|
+
expect(method).to(equal("Network.responseReceived"))
|
|
77
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
78
|
+
expect(response["status"] as? Int).to(equal(200))
|
|
79
|
+
expect((response["headers"] as! [String: Any]).count).to(beGreaterThan(0))
|
|
80
|
+
|
|
81
|
+
// Network.loadingFinished
|
|
82
|
+
json = self.parseJSON(data: self.mockDelegate.events[3])
|
|
83
|
+
method = json["method"] as! String
|
|
84
|
+
params = json["params"] as! [String: Any]
|
|
85
|
+
expect(method).to(equal("Network.loadingFinished"))
|
|
86
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
87
|
+
|
|
88
|
+
// Expo(Network.receivedResponseBody)
|
|
89
|
+
json = self.parseJSON(data: self.mockDelegate.events[4])
|
|
90
|
+
method = json["method"] as! String
|
|
91
|
+
params = json["params"] as! [String: Any]
|
|
92
|
+
expect(method).to(equal("Expo(Network.receivedResponseBody)"))
|
|
93
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
94
|
+
expect(params["body"] as? String).notTo(beEmpty())
|
|
95
|
+
expect(params["base64Encoded"] as? Bool).to(beFalse())
|
|
96
|
+
|
|
97
|
+
done()
|
|
98
|
+
}
|
|
99
|
+
}.resume()
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
it("http 302 redirection") {
|
|
104
|
+
waitUntil(timeout: .seconds(2)) { done in
|
|
105
|
+
self.session.dataTask(with: URL(string: "https://github.com/expo.png")!) { (data, response, error) in
|
|
106
|
+
DispatchQueue.main.async {
|
|
107
|
+
expect(self.mockDelegate.events.count).to(equal(7))
|
|
108
|
+
|
|
109
|
+
// Network.requestWillBeSent
|
|
110
|
+
var json = self.parseJSON(data: self.mockDelegate.events[0])
|
|
111
|
+
var method = json["method"] as! String
|
|
112
|
+
var params = json["params"] as! [String: Any]
|
|
113
|
+
var request = params["request"] as! [String: Any]
|
|
114
|
+
let requestId = params["requestId"] as! String
|
|
115
|
+
expect(method).to(equal("Network.requestWillBeSent"))
|
|
116
|
+
expect(request["url"] as? String).to(equal("https://github.com/expo.png"))
|
|
117
|
+
|
|
118
|
+
// Network.requestWillBeSentExtraInfo
|
|
119
|
+
|
|
120
|
+
// Network.requestWillBeSent
|
|
121
|
+
json = self.parseJSON(data: self.mockDelegate.events[2])
|
|
122
|
+
method = json["method"] as! String
|
|
123
|
+
params = json["params"] as! [String: Any]
|
|
124
|
+
request = params["request"] as! [String: Any]
|
|
125
|
+
let redirectResponse = params["redirectResponse"] as? [String: Any]
|
|
126
|
+
expect(method).to(equal("Network.requestWillBeSent"))
|
|
127
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
128
|
+
expect(request["url"] as? String).to(beginWith("https://avatars.githubusercontent.com"))
|
|
129
|
+
expect(redirectResponse).notTo(beNil())
|
|
130
|
+
if let redirectResponse = redirectResponse {
|
|
131
|
+
expect(redirectResponse["status"] as? Int).to(equal(302))
|
|
132
|
+
expect((redirectResponse["headers"] as! [String: Any]).count).to(beGreaterThan(0))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Network.requestWillBeSentExtraInfo
|
|
136
|
+
|
|
137
|
+
// Network.responseReceived
|
|
138
|
+
json = self.parseJSON(data: self.mockDelegate.events[4])
|
|
139
|
+
method = json["method"] as! String
|
|
140
|
+
params = json["params"] as! [String: Any]
|
|
141
|
+
let response = params["response"] as! [String: Any]
|
|
142
|
+
expect(method).to(equal("Network.responseReceived"))
|
|
143
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
144
|
+
expect(response["status"] as? Int).to(equal(200))
|
|
145
|
+
expect(response["mimeType"] as? String).to(equal("image/png"))
|
|
146
|
+
expect((response["headers"] as! [String: Any]).count).to(beGreaterThan(0))
|
|
147
|
+
|
|
148
|
+
// Network.loadingFinished
|
|
149
|
+
|
|
150
|
+
// Expo(Network.receivedResponseBody)
|
|
151
|
+
json = self.parseJSON(data: self.mockDelegate.events[6])
|
|
152
|
+
method = json["method"] as! String
|
|
153
|
+
params = json["params"] as! [String: Any]
|
|
154
|
+
expect(method).to(equal("Expo(Network.receivedResponseBody)"))
|
|
155
|
+
expect(params["requestId"] as? String).to(equal(requestId))
|
|
156
|
+
expect(params["body"] as? String).notTo(beEmpty())
|
|
157
|
+
expect(params["base64Encoded"] as? Bool).to(beTrue())
|
|
158
|
+
|
|
159
|
+
done()
|
|
160
|
+
}
|
|
161
|
+
}.resume()
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import ExpoModulesTestCore
|
|
2
|
+
|
|
3
|
+
@testable import ExpoModulesCore
|
|
4
|
+
|
|
5
|
+
final class SharedRefSpec: ExpoSpec {
|
|
6
|
+
override func spec() {
|
|
7
|
+
let appContext = AppContext.create()
|
|
8
|
+
let runtime = try! appContext.runtime
|
|
9
|
+
|
|
10
|
+
beforeSuite {
|
|
11
|
+
appContext.moduleRegistry.register(moduleType: FirstModule.self)
|
|
12
|
+
appContext.moduleRegistry.register(moduleType: SecondModule.self)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
it("is a shared object") {
|
|
16
|
+
expect(SharedRef<UIImage>.self is SharedObject.Type)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
it("has dynamic type for shared objects") {
|
|
20
|
+
let dynamicType = ~SharedRef<UIImage>.self
|
|
21
|
+
|
|
22
|
+
expect(dynamicType is DynamicSharedObjectType) == true
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
it("creates shared data") {
|
|
26
|
+
let result = try runtime.eval("expo.modules.FirstModule.createSharedData('\(sharedDataString)')")
|
|
27
|
+
|
|
28
|
+
expect(result.kind) == .object
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
it("shares Data object") {
|
|
32
|
+
let result = try runtime.eval([
|
|
33
|
+
"sharedData = expo.modules.FirstModule.createSharedData('\(sharedDataString)')",
|
|
34
|
+
"expo.modules.SecondModule.stringFromSharedData(sharedData)"
|
|
35
|
+
])
|
|
36
|
+
|
|
37
|
+
expect(result.kind) == .string
|
|
38
|
+
expect(try result.asString()) == sharedDataString
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private let sharedDataString = "I can be shared among independent modules"
|
|
44
|
+
|
|
45
|
+
private class FirstModule: Module {
|
|
46
|
+
public func definition() -> ModuleDefinition {
|
|
47
|
+
Function("createSharedData") { (string: String) -> SharedRef<Data> in
|
|
48
|
+
let data = Data(string.utf8)
|
|
49
|
+
return SharedRef<Data>(data)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private class SecondModule: Module {
|
|
55
|
+
public func definition() -> ModuleDefinition {
|
|
56
|
+
Function("stringFromSharedData") { (data: SharedRef<Data>) -> String in
|
|
57
|
+
return String(decoding: data.pointer, as: UTF8.self)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-modules-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "The core of Expo Modules architecture",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"@testing-library/react-hooks": "^7.0.1",
|
|
43
43
|
"expo-module-scripts": "^3.0.0"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "3ccd2edee9cbfed217557675cb50f0ba5e55a9e4"
|
|
46
46
|
}
|