react-native-nitro-passkeys 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NitroPasskeys.podspec +37 -0
- package/README.md +314 -0
- package/android/CMakeLists.txt +31 -0
- package/android/build.gradle +155 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +9 -0
- package/android/src/main/java/com/margelo/nitro/nitropasskeys/HybridNitroPasskeys.kt +65 -0
- package/android/src/main/java/com/margelo/nitro/nitropasskeys/NitroPasskeysPackage.kt +20 -0
- package/android/src/main/java/com/margelo/nitro/nitropasskeys/PasskeyErrorToken.kt +64 -0
- package/android/src/test/java/com/margelo/nitro/nitropasskeys/PasskeyErrorTokenTest.kt +128 -0
- package/ios/Base64URL.swift +37 -0
- package/ios/Bridge.h +1 -0
- package/ios/HybridNitroPasskeys.swift +290 -0
- package/ios/PasskeyErrorToken.swift +32 -0
- package/ios/PasskeyJSON.swift +195 -0
- package/lib/commonjs/PasskeyError.js +39 -0
- package/lib/commonjs/PasskeyError.js.map +1 -0
- package/lib/commonjs/index.js +52 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/response.js +30 -0
- package/lib/commonjs/response.js.map +1 -0
- package/lib/commonjs/specs/nitro-passkeys.nitro.js +6 -0
- package/lib/commonjs/specs/nitro-passkeys.nitro.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/validate.js +118 -0
- package/lib/commonjs/validate.js.map +1 -0
- package/lib/module/PasskeyError.js +34 -0
- package/lib/module/PasskeyError.js.map +1 -0
- package/lib/module/index.js +42 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/response.js +25 -0
- package/lib/module/response.js.map +1 -0
- package/lib/module/specs/nitro-passkeys.nitro.js +4 -0
- package/lib/module/specs/nitro-passkeys.nitro.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/validate.js +109 -0
- package/lib/module/validate.js.map +1 -0
- package/lib/typescript/example/server/index.d.ts +2 -0
- package/lib/typescript/example/server/index.d.ts.map +1 -0
- package/lib/typescript/src/PasskeyError.d.ts +8 -0
- package/lib/typescript/src/PasskeyError.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +8 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/response.d.ts +4 -0
- package/lib/typescript/src/response.d.ts.map +1 -0
- package/lib/typescript/src/specs/nitro-passkeys.nitro.d.ts +12 -0
- package/lib/typescript/src/specs/nitro-passkeys.nitro.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +104 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/validate.d.ts +14 -0
- package/lib/typescript/src/validate.d.ts.map +1 -0
- package/nitro.json +24 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/NitroPasskeys+autolinking.cmake +81 -0
- package/nitrogen/generated/android/NitroPasskeys+autolinking.gradle +27 -0
- package/nitrogen/generated/android/NitroPasskeysOnLoad.cpp +54 -0
- package/nitrogen/generated/android/NitroPasskeysOnLoad.hpp +34 -0
- package/nitrogen/generated/android/c++/JHybridNitroPasskeysSpec.cpp +86 -0
- package/nitrogen/generated/android/c++/JHybridNitroPasskeysSpec.hpp +64 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitropasskeys/HybridNitroPasskeysSpec.kt +63 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitropasskeys/NitroPasskeysOnLoad.kt +35 -0
- package/nitrogen/generated/ios/NitroPasskeys+autolinking.rb +62 -0
- package/nitrogen/generated/ios/NitroPasskeys-Swift-Cxx-Bridge.cpp +49 -0
- package/nitrogen/generated/ios/NitroPasskeys-Swift-Cxx-Bridge.hpp +111 -0
- package/nitrogen/generated/ios/NitroPasskeys-Swift-Cxx-Umbrella.hpp +45 -0
- package/nitrogen/generated/ios/NitroPasskeysAutolinking.mm +33 -0
- package/nitrogen/generated/ios/NitroPasskeysAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridNitroPasskeysSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridNitroPasskeysSpecSwift.hpp +93 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridNitroPasskeysSpec.swift +56 -0
- package/nitrogen/generated/ios/swift/HybridNitroPasskeysSpec_cxx.swift +169 -0
- package/nitrogen/generated/shared/c++/HybridNitroPasskeysSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridNitroPasskeysSpec.hpp +64 -0
- package/package.json +106 -0
- package/src/PasskeyError.ts +58 -0
- package/src/index.ts +66 -0
- package/src/response.ts +49 -0
- package/src/specs/nitro-passkeys.nitro.ts +12 -0
- package/src/types.ts +124 -0
- package/src/validate.ts +132 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const BASE64URL_RE = /^[A-Za-z0-9_-]+={0,2}$/;
|
|
4
|
+
function unpaddedLength(value) {
|
|
5
|
+
let end = value.length;
|
|
6
|
+
while (end > 0 && value[end - 1] === '=') end--;
|
|
7
|
+
return end;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* True for a non-empty base64url string with optional `=` padding. Rejects `+`, `/`, whitespace,
|
|
12
|
+
* impossible lengths (unpadded length % 4 === 1) and padding that does not complete a 4-char group.
|
|
13
|
+
*/
|
|
14
|
+
export function isBase64URL(value) {
|
|
15
|
+
if (typeof value !== 'string' || !BASE64URL_RE.test(value)) return false;
|
|
16
|
+
const unpadded = unpaddedLength(value);
|
|
17
|
+
if (unpadded === 0 || unpadded % 4 === 1) return false;
|
|
18
|
+
if (unpadded !== value.length && value.length % 4 !== 0) return false;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Number of bytes a valid base64url string decodes to. */
|
|
23
|
+
export function base64URLByteLength(value) {
|
|
24
|
+
return Math.floor(unpaddedLength(value) * 3 / 4);
|
|
25
|
+
}
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function isNonEmptyString(value) {
|
|
30
|
+
return typeof value === 'string' && value.length > 0;
|
|
31
|
+
}
|
|
32
|
+
function validateDescriptors(value, field) {
|
|
33
|
+
if (value === undefined) return undefined;
|
|
34
|
+
if (!Array.isArray(value)) return `${field} must be an array`;
|
|
35
|
+
for (const [index, entry] of value.entries()) {
|
|
36
|
+
if (!isRecord(entry) || !isBase64URL(entry['id'])) {
|
|
37
|
+
return `${field}[${index}].id is not valid base64url`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Returns a reason for the first failing rule, or `undefined` when the options are valid. */
|
|
44
|
+
export function validateCreationOptions(options) {
|
|
45
|
+
if (!isRecord(options)) return 'options must be an object';
|
|
46
|
+
const {
|
|
47
|
+
rp,
|
|
48
|
+
user,
|
|
49
|
+
challenge,
|
|
50
|
+
excludeCredentials,
|
|
51
|
+
pubKeyCredParams
|
|
52
|
+
} = options;
|
|
53
|
+
if (!isRecord(rp)) return 'rp must be an object';
|
|
54
|
+
if (!isNonEmptyString(rp['id'])) return 'rp.id is required';
|
|
55
|
+
if (!isNonEmptyString(challenge)) return 'challenge is required';
|
|
56
|
+
if (!isBase64URL(challenge)) return 'challenge is not valid base64url';
|
|
57
|
+
if (!isRecord(user)) return 'user must be an object';
|
|
58
|
+
if (!isNonEmptyString(user['id'])) return 'user.id is required';
|
|
59
|
+
if (!isNonEmptyString(user['name'])) return 'user.name is required';
|
|
60
|
+
if (!isBase64URL(user['id'])) return 'user.id is not valid base64url';
|
|
61
|
+
const userIdBytes = base64URLByteLength(user['id']);
|
|
62
|
+
if (userIdBytes < 1 || userIdBytes > 64) return 'user.id must decode to 1-64 bytes';
|
|
63
|
+
const excludeReason = validateDescriptors(excludeCredentials, 'excludeCredentials');
|
|
64
|
+
if (excludeReason) return excludeReason;
|
|
65
|
+
if (pubKeyCredParams !== undefined) {
|
|
66
|
+
if (!Array.isArray(pubKeyCredParams)) return 'pubKeyCredParams must be an array';
|
|
67
|
+
if (pubKeyCredParams.length > 0 && !pubKeyCredParams.some(param => isRecord(param) && param['alg'] === -7)) {
|
|
68
|
+
return 'pubKeyCredParams must include ES256 (alg -7)';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Returns a reason for the first failing rule, or `undefined` when the options are valid. */
|
|
75
|
+
export function validateRequestOptions(options) {
|
|
76
|
+
if (!isRecord(options)) return 'options must be an object';
|
|
77
|
+
if (!isNonEmptyString(options['rpId'])) return 'rpId is required';
|
|
78
|
+
if (!isNonEmptyString(options['challenge'])) return 'challenge is required';
|
|
79
|
+
if (!isBase64URL(options['challenge'])) return 'challenge is not valid base64url';
|
|
80
|
+
return validateDescriptors(options['allowCredentials'], 'allowCredentials');
|
|
81
|
+
}
|
|
82
|
+
function validateCommonResponse(value) {
|
|
83
|
+
if (!isRecord(value)) return 'response must be an object';
|
|
84
|
+
if (!isNonEmptyString(value['id'])) return 'id is missing';
|
|
85
|
+
if (!isNonEmptyString(value['rawId'])) return 'rawId is missing';
|
|
86
|
+
if (value['id'] !== value['rawId']) return 'id does not equal rawId';
|
|
87
|
+
if (value['type'] !== 'public-key') return "type must be 'public-key'";
|
|
88
|
+
if (!isRecord(value['response'])) return 'response.response is missing';
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
function missingFields(response, fields) {
|
|
92
|
+
for (const field of fields) {
|
|
93
|
+
if (!isNonEmptyString(response[field])) return `response.${field} is missing`;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
export function validateRegistrationResponse(value) {
|
|
98
|
+
const common = validateCommonResponse(value);
|
|
99
|
+
if (common) return common;
|
|
100
|
+
const response = value.response;
|
|
101
|
+
return missingFields(response, ['clientDataJSON', 'attestationObject']);
|
|
102
|
+
}
|
|
103
|
+
export function validateAuthenticationResponse(value) {
|
|
104
|
+
const common = validateCommonResponse(value);
|
|
105
|
+
if (common) return common;
|
|
106
|
+
const response = value.response;
|
|
107
|
+
return missingFields(response, ['clientDataJSON', 'authenticatorData', 'signature']);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BASE64URL_RE","unpaddedLength","value","end","length","isBase64URL","test","unpadded","base64URLByteLength","Math","floor","isRecord","Array","isArray","isNonEmptyString","validateDescriptors","field","undefined","index","entry","entries","validateCreationOptions","options","rp","user","challenge","excludeCredentials","pubKeyCredParams","userIdBytes","excludeReason","some","param","validateRequestOptions","validateCommonResponse","missingFields","response","fields","validateRegistrationResponse","common","validateAuthenticationResponse"],"sourceRoot":"../../src","sources":["validate.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../example/server/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type PasskeyErrorCode = 'canceled' | 'noCredentials' | 'alreadyRegistered' | 'domainNotAssociated' | 'unsupported' | 'invalidOptions' | 'unknown';
|
|
2
|
+
export declare class PasskeyError extends Error {
|
|
3
|
+
readonly code: PasskeyErrorCode;
|
|
4
|
+
constructor(code: PasskeyErrorCode, message: string);
|
|
5
|
+
/** Normalises any thrown value into a `PasskeyError`. Never throws. */
|
|
6
|
+
static from(error: unknown): PasskeyError;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=PasskeyError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasskeyError.d.ts","sourceRoot":"","sources":["../../../src/PasskeyError.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,eAAe,GACf,mBAAmB,GACnB,qBAAqB,GACrB,aAAa,GACb,gBAAgB,GAChB,SAAS,CAAC;AAuBd,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAEhC,YAAY,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAIlD;IAED,uEAAuE;IACvE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAgBxC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, RegistrationResponseJSON } from './types';
|
|
2
|
+
export declare function isPasskeySupported(): boolean;
|
|
3
|
+
export declare function createPasskey(options: PublicKeyCredentialCreationOptionsJSON): Promise<RegistrationResponseJSON>;
|
|
4
|
+
export declare function getPasskey(options: PublicKeyCredentialRequestOptionsJSON): Promise<AuthenticationResponseJSON>;
|
|
5
|
+
export { PasskeyError } from './PasskeyError';
|
|
6
|
+
export type { PasskeyErrorCode } from './PasskeyError';
|
|
7
|
+
export type * from './types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,0BAA0B,EAC1B,sCAAsC,EACtC,qCAAqC,EACrC,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAMjB,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,wBAAwB,CAAC,CAgBnC;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,0BAA0B,CAAC,CAgBrC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,mBAAmB,SAAS,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AuthenticationResponseJSON, RegistrationResponseJSON } from './types';
|
|
2
|
+
export declare function parseRegistrationResponse(raw: string): RegistrationResponseJSON;
|
|
3
|
+
export declare function parseAuthenticationResponse(raw: string): AuthenticationResponseJSON;
|
|
4
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,wBAAwB,EACzB,MAAM,SAAS,CAAC;AA0BjB,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,GACV,wBAAwB,CAM1B;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,GACV,0BAA0B,CAM5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
export interface NitroPasskeys extends HybridObject<{
|
|
3
|
+
ios: 'swift';
|
|
4
|
+
android: 'kotlin';
|
|
5
|
+
}> {
|
|
6
|
+
readonly isSupported: boolean;
|
|
7
|
+
/** creationOptionsJson: PublicKeyCredentialCreationOptionsJSON → RegistrationResponseJSON (both JSON strings). */
|
|
8
|
+
create(creationOptionsJson: string): Promise<string>;
|
|
9
|
+
/** requestOptionsJson: PublicKeyCredentialRequestOptionsJSON → AuthenticationResponseJSON (both JSON strings). */
|
|
10
|
+
get(requestOptionsJson: string): Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=nitro-passkeys.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nitro-passkeys.nitro.d.ts","sourceRoot":"","sources":["../../../../src/specs/nitro-passkeys.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,aAAc,SAAQ,YAAY,CAAC;IAClD,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;IACA,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,kHAAkH;IAClH,MAAM,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,kHAAkH;IAClH,GAAG,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export type Base64URLString = string;
|
|
2
|
+
export type PublicKeyCredentialType = 'public-key';
|
|
3
|
+
export type COSEAlgorithmIdentifier = number;
|
|
4
|
+
export type AuthenticatorTransport = 'ble' | 'hybrid' | 'internal' | 'nfc' | 'usb';
|
|
5
|
+
export type AuthenticatorAttachment = 'cross-platform' | 'platform';
|
|
6
|
+
export type UserVerificationRequirement = 'discouraged' | 'preferred' | 'required';
|
|
7
|
+
export type ResidentKeyRequirement = 'discouraged' | 'preferred' | 'required';
|
|
8
|
+
export type AttestationConveyancePreference = 'direct' | 'enterprise' | 'indirect' | 'none';
|
|
9
|
+
export type AttestationFormat = 'fido-u2f' | 'packed' | 'android-safetynet' | 'android-key' | 'tpm' | 'apple' | 'none';
|
|
10
|
+
export type PublicKeyCredentialHint = 'hybrid' | 'security-key' | 'client-device';
|
|
11
|
+
export interface PublicKeyCredentialRpEntity {
|
|
12
|
+
name: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PublicKeyCredentialUserEntityJSON {
|
|
16
|
+
id: Base64URLString;
|
|
17
|
+
name: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PublicKeyCredentialParameters {
|
|
21
|
+
alg: COSEAlgorithmIdentifier;
|
|
22
|
+
type: PublicKeyCredentialType;
|
|
23
|
+
}
|
|
24
|
+
export interface PublicKeyCredentialDescriptorJSON {
|
|
25
|
+
id: Base64URLString;
|
|
26
|
+
type: string;
|
|
27
|
+
transports?: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface AuthenticatorSelectionCriteria {
|
|
30
|
+
authenticatorAttachment?: AuthenticatorAttachment;
|
|
31
|
+
requireResidentKey?: boolean;
|
|
32
|
+
residentKey?: ResidentKeyRequirement;
|
|
33
|
+
userVerification?: UserVerificationRequirement;
|
|
34
|
+
}
|
|
35
|
+
export interface AuthenticationExtensionsClientInputs {
|
|
36
|
+
appid?: string;
|
|
37
|
+
credProps?: boolean;
|
|
38
|
+
hmacCreateSecret?: boolean;
|
|
39
|
+
minPinLength?: boolean;
|
|
40
|
+
prf?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface AuthenticationExtensionsClientOutputs {
|
|
43
|
+
appid?: boolean;
|
|
44
|
+
credProps?: {
|
|
45
|
+
rk?: boolean;
|
|
46
|
+
};
|
|
47
|
+
hmacCreateSecret?: boolean;
|
|
48
|
+
prf?: {
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface PublicKeyCredentialCreationOptionsJSON {
|
|
53
|
+
rp: PublicKeyCredentialRpEntity;
|
|
54
|
+
user: PublicKeyCredentialUserEntityJSON;
|
|
55
|
+
challenge: Base64URLString;
|
|
56
|
+
pubKeyCredParams: PublicKeyCredentialParameters[];
|
|
57
|
+
timeout?: number;
|
|
58
|
+
excludeCredentials?: PublicKeyCredentialDescriptorJSON[];
|
|
59
|
+
authenticatorSelection?: AuthenticatorSelectionCriteria;
|
|
60
|
+
hints?: PublicKeyCredentialHint[];
|
|
61
|
+
attestation?: AttestationConveyancePreference;
|
|
62
|
+
attestationFormats?: AttestationFormat[];
|
|
63
|
+
extensions?: AuthenticationExtensionsClientInputs;
|
|
64
|
+
}
|
|
65
|
+
export interface PublicKeyCredentialRequestOptionsJSON {
|
|
66
|
+
challenge: Base64URLString;
|
|
67
|
+
timeout?: number;
|
|
68
|
+
rpId?: string;
|
|
69
|
+
allowCredentials?: PublicKeyCredentialDescriptorJSON[];
|
|
70
|
+
userVerification?: UserVerificationRequirement;
|
|
71
|
+
hints?: PublicKeyCredentialHint[];
|
|
72
|
+
extensions?: AuthenticationExtensionsClientInputs;
|
|
73
|
+
}
|
|
74
|
+
export interface AuthenticatorAttestationResponseJSON {
|
|
75
|
+
clientDataJSON: Base64URLString;
|
|
76
|
+
attestationObject: Base64URLString;
|
|
77
|
+
authenticatorData?: Base64URLString;
|
|
78
|
+
transports?: AuthenticatorTransport[];
|
|
79
|
+
publicKeyAlgorithm?: COSEAlgorithmIdentifier;
|
|
80
|
+
publicKey?: Base64URLString;
|
|
81
|
+
}
|
|
82
|
+
export interface AuthenticatorAssertionResponseJSON {
|
|
83
|
+
clientDataJSON: Base64URLString;
|
|
84
|
+
authenticatorData: Base64URLString;
|
|
85
|
+
signature: Base64URLString;
|
|
86
|
+
userHandle?: Base64URLString;
|
|
87
|
+
}
|
|
88
|
+
export interface RegistrationResponseJSON {
|
|
89
|
+
id: Base64URLString;
|
|
90
|
+
rawId: Base64URLString;
|
|
91
|
+
response: AuthenticatorAttestationResponseJSON;
|
|
92
|
+
authenticatorAttachment?: AuthenticatorAttachment;
|
|
93
|
+
clientExtensionResults: AuthenticationExtensionsClientOutputs;
|
|
94
|
+
type: PublicKeyCredentialType;
|
|
95
|
+
}
|
|
96
|
+
export interface AuthenticationResponseJSON {
|
|
97
|
+
id: Base64URLString;
|
|
98
|
+
rawId: Base64URLString;
|
|
99
|
+
response: AuthenticatorAssertionResponseJSON;
|
|
100
|
+
authenticatorAttachment?: AuthenticatorAttachment;
|
|
101
|
+
clientExtensionResults: AuthenticationExtensionsClientOutputs;
|
|
102
|
+
type: PublicKeyCredentialType;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True for a non-empty base64url string with optional `=` padding. Rejects `+`, `/`, whitespace,
|
|
3
|
+
* impossible lengths (unpadded length % 4 === 1) and padding that does not complete a 4-char group.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isBase64URL(value: unknown): value is string;
|
|
6
|
+
/** Number of bytes a valid base64url string decodes to. */
|
|
7
|
+
export declare function base64URLByteLength(value: string): number;
|
|
8
|
+
/** Returns a reason for the first failing rule, or `undefined` when the options are valid. */
|
|
9
|
+
export declare function validateCreationOptions(options: unknown): string | undefined;
|
|
10
|
+
/** Returns a reason for the first failing rule, or `undefined` when the options are valid. */
|
|
11
|
+
export declare function validateRequestOptions(options: unknown): string | undefined;
|
|
12
|
+
export declare function validateRegistrationResponse(value: unknown): string | undefined;
|
|
13
|
+
export declare function validateAuthenticationResponse(value: unknown): string | undefined;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/validate.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAM3D;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAwBD,8FAA8F;AAC9F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA8B5E;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO3E;AAuBD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,SAAS,CASpB"}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://nitro.margelo.com/nitro.schema.json",
|
|
3
|
+
"cxxNamespace": ["nitropasskeys"],
|
|
4
|
+
"ios": {
|
|
5
|
+
"iosModuleName": "NitroPasskeys"
|
|
6
|
+
},
|
|
7
|
+
"android": {
|
|
8
|
+
"androidNamespace": ["nitropasskeys"],
|
|
9
|
+
"androidCxxLibName": "NitroPasskeys"
|
|
10
|
+
},
|
|
11
|
+
"autolinking": {
|
|
12
|
+
"NitroPasskeys": {
|
|
13
|
+
"ios": {
|
|
14
|
+
"language": "swift",
|
|
15
|
+
"implementationClassName": "HybridNitroPasskeys"
|
|
16
|
+
},
|
|
17
|
+
"android": {
|
|
18
|
+
"language": "kotlin",
|
|
19
|
+
"implementationClassName": "HybridNitroPasskeys"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"ignorePaths": ["**/node_modules"]
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
** linguist-generated=true
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#
|
|
2
|
+
# NitroPasskeys+autolinking.cmake
|
|
3
|
+
# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
# https://github.com/mrousavy/nitro
|
|
5
|
+
# Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
# This is a CMake file that adds all files generated by Nitrogen
|
|
9
|
+
# to the current CMake project.
|
|
10
|
+
#
|
|
11
|
+
# To use it, add this to your CMakeLists.txt:
|
|
12
|
+
# ```cmake
|
|
13
|
+
# include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroPasskeys+autolinking.cmake)
|
|
14
|
+
# ```
|
|
15
|
+
|
|
16
|
+
# Define a flag to check if we are building properly
|
|
17
|
+
add_definitions(-DBUILDING_NITROPASSKEYS_WITH_GENERATED_CMAKE_PROJECT)
|
|
18
|
+
|
|
19
|
+
# Enable Raw Props parsing in react-native (for Nitro Views)
|
|
20
|
+
add_definitions(-DRN_SERIALIZABLE_STATE)
|
|
21
|
+
|
|
22
|
+
# Add all headers that were generated by Nitrogen
|
|
23
|
+
include_directories(
|
|
24
|
+
"../nitrogen/generated/shared/c++"
|
|
25
|
+
"../nitrogen/generated/android/c++"
|
|
26
|
+
"../nitrogen/generated/android/"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Add all .cpp sources that were generated by Nitrogen
|
|
30
|
+
target_sources(
|
|
31
|
+
# CMake project name (Android C++ library name)
|
|
32
|
+
NitroPasskeys PRIVATE
|
|
33
|
+
# Autolinking Setup
|
|
34
|
+
../nitrogen/generated/android/NitroPasskeysOnLoad.cpp
|
|
35
|
+
# Shared Nitrogen C++ sources
|
|
36
|
+
../nitrogen/generated/shared/c++/HybridNitroPasskeysSpec.cpp
|
|
37
|
+
# Android-specific Nitrogen C++ sources
|
|
38
|
+
../nitrogen/generated/android/c++/JHybridNitroPasskeysSpec.cpp
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
|
|
42
|
+
# Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
|
|
43
|
+
target_compile_definitions(
|
|
44
|
+
NitroPasskeys PRIVATE
|
|
45
|
+
-DFOLLY_NO_CONFIG=1
|
|
46
|
+
-DFOLLY_HAVE_CLOCK_GETTIME=1
|
|
47
|
+
-DFOLLY_USE_LIBCPP=1
|
|
48
|
+
-DFOLLY_CFG_NO_COROUTINES=1
|
|
49
|
+
-DFOLLY_MOBILE=1
|
|
50
|
+
-DFOLLY_HAVE_RECVMMSG=1
|
|
51
|
+
-DFOLLY_HAVE_PTHREAD=1
|
|
52
|
+
# Once we target android-23 above, we can comment
|
|
53
|
+
# the following line. NDK uses GNU style stderror_r() after API 23.
|
|
54
|
+
-DFOLLY_HAVE_XSI_STRERROR_R=1
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Add all libraries required by the generated specs
|
|
58
|
+
find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
|
|
59
|
+
find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
|
|
60
|
+
find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
|
|
61
|
+
|
|
62
|
+
# Link all libraries together
|
|
63
|
+
target_link_libraries(
|
|
64
|
+
NitroPasskeys
|
|
65
|
+
fbjni::fbjni # <-- Facebook C++ JNI helpers
|
|
66
|
+
ReactAndroid::jsi # <-- RN: JSI
|
|
67
|
+
react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Link react-native (different prefab between RN 0.75 and RN 0.76)
|
|
71
|
+
if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
|
|
72
|
+
target_link_libraries(
|
|
73
|
+
NitroPasskeys
|
|
74
|
+
ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
|
|
75
|
+
)
|
|
76
|
+
else()
|
|
77
|
+
target_link_libraries(
|
|
78
|
+
NitroPasskeys
|
|
79
|
+
ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
|
|
80
|
+
)
|
|
81
|
+
endif()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroPasskeys+autolinking.gradle
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
/// This is a Gradle file that adds all files generated by Nitrogen
|
|
9
|
+
/// to the current Gradle project.
|
|
10
|
+
///
|
|
11
|
+
/// To use it, add this to your build.gradle:
|
|
12
|
+
/// ```gradle
|
|
13
|
+
/// apply from: '../nitrogen/generated/android/NitroPasskeys+autolinking.gradle'
|
|
14
|
+
/// ```
|
|
15
|
+
|
|
16
|
+
logger.warn("[NitroModules] 🔥 NitroPasskeys is boosted by nitro!")
|
|
17
|
+
|
|
18
|
+
android {
|
|
19
|
+
sourceSets {
|
|
20
|
+
main {
|
|
21
|
+
java.srcDirs += [
|
|
22
|
+
// Nitrogen files
|
|
23
|
+
"${project.projectDir}/../nitrogen/generated/android/kotlin"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroPasskeysOnLoad.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#ifndef BUILDING_NITROPASSKEYS_WITH_GENERATED_CMAKE_PROJECT
|
|
9
|
+
#error NitroPasskeysOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
#include "NitroPasskeysOnLoad.hpp"
|
|
13
|
+
|
|
14
|
+
#include <jni.h>
|
|
15
|
+
#include <fbjni/fbjni.h>
|
|
16
|
+
#include <NitroModules/HybridObjectRegistry.hpp>
|
|
17
|
+
|
|
18
|
+
#include "JHybridNitroPasskeysSpec.hpp"
|
|
19
|
+
#include <NitroModules/DefaultConstructableObject.hpp>
|
|
20
|
+
|
|
21
|
+
namespace margelo::nitro::nitropasskeys {
|
|
22
|
+
|
|
23
|
+
int initialize(JavaVM* vm) {
|
|
24
|
+
return facebook::jni::initialize(vm, []() {
|
|
25
|
+
::margelo::nitro::nitropasskeys::registerAllNatives();
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
struct JHybridNitroPasskeysSpecImpl: public jni::JavaClass<JHybridNitroPasskeysSpecImpl, JHybridNitroPasskeysSpec::JavaPart> {
|
|
30
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/nitropasskeys/HybridNitroPasskeys;";
|
|
31
|
+
static std::shared_ptr<JHybridNitroPasskeysSpec> create() {
|
|
32
|
+
static const auto constructorFn = javaClassStatic()->getConstructor<JHybridNitroPasskeysSpecImpl::javaobject()>();
|
|
33
|
+
jni::local_ref<JHybridNitroPasskeysSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
|
|
34
|
+
return javaPart->getJHybridNitroPasskeysSpec();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
void registerAllNatives() {
|
|
39
|
+
using namespace margelo::nitro;
|
|
40
|
+
using namespace margelo::nitro::nitropasskeys;
|
|
41
|
+
|
|
42
|
+
// Register native JNI methods
|
|
43
|
+
margelo::nitro::nitropasskeys::JHybridNitroPasskeysSpec::CxxPart::registerNatives();
|
|
44
|
+
|
|
45
|
+
// Register Nitro Hybrid Objects
|
|
46
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
47
|
+
"NitroPasskeys",
|
|
48
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
49
|
+
return JHybridNitroPasskeysSpecImpl::create();
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
} // namespace margelo::nitro::nitropasskeys
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// NitroPasskeysOnLoad.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include <jni.h>
|
|
9
|
+
#include <functional>
|
|
10
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::nitropasskeys {
|
|
13
|
+
|
|
14
|
+
[[deprecated("Use registerNatives() instead.")]]
|
|
15
|
+
int initialize(JavaVM* vm);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Register the native (C++) part of NitroPasskeys, and autolinks all Hybrid Objects.
|
|
19
|
+
* Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
|
|
20
|
+
* inside a `facebook::jni::initialize(vm, ...)` call.
|
|
21
|
+
* Example:
|
|
22
|
+
* ```cpp (cpp-adapter.cpp)
|
|
23
|
+
* JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
|
|
24
|
+
* return facebook::jni::initialize(vm, []() {
|
|
25
|
+
* // register all NitroPasskeys HybridObjects
|
|
26
|
+
* margelo::nitro::nitropasskeys::registerNatives();
|
|
27
|
+
* // any other custom registrations go here.
|
|
28
|
+
* });
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
void registerAllNatives();
|
|
33
|
+
|
|
34
|
+
} // namespace margelo::nitro::nitropasskeys
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridNitroPasskeysSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "JHybridNitroPasskeysSpec.hpp"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <NitroModules/Promise.hpp>
|
|
14
|
+
#include <NitroModules/JPromise.hpp>
|
|
15
|
+
|
|
16
|
+
namespace margelo::nitro::nitropasskeys {
|
|
17
|
+
|
|
18
|
+
std::shared_ptr<JHybridNitroPasskeysSpec> JHybridNitroPasskeysSpec::JavaPart::getJHybridNitroPasskeysSpec() {
|
|
19
|
+
auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
|
|
20
|
+
auto castHybridObject = std::dynamic_pointer_cast<JHybridNitroPasskeysSpec>(hybridObject);
|
|
21
|
+
if (castHybridObject == nullptr) [[unlikely]] {
|
|
22
|
+
throw std::runtime_error("Failed to downcast JHybridObject to JHybridNitroPasskeysSpec!");
|
|
23
|
+
}
|
|
24
|
+
return castHybridObject;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
jni::local_ref<JHybridNitroPasskeysSpec::CxxPart::jhybriddata> JHybridNitroPasskeysSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
28
|
+
return makeCxxInstance(jThis);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
std::shared_ptr<JHybridObject> JHybridNitroPasskeysSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
|
|
32
|
+
auto castJavaPart = jni::dynamic_ref_cast<JHybridNitroPasskeysSpec::JavaPart>(javaPart);
|
|
33
|
+
if (castJavaPart == nullptr) [[unlikely]] {
|
|
34
|
+
throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridNitroPasskeysSpec::JavaPart!");
|
|
35
|
+
}
|
|
36
|
+
return std::make_shared<JHybridNitroPasskeysSpec>(castJavaPart);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void JHybridNitroPasskeysSpec::CxxPart::registerNatives() {
|
|
40
|
+
registerHybrid({
|
|
41
|
+
makeNativeMethod("initHybrid", JHybridNitroPasskeysSpec::CxxPart::initHybrid),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Properties
|
|
46
|
+
bool JHybridNitroPasskeysSpec::getIsSupported() {
|
|
47
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jboolean()>("isSupported");
|
|
48
|
+
auto __result = method(_javaPart);
|
|
49
|
+
return static_cast<bool>(__result);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Methods
|
|
53
|
+
std::shared_ptr<Promise<std::string>> JHybridNitroPasskeysSpec::create(const std::string& creationOptionsJson) {
|
|
54
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* creationOptionsJson */)>("create");
|
|
55
|
+
auto __result = method(_javaPart, jni::make_jstring(creationOptionsJson));
|
|
56
|
+
return [&]() {
|
|
57
|
+
auto __promise = Promise<std::string>::create();
|
|
58
|
+
__result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
|
|
59
|
+
auto __result = jni::static_ref_cast<jni::JString>(__boxedResult);
|
|
60
|
+
__promise->resolve(__result->toStdString());
|
|
61
|
+
});
|
|
62
|
+
__result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
|
|
63
|
+
jni::JniException __jniError(__throwable);
|
|
64
|
+
__promise->reject(std::make_exception_ptr(__jniError));
|
|
65
|
+
});
|
|
66
|
+
return __promise;
|
|
67
|
+
}();
|
|
68
|
+
}
|
|
69
|
+
std::shared_ptr<Promise<std::string>> JHybridNitroPasskeysSpec::get(const std::string& requestOptionsJson) {
|
|
70
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* requestOptionsJson */)>("get");
|
|
71
|
+
auto __result = method(_javaPart, jni::make_jstring(requestOptionsJson));
|
|
72
|
+
return [&]() {
|
|
73
|
+
auto __promise = Promise<std::string>::create();
|
|
74
|
+
__result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
|
|
75
|
+
auto __result = jni::static_ref_cast<jni::JString>(__boxedResult);
|
|
76
|
+
__promise->resolve(__result->toStdString());
|
|
77
|
+
});
|
|
78
|
+
__result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
|
|
79
|
+
jni::JniException __jniError(__throwable);
|
|
80
|
+
__promise->reject(std::make_exception_ptr(__jniError));
|
|
81
|
+
});
|
|
82
|
+
return __promise;
|
|
83
|
+
}();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
} // namespace margelo::nitro::nitropasskeys
|