@breeztech/breez-sdk-spark-react-native 0.15.0 → 0.16.1-dev1

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 (29) hide show
  1. package/cpp/generated/breez_sdk_spark.cpp +4947 -2629
  2. package/cpp/generated/breez_sdk_spark.hpp +257 -110
  3. package/lib/commonjs/generated/breez_sdk_spark-ffi.js.map +1 -1
  4. package/lib/commonjs/generated/breez_sdk_spark.js +1304 -580
  5. package/lib/commonjs/generated/breez_sdk_spark.js.map +1 -1
  6. package/lib/commonjs/passkey-prf-provider.js +300 -0
  7. package/lib/commonjs/passkey-prf-provider.js.map +1 -0
  8. package/lib/module/generated/breez_sdk_spark-ffi.js.map +1 -1
  9. package/lib/module/generated/breez_sdk_spark.js +1304 -580
  10. package/lib/module/generated/breez_sdk_spark.js.map +1 -1
  11. package/lib/module/passkey-prf-provider.js +293 -0
  12. package/lib/module/passkey-prf-provider.js.map +1 -0
  13. package/lib/typescript/commonjs/src/generated/breez_sdk_spark-ffi.d.ts +199 -140
  14. package/lib/typescript/commonjs/src/generated/breez_sdk_spark-ffi.d.ts.map +1 -1
  15. package/lib/typescript/commonjs/src/generated/breez_sdk_spark.d.ts +6149 -3695
  16. package/lib/typescript/commonjs/src/generated/breez_sdk_spark.d.ts.map +1 -1
  17. package/lib/typescript/commonjs/src/passkey-prf-provider.d.ts +135 -0
  18. package/lib/typescript/commonjs/src/passkey-prf-provider.d.ts.map +1 -0
  19. package/lib/typescript/module/src/generated/breez_sdk_spark-ffi.d.ts +199 -140
  20. package/lib/typescript/module/src/generated/breez_sdk_spark-ffi.d.ts.map +1 -1
  21. package/lib/typescript/module/src/generated/breez_sdk_spark.d.ts +6149 -3695
  22. package/lib/typescript/module/src/generated/breez_sdk_spark.d.ts.map +1 -1
  23. package/lib/typescript/module/src/passkey-prf-provider.d.ts +135 -0
  24. package/lib/typescript/module/src/passkey-prf-provider.d.ts.map +1 -0
  25. package/package.json +17 -5
  26. package/scripts/post-ubrn.js +227 -0
  27. package/src/generated/breez_sdk_spark-ffi.ts +366 -198
  28. package/src/generated/breez_sdk_spark.ts +12343 -7056
  29. package/src/passkey-prf-provider.ts +372 -0
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+
3
+ import { NativeModules, Platform } from 'react-native';
4
+ import { PasskeyClient as SdkPasskeyClient, PasskeyProviderOptions } from "./generated/breez_sdk_spark.js";
5
+ const {
6
+ BreezSdkSparkPasskey
7
+ } = NativeModules;
8
+
9
+ /**
10
+ * Diagnostic error for when the native passkey module isn't reachable. The
11
+ * common iOS cause is running below iOS 18, where the `@available(iOS 18.0, *)`
12
+ * Swift class cannot load; on Android a missing module means broken linking.
13
+ */
14
+ function passkeyModuleUnavailableError(operation) {
15
+ if (Platform.OS === 'ios') {
16
+ const version = parseFloat(String(Platform.Version));
17
+ if (!Number.isNaN(version) && version < 18) {
18
+ return new Error(`Passkey PRF requires iOS 18.0 or later. ` + `This device is running iOS ${Platform.Version}, where ` + `ASAuthorizationPlatformPublicKeyCredentialPRFAssertionInput is not available. ` + `${operation} is unsupported on this device.`);
19
+ }
20
+ return new Error(`Passkey PRF native module (BreezSdkSparkPasskey) failed to load on iOS. ` + `This normally means the iOS deployment target is lower than 18.0 or ` + `the pod was not linked. ${operation} is unavailable.`);
21
+ }
22
+ if (Platform.OS === 'android') {
23
+ return new Error(`Passkey PRF native module (BreezSdkSparkPasskey) is not registered. ` + `Check that @breeztech/breez-sdk-spark-react-native is autolinked and ` + `that BreezSdkSparkPasskeyModule appears in BreezSdkSparkReactNativePackage. ` + `${operation} is unavailable.`);
24
+ }
25
+ return new Error(`Passkey PRF is only supported on iOS 18+ and Android 9+. ` + `${operation} is not available on ${Platform.OS}.`);
26
+ }
27
+
28
+ /**
29
+ * A passkey credential from a register or sign-in ceremony. `credentialId`
30
+ * is always set; the attestation fields are populated on registration and
31
+ * absent on sign-in (an assertion carries no attestation). Persist
32
+ * `credentialId` to drive `excludeCredentials` / `allowCredentials` on later
33
+ * calls. Treat `aaguid` as an unverified display hint, never a trust decision.
34
+ * `userId` is the user handle minted by the native plugin (never host-supplied).
35
+ */
36
+
37
+ /**
38
+ * Result of {@link PasskeyProvider.checkDomainAssociation}. Switch on `kind`
39
+ * to handle each outcome.
40
+ */
41
+
42
+ /**
43
+ * Error thrown when a passkey operation fails, with a structured `code` for
44
+ * programmatic handling: `userCancelled`, `userTimedOut`, `prfNotSupported`,
45
+ * `noCredential`, `configuration`, `credentialAlreadyExists`, `unknown`.
46
+ * `userTimedOut` is the OS biometric inactivity timeout (distinct from the
47
+ * user dismissing the prompt), so hosts may safely auto-retry it.
48
+ */
49
+ export class PasskeyPrfException extends Error {
50
+ constructor(code, message) {
51
+ super(message);
52
+ this.name = 'PasskeyPrfException';
53
+ this.code = code;
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Map a native bridge rejection (RN passes `{ code, message }` on the
59
+ * thrown error) into a typed [PasskeyPrfException].
60
+ */
61
+ function mapNativeError(err) {
62
+ const anyErr = err;
63
+ const message = anyErr?.message ?? 'Unknown passkey error';
64
+ switch (anyErr?.code) {
65
+ case 'ERR_USER_CANCELLED':
66
+ return new PasskeyPrfException('userCancelled', message);
67
+ case 'ERR_USER_TIMED_OUT':
68
+ return new PasskeyPrfException('userTimedOut', message);
69
+ case 'ERR_PRF_NOT_SUPPORTED':
70
+ return new PasskeyPrfException('prfNotSupported', message);
71
+ case 'ERR_NO_CREDENTIAL':
72
+ return new PasskeyPrfException('noCredential', message);
73
+ case 'ERR_CONFIGURATION':
74
+ return new PasskeyPrfException('configuration', message);
75
+ case 'ERR_CREDENTIAL_ALREADY_EXISTS':
76
+ return new PasskeyPrfException('credentialAlreadyExists', message);
77
+ case 'ERR_AUTHENTICATION_FAILED':
78
+ return new PasskeyPrfException('authenticationFailed', message);
79
+ case 'ERR_PRF_EVALUATION_FAILED':
80
+ return new PasskeyPrfException('prfEvaluationFailed', message);
81
+ default:
82
+ return new PasskeyPrfException('unknown', message);
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Built-in React Native passkey PRF provider, backed by AuthenticationServices
88
+ * on iOS and Credential Manager on Android. The default {@link PrfProvider};
89
+ * inject a configured instance through {@link PasskeyClientBuilder}. Requires
90
+ * iOS 18+ or Android 14+ (API 34) plus the Associated Domains entitlement
91
+ * (iOS) or assetlinks.json (Android) for the RP domain.
92
+ */
93
+ export class PasskeyProvider {
94
+ /**
95
+ * Breez's shared `keys.breez.technology` RP. Pass as `rpId` to opt in
96
+ * (only valid for apps registered with Breez); apps with their own RP
97
+ * domain pass their own string.
98
+ */
99
+ static BREEZ_RP_ID = 'keys.breez.technology';
100
+
101
+ /** Default `rpName` for the zero-config client when none is supplied. */
102
+ static DEFAULT_RP_NAME = 'Breez';
103
+ constructor(options) {
104
+ this.rpId = options.rpId ?? PasskeyProvider.BREEZ_RP_ID;
105
+ this.rpName = options.rpName ?? PasskeyProvider.DEFAULT_RP_NAME;
106
+ this.userName = options.userName ?? this.rpName;
107
+ this.userDisplayName = options.userDisplayName ?? this.userName;
108
+ }
109
+
110
+ /**
111
+ * Derive one 32-byte seed per salt from passkey PRF, in as few OS prompts
112
+ * as the platform supports. `allowCredentials` restricts the assertion to
113
+ * specific credential IDs (mainly for reauthentication) when non-empty;
114
+ * `preferImmediatelyAvailableCredentials` overrides the platform default
115
+ * when set. Returns the seeds plus the asserted credential ID.
116
+ */
117
+ async deriveSeeds(request) {
118
+ if (!BreezSdkSparkPasskey) {
119
+ throw passkeyModuleUnavailableError('deriveSeeds');
120
+ }
121
+ const allowBase64 = (request.allowCredentials ?? []).map(id => uint8ArrayToBase64(id));
122
+ const preferImmediate = request.preferImmediatelyAvailableCredentials ?? null;
123
+ let result;
124
+ try {
125
+ result = await BreezSdkSparkPasskey.deriveSeeds(request.salts, this.rpId, this.rpName, this.userName, this.userDisplayName, false, allowBase64, preferImmediate);
126
+ if (!result || !Array.isArray(result.seeds)) {
127
+ throw new PasskeyPrfException('unknown', 'deriveSeeds returned an unexpected shape');
128
+ }
129
+ } catch (err) {
130
+ if (err instanceof PasskeyPrfException) {
131
+ throw err;
132
+ }
133
+ throw mapNativeError(err);
134
+ }
135
+
136
+ // The native module returns the asserted credential ID alongside the
137
+ // seeds; surface it so the SDK can pin the next derive to this exact
138
+ // credential.
139
+ return {
140
+ seeds: result.seeds.map(b64 => base64ToUint8Array(b64)),
141
+ credentialId: result.credentialId ? base64ToUint8Array(result.credentialId) : undefined
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Register a new PRF-capable passkey (one prompt, no seed derivation): use
147
+ * it to split credential creation from derivation in multi-step onboarding.
148
+ * `excludeCredentials` blocks re-registering a device that already holds a
149
+ * credential, surfaced as a `credentialAlreadyExists` failure. The returned
150
+ * user handle is minted fresh per call (never host-supplied).
151
+ */
152
+ async createPasskey(excludeCredentials = []) {
153
+ if (!BreezSdkSparkPasskey) {
154
+ throw passkeyModuleUnavailableError('createPasskey');
155
+ }
156
+ const excludeBase64 = excludeCredentials.map(id => uint8ArrayToBase64(id));
157
+ try {
158
+ const result = await BreezSdkSparkPasskey.createPasskey(this.rpId, this.rpName, this.userName, this.userDisplayName, excludeBase64);
159
+ return {
160
+ credentialId: base64ToUint8Array(result.credentialId),
161
+ userId: base64ToUint8Array(result.userId),
162
+ aaguid: result.aaguid ? base64ToUint8Array(result.aaguid) : null,
163
+ backupEligible: result.backupEligible
164
+ };
165
+ } catch (err) {
166
+ throw mapNativeError(err);
167
+ }
168
+ }
169
+
170
+ /** Whether this device supports passkeys with the PRF extension. */
171
+ async isSupported() {
172
+ if (!BreezSdkSparkPasskey) {
173
+ return false;
174
+ }
175
+ return await BreezSdkSparkPasskey.isSupported();
176
+ }
177
+
178
+ /**
179
+ * Verify the app is associated with the configured `rpId` for WebAuthn.
180
+ * Android always returns `Skipped` rather than `NotAssociated`: Credential
181
+ * Manager runs its own check internally against fresher data.
182
+ */
183
+ async checkDomainAssociation() {
184
+ if (!BreezSdkSparkPasskey) {
185
+ return {
186
+ kind: 'Skipped',
187
+ reason: 'Native passkey module unavailable on this platform'
188
+ };
189
+ }
190
+ try {
191
+ const result = await BreezSdkSparkPasskey.checkDomainAssociation(this.rpId);
192
+ const kind = result?.kind;
193
+ if (kind === 'Associated') {
194
+ return {
195
+ kind: 'Associated'
196
+ };
197
+ }
198
+ if (kind === 'NotAssociated') {
199
+ return {
200
+ kind: 'NotAssociated',
201
+ source: result?.source ?? 'unknown',
202
+ reason: result?.reason ?? ''
203
+ };
204
+ }
205
+ return {
206
+ kind: 'Skipped',
207
+ reason: result?.reason ?? ''
208
+ };
209
+ } catch (err) {
210
+ const anyErr = err;
211
+ return {
212
+ kind: 'Skipped',
213
+ reason: anyErr?.message ?? 'Domain association probe failed'
214
+ };
215
+ }
216
+ }
217
+ }
218
+
219
+ /** Decode a base64 string to Uint8Array. */
220
+ function base64ToUint8Array(base64) {
221
+ const binaryString = atob(base64);
222
+ const bytes = new Uint8Array(binaryString.length);
223
+ for (let i = 0; i < binaryString.length; i++) {
224
+ bytes[i] = binaryString.charCodeAt(i);
225
+ }
226
+ return bytes;
227
+ }
228
+
229
+ /** Encode a Uint8Array to base64 string. */
230
+ function uint8ArrayToBase64(bytes) {
231
+ let binary = '';
232
+ for (const byte of bytes) {
233
+ binary += String.fromCharCode(byte);
234
+ }
235
+ return btoa(binary);
236
+ }
237
+
238
+ /**
239
+ * Builds a `PasskeyClient` backed by a caller-supplied provider. Use this
240
+ * for a custom PRF backend; omit the provider for the zero-config Breez-RP
241
+ * default and set `providerOptions` on the config to use your own RP.
242
+ */
243
+ export class PasskeyClientBuilder {
244
+ /**
245
+ * @param breezApiKey Breez relay key for authenticated (NIP-42) label
246
+ * storage. Omit for public relays only.
247
+ * @param config Passkey client config. `providerOptions` configures the
248
+ * default provider (ignored when a provider is injected via
249
+ * {@link withPrfProvider}, which owns its RP); `defaultLabel` is the
250
+ * label-store default.
251
+ */
252
+ constructor(breezApiKey, config) {
253
+ this.breezApiKey = breezApiKey;
254
+ this.config = config;
255
+ }
256
+
257
+ /**
258
+ * Inject the provider the client derives seeds through: the built-in
259
+ * {@link PasskeyProvider} or any custom `PrfProvider` implementation.
260
+ * Supersedes the config's `providerOptions` (the injected provider owns
261
+ * its RP).
262
+ */
263
+ withPrfProvider(provider) {
264
+ this.provider = provider;
265
+ return this;
266
+ }
267
+
268
+ /**
269
+ * Construct the client. Falls back to a default {@link PasskeyProvider}
270
+ * on the config's `providerOptions` (default: the Breez RP) when no
271
+ * provider was injected.
272
+ */
273
+ build() {
274
+ // The hand-written PasskeyProvider conforms structurally to the
275
+ // generated PrfProvider foreign interface.
276
+ const provider = this.provider ?? new PasskeyProvider(this.config?.providerOptions ?? PasskeyProviderOptions.create({}));
277
+ return new SdkPasskeyClient(provider, this.breezApiKey, this.config);
278
+ }
279
+ }
280
+
281
+ /** @internal Builds the zero-config client; exposed via {@link PasskeyClient}. */
282
+ function buildPasskeyClient(breezApiKey, config) {
283
+ return new PasskeyClientBuilder(breezApiKey, config).build();
284
+ }
285
+
286
+ /**
287
+ * Zero-config passkey client on the Breez shared RP (`keys.breez.technology`),
288
+ * so a Breez-registered app needs only its relay key; set `providerOptions` on
289
+ * the config to use your own RP. For a custom PRF backend, build the provider
290
+ * and inject it via {@link PasskeyClientBuilder}.
291
+ */
292
+ export const PasskeyClient = buildPasskeyClient;
293
+ //# sourceMappingURL=passkey-prf-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeModules","Platform","PasskeyClient","SdkPasskeyClient","PasskeyProviderOptions","BreezSdkSparkPasskey","passkeyModuleUnavailableError","operation","OS","version","parseFloat","String","Version","Number","isNaN","Error","PasskeyPrfException","constructor","code","message","name","mapNativeError","err","anyErr","PasskeyProvider","BREEZ_RP_ID","DEFAULT_RP_NAME","options","rpId","rpName","userName","userDisplayName","deriveSeeds","request","allowBase64","allowCredentials","map","id","uint8ArrayToBase64","preferImmediate","preferImmediatelyAvailableCredentials","result","salts","Array","isArray","seeds","b64","base64ToUint8Array","credentialId","undefined","createPasskey","excludeCredentials","excludeBase64","userId","aaguid","backupEligible","isSupported","checkDomainAssociation","kind","reason","source","base64","binaryString","atob","bytes","Uint8Array","length","i","charCodeAt","binary","byte","fromCharCode","btoa","PasskeyClientBuilder","breezApiKey","config","withPrfProvider","provider","build","providerOptions","create","buildPasskeyClient"],"sourceRoot":"../../src","sources":["passkey-prf-provider.ts"],"mappings":"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","ignoreList":[]}