@doordeck/headless-react-native-sdk 0.83.0 → 1.0.7
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/HeadlessReactNativeSdk.podspec +15 -23
- package/android/build.gradle +7 -7
- package/android/generated/jni/CMakeLists.txt +1 -9
- package/android/generated/jni/react/renderer/components/RNHeadlessReactNativeSdkSpec/RNHeadlessReactNativeSdkSpecJSI.h +66 -108
- package/android/gradle.properties +4 -4
- package/android/src/main/java/com/doordeck/headlessreactnativesdk/HeadlessReactNativeSdkModule.kt +25 -23
- package/android/src/main/java/com/doordeck/headlessreactnativesdk/HeadlessReactNativeSdkPackage.kt +5 -6
- package/ios/HeadlessReactNativeSdk.h +1 -1
- package/ios/HeadlessReactNativeSdkImpl.swift +103 -77
- package/ios/generated/{RNHeadlessReactNativeSdkSpecJSI.h → ReactCodegen/RNHeadlessReactNativeSdkSpecJSI.h} +66 -108
- package/lib/commonjs/NativeHeadlessReactNativeSdk.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/package.json +1 -0
- package/lib/module/NativeHeadlessReactNativeSdk.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/package.json +1 -0
- package/lib/typescript/commonjs/src/NativeHeadlessReactNativeSdk.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/NativeHeadlessReactNativeSdk.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +1 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +32 -52
- package/src/NativeHeadlessReactNativeSdk.ts +8 -8
- package/src/index.tsx +13 -8
- package/android/generated/jni/react/renderer/components/RNHeadlessReactNativeSdkSpec/RNHeadlessReactNativeSdkSpecJSI-generated.cpp +0 -68
- package/ios/generated/RNHeadlessReactNativeSdkSpecJSI-generated.cpp +0 -68
- /package/ios/generated/{RNHeadlessReactNativeSdkSpec → ReactCodegen/RNHeadlessReactNativeSdkSpec}/RNHeadlessReactNativeSdkSpec-generated.mm +0 -0
- /package/ios/generated/{RNHeadlessReactNativeSdkSpec → ReactCodegen/RNHeadlessReactNativeSdkSpec}/RNHeadlessReactNativeSdkSpec.h +0 -0
|
@@ -12,12 +12,17 @@ import DoordeckSDK
|
|
|
12
12
|
@objc(HeadlessReactNativeSdkImpl)
|
|
13
13
|
public class HeadlessReactNativeSdkImpl: NSObject {
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
// The Doordeck SDK is now initialized through an async/throwing factory, which
|
|
16
|
+
// cannot run in `init()`. Initialize it lazily on first use and cache it.
|
|
17
|
+
private var doordeckSdk: Doordeck?
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
private func sdk() async throws -> Doordeck {
|
|
20
|
+
if let existing = doordeckSdk {
|
|
21
|
+
return existing
|
|
22
|
+
}
|
|
23
|
+
let initialized = try await KDoordeckFactory().initialize(sdkConfig: SdkConfig.Builder().build())
|
|
24
|
+
doordeckSdk = initialized
|
|
25
|
+
return initialized
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
/**
|
|
@@ -30,16 +35,14 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
30
35
|
resolver: @escaping RCTPromiseResolveBlock,
|
|
31
36
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
32
37
|
) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
Task {
|
|
39
|
+
do {
|
|
40
|
+
let sdk = try await self.sdk()
|
|
41
|
+
self.setKeyPairIfNeeded(sdk)
|
|
42
|
+
_ = try await sdk.accountless().login(email: email, password: password)
|
|
43
|
+
try await self.respondNeedsVerification(sdk, resolver)
|
|
44
|
+
} catch {
|
|
38
45
|
rejecter("LOGIN_ERROR", error.localizedDescription, error)
|
|
39
|
-
} else if tokenResponse != nil {
|
|
40
|
-
self.respondNeedsVerification(resolver, rejecter)
|
|
41
|
-
} else {
|
|
42
|
-
rejecter("LOGIN_ERROR", "Unknown error occurred", nil)
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
}
|
|
@@ -49,10 +52,16 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
49
52
|
resolver: @escaping RCTPromiseResolveBlock,
|
|
50
53
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
51
54
|
) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
Task {
|
|
56
|
+
do {
|
|
57
|
+
let sdk = try await self.sdk()
|
|
58
|
+
self.setKeyPairIfNeeded(sdk)
|
|
59
|
+
sdk.contextManager().setCloudAuthToken(token: authToken)
|
|
60
|
+
try await self.respondNeedsVerification(sdk, resolver)
|
|
61
|
+
} catch {
|
|
62
|
+
rejecter("SET_AUTH_TOKEN_ERROR", error.localizedDescription, error)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
56
65
|
}
|
|
57
66
|
|
|
58
67
|
@objc public func verify(
|
|
@@ -60,11 +69,13 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
60
69
|
resolver: @escaping RCTPromiseResolveBlock,
|
|
61
70
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
62
71
|
) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
Task {
|
|
73
|
+
do {
|
|
74
|
+
let sdk = try await self.sdk()
|
|
75
|
+
_ = try await sdk.account().verifyEphemeralKeyRegistration(code: code, publicKey: nil, privateKey: nil)
|
|
67
76
|
resolver(nil)
|
|
77
|
+
} catch {
|
|
78
|
+
rejecter("VERIFY_ERROR", error.localizedDescription, error)
|
|
68
79
|
}
|
|
69
80
|
}
|
|
70
81
|
}
|
|
@@ -73,11 +84,13 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
73
84
|
_ resolver: @escaping RCTPromiseResolveBlock,
|
|
74
85
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
75
86
|
) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
Task {
|
|
88
|
+
do {
|
|
89
|
+
let sdk = try await self.sdk()
|
|
90
|
+
try await sdk.account().logout()
|
|
80
91
|
resolver(nil)
|
|
92
|
+
} catch {
|
|
93
|
+
rejecter("LOGOUT_ERROR", error.localizedDescription, error)
|
|
81
94
|
}
|
|
82
95
|
}
|
|
83
96
|
}
|
|
@@ -90,17 +103,19 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
90
103
|
_ resolver: @escaping RCTPromiseResolveBlock,
|
|
91
104
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
92
105
|
) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
106
|
+
Task {
|
|
107
|
+
do {
|
|
108
|
+
let sdk = try await self.sdk()
|
|
109
|
+
let response = try await sdk.account().getUserDetails()
|
|
110
|
+
let contextManager = sdk.contextManager()
|
|
111
|
+
let tokenAboutToExpire = try await contextManager.isCloudAuthTokenInvalidOrExpired(checkServerInvalidation: false)
|
|
97
112
|
resolver(response.toNativeMap(
|
|
98
|
-
userId:
|
|
99
|
-
certificateChainAboutToExpire:
|
|
100
|
-
tokenAboutToExpire:
|
|
113
|
+
userId: contextManager.getUserId()?.uuidString,
|
|
114
|
+
certificateChainAboutToExpire: contextManager.isCertificateChainInvalidOrExpired(),
|
|
115
|
+
tokenAboutToExpire: tokenAboutToExpire.boolValue
|
|
101
116
|
))
|
|
102
|
-
}
|
|
103
|
-
rejecter("USER_DETAILS_ERROR",
|
|
117
|
+
} catch {
|
|
118
|
+
rejecter("USER_DETAILS_ERROR", error.localizedDescription, error)
|
|
104
119
|
}
|
|
105
120
|
}
|
|
106
121
|
}
|
|
@@ -114,13 +129,16 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
114
129
|
resolver: @escaping RCTPromiseResolveBlock,
|
|
115
130
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
116
131
|
) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
132
|
+
Task {
|
|
133
|
+
do {
|
|
134
|
+
guard let tileUuid = UUID(uuidString: tileId) else {
|
|
135
|
+
throw HeadlessReactNativeSdkImpl.makeError("Invalid tileId: \(tileId)")
|
|
136
|
+
}
|
|
137
|
+
let sdk = try await self.sdk()
|
|
138
|
+
let response = try await sdk.tiles().getLocksBelongingToTile(tileId: tileUuid)
|
|
121
139
|
resolver(response.toNativeMap())
|
|
122
|
-
}
|
|
123
|
-
rejecter("LOCKS_ERROR",
|
|
140
|
+
} catch {
|
|
141
|
+
rejecter("LOCKS_ERROR", error.localizedDescription, error)
|
|
124
142
|
}
|
|
125
143
|
}
|
|
126
144
|
}
|
|
@@ -130,48 +148,56 @@ public class HeadlessReactNativeSdkImpl: NSObject {
|
|
|
130
148
|
resolver: @escaping RCTPromiseResolveBlock,
|
|
131
149
|
rejecter: @escaping RCTPromiseRejectBlock
|
|
132
150
|
) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
151
|
+
Task {
|
|
152
|
+
do {
|
|
153
|
+
guard let lockUuid = UUID(uuidString: lockId) else {
|
|
154
|
+
throw HeadlessReactNativeSdkImpl.makeError("Invalid lockId: \(lockId)")
|
|
155
|
+
}
|
|
156
|
+
let sdk = try await self.sdk()
|
|
157
|
+
|
|
158
|
+
let now = Date()
|
|
159
|
+
let baseOperation = LockOperations.BaseOperation(
|
|
160
|
+
userId: nil,
|
|
161
|
+
userCertificateChain: nil,
|
|
162
|
+
userPrivateKey: nil,
|
|
163
|
+
lockId: lockUuid,
|
|
164
|
+
notBefore: now,
|
|
165
|
+
issuedAt: now,
|
|
166
|
+
expiresAt: now.addingTimeInterval(60),
|
|
167
|
+
jti: UUID()
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
let unlockOperation = LockOperations.UnlockOperation(baseOperation: baseOperation, directAccessEndpoints: nil)
|
|
171
|
+
|
|
172
|
+
try await sdk.lockOperations().unlock(unlockOperation: unlockOperation)
|
|
150
173
|
resolver(nil)
|
|
174
|
+
} catch {
|
|
175
|
+
rejecter("UNLOCK_ERROR", error.localizedDescription, error)
|
|
151
176
|
}
|
|
152
177
|
}
|
|
153
178
|
}
|
|
154
179
|
|
|
155
|
-
private func setKeyPairIfNeeded() {
|
|
156
|
-
if (!
|
|
157
|
-
let newKeyPair =
|
|
158
|
-
|
|
180
|
+
private func setKeyPairIfNeeded(_ sdk: Doordeck) {
|
|
181
|
+
if (!sdk.contextManager().isKeyPairValid()) {
|
|
182
|
+
let newKeyPair = sdk.crypto().generateKeyPair()
|
|
183
|
+
sdk.contextManager().setKeyPair(publicKey: newKeyPair.public_, privateKey: newKeyPair.private_)
|
|
159
184
|
}
|
|
160
185
|
}
|
|
161
186
|
|
|
162
187
|
private func respondNeedsVerification(
|
|
163
|
-
_
|
|
164
|
-
_
|
|
165
|
-
) {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
188
|
+
_ sdk: Doordeck,
|
|
189
|
+
_ resolver: @escaping RCTPromiseResolveBlock
|
|
190
|
+
) async throws {
|
|
191
|
+
let response = try await sdk.helper().assistedRegisterEphemeralKey(publicKey: nil, privateKey: nil)
|
|
192
|
+
resolver(response.toNativeMap())
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private static func makeError(_ message: String) -> NSError {
|
|
196
|
+
return NSError(
|
|
197
|
+
domain: "HeadlessReactNativeSdk",
|
|
198
|
+
code: -1,
|
|
199
|
+
userInfo: [NSLocalizedDescriptionKey: message]
|
|
200
|
+
)
|
|
175
201
|
}
|
|
176
202
|
}
|
|
177
203
|
|
|
@@ -188,9 +214,9 @@ extension AssistedRegisterEphemeralKeyResponse {
|
|
|
188
214
|
extension TileLocksResponse {
|
|
189
215
|
func toNativeMap() -> NSDictionary {
|
|
190
216
|
return [
|
|
191
|
-
"siteId": siteId,
|
|
192
|
-
"tileId": tileId,
|
|
193
|
-
"deviceIds": deviceIds
|
|
217
|
+
"siteId": siteId.uuidString,
|
|
218
|
+
"tileId": tileId.uuidString,
|
|
219
|
+
"deviceIds": deviceIds.map { $0.uuidString }
|
|
194
220
|
]
|
|
195
221
|
}
|
|
196
222
|
}
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
namespace facebook::react {
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
#pragma mark - NativeHeadlessReactNativeSdkAssistedRegisterEphemeralKeyResponse
|
|
20
19
|
|
|
21
20
|
template <typename P0>
|
|
@@ -61,8 +60,8 @@ struct NativeHeadlessReactNativeSdkAssistedRegisterEphemeralKeyResponseBridging
|
|
|
61
60
|
|
|
62
61
|
template <typename P0, typename P1, typename P2>
|
|
63
62
|
struct NativeHeadlessReactNativeSdkTileLocksResponse {
|
|
64
|
-
P0 siteId;
|
|
65
|
-
P1 tileId;
|
|
63
|
+
P0 siteId{};
|
|
64
|
+
P1 tileId{};
|
|
66
65
|
P2 deviceIds;
|
|
67
66
|
bool operator==(const NativeHeadlessReactNativeSdkTileLocksResponse &other) const {
|
|
68
67
|
return siteId == other.siteId && tileId == other.tileId && deviceIds == other.deviceIds;
|
|
@@ -88,11 +87,9 @@ struct NativeHeadlessReactNativeSdkTileLocksResponseBridging {
|
|
|
88
87
|
static jsi::String siteIdToJs(jsi::Runtime &rt, decltype(types.siteId) value) {
|
|
89
88
|
return bridging::toJs(rt, value);
|
|
90
89
|
}
|
|
91
|
-
|
|
92
90
|
static jsi::String tileIdToJs(jsi::Runtime &rt, decltype(types.tileId) value) {
|
|
93
91
|
return bridging::toJs(rt, value);
|
|
94
92
|
}
|
|
95
|
-
|
|
96
93
|
static jsi::Array deviceIdsToJs(jsi::Runtime &rt, decltype(types.deviceIds) value) {
|
|
97
94
|
return bridging::toJs(rt, value);
|
|
98
95
|
}
|
|
@@ -116,12 +113,12 @@ struct NativeHeadlessReactNativeSdkTileLocksResponseBridging {
|
|
|
116
113
|
|
|
117
114
|
template <typename P0, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
|
|
118
115
|
struct NativeHeadlessReactNativeSdkUserDetailsResponse {
|
|
119
|
-
P0 userId;
|
|
120
|
-
P1 publicKey;
|
|
121
|
-
P2 email;
|
|
122
|
-
P3 displayName;
|
|
123
|
-
P4 emailVerified;
|
|
124
|
-
P5 certificateChainAboutToExpire;
|
|
116
|
+
P0 userId{};
|
|
117
|
+
P1 publicKey{};
|
|
118
|
+
P2 email{};
|
|
119
|
+
P3 displayName{};
|
|
120
|
+
P4 emailVerified{};
|
|
121
|
+
P5 certificateChainAboutToExpire{};
|
|
125
122
|
P6 tokenAboutToExpire;
|
|
126
123
|
bool operator==(const NativeHeadlessReactNativeSdkUserDetailsResponse &other) const {
|
|
127
124
|
return userId == other.userId && publicKey == other.publicKey && email == other.email && displayName == other.displayName && emailVerified == other.emailVerified && certificateChainAboutToExpire == other.certificateChainAboutToExpire && tokenAboutToExpire == other.tokenAboutToExpire;
|
|
@@ -151,27 +148,21 @@ struct NativeHeadlessReactNativeSdkUserDetailsResponseBridging {
|
|
|
151
148
|
static jsi::String userIdToJs(jsi::Runtime &rt, decltype(types.userId) value) {
|
|
152
149
|
return bridging::toJs(rt, value);
|
|
153
150
|
}
|
|
154
|
-
|
|
155
151
|
static jsi::String publicKeyToJs(jsi::Runtime &rt, decltype(types.publicKey) value) {
|
|
156
152
|
return bridging::toJs(rt, value);
|
|
157
153
|
}
|
|
158
|
-
|
|
159
154
|
static jsi::String emailToJs(jsi::Runtime &rt, decltype(types.email) value) {
|
|
160
155
|
return bridging::toJs(rt, value);
|
|
161
156
|
}
|
|
162
|
-
|
|
163
157
|
static jsi::String displayNameToJs(jsi::Runtime &rt, decltype(types.displayName) value) {
|
|
164
158
|
return bridging::toJs(rt, value);
|
|
165
159
|
}
|
|
166
|
-
|
|
167
160
|
static bool emailVerifiedToJs(jsi::Runtime &rt, decltype(types.emailVerified) value) {
|
|
168
161
|
return bridging::toJs(rt, value);
|
|
169
162
|
}
|
|
170
|
-
|
|
171
163
|
static bool certificateChainAboutToExpireToJs(jsi::Runtime &rt, decltype(types.certificateChainAboutToExpire) value) {
|
|
172
164
|
return bridging::toJs(rt, value);
|
|
173
165
|
}
|
|
174
|
-
|
|
175
166
|
static bool tokenAboutToExpireToJs(jsi::Runtime &rt, decltype(types.tokenAboutToExpire) value) {
|
|
176
167
|
return bridging::toJs(rt, value);
|
|
177
168
|
}
|
|
@@ -197,111 +188,78 @@ struct NativeHeadlessReactNativeSdkUserDetailsResponseBridging {
|
|
|
197
188
|
}
|
|
198
189
|
};
|
|
199
190
|
|
|
200
|
-
class JSI_EXPORT NativeHeadlessReactNativeSdkCxxSpecJSI : public TurboModule {
|
|
201
|
-
protected:
|
|
202
|
-
NativeHeadlessReactNativeSdkCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
|
203
|
-
|
|
204
|
-
public:
|
|
205
|
-
virtual jsi::Value login(jsi::Runtime &rt, jsi::String email, jsi::String password) = 0;
|
|
206
|
-
virtual jsi::Value setAuthToken(jsi::Runtime &rt, jsi::String authToken) = 0;
|
|
207
|
-
virtual jsi::Value getUserDetails(jsi::Runtime &rt) = 0;
|
|
208
|
-
virtual jsi::Value verify(jsi::Runtime &rt, jsi::String code) = 0;
|
|
209
|
-
virtual jsi::Value logout(jsi::Runtime &rt) = 0;
|
|
210
|
-
virtual jsi::Value getLocksBelongingToTile(jsi::Runtime &rt, jsi::String tileId) = 0;
|
|
211
|
-
virtual jsi::Value unlockDevice(jsi::Runtime &rt, jsi::String lockId) = 0;
|
|
212
|
-
|
|
213
|
-
};
|
|
214
191
|
|
|
215
192
|
template <typename T>
|
|
216
193
|
class JSI_EXPORT NativeHeadlessReactNativeSdkCxxSpec : public TurboModule {
|
|
217
194
|
public:
|
|
218
|
-
jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
|
|
219
|
-
return delegate_.create(rt, propName);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override {
|
|
223
|
-
return delegate_.getPropertyNames(runtime);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
195
|
static constexpr std::string_view kModuleName = "HeadlessReactNativeSdk";
|
|
227
196
|
|
|
228
197
|
protected:
|
|
229
|
-
NativeHeadlessReactNativeSdkCxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
198
|
+
NativeHeadlessReactNativeSdkCxxSpec(std::shared_ptr<CallInvoker> jsInvoker) : TurboModule(std::string{NativeHeadlessReactNativeSdkCxxSpec::kModuleName}, jsInvoker) {
|
|
199
|
+
methodMap_["login"] = MethodMetadata {.argCount = 2, .invoker = __login};
|
|
200
|
+
methodMap_["setAuthToken"] = MethodMetadata {.argCount = 1, .invoker = __setAuthToken};
|
|
201
|
+
methodMap_["getUserDetails"] = MethodMetadata {.argCount = 0, .invoker = __getUserDetails};
|
|
202
|
+
methodMap_["verify"] = MethodMetadata {.argCount = 1, .invoker = __verify};
|
|
203
|
+
methodMap_["logout"] = MethodMetadata {.argCount = 0, .invoker = __logout};
|
|
204
|
+
methodMap_["getLocksBelongingToTile"] = MethodMetadata {.argCount = 1, .invoker = __getLocksBelongingToTile};
|
|
205
|
+
methodMap_["unlockDevice"] = MethodMetadata {.argCount = 1, .invoker = __unlockDevice};
|
|
206
|
+
}
|
|
207
|
+
|
|
234
208
|
private:
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
static_assert(
|
|
244
|
-
bridging::getParameterCount(&T::login) == 3,
|
|
245
|
-
"Expected login(...) to have 3 parameters");
|
|
246
|
-
|
|
247
|
-
return bridging::callFromJs<jsi::Value>(
|
|
248
|
-
rt, &T::login, jsInvoker_, instance_, std::move(email), std::move(password));
|
|
249
|
-
}
|
|
250
|
-
jsi::Value setAuthToken(jsi::Runtime &rt, jsi::String authToken) override {
|
|
251
|
-
static_assert(
|
|
252
|
-
bridging::getParameterCount(&T::setAuthToken) == 2,
|
|
253
|
-
"Expected setAuthToken(...) to have 2 parameters");
|
|
254
|
-
|
|
255
|
-
return bridging::callFromJs<jsi::Value>(
|
|
256
|
-
rt, &T::setAuthToken, jsInvoker_, instance_, std::move(authToken));
|
|
257
|
-
}
|
|
258
|
-
jsi::Value getUserDetails(jsi::Runtime &rt) override {
|
|
259
|
-
static_assert(
|
|
260
|
-
bridging::getParameterCount(&T::getUserDetails) == 1,
|
|
261
|
-
"Expected getUserDetails(...) to have 1 parameters");
|
|
262
|
-
|
|
263
|
-
return bridging::callFromJs<jsi::Value>(
|
|
264
|
-
rt, &T::getUserDetails, jsInvoker_, instance_);
|
|
265
|
-
}
|
|
266
|
-
jsi::Value verify(jsi::Runtime &rt, jsi::String code) override {
|
|
267
|
-
static_assert(
|
|
268
|
-
bridging::getParameterCount(&T::verify) == 2,
|
|
269
|
-
"Expected verify(...) to have 2 parameters");
|
|
209
|
+
static jsi::Value __login(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
210
|
+
static_assert(
|
|
211
|
+
bridging::getParameterCount(&T::login) == 3,
|
|
212
|
+
"Expected login(...) to have 3 parameters");
|
|
213
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::login, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
214
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt),
|
|
215
|
+
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt));
|
|
216
|
+
}
|
|
270
217
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
218
|
+
static jsi::Value __setAuthToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
219
|
+
static_assert(
|
|
220
|
+
bridging::getParameterCount(&T::setAuthToken) == 2,
|
|
221
|
+
"Expected setAuthToken(...) to have 2 parameters");
|
|
222
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::setAuthToken, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
223
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt));
|
|
224
|
+
}
|
|
278
225
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
"Expected getLocksBelongingToTile(...) to have 2 parameters");
|
|
226
|
+
static jsi::Value __getUserDetails(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* /*args*/, size_t /*count*/) {
|
|
227
|
+
static_assert(
|
|
228
|
+
bridging::getParameterCount(&T::getUserDetails) == 1,
|
|
229
|
+
"Expected getUserDetails(...) to have 1 parameters");
|
|
230
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::getUserDetails, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule));
|
|
231
|
+
}
|
|
286
232
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
233
|
+
static jsi::Value __verify(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
234
|
+
static_assert(
|
|
235
|
+
bridging::getParameterCount(&T::verify) == 2,
|
|
236
|
+
"Expected verify(...) to have 2 parameters");
|
|
237
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::verify, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
238
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt));
|
|
239
|
+
}
|
|
294
240
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
241
|
+
static jsi::Value __logout(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* /*args*/, size_t /*count*/) {
|
|
242
|
+
static_assert(
|
|
243
|
+
bridging::getParameterCount(&T::logout) == 1,
|
|
244
|
+
"Expected logout(...) to have 1 parameters");
|
|
245
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::logout, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule));
|
|
246
|
+
}
|
|
298
247
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
248
|
+
static jsi::Value __getLocksBelongingToTile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
249
|
+
static_assert(
|
|
250
|
+
bridging::getParameterCount(&T::getLocksBelongingToTile) == 2,
|
|
251
|
+
"Expected getLocksBelongingToTile(...) to have 2 parameters");
|
|
252
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::getLocksBelongingToTile, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
253
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt));
|
|
254
|
+
}
|
|
303
255
|
|
|
304
|
-
|
|
256
|
+
static jsi::Value __unlockDevice(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
257
|
+
static_assert(
|
|
258
|
+
bridging::getParameterCount(&T::unlockDevice) == 2,
|
|
259
|
+
"Expected unlockDevice(...) to have 2 parameters");
|
|
260
|
+
return bridging::callFromJs<jsi::Value>(rt, &T::unlockDevice, static_cast<NativeHeadlessReactNativeSdkCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
261
|
+
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt));
|
|
262
|
+
}
|
|
305
263
|
};
|
|
306
264
|
|
|
307
265
|
} // namespace facebook::react
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHeadlessReactNativeSdk.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHeadlessReactNativeSdk.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAqFpCC,gCAAmB,CAACC,YAAY,CAAO,wBAAwB,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_NativeHeadlessReactNativeSdk","_interopRequireDefault","require","e","__esModule","default","login","email","password","HeadlessReactNativeSdk","setAuthToken","authToken","getUserDetails","verify","code","logout","getLocksBelongingToTile","tileId","unlockDevice","lockId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,6BAAA,GAAAC,sBAAA,CAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_NativeHeadlessReactNativeSdk","_interopRequireDefault","require","e","__esModule","default","login","email","password","HeadlessReactNativeSdk","setAuthToken","authToken","getUserDetails","verify","code","logout","getLocksBelongingToTile","tileId","unlockDevice","lockId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,6BAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIwC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEjC,SAASG,KAAKA,CACnBC,KAAa,EACbC,QAAgB,EAC+B;EAC/C,OAAOC,qCAAsB,CAACH,KAAK,CAACC,KAAK,EAAEC,QAAQ,CAAC;AACtD;AAEO,SAASE,YAAYA,CAC1BC,SAAiB,EAC8B;EAC/C,OAAOF,qCAAsB,CAACC,YAAY,CAACC,SAAS,CAAC;AACvD;AAEO,SAASC,cAAcA,CAAA,EAAiC;EAC7D,OAAOH,qCAAsB,CAACG,cAAc,CAAC,CAAC;AAChD;AAEO,SAASC,MAAMA,CAACC,IAAY,EAAiB;EAClD,OAAOL,qCAAsB,CAACI,MAAM,CAACC,IAAI,CAAC;AAC5C;AAEO,SAASC,MAAMA,CAAA,EAAkB;EACtC,OAAON,qCAAsB,CAACM,MAAM,CAAC,CAAC;AACxC;AAEO,SAASC,uBAAuBA,CACrCC,MAAc,EACc;EAC5B,OAAOR,qCAAsB,CAACO,uBAAuB,CAACC,MAAM,CAAC;AAC/D;AAEO,SAASC,YAAYA,CAACC,MAAc,EAAiB;EAC1D,OAAOV,qCAAsB,CAACS,YAAY,CAACC,MAAM,CAAC;AACpD","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHeadlessReactNativeSdk.ts"],"mappings":";;AACA,
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHeadlessReactNativeSdk.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAqFlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,wBAAwB,CAAC","ignoreList":[]}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["HeadlessReactNativeSdk","login","email","password","setAuthToken","authToken","getUserDetails","verify","code","logout","getLocksBelongingToTile","tileId","unlockDevice","lockId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,sBAAsB,
|
|
1
|
+
{"version":3,"names":["HeadlessReactNativeSdk","login","email","password","setAuthToken","authToken","getUserDetails","verify","code","logout","getLocksBelongingToTile","tileId","unlockDevice","lockId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,sBAAsB,MAItB,mCAAgC;AAEvC,OAAO,SAASC,KAAKA,CACnBC,KAAa,EACbC,QAAgB,EAC+B;EAC/C,OAAOH,sBAAsB,CAACC,KAAK,CAACC,KAAK,EAAEC,QAAQ,CAAC;AACtD;AAEA,OAAO,SAASC,YAAYA,CAC1BC,SAAiB,EAC8B;EAC/C,OAAOL,sBAAsB,CAACI,YAAY,CAACC,SAAS,CAAC;AACvD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAiC;EAC7D,OAAON,sBAAsB,CAACM,cAAc,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,MAAMA,CAACC,IAAY,EAAiB;EAClD,OAAOR,sBAAsB,CAACO,MAAM,CAACC,IAAI,CAAC;AAC5C;AAEA,OAAO,SAASC,MAAMA,CAAA,EAAkB;EACtC,OAAOT,sBAAsB,CAACS,MAAM,CAAC,CAAC;AACxC;AAEA,OAAO,SAASC,uBAAuBA,CACrCC,MAAc,EACc;EAC5B,OAAOX,sBAAsB,CAACU,uBAAuB,CAACC,MAAM,CAAC;AAC/D;AAEA,OAAO,SAASC,YAAYA,CAACC,MAAc,EAAiB;EAC1D,OAAOb,sBAAsB,CAACY,YAAY,CAACC,MAAM,CAAC;AACpD","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeHeadlessReactNativeSdk.d.ts","sourceRoot":"","sources":["../../../../src/NativeHeadlessReactNativeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"NativeHeadlessReactNativeSdk.d.ts","sourceRoot":"","sources":["../../../../src/NativeHeadlessReactNativeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;;;;;OASG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAEjD;;;;;;;;OAQG;IACH,YAAY,CACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAEjD;;;;;OAKG;IACH,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE/C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;OAIG;IACH,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEpE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,6BAA6B,EAAE,OAAO,CAAC;IACvC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;;AAEF,wBAAgF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAA+B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAA+B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,gCAAgC,CAAC;AAExC,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAE7D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,wBAAgB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeHeadlessReactNativeSdk.d.ts","sourceRoot":"","sources":["../../../../src/NativeHeadlessReactNativeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"NativeHeadlessReactNativeSdk.d.ts","sourceRoot":"","sources":["../../../../src/NativeHeadlessReactNativeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;;;;;OASG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAEjD;;;;;;;;OAQG;IACH,YAAY,CACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAEjD;;;;;OAKG;IACH,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAE/C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB;;;;OAIG;IACH,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEpE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,oBAAoB,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,6BAA6B,EAAE,OAAO,CAAC;IACvC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;;AAEF,wBAAgF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AssistedRegisterEphemeralKeyResponse, type TileLocksResponse, type UserDetailsResponse } from './NativeHeadlessReactNativeSdk';
|
|
1
|
+
import { type AssistedRegisterEphemeralKeyResponse, type TileLocksResponse, type UserDetailsResponse } from './NativeHeadlessReactNativeSdk.js';
|
|
2
2
|
export declare function login(email: string, password: string): Promise<AssistedRegisterEphemeralKeyResponse>;
|
|
3
3
|
export declare function setAuthToken(authToken: string): Promise<AssistedRegisterEphemeralKeyResponse>;
|
|
4
4
|
export declare function getUserDetails(): Promise<UserDetailsResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAA+B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAA+B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,mCAAgC,CAAC;AAExC,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oCAAoC,CAAC,CAE/C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAE7D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,wBAAgB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAE5B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
|