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.
Files changed (64) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/ExpoModulesCore.podspec +26 -5
  3. package/android/ExpoModulesCorePlugin.gradle +4 -0
  4. package/android/build.gradle +13 -14
  5. package/android/src/main/AndroidManifest.xml +1 -2
  6. package/android/src/main/cpp/ExpoModulesHostObject.cpp +3 -0
  7. package/android/src/main/cpp/JNIDeallocator.cpp +17 -0
  8. package/android/src/main/cpp/JNIDeallocator.h +25 -0
  9. package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +8 -1
  10. package/android/src/main/cpp/JSIInteropModuleRegistry.h +6 -1
  11. package/android/src/main/cpp/JavaCallback.cpp +9 -0
  12. package/android/src/main/cpp/JavaCallback.h +12 -2
  13. package/android/src/main/cpp/JavaScriptFunction.cpp +13 -0
  14. package/android/src/main/cpp/JavaScriptFunction.h +7 -1
  15. package/android/src/main/cpp/JavaScriptModuleObject.cpp +2 -1
  16. package/android/src/main/cpp/JavaScriptObject.cpp +17 -2
  17. package/android/src/main/cpp/JavaScriptObject.h +10 -3
  18. package/android/src/main/cpp/JavaScriptRuntime.cpp +5 -4
  19. package/android/src/main/cpp/JavaScriptRuntime.h +5 -3
  20. package/android/src/main/cpp/JavaScriptTypedArray.cpp +14 -0
  21. package/android/src/main/cpp/JavaScriptTypedArray.h +6 -0
  22. package/android/src/main/cpp/JavaScriptValue.cpp +32 -4
  23. package/android/src/main/cpp/JavaScriptValue.h +10 -3
  24. package/android/src/main/cpp/MethodMetadata.cpp +1 -1
  25. package/android/src/main/cpp/types/FrontendConverter.cpp +8 -4
  26. package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +14 -0
  27. package/android/src/main/java/expo/modules/kotlin/AppContext.kt +4 -1
  28. package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -3
  29. package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +19 -12
  30. package/android/src/main/java/expo/modules/kotlin/devtools/ExpoNetworkInspectOkHttpInterceptors.kt +70 -0
  31. package/android/src/main/java/expo/modules/kotlin/devtools/ExpoRequestCdpInterceptor.kt +72 -0
  32. package/android/src/main/java/expo/modules/kotlin/devtools/OkHttpHeadersExtension.kt +18 -0
  33. package/android/src/main/java/expo/modules/kotlin/devtools/cdp/CdpNetworkTypes.kt +257 -0
  34. package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +24 -15
  35. package/android/src/main/java/expo/modules/kotlin/jni/JSIInteropModuleRegistry.kt +8 -1
  36. package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +0 -4
  37. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +0 -4
  38. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +5 -2
  39. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +0 -5
  40. package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +0 -4
  41. package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +1 -1
  42. package/android/src/main/java/expo/modules/kotlin/types/ColorTypeConverter.kt +3 -0
  43. package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +1 -2
  44. package/android-annotation/build.gradle +2 -2
  45. package/android-annotation-processor/build.gradle +2 -2
  46. package/ios/JSI/EXJSIInstaller.h +2 -2
  47. package/ios/JSI/EXJSIInstaller.mm +6 -6
  48. package/ios/JSI/EXJavaScriptRuntime.h +0 -6
  49. package/ios/JSI/EXJavaScriptRuntime.mm +0 -23
  50. package/ios/RCTComponentData+Privates.h +17 -0
  51. package/ios/RCTComponentData+Privates.m +15 -0
  52. package/ios/Swift/AppContext.swift +20 -11
  53. package/ios/Swift/DevTools/CdpNetworkTypes.swift +163 -0
  54. package/ios/Swift/DevTools/ExpoRequestCdpInterceptor.swift +71 -0
  55. package/ios/Swift/DevTools/ExpoRequestInterceptorProtocol.swift +183 -0
  56. package/ios/Swift/DevTools/URLRequest+httpBodyData.swift +43 -0
  57. package/ios/Swift/ExpoRuntime.swift +28 -0
  58. package/ios/Swift/Modules/CoreModule.swift +7 -0
  59. package/ios/Swift/SharedObjects/SharedRef.swift +12 -0
  60. package/ios/Swift/Views/ComponentData.swift +1 -1
  61. package/ios/Tests/CoreModuleSpec.swift +27 -0
  62. package/ios/Tests/ExpoRequestCdpInterceptorSpec.swift +165 -0
  63. package/ios/Tests/SharedRefSpec.swift +60 -0
  64. 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.2",
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": "c7c6934083f19754254c77ec6b329b1c35b75269"
45
+ "gitHead": "3ccd2edee9cbfed217557675cb50f0ba5e55a9e4"
46
46
  }