@tokamakdev/plugin-local-authentication 0.1.0-beta.107 → 0.1.0-beta.114

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.
@@ -0,0 +1,530 @@
1
+ // Generated by `tok bindings` from the iOS and macOS 26.2 SDKs: LocalAuthentication. Do not edit.
2
+
3
+ import Foundation
4
+ import LocalAuthentication
5
+
6
+ #if hasAttribute(diagnose)
7
+ @diagnose(DeprecatedDeclaration, as: ignored)
8
+ #endif
9
+ final class TokamakBindings_local_authentication: TokamakPlugin {
10
+ let id = "local-authentication/apple"
11
+ private let host: TokamakHost
12
+
13
+ init(host: TokamakHost) { self.host = host }
14
+
15
+ func callBytes(method: String, payload: Data, reply: @escaping TokamakPluginBytesReply) -> (() -> Void)? {
16
+ let b = TokamakBinding(payload, resources: host.resources, reply: reply)
17
+ switch method {
18
+ case "LAAuthenticationRequirement.biometry":
19
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
20
+ return b.run { let value = LAAuthenticationRequirement.biometry; return b.encode(object: value) }
21
+ case "LAAuthenticationRequirement.biometryCurrentSet":
22
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
23
+ return b.run { let value = LAAuthenticationRequirement.biometryCurrentSet; return b.encode(object: value) }
24
+ case "LAAuthenticationRequirement.default":
25
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
26
+ return b.run { let value = LAAuthenticationRequirement.default; return b.encode(object: value) }
27
+ case "LAAuthenticationRequirement.init()":
28
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
29
+ return b.run { let value = LAAuthenticationRequirement(); return b.encode(object: value) }
30
+ case "LABiometryFallbackRequirement.default":
31
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
32
+ return b.run { let value = LABiometryFallbackRequirement.default; return b.encode(object: value) }
33
+ case "LABiometryFallbackRequirement.devicePasscode":
34
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
35
+ return b.run { let value = LABiometryFallbackRequirement.devicePasscode; return b.encode(object: value) }
36
+ case "LABiometryFallbackRequirement.init()":
37
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
38
+ return b.run { let value = LABiometryFallbackRequirement(); return b.encode(object: value) }
39
+ case "LAContext.biometryType":
40
+ guard #available(iOS 11.0, macOS 10.13.2, *) else { return b.run { throw TokamakBinding.unavailable } }
41
+ return b.run { let value = try b.target(LAContext.self).biometryType; return TokamakBindings_local_authentication.encode(value, b) }
42
+ case "LAContext.canEvaluatePolicy(_:error:)":
43
+ guard #available(iOS 8.0, macOS 10.10, *) else { return b.run { throw TokamakBinding.unavailable } }
44
+ return b.run { var error: NSError?; let value = try b.target(LAContext.self).canEvaluatePolicy(TokamakBindings_local_authentication.decode(b[0], b, as: LAPolicy.self), error: &error); if let error { throw error }; return b.encode(value) }
45
+ case "LAContext.domainState":
46
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
47
+ return b.run { let value = try b.target(LAContext.self).domainState; return b.encode(object: value) }
48
+ case "LAContext.evaluatePolicy(_:localizedReason:)":
49
+ guard #available(iOS 8.0, macOS 10.10, *) else { return b.run { throw TokamakBinding.unavailable } }
50
+ return b.task { let value = try await b.target(LAContext.self).evaluatePolicy(TokamakBindings_local_authentication.decode(b[0], b, as: LAPolicy.self), localizedReason: b.decode(b[1], as: String.self)); return b.encode(value) }
51
+ case "LAContext.evaluatedPolicyDomainState":
52
+ guard #available(iOS 9.0, macOS 10.11, *) else { return b.run { throw TokamakBinding.unavailable } }
53
+ return b.run { let value = try b.target(LAContext.self).evaluatedPolicyDomainState; return b.encode(optional: value) { b.encode($0) } }
54
+ case "LAContext.interactionNotAllowed":
55
+ guard #available(iOS 11.0, macOS 10.13, *) else { return b.run { throw TokamakBinding.unavailable } }
56
+ return b.run { let value = try b.target(LAContext.self).interactionNotAllowed; return b.encode(value) }
57
+ case "LAContext.interactionNotAllowed=":
58
+ guard #available(iOS 11.0, macOS 10.13, *) else { return b.run { throw TokamakBinding.unavailable } }
59
+ return b.run { try b.target(LAContext.self).interactionNotAllowed = b.decode(b[0], as: Bool.self); return nil }
60
+ case "LAContext.invalidate()":
61
+ guard #available(iOS 9.0, macOS 10.11, *) else { return b.run { throw TokamakBinding.unavailable } }
62
+ return b.run { try b.target(LAContext.self).invalidate(); return nil }
63
+ case "LAContext.isCredentialSet(_:)":
64
+ guard #available(iOS 9.0, macOS 10.11, *) else { return b.run { throw TokamakBinding.unavailable } }
65
+ return b.run { let value = try b.target(LAContext.self).isCredentialSet(TokamakBindings_local_authentication.decode(b[0], b, as: LACredentialType.self)); return b.encode(value) }
66
+ case "LAContext.localizedCancelTitle":
67
+ guard #available(iOS 10.0, macOS 10.12, *) else { return b.run { throw TokamakBinding.unavailable } }
68
+ return b.run { let value = try b.target(LAContext.self).localizedCancelTitle; return b.encode(optional: value) { b.encode($0) } }
69
+ case "LAContext.localizedCancelTitle=":
70
+ guard #available(iOS 10.0, macOS 10.12, *) else { return b.run { throw TokamakBinding.unavailable } }
71
+ return b.run { try b.target(LAContext.self).localizedCancelTitle = b.optional(b[0]) { try b.decode($0, as: String.self) }; return nil }
72
+ case "LAContext.localizedFallbackTitle":
73
+ guard #available(iOS 8.0, macOS 10.10, *) else { return b.run { throw TokamakBinding.unavailable } }
74
+ return b.run { let value = try b.target(LAContext.self).localizedFallbackTitle; return b.encode(optional: value) { b.encode($0) } }
75
+ case "LAContext.localizedFallbackTitle=":
76
+ guard #available(iOS 8.0, macOS 10.10, *) else { return b.run { throw TokamakBinding.unavailable } }
77
+ return b.run { try b.target(LAContext.self).localizedFallbackTitle = b.optional(b[0]) { try b.decode($0, as: String.self) }; return nil }
78
+ case "LAContext.localizedReason":
79
+ guard #available(iOS 11.0, macOS 10.13, *) else { return b.run { throw TokamakBinding.unavailable } }
80
+ return b.run { let value = try b.target(LAContext.self).localizedReason; return b.encode(value) }
81
+ case "LAContext.localizedReason=":
82
+ guard #available(iOS 11.0, macOS 10.13, *) else { return b.run { throw TokamakBinding.unavailable } }
83
+ return b.run { try b.target(LAContext.self).localizedReason = b.decode(b[0], as: String.self); return nil }
84
+ case "LAContext.maxBiometryFailures":
85
+ guard #available(iOS 8.3, macOS 10.10.3, *) else { return b.run { throw TokamakBinding.unavailable } }
86
+ return b.run { let value = try b.target(LAContext.self).maxBiometryFailures; return b.encode(optional: value) { b.encode($0) } }
87
+ case "LAContext.maxBiometryFailures=":
88
+ guard #available(iOS 8.3, macOS 10.10.3, *) else { return b.run { throw TokamakBinding.unavailable } }
89
+ return b.run { try b.target(LAContext.self).maxBiometryFailures = b.optional(b[0]) { try b.decode($0, as: NSNumber.self) }; return nil }
90
+ case "LAContext.setCredential(_:type:)":
91
+ guard #available(iOS 9.0, macOS 10.11, *) else { return b.run { throw TokamakBinding.unavailable } }
92
+ return b.run { let value = try b.target(LAContext.self).setCredential(b.optional(b[0]) { try b.decode($0, as: Data.self) }, type: TokamakBindings_local_authentication.decode(b[1], b, as: LACredentialType.self)); return b.encode(value) }
93
+ case "LAContext.touchIDAuthenticationAllowableReuseDuration":
94
+ guard #available(iOS 9.0, macOS 10.12, *) else { return b.run { throw TokamakBinding.unavailable } }
95
+ return b.run { let value = try b.target(LAContext.self).touchIDAuthenticationAllowableReuseDuration; return b.encode(value) }
96
+ case "LAContext.touchIDAuthenticationAllowableReuseDuration=":
97
+ guard #available(iOS 9.0, macOS 10.12, *) else { return b.run { throw TokamakBinding.unavailable } }
98
+ return b.run { try b.target(LAContext.self).touchIDAuthenticationAllowableReuseDuration = b.decode(b[0], as: TimeInterval.self); return nil }
99
+ case "LAContext.init()":
100
+ guard #available(iOS 8.0, macOS 10.10, *) else { return b.run { throw TokamakBinding.unavailable } }
101
+ return b.run { let value = LAContext(); return b.encode(object: value) }
102
+ case "LADomainState.biometry":
103
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
104
+ return b.run { let value = try b.target(LADomainState.self).biometry; return b.encode(object: value) }
105
+ case "LADomainState.companion":
106
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
107
+ return b.run { let value = try b.target(LADomainState.self).companion; return b.encode(object: value) }
108
+ case "LADomainState.stateHash":
109
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
110
+ return b.run { let value = try b.target(LADomainState.self).stateHash; return b.encode(optional: value) { b.encode($0) } }
111
+ case "LADomainStateBiometry.biometryType":
112
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
113
+ return b.run { let value = try b.target(LADomainStateBiometry.self).biometryType; return TokamakBindings_local_authentication.encode(value, b) }
114
+ case "LADomainStateBiometry.stateHash":
115
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
116
+ return b.run { let value = try b.target(LADomainStateBiometry.self).stateHash; return b.encode(optional: value) { b.encode($0) } }
117
+ case "LADomainStateCompanion.availableCompanionTypes":
118
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
119
+ return b.run { let value = try b.target(LADomainStateCompanion.self).availableCompanionTypes; return b.encode(array: value) { TokamakBindings_local_authentication.encode($0, b) } }
120
+ case "LADomainStateCompanion.stateHash":
121
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
122
+ return b.run { let value = try b.target(LADomainStateCompanion.self).stateHash; return b.encode(optional: value) { b.encode($0) } }
123
+ case "LADomainStateCompanion.stateHash(for:)":
124
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
125
+ return b.run { let value = try b.target(LADomainStateCompanion.self).stateHash(for: TokamakBindings_local_authentication.decode(b[0], b, as: LACompanionType.self)); return b.encode(optional: value) { b.encode($0) } }
126
+ case "LAEnvironment.addObserver(_:)":
127
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
128
+ return b.run { try b.target(LAEnvironment.self).addObserver(b.object(b[0], as: (any LAEnvironment.Observer).self)); return nil }
129
+ case "LAEnvironment.currentUser":
130
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
131
+ return b.run { let value = LAEnvironment.currentUser; return b.encode(object: value) }
132
+ case "LAEnvironment.removeObserver(_:)":
133
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
134
+ return b.run { try b.target(LAEnvironment.self).removeObserver(b.object(b[0], as: (any LAEnvironment.Observer).self)); return nil }
135
+ case "LAEnvironment.state":
136
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
137
+ return b.run { let value = try b.target(LAEnvironment.self).state; return b.encode(object: value) }
138
+ case "LAEnvironment.Mechanism.iconSystemName":
139
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
140
+ return b.run { let value = try b.target(LAEnvironment.Mechanism.self).iconSystemName; return b.encode(value) }
141
+ case "LAEnvironment.Mechanism.isUsable":
142
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
143
+ return b.run { let value = try b.target(LAEnvironment.Mechanism.self).isUsable; return b.encode(value) }
144
+ case "LAEnvironment.Mechanism.localizedName":
145
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
146
+ return b.run { let value = try b.target(LAEnvironment.Mechanism.self).localizedName; return b.encode(value) }
147
+ case "LAEnvironment.MechanismBiometry.biometryType":
148
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
149
+ return b.run { let value = try b.target(LAEnvironment.MechanismBiometry.self).biometryType; return TokamakBindings_local_authentication.encode(value, b) }
150
+ case "LAEnvironment.MechanismBiometry.builtInSensorInaccessible":
151
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
152
+ return b.run { let value = try b.target(LAEnvironment.MechanismBiometry.self).builtInSensorInaccessible; return b.encode(value) }
153
+ case "LAEnvironment.MechanismBiometry.isEnrolled":
154
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
155
+ return b.run { let value = try b.target(LAEnvironment.MechanismBiometry.self).isEnrolled; return b.encode(value) }
156
+ case "LAEnvironment.MechanismBiometry.isLockedOut":
157
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
158
+ return b.run { let value = try b.target(LAEnvironment.MechanismBiometry.self).isLockedOut; return b.encode(value) }
159
+ case "LAEnvironment.MechanismBiometry.stateHash":
160
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
161
+ return b.run { let value = try b.target(LAEnvironment.MechanismBiometry.self).stateHash; return b.encode(value) }
162
+ case "LAEnvironment.MechanismCompanion.stateHash":
163
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
164
+ return b.run { let value = try b.target(LAEnvironment.MechanismCompanion.self).stateHash; return b.encode(optional: value) { b.encode($0) } }
165
+ case "LAEnvironment.MechanismCompanion.type":
166
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
167
+ return b.run { let value = try b.target(LAEnvironment.MechanismCompanion.self).type; return TokamakBindings_local_authentication.encode(value, b) }
168
+ case "LAEnvironment.MechanismUserPassword.isSet":
169
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
170
+ return b.run { let value = try b.target(LAEnvironment.MechanismUserPassword.self).isSet; return b.encode(value) }
171
+ case "LAEnvironment.State.allMechanisms":
172
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
173
+ return b.run { let value = try b.target(LAEnvironment.State.self).allMechanisms; return b.encode(array: value) { b.encode(object: $0) } }
174
+ case "LAEnvironment.State.biometry":
175
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
176
+ return b.run { let value = try b.target(LAEnvironment.State.self).biometry; return b.encode(optional: value) { b.encode(object: $0) } }
177
+ case "LAEnvironment.State.companions":
178
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
179
+ return b.run { let value = try b.target(LAEnvironment.State.self).companions; return b.encode(array: value) { b.encode(object: $0) } }
180
+ case "LAEnvironment.State.userPassword":
181
+ guard #available(iOS 18.0, macOS 15.0, *) else { return b.run { throw TokamakBinding.unavailable } }
182
+ return b.run { let value = try b.target(LAEnvironment.State.self).userPassword; return b.encode(optional: value) { b.encode(object: $0) } }
183
+ case "LAPersistedRight.key":
184
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
185
+ return b.run { let value = try b.target(LAPersistedRight.self).key; return b.encode(object: value) }
186
+ case "LAPersistedRight.secret":
187
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
188
+ return b.run { let value = try b.target(LAPersistedRight.self).secret; return b.encode(object: value) }
189
+ case "LAPrivateKey.publicKey":
190
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
191
+ return b.run { let value = try b.target(LAPrivateKey.self).publicKey; return b.encode(object: value) }
192
+ case "LAPublicKey.bytes":
193
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
194
+ return b.task { let value = try await b.target(LAPublicKey.self).bytes; return b.encode(value) }
195
+ case "LARight.authorize(localizedReason:)":
196
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
197
+ return b.task { try await b.target(LARight.self).authorize(localizedReason: b.decode(b[0], as: String.self)); return nil }
198
+ case "LARight.checkCanAuthorize()":
199
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
200
+ return b.task { try await b.target(LARight.self).checkCanAuthorize(); return nil }
201
+ case "LARight.deauthorize()":
202
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
203
+ return b.task { try await b.target(LARight.self).deauthorize(); return nil }
204
+ case "LARight.init()":
205
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
206
+ return b.run { let value = LARight(); return b.encode(object: value) }
207
+ case "LARight.init(requirement:)":
208
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
209
+ return b.run { let value = try LARight(requirement: b.object(b[0], as: LAAuthenticationRequirement.self)); return b.encode(object: value) }
210
+ case "LARight.state":
211
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
212
+ return b.run { let value = try b.target(LARight.self).state; return TokamakBindings_local_authentication.encode(value, b) }
213
+ case "LARight.tag":
214
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
215
+ return b.run { let value = try b.target(LARight.self).tag; return b.encode(value) }
216
+ case "LARight.tag=":
217
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
218
+ return b.run { try b.target(LARight.self).tag = b.decode(b[0], as: Int.self); return nil }
219
+ case "LARightStore.removeAllRights()":
220
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
221
+ return b.task { try await b.target(LARightStore.self).removeAllRights(); return nil }
222
+ case "LARightStore.removeRight(_:)":
223
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
224
+ return b.task { try await b.target(LARightStore.self).removeRight(b.object(b[0], as: LAPersistedRight.self)); return nil }
225
+ case "LARightStore.removeRight(forIdentifier:)":
226
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
227
+ return b.task { try await b.target(LARightStore.self).removeRight(forIdentifier: b.decode(b[0], as: String.self)); return nil }
228
+ case "LARightStore.right(forIdentifier:)":
229
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
230
+ return b.task { let value = try await b.target(LARightStore.self).right(forIdentifier: b.decode(b[0], as: String.self)); return b.encode(object: value) }
231
+ case "LARightStore.saveRight(_:identifier:)":
232
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
233
+ return b.task { let value = try await b.target(LARightStore.self).saveRight(b.object(b[0], as: LARight.self), identifier: b.decode(b[1], as: String.self)); return b.encode(object: value) }
234
+ case "LARightStore.saveRight(_:identifier:secret:)":
235
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
236
+ return b.task { let value = try await b.target(LARightStore.self).saveRight(b.object(b[0], as: LARight.self), identifier: b.decode(b[1], as: String.self), secret: b.decode(b[2], as: Data.self)); return b.encode(object: value) }
237
+ case "LARightStore.shared":
238
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
239
+ return b.run { let value = LARightStore.shared; return b.encode(object: value) }
240
+ case "LASecret.rawData":
241
+ guard #available(iOS 16.0, macOS 13.0, *) else { return b.run { throw TokamakBinding.unavailable } }
242
+ return b.task { let value = try await b.target(LASecret.self).rawData; return b.encode(value) }
243
+ case "LAErrorDomain":
244
+ guard #available(iOS 8.3, macOS 10.11, *) else { return b.run { throw TokamakBinding.unavailable } }
245
+ return b.run { let value = LAErrorDomain; return b.encode(value) }
246
+ case "LATouchIDAuthenticationMaximumAllowableReuseDuration":
247
+ guard #available(iOS 9.0, macOS 10.12, *) else { return b.run { throw TokamakBinding.unavailable } }
248
+ return b.run { let value = LATouchIDAuthenticationMaximumAllowableReuseDuration; return b.encode(value) }
249
+ case "kLAAccessControlOperationCreateItem":
250
+ return b.run { let value = kLAAccessControlOperationCreateItem; return b.encode(value) }
251
+ case "kLAAccessControlOperationCreateKey":
252
+ return b.run { let value = kLAAccessControlOperationCreateKey; return b.encode(value) }
253
+ case "kLAAccessControlOperationUseItem":
254
+ return b.run { let value = kLAAccessControlOperationUseItem; return b.encode(value) }
255
+ case "kLAAccessControlOperationUseKeyDecrypt":
256
+ return b.run { let value = kLAAccessControlOperationUseKeyDecrypt; return b.encode(value) }
257
+ case "kLAAccessControlOperationUseKeyKeyExchange":
258
+ return b.run { let value = kLAAccessControlOperationUseKeyKeyExchange; return b.encode(value) }
259
+ case "kLAAccessControlOperationUseKeySign":
260
+ return b.run { let value = kLAAccessControlOperationUseKeySign; return b.encode(value) }
261
+ case "kLABiometryTypeFaceID":
262
+ return b.run { let value = kLABiometryTypeFaceID; return b.encode(value) }
263
+ case "kLABiometryTypeNone":
264
+ return b.run { let value = kLABiometryTypeNone; return b.encode(value) }
265
+ case "kLABiometryTypeOpticID":
266
+ return b.run { let value = kLABiometryTypeOpticID; return b.encode(value) }
267
+ case "kLABiometryTypeTouchID":
268
+ return b.run { let value = kLABiometryTypeTouchID; return b.encode(value) }
269
+ case "kLACompanionTypeMac":
270
+ return b.run { let value = kLACompanionTypeMac; return b.encode(value) }
271
+ case "kLACompanionTypeNone":
272
+ return b.run { let value = kLACompanionTypeNone; return b.encode(value) }
273
+ case "kLACompanionTypeVision":
274
+ return b.run { let value = kLACompanionTypeVision; return b.encode(value) }
275
+ case "kLACompanionTypeWatch":
276
+ return b.run { let value = kLACompanionTypeWatch; return b.encode(value) }
277
+ case "kLACredentialSmartCardPIN":
278
+ return b.run { let value = kLACredentialSmartCardPIN; return b.encode(value) }
279
+ case "kLACredentialTypeApplicationPassword":
280
+ return b.run { let value = kLACredentialTypeApplicationPassword; return b.encode(value) }
281
+ case "kLAErrorAppCancel":
282
+ return b.run { let value = kLAErrorAppCancel; return b.encode(value) }
283
+ case "kLAErrorAuthenticationFailed":
284
+ return b.run { let value = kLAErrorAuthenticationFailed; return b.encode(value) }
285
+ case "kLAErrorBiometryDisconnected":
286
+ return b.run { let value = kLAErrorBiometryDisconnected; return b.encode(value) }
287
+ case "kLAErrorBiometryLockout":
288
+ return b.run { let value = kLAErrorBiometryLockout; return b.encode(value) }
289
+ case "kLAErrorBiometryNotAvailable":
290
+ return b.run { let value = kLAErrorBiometryNotAvailable; return b.encode(value) }
291
+ case "kLAErrorBiometryNotEnrolled":
292
+ return b.run { let value = kLAErrorBiometryNotEnrolled; return b.encode(value) }
293
+ case "kLAErrorBiometryNotPaired":
294
+ return b.run { let value = kLAErrorBiometryNotPaired; return b.encode(value) }
295
+ case "kLAErrorCompanionNotAvailable":
296
+ return b.run { let value = kLAErrorCompanionNotAvailable; return b.encode(value) }
297
+ case "kLAErrorDomain":
298
+ return b.run { let value = kLAErrorDomain; return b.encode(value) }
299
+ case "kLAErrorInvalidContext":
300
+ return b.run { let value = kLAErrorInvalidContext; return b.encode(value) }
301
+ case "kLAErrorInvalidDimensions":
302
+ return b.run { let value = kLAErrorInvalidDimensions; return b.encode(value) }
303
+ case "kLAErrorNotInteractive":
304
+ return b.run { let value = kLAErrorNotInteractive; return b.encode(value) }
305
+ case "kLAErrorPasscodeNotSet":
306
+ return b.run { let value = kLAErrorPasscodeNotSet; return b.encode(value) }
307
+ case "kLAErrorSystemCancel":
308
+ return b.run { let value = kLAErrorSystemCancel; return b.encode(value) }
309
+ case "kLAErrorTouchIDLockout":
310
+ return b.run { let value = kLAErrorTouchIDLockout; return b.encode(value) }
311
+ case "kLAErrorTouchIDNotAvailable":
312
+ return b.run { let value = kLAErrorTouchIDNotAvailable; return b.encode(value) }
313
+ case "kLAErrorTouchIDNotEnrolled":
314
+ return b.run { let value = kLAErrorTouchIDNotEnrolled; return b.encode(value) }
315
+ case "kLAErrorUserCancel":
316
+ return b.run { let value = kLAErrorUserCancel; return b.encode(value) }
317
+ case "kLAErrorUserFallback":
318
+ return b.run { let value = kLAErrorUserFallback; return b.encode(value) }
319
+ case "kLAErrorWatchNotAvailable":
320
+ return b.run { let value = kLAErrorWatchNotAvailable; return b.encode(value) }
321
+ case "kLAPolicyDeviceOwnerAuthentication":
322
+ return b.run { let value = kLAPolicyDeviceOwnerAuthentication; return b.encode(value) }
323
+ case "kLAPolicyDeviceOwnerAuthenticationWithBiometrics":
324
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithBiometrics; return b.encode(value) }
325
+ case "kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrCompanion":
326
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrCompanion; return b.encode(value) }
327
+ case "kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch":
328
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithBiometricsOrWatch; return b.encode(value) }
329
+ case "kLAPolicyDeviceOwnerAuthenticationWithCompanion":
330
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithCompanion; return b.encode(value) }
331
+ case "kLAPolicyDeviceOwnerAuthenticationWithWatch":
332
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithWatch; return b.encode(value) }
333
+ case "kLAPolicyDeviceOwnerAuthenticationWithWristDetection":
334
+ return b.run { let value = kLAPolicyDeviceOwnerAuthenticationWithWristDetection; return b.encode(value) }
335
+ default:
336
+ return b.unsupported(method)
337
+ }
338
+ }
339
+
340
+ func subscribeBytes(method: String, payload: Data, reply: @escaping TokamakPluginBytesReply)
341
+ throws(TokamakPluginError) -> () -> Void
342
+ {
343
+ let b = TokamakBinding(payload, resources: host.resources, reply: reply)
344
+ switch method {
345
+ case "LAEnvironment.Observer":
346
+ guard #available(iOS 18.0, macOS 15.0, *) else { throw TokamakBinding.unavailable }
347
+ return b.implement(LAEnvironment_ObserverImplementation.self)
348
+ default:
349
+ throw .notSupported("\(method) is not supported")
350
+ }
351
+ }
352
+
353
+ @available(iOS 9.0, macOS 10.11, *)
354
+ private static func encode(_ value: LAAccessControlOperation, _ b: TokamakBinding) -> Any {
355
+ if value == .createItem { return "createItem" }
356
+ if value == .createKey { return "createKey" }
357
+ if value == .useItem { return "useItem" }
358
+ if #available(iOS 10.0, macOS 10.12, *), value == .useKeyDecrypt { return "useKeyDecrypt" }
359
+ if #available(iOS 10.0, macOS 10.12, *), value == .useKeyKeyExchange { return "useKeyKeyExchange" }
360
+ if value == .useKeySign { return "useKeySign" }
361
+ return "\(value)"
362
+ }
363
+
364
+ @available(iOS 9.0, macOS 10.11, *)
365
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LAAccessControlOperation.Type) throws -> LAAccessControlOperation {
366
+ switch try b.decode(value, as: String.self) {
367
+ case "createItem":
368
+ return .createItem
369
+ case "createKey":
370
+ return .createKey
371
+ case "useItem":
372
+ return .useItem
373
+ case "useKeyDecrypt":
374
+ guard #available(iOS 10.0, macOS 10.12, *) else { throw TokamakBinding.unavailable }
375
+ return .useKeyDecrypt
376
+ case "useKeyKeyExchange":
377
+ guard #available(iOS 10.0, macOS 10.12, *) else { throw TokamakBinding.unavailable }
378
+ return .useKeyKeyExchange
379
+ case "useKeySign":
380
+ return .useKeySign
381
+ default: throw b.mismatch(value, type)
382
+ }
383
+ }
384
+
385
+ @available(iOS 11.0, macOS 10.13.2, *)
386
+ private static func encode(_ value: LABiometryType, _ b: TokamakBinding) -> Any {
387
+ if #available(macOS 10.15, *), value == .faceID { return "faceID" }
388
+ if #available(iOS 11.2, *), value == .none { return "none" }
389
+ if #available(iOS 17.0, macOS 14.0, *), value == .opticID { return "opticID" }
390
+ if value == .touchID { return "touchID" }
391
+ return "\(value)"
392
+ }
393
+
394
+ @available(iOS 11.0, macOS 10.13.2, *)
395
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LABiometryType.Type) throws -> LABiometryType {
396
+ switch try b.decode(value, as: String.self) {
397
+ case "faceID":
398
+ guard #available(macOS 10.15, *) else { throw TokamakBinding.unavailable }
399
+ return .faceID
400
+ case "none":
401
+ guard #available(iOS 11.2, *) else { throw TokamakBinding.unavailable }
402
+ return .none
403
+ case "opticID":
404
+ guard #available(iOS 17.0, macOS 14.0, *) else { throw TokamakBinding.unavailable }
405
+ return .opticID
406
+ case "touchID":
407
+ return .touchID
408
+ default: throw b.mismatch(value, type)
409
+ }
410
+ }
411
+
412
+ @available(iOS 18.0, macOS 15.0, *)
413
+ private static func encode(_ value: LACompanionType, _ b: TokamakBinding) -> Any {
414
+ #if os(iOS)
415
+ if value == .mac { return "mac" }
416
+ #endif
417
+ #if os(iOS)
418
+ if #available(iOS 26.0, *), value == .vision { return "vision" }
419
+ #endif
420
+ #if os(macOS)
421
+ if value == .watch { return "watch" }
422
+ #endif
423
+ return "\(value)"
424
+ }
425
+
426
+ @available(iOS 18.0, macOS 15.0, *)
427
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LACompanionType.Type) throws -> LACompanionType {
428
+ switch try b.decode(value, as: String.self) {
429
+ #if os(iOS)
430
+ case "mac":
431
+ return .mac
432
+ #endif
433
+ #if os(iOS)
434
+ case "vision":
435
+ guard #available(iOS 26.0, *) else { throw TokamakBinding.unavailable }
436
+ return .vision
437
+ #endif
438
+ #if os(macOS)
439
+ case "watch":
440
+ return .watch
441
+ #endif
442
+ default: throw b.mismatch(value, type)
443
+ }
444
+ }
445
+
446
+ @available(iOS 9.0, macOS 10.11, *)
447
+ private static func encode(_ value: LACredentialType, _ b: TokamakBinding) -> Any {
448
+ if value == .applicationPassword { return "applicationPassword" }
449
+ if #available(iOS 13.4, macOS 10.15.4, *), value == .smartCardPIN { return "smartCardPIN" }
450
+ return "\(value)"
451
+ }
452
+
453
+ @available(iOS 9.0, macOS 10.11, *)
454
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LACredentialType.Type) throws -> LACredentialType {
455
+ switch try b.decode(value, as: String.self) {
456
+ case "applicationPassword":
457
+ return .applicationPassword
458
+ case "smartCardPIN":
459
+ guard #available(iOS 13.4, macOS 10.15.4, *) else { throw TokamakBinding.unavailable }
460
+ return .smartCardPIN
461
+ default: throw b.mismatch(value, type)
462
+ }
463
+ }
464
+
465
+ @available(iOS 18.0, macOS 15.0, *)
466
+ private final class LAEnvironment_ObserverImplementation: TokamakBindingImplementation, LAEnvironment.Observer {
467
+ override class var selectors: [Selector: String] {
468
+ [
469
+ NSSelectorFromString("environment:stateDidChangeFromOldState:"): "environmentStateDidChangeFromOldState",
470
+ ]
471
+ }
472
+
473
+ @available(iOS 18.0, macOS 15.0, *)
474
+ func environment(_ environment: LAEnvironment, stateDidChangeFromOldState oldState: LAEnvironment.State) {
475
+ call("environmentStateDidChangeFromOldState") { b in [b.encode(object: environment), b.encode(object: oldState)] }
476
+ }
477
+ }
478
+
479
+ @available(iOS 8.0, macOS 10.10, *)
480
+ private static func encode(_ value: LAPolicy, _ b: TokamakBinding) -> Any {
481
+ if #available(iOS 9.0, macOS 10.11, *), value == .deviceOwnerAuthentication { return "deviceOwnerAuthentication" }
482
+ if #available(macOS 10.12.2, *), value == .deviceOwnerAuthenticationWithBiometrics { return "deviceOwnerAuthenticationWithBiometrics" }
483
+ if #available(iOS 18.0, macOS 15.0, *), value == .deviceOwnerAuthenticationWithBiometricsOrCompanion { return "deviceOwnerAuthenticationWithBiometricsOrCompanion" }
484
+ if #available(iOS 18.0, macOS 15.0, *), value == .deviceOwnerAuthenticationWithCompanion { return "deviceOwnerAuthenticationWithCompanion" }
485
+ return "\(value)"
486
+ }
487
+
488
+ @available(iOS 8.0, macOS 10.10, *)
489
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LAPolicy.Type) throws -> LAPolicy {
490
+ switch try b.decode(value, as: String.self) {
491
+ case "deviceOwnerAuthentication":
492
+ guard #available(iOS 9.0, macOS 10.11, *) else { throw TokamakBinding.unavailable }
493
+ return .deviceOwnerAuthentication
494
+ case "deviceOwnerAuthenticationWithBiometrics":
495
+ guard #available(macOS 10.12.2, *) else { throw TokamakBinding.unavailable }
496
+ return .deviceOwnerAuthenticationWithBiometrics
497
+ case "deviceOwnerAuthenticationWithBiometricsOrCompanion":
498
+ guard #available(iOS 18.0, macOS 15.0, *) else { throw TokamakBinding.unavailable }
499
+ return .deviceOwnerAuthenticationWithBiometricsOrCompanion
500
+ case "deviceOwnerAuthenticationWithCompanion":
501
+ guard #available(iOS 18.0, macOS 15.0, *) else { throw TokamakBinding.unavailable }
502
+ return .deviceOwnerAuthenticationWithCompanion
503
+ default: throw b.mismatch(value, type)
504
+ }
505
+ }
506
+
507
+ @available(iOS 16.0, macOS 13.0, *)
508
+ private static func encode(_ value: LARight.State, _ b: TokamakBinding) -> Any {
509
+ if value == .authorized { return "authorized" }
510
+ if value == .authorizing { return "authorizing" }
511
+ if value == .notAuthorized { return "notAuthorized" }
512
+ if value == .unknown { return "unknown" }
513
+ return "\(value)"
514
+ }
515
+
516
+ @available(iOS 16.0, macOS 13.0, *)
517
+ private static func decode(_ value: Any, _ b: TokamakBinding, as type: LARight.State.Type) throws -> LARight.State {
518
+ switch try b.decode(value, as: String.self) {
519
+ case "authorized":
520
+ return .authorized
521
+ case "authorizing":
522
+ return .authorizing
523
+ case "notAuthorized":
524
+ return .notAuthorized
525
+ case "unknown":
526
+ return .unknown
527
+ default: throw b.mismatch(value, type)
528
+ }
529
+ }
530
+ }
@@ -14,20 +14,21 @@ final class TokamakLocalAuthenticationPlugin: TokamakPlugin {
14
14
  method: String,
15
15
  arguments: Any,
16
16
  reply: @escaping TokamakPluginReply
17
- ) {
17
+ ) -> (() -> Void)? {
18
18
  let arguments = arguments as? [String: Any] ?? [:]
19
19
  do throws(TokamakPluginError) {
20
20
  switch method {
21
21
  case "status":
22
22
  reply(.success(status(try policy(arguments))))
23
23
  case "authenticate":
24
- try authenticate(policy(arguments), prompt: prompt(arguments), reply: reply)
24
+ return try authenticate(policy(arguments), prompt: prompt(arguments), reply: reply)
25
25
  default:
26
26
  throw .notSupported("\(id).\(method) is not supported")
27
27
  }
28
28
  } catch {
29
29
  reply(.failure(error))
30
30
  }
31
+ return nil
31
32
  }
32
33
 
33
34
  private func status(_ policy: LAPolicy) -> String {
@@ -49,7 +50,7 @@ final class TokamakLocalAuthenticationPlugin: TokamakPlugin {
49
50
  _ policy: LAPolicy,
50
51
  prompt: String,
51
52
  reply: @escaping TokamakPluginReply
52
- ) throws(TokamakPluginError) {
53
+ ) throws(TokamakPluginError) -> (() -> Void) {
53
54
  let context = LAContext()
54
55
  var error: NSError?
55
56
  guard context.canEvaluatePolicy(policy, error: &error) else {
@@ -66,6 +67,7 @@ final class TokamakLocalAuthenticationPlugin: TokamakPlugin {
66
67
  reply(success ? .success(nil) : .failure(Self.failure(error)))
67
68
  }
68
69
  }
70
+ return { context.invalidate() }
69
71
  }
70
72
 
71
73
  private static func failure(_ error: Error?) -> TokamakPluginError {