@turnkey/http 2.0.0 → 2.2.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/CHANGELOG.md +38 -0
- package/dist/__generated__/services/coordinator/public/v1/public_api.client.d.ts +46 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.client.d.ts.map +1 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.client.js +76 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.client.js.map +1 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.fetcher.d.ts +722 -2061
- package/dist/__generated__/services/coordinator/public/v1/public_api.fetcher.d.ts.map +1 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.fetcher.js +76 -4
- package/dist/__generated__/services/coordinator/public/v1/public_api.fetcher.js.map +1 -1
- package/dist/__generated__/services/coordinator/public/v1/public_api.swagger.json +343 -197
- package/dist/__generated__/services/coordinator/public/v1/public_api.types.d.ts +164 -74
- package/dist/__generated__/services/coordinator/public/v1/public_api.types.d.ts.map +1 -1
- package/dist/esm/__generated__/barrel.js +4 -0
- package/dist/esm/__generated__/barrel.js.map +1 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.client.js +1212 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.client.js.map +1 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.fetcher.js +1052 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.fetcher.js.map +1 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.swagger.json +5941 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.types.js +6 -0
- package/dist/esm/__generated__/services/coordinator/public/v1/public_api.types.js.map +1 -0
- package/dist/esm/async.js +158 -0
- package/dist/esm/async.js.map +1 -0
- package/dist/esm/base.js +157 -0
- package/dist/esm/base.js.map +1 -0
- package/dist/esm/config.js +41 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/encoding.js +15 -0
- package/dist/esm/encoding.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/shared.js +15 -0
- package/dist/esm/shared.js.map +1 -0
- package/dist/esm/universal.js +10 -0
- package/dist/esm/universal.js.map +1 -0
- package/dist/esm/webauthn-json/api.js +24 -0
- package/dist/esm/webauthn-json/api.js.map +1 -0
- package/dist/esm/webauthn-json/base64url.js +32 -0
- package/dist/esm/webauthn-json/base64url.js.map +1 -0
- package/dist/esm/webauthn-json/convert.js +62 -0
- package/dist/esm/webauthn-json/convert.js.map +1 -0
- package/dist/esm/webauthn-json/index.js +13 -0
- package/dist/esm/webauthn-json/index.js.map +1 -0
- package/dist/esm/webauthn-json/json.js +2 -0
- package/dist/esm/webauthn-json/json.js.map +1 -0
- package/dist/esm/webauthn-json/schema-format.js +2 -0
- package/dist/esm/webauthn-json/schema-format.js.map +1 -0
- package/dist/esm/webauthn-json/schema.js +83 -0
- package/dist/esm/webauthn-json/schema.js.map +1 -0
- package/dist/esm/webauthn.js +90 -0
- package/dist/esm/webauthn.js.map +1 -0
- package/dist/webauthn.d.ts +1 -1
- package/dist/webauthn.d.ts.map +1 -1
- package/dist/webauthn.js.map +1 -1
- package/package.json +12 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public_api.types.js","sourceRoot":"","sources":["../../../../../../../src/__generated__/services/coordinator/public/v1/public_api.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { PublicApiService as TurnkeyApi } from "./__generated__/barrel";
|
|
2
|
+
import { TurnkeyActivityError } from "./shared";
|
|
3
|
+
const DEFAULT_REFRESH_INTERVAL_MS = 500;
|
|
4
|
+
/**
|
|
5
|
+
* Wraps a request to create a fetcher with built-in async polling support.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated this function only works with {@link TurnkeyApi}.
|
|
8
|
+
* Use {@link TurnkeyClient} and {@link createActivityPoller} instead.
|
|
9
|
+
*/
|
|
10
|
+
export function withAsyncPolling(params) {
|
|
11
|
+
const { request, refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS } = params;
|
|
12
|
+
return async (input) => {
|
|
13
|
+
const initialResponse = await request(input);
|
|
14
|
+
let activity = initialResponse.activity;
|
|
15
|
+
while (true) {
|
|
16
|
+
switch (activity.status) {
|
|
17
|
+
case "ACTIVITY_STATUS_COMPLETED": {
|
|
18
|
+
return activity;
|
|
19
|
+
}
|
|
20
|
+
case "ACTIVITY_STATUS_CREATED": {
|
|
21
|
+
// Async pending state -- keep polling
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case "ACTIVITY_STATUS_PENDING": {
|
|
25
|
+
// Async pending state -- keep polling
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case "ACTIVITY_STATUS_CONSENSUS_NEEDED": {
|
|
29
|
+
// If the activity requires consensus, we shouldn't be polling forever.
|
|
30
|
+
// You can read the `TurnkeyActivityError` thrown to get the `activityId`,
|
|
31
|
+
// store it somewhere, then re-fetch the activity via `.postGetActivity(...)`
|
|
32
|
+
// when the required approvals/rejections are in place.
|
|
33
|
+
throw new TurnkeyActivityError({
|
|
34
|
+
message: `Consensus needed for activity ${activity.id}`,
|
|
35
|
+
activityId: activity.id,
|
|
36
|
+
activityStatus: activity.status,
|
|
37
|
+
activityType: activity.type,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
case "ACTIVITY_STATUS_FAILED": {
|
|
41
|
+
// Activity failed
|
|
42
|
+
throw new TurnkeyActivityError({
|
|
43
|
+
message: `Activity ${activity.id} failed`,
|
|
44
|
+
activityId: activity.id,
|
|
45
|
+
activityStatus: activity.status,
|
|
46
|
+
activityType: activity.type,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
case "ACTIVITY_STATUS_REJECTED": {
|
|
50
|
+
// Activity was rejected
|
|
51
|
+
throw new TurnkeyActivityError({
|
|
52
|
+
message: `Activity ${activity.id} was rejected`,
|
|
53
|
+
activityId: activity.id,
|
|
54
|
+
activityStatus: activity.status,
|
|
55
|
+
activityType: activity.type,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
default: {
|
|
59
|
+
// Make sure the switch block is exhaustive
|
|
60
|
+
assertNever(activity.status);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
await sleep(refreshIntervalMs);
|
|
64
|
+
const pollingResponse = await TurnkeyApi.getActivity({
|
|
65
|
+
body: {
|
|
66
|
+
activityId: activity.id,
|
|
67
|
+
organizationId: activity.organizationId,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
activity = pollingResponse.activity;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Wraps a client request function (e.g. `client.createPrivateKeys`) in a poller.
|
|
76
|
+
* The default refresh interval is 500ms.
|
|
77
|
+
*
|
|
78
|
+
* The returned poller will poll until the activity becomes `COMPLETED`.
|
|
79
|
+
* If the activity becomes `FAILED` or `REJECTED` or is flagged as `NEEDS_CONSENSUS`, an error is thrown.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* const activityPoller = createActivityPoller(client, client.createPrivateKeys);
|
|
83
|
+
* const activity = await activityPoller(input);
|
|
84
|
+
* console.log(activity.result); // activity is completed
|
|
85
|
+
*/
|
|
86
|
+
export function createActivityPoller(params) {
|
|
87
|
+
const { client, requestFn, refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS, } = params;
|
|
88
|
+
return async (input) => {
|
|
89
|
+
const initialResponse = await requestFn(input);
|
|
90
|
+
let activity = initialResponse.activity;
|
|
91
|
+
while (true) {
|
|
92
|
+
switch (activity.status) {
|
|
93
|
+
case "ACTIVITY_STATUS_COMPLETED": {
|
|
94
|
+
return activity;
|
|
95
|
+
}
|
|
96
|
+
case "ACTIVITY_STATUS_CREATED": {
|
|
97
|
+
// Async pending state -- keep polling
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case "ACTIVITY_STATUS_PENDING": {
|
|
101
|
+
// Async pending state -- keep polling
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case "ACTIVITY_STATUS_CONSENSUS_NEEDED": {
|
|
105
|
+
// If the activity requires consensus, we shouldn't be polling forever.
|
|
106
|
+
// You can read the `TurnkeyActivityError` thrown to get the `activityId`,
|
|
107
|
+
// store it somewhere, then re-fetch the activity via `.postGetActivity(...)`
|
|
108
|
+
// when the required approvals/rejections are in place.
|
|
109
|
+
throw new TurnkeyActivityError({
|
|
110
|
+
message: `Consensus needed for activity ${activity.id}`,
|
|
111
|
+
activityId: activity.id,
|
|
112
|
+
activityStatus: activity.status,
|
|
113
|
+
activityType: activity.type,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
case "ACTIVITY_STATUS_FAILED": {
|
|
117
|
+
// Activity failed
|
|
118
|
+
throw new TurnkeyActivityError({
|
|
119
|
+
message: `Activity ${activity.id} failed`,
|
|
120
|
+
activityId: activity.id,
|
|
121
|
+
activityStatus: activity.status,
|
|
122
|
+
activityType: activity.type,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
case "ACTIVITY_STATUS_REJECTED": {
|
|
126
|
+
// Activity was rejected
|
|
127
|
+
throw new TurnkeyActivityError({
|
|
128
|
+
message: `Activity ${activity.id} was rejected`,
|
|
129
|
+
activityId: activity.id,
|
|
130
|
+
activityStatus: activity.status,
|
|
131
|
+
activityType: activity.type,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
default: {
|
|
135
|
+
// Make sure the switch block is exhaustive
|
|
136
|
+
assertNever(activity.status);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
await sleep(refreshIntervalMs);
|
|
140
|
+
const pollingResponse = await client.getActivity({
|
|
141
|
+
activityId: activity.id,
|
|
142
|
+
organizationId: activity.organizationId,
|
|
143
|
+
});
|
|
144
|
+
activity = pollingResponse.activity;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function sleep(ms) {
|
|
149
|
+
return new Promise((resolve) => {
|
|
150
|
+
setTimeout(() => {
|
|
151
|
+
resolve();
|
|
152
|
+
}, ms);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function assertNever(input, message) {
|
|
156
|
+
throw new Error(message != null ? message : `Unexpected case: ${JSON.stringify(input)}`);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/async.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/base.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { signWithApiKey } from "@turnkey/api-key-stamper";
|
|
2
|
+
import { fetch } from "./universal";
|
|
3
|
+
import { getBrowserConfig, getConfig } from "./config";
|
|
4
|
+
import { stringToBase64urlString } from "./encoding";
|
|
5
|
+
import { getWebAuthnAssertion, } from "./webauthn";
|
|
6
|
+
export { fetch };
|
|
7
|
+
const sharedHeaders = {};
|
|
8
|
+
const sharedRequestOptions = {
|
|
9
|
+
redirect: "follow",
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated
|
|
13
|
+
*/
|
|
14
|
+
export async function signedRequest(input) {
|
|
15
|
+
const { uri: inputUri, query: inputQuery = {}, substitution: inputSubstitution = {}, body: inputBody = {}, } = input;
|
|
16
|
+
const url = constructUrl({
|
|
17
|
+
uri: inputUri,
|
|
18
|
+
query: inputQuery,
|
|
19
|
+
substitution: inputSubstitution,
|
|
20
|
+
});
|
|
21
|
+
const body = JSON.stringify(inputBody);
|
|
22
|
+
const stamp = await getWebAuthnAssertion(body, input.options);
|
|
23
|
+
return {
|
|
24
|
+
url: url.toString(),
|
|
25
|
+
body,
|
|
26
|
+
stamp,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function request(input) {
|
|
30
|
+
const { uri: inputUri, method, headers: inputHeaders = {}, query: inputQuery = {}, substitution: inputSubstitution = {}, body: inputBody = {}, } = input;
|
|
31
|
+
const url = constructUrl({
|
|
32
|
+
uri: inputUri,
|
|
33
|
+
query: inputQuery,
|
|
34
|
+
substitution: inputSubstitution,
|
|
35
|
+
});
|
|
36
|
+
const { sealedBody, xStamp } = await sealAndStampRequestBody({
|
|
37
|
+
body: inputBody,
|
|
38
|
+
});
|
|
39
|
+
const response = await fetch(url.toString(), {
|
|
40
|
+
...sharedRequestOptions,
|
|
41
|
+
method,
|
|
42
|
+
headers: {
|
|
43
|
+
...sharedHeaders,
|
|
44
|
+
...inputHeaders,
|
|
45
|
+
"X-Stamp": xStamp,
|
|
46
|
+
},
|
|
47
|
+
body: sealedBody,
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
// Can't use native `cause` here because it's not well supported on Node v16
|
|
51
|
+
// https://node.green/#ES2022-features-Error-cause-property
|
|
52
|
+
let res;
|
|
53
|
+
try {
|
|
54
|
+
res = await response.json();
|
|
55
|
+
}
|
|
56
|
+
catch (_) {
|
|
57
|
+
throw new Error(`${response.status} ${response.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
throw new TurnkeyRequestError(res);
|
|
60
|
+
}
|
|
61
|
+
const data = await response.json();
|
|
62
|
+
return data;
|
|
63
|
+
}
|
|
64
|
+
function constructUrl(input) {
|
|
65
|
+
const { uri, query, substitution } = input;
|
|
66
|
+
const baseUrl = getBaseUrl();
|
|
67
|
+
const url = new URL(substitutePath(uri, substitution), baseUrl);
|
|
68
|
+
for (const key in query) {
|
|
69
|
+
const value = query[key];
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
for (const item of value) {
|
|
72
|
+
url.searchParams.append(key, item);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
url.searchParams.append(key, value ?? "");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return url;
|
|
80
|
+
}
|
|
81
|
+
function getBaseUrl() {
|
|
82
|
+
try {
|
|
83
|
+
const { baseUrl } = getConfig();
|
|
84
|
+
return baseUrl;
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
const { baseUrl } = getBrowserConfig();
|
|
88
|
+
return baseUrl;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function substitutePath(uri, substitutionMap) {
|
|
92
|
+
let result = uri;
|
|
93
|
+
const keyList = Object.keys(substitutionMap);
|
|
94
|
+
for (const key of keyList) {
|
|
95
|
+
const output = result.replaceAll(`{${key}}`, substitutionMap[key]);
|
|
96
|
+
invariant(output !== result, `Substitution error: cannot find "${key}" in URI "${uri}". \`substitutionMap\`: ${JSON.stringify(substitutionMap)}`);
|
|
97
|
+
result = output;
|
|
98
|
+
}
|
|
99
|
+
invariant(!/\{.*\}/.test(result), `Substitution error: found unsubstituted components in "${result}"`);
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
function invariant(condition, message) {
|
|
103
|
+
if (!condition) {
|
|
104
|
+
throw new Error(message);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function stableStringify(input) {
|
|
108
|
+
return JSON.stringify(input);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Seals and stamps the request body with your Turnkey API credentials.
|
|
112
|
+
*
|
|
113
|
+
* You can either:
|
|
114
|
+
* - Before calling `sealAndStampRequestBody(...)`, initialize with your Turnkey API credentials via `init(...)`
|
|
115
|
+
* - Or, provide `apiPublicKey` and `apiPrivateKey` here as arguments
|
|
116
|
+
*/
|
|
117
|
+
export async function sealAndStampRequestBody(input) {
|
|
118
|
+
const { body } = input;
|
|
119
|
+
let { apiPublicKey, apiPrivateKey } = input;
|
|
120
|
+
if (!apiPublicKey) {
|
|
121
|
+
const config = getConfig();
|
|
122
|
+
apiPublicKey = config.apiPublicKey;
|
|
123
|
+
}
|
|
124
|
+
if (!apiPrivateKey) {
|
|
125
|
+
const config = getConfig();
|
|
126
|
+
apiPrivateKey = config.apiPrivateKey;
|
|
127
|
+
}
|
|
128
|
+
const sealedBody = stableStringify(body);
|
|
129
|
+
const signature = await signWithApiKey({
|
|
130
|
+
content: sealedBody,
|
|
131
|
+
privateKey: apiPrivateKey,
|
|
132
|
+
publicKey: apiPublicKey,
|
|
133
|
+
});
|
|
134
|
+
const sealedStamp = stableStringify({
|
|
135
|
+
publicKey: apiPublicKey,
|
|
136
|
+
scheme: "SIGNATURE_SCHEME_TK_API_P256",
|
|
137
|
+
signature: signature,
|
|
138
|
+
});
|
|
139
|
+
const xStamp = stringToBase64urlString(sealedStamp);
|
|
140
|
+
return {
|
|
141
|
+
sealedBody,
|
|
142
|
+
xStamp,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export class TurnkeyRequestError extends Error {
|
|
146
|
+
constructor(input) {
|
|
147
|
+
let turnkeyErrorMessage = `Turnkey error ${input.code}: ${input.message}`;
|
|
148
|
+
if (input.details != null) {
|
|
149
|
+
turnkeyErrorMessage += ` (Details: ${JSON.stringify(input.details)})`;
|
|
150
|
+
}
|
|
151
|
+
super(turnkeyErrorMessage);
|
|
152
|
+
this.name = "TurnkeyRequestError";
|
|
153
|
+
this.details = input.details ?? null;
|
|
154
|
+
this.code = input.code;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const config = {
|
|
2
|
+
apiPublicKey: null,
|
|
3
|
+
apiPrivateKey: null,
|
|
4
|
+
baseUrl: null,
|
|
5
|
+
};
|
|
6
|
+
const browserConfig = {
|
|
7
|
+
baseUrl: null,
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated use {@link TurnkeyClient} instead, which doesn't rely on global initialization logic.
|
|
11
|
+
*/
|
|
12
|
+
export function browserInit(value) {
|
|
13
|
+
browserConfig.baseUrl = assertNonEmptyString(value.baseUrl, "baseUrl");
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated use {@link TurnkeyClient} instead, which doesn't rely on global initialization logic.
|
|
17
|
+
*/
|
|
18
|
+
export function init(value) {
|
|
19
|
+
config.apiPublicKey = assertNonEmptyString(value.apiPublicKey, "apiPublicKey");
|
|
20
|
+
config.apiPrivateKey = assertNonEmptyString(value.apiPrivateKey, "apiPrivateKey");
|
|
21
|
+
config.baseUrl = assertNonEmptyString(value.baseUrl, "baseUrl");
|
|
22
|
+
}
|
|
23
|
+
export function getConfig() {
|
|
24
|
+
return {
|
|
25
|
+
apiPublicKey: assertNonEmptyString(config.apiPublicKey, "apiPublicKey"),
|
|
26
|
+
apiPrivateKey: assertNonEmptyString(config.apiPrivateKey, "apiPrivateKey"),
|
|
27
|
+
baseUrl: assertNonEmptyString(config.baseUrl, "baseUrl"),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function getBrowserConfig() {
|
|
31
|
+
return {
|
|
32
|
+
baseUrl: assertNonEmptyString(browserConfig.baseUrl, "baseUrl"),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function assertNonEmptyString(input, name) {
|
|
36
|
+
if (typeof input !== "string" || !input) {
|
|
37
|
+
throw new Error(`"${name}" must be a non-empty string`);
|
|
38
|
+
}
|
|
39
|
+
return input;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,GAAuB;IACjC,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,MAAM,aAAa,GAA8B;IAC/C,OAAO,EAAE,IAAI;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAqB;IAC/C,aAAa,CAAC,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,MAAM,CAAC,YAAY,GAAG,oBAAoB,CACxC,KAAK,CAAC,YAAY,EAClB,cAAc,CACf,CAAC;IAEF,MAAM,CAAC,aAAa,GAAG,oBAAoB,CACzC,KAAK,CAAC,aAAa,EACnB,eAAe,CAChB,CAAC;IACF,MAAM,CAAC,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,YAAY,EAAE,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;QACvE,aAAa,EAAE,oBAAoB,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;QAC1E,OAAO,EAAE,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,OAAO,EAAE,oBAAoB,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,IAAY;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,8BAA8B,CAAC,CAAC;KACzD;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code modified from https://github.com/github/webauthn-json/blob/e932b3585fa70b0bd5b5a4012ba7dbad7b0a0d0f/src/webauthn-json/base64url.ts#L23
|
|
3
|
+
*/
|
|
4
|
+
export function stringToBase64urlString(input) {
|
|
5
|
+
// string to base64
|
|
6
|
+
const base64String = btoa(input);
|
|
7
|
+
return base64StringToBase64UrlEncodedString(base64String);
|
|
8
|
+
}
|
|
9
|
+
export function base64StringToBase64UrlEncodedString(input) {
|
|
10
|
+
return input.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
11
|
+
}
|
|
12
|
+
export function uint8ArrayToHexString(input) {
|
|
13
|
+
return input.reduce((result, x) => result + x.toString(16).padStart(2, "0"), "");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/encoding.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjC,OAAO,oCAAoC,CAAC,YAAY,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,KAAa;IAChE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAiB;IACrD,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EACvD,EAAE,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PublicApiService as TurnkeyApi } from "./__generated__/barrel";
|
|
2
|
+
export { TurnkeyClient } from "./__generated__/services/coordinator/public/v1/public_api.client";
|
|
3
|
+
export { init, browserInit } from "./config";
|
|
4
|
+
export { TurnkeyRequestError } from "./base";
|
|
5
|
+
export { TurnkeyActivityError } from "./shared";
|
|
6
|
+
export { getWebAuthnAttestation } from "./webauthn";
|
|
7
|
+
export { withAsyncPolling, createActivityPoller } from "./async";
|
|
8
|
+
export { TurnkeyApi };
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated use `TurnkeyApi` instead
|
|
11
|
+
*/
|
|
12
|
+
const PublicApiService = TurnkeyApi;
|
|
13
|
+
export { PublicApiService };
|
|
14
|
+
export { sealAndStampRequestBody } from "./base";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,kEAAkE,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class TurnkeyActivityError extends Error {
|
|
2
|
+
constructor(input) {
|
|
3
|
+
const { message, cause, activityId, activityStatus, activityType } = input;
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "TurnkeyActivityError";
|
|
6
|
+
this.activityId = activityId ?? null;
|
|
7
|
+
this.activityStatus = activityStatus ?? null;
|
|
8
|
+
this.activityType = activityType ?? null;
|
|
9
|
+
this.cause = cause ?? null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function stableStringify(input) {
|
|
13
|
+
return JSON.stringify(input);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/shared.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAM7C,YAAY,KAMX;QACC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAC3E,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAA0B;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universal.js","sourceRoot":"","sources":["../../src/universal.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,IAAI,KAA8B,CAAC;AAEnC,IAAI,OAAO,UAAU,EAAE,KAAK,KAAK,WAAW,EAAE;IAC5C,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;CAC1B;KAAM;IACL,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAChC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { base64urlToBuffer, bufferToBase64url } from "./base64url";
|
|
2
|
+
import { convert } from "./convert";
|
|
3
|
+
import { credentialCreationOptions, credentialRequestOptions, publicKeyCredentialWithAssertion, publicKeyCredentialWithAttestation, } from "./schema";
|
|
4
|
+
export function createRequestFromJSON(requestJSON) {
|
|
5
|
+
return convert(base64urlToBuffer, credentialCreationOptions, requestJSON);
|
|
6
|
+
}
|
|
7
|
+
export function createResponseToJSON(credential) {
|
|
8
|
+
return convert(bufferToBase64url, publicKeyCredentialWithAttestation, credential);
|
|
9
|
+
}
|
|
10
|
+
export async function create(requestJSON) {
|
|
11
|
+
const credential = (await navigator.credentials.create(createRequestFromJSON(requestJSON)));
|
|
12
|
+
return createResponseToJSON(credential);
|
|
13
|
+
}
|
|
14
|
+
export function getRequestFromJSON(requestJSON) {
|
|
15
|
+
return convert(base64urlToBuffer, credentialRequestOptions, requestJSON);
|
|
16
|
+
}
|
|
17
|
+
export function getResponseToJSON(credential) {
|
|
18
|
+
return convert(bufferToBase64url, publicKeyCredentialWithAssertion, credential);
|
|
19
|
+
}
|
|
20
|
+
export async function get(requestJSON) {
|
|
21
|
+
const credential = (await navigator.credentials.get(getRequestFromJSON(requestJSON)));
|
|
22
|
+
return getResponseToJSON(credential);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/webauthn-json/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,UAAU,CAAC;AAElB,MAAM,UAAU,qBAAqB,CACnC,WAA0C;IAE1C,OAAO,OAAO,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAA+B;IAE/B,OAAO,OAAO,CACZ,iBAAiB,EACjB,kCAAkC,EAClC,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,WAA0C;IAE1C,MAAM,UAAU,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CACpD,qBAAqB,CAAC,WAAW,CAAC,CACnC,CAAwB,CAAC;IAC1B,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAyC;IAEzC,OAAO,OAAO,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,WAAW,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,UAA+B;IAE/B,OAAO,OAAO,CACZ,iBAAiB,EACjB,gCAAgC,EAChC,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,WAAyC;IAEzC,MAAM,UAAU,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,GAAG,CACjD,kBAAkB,CAAC,WAAW,CAAC,CAChC,CAAwB,CAAC;IAC1B,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function base64urlToBuffer(baseurl64String) {
|
|
2
|
+
// Base64url to Base64
|
|
3
|
+
const padding = "==".slice(0, (4 - (baseurl64String.length % 4)) % 4);
|
|
4
|
+
const base64String = baseurl64String.replace(/-/g, "+").replace(/_/g, "/") + padding;
|
|
5
|
+
// Base64 to binary string
|
|
6
|
+
const str = atob(base64String);
|
|
7
|
+
// Binary string to buffer
|
|
8
|
+
const buffer = new ArrayBuffer(str.length);
|
|
9
|
+
const byteView = new Uint8Array(buffer);
|
|
10
|
+
for (let i = 0; i < str.length; i++) {
|
|
11
|
+
byteView[i] = str.charCodeAt(i);
|
|
12
|
+
}
|
|
13
|
+
return buffer;
|
|
14
|
+
}
|
|
15
|
+
export function bufferToBase64url(buffer) {
|
|
16
|
+
// Buffer to binary string
|
|
17
|
+
const byteView = new Uint8Array(buffer);
|
|
18
|
+
let str = "";
|
|
19
|
+
for (const charCode of byteView) {
|
|
20
|
+
str += String.fromCharCode(charCode);
|
|
21
|
+
}
|
|
22
|
+
// Binary string to base64
|
|
23
|
+
const base64String = btoa(str);
|
|
24
|
+
// Base64 to base64url
|
|
25
|
+
// We assume that the base64url string is well-formed.
|
|
26
|
+
const base64urlString = base64String
|
|
27
|
+
.replace(/\+/g, "-")
|
|
28
|
+
.replace(/\//g, "_")
|
|
29
|
+
.replace(/=/g, "");
|
|
30
|
+
return base64urlString;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=base64url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../../src/webauthn-json/base64url.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAC/B,eAAgC;IAEhC,sBAAsB;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAChB,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;IAElE,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAE/B,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACjC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE;QAC/B,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;KACtC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/B,sBAAsB;IACtB,sDAAsD;IACtD,MAAM,eAAe,GAAG,YAAY;SACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrB,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// We export these values in order so that they can be used to deduplicate
|
|
2
|
+
// schema definitions in minified JS code.
|
|
3
|
+
// TODO: Parcel isn't deduplicating these values.
|
|
4
|
+
export const copyValue = "copy";
|
|
5
|
+
export const convertValue = "convert";
|
|
6
|
+
export function convert(conversionFn, schema, input) {
|
|
7
|
+
if (schema === copyValue) {
|
|
8
|
+
return input;
|
|
9
|
+
}
|
|
10
|
+
if (schema === convertValue) {
|
|
11
|
+
return conversionFn(input);
|
|
12
|
+
}
|
|
13
|
+
if (schema instanceof Array) {
|
|
14
|
+
return input.map((v) => convert(conversionFn, schema[0], v));
|
|
15
|
+
}
|
|
16
|
+
if (schema instanceof Object) {
|
|
17
|
+
const output = {};
|
|
18
|
+
for (const [key, schemaField] of Object.entries(schema)) {
|
|
19
|
+
if (schemaField.derive) {
|
|
20
|
+
const v = schemaField.derive(input);
|
|
21
|
+
if (v !== undefined) {
|
|
22
|
+
input[key] = v;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!(key in input)) {
|
|
26
|
+
if (schemaField.required) {
|
|
27
|
+
throw new Error(`Missing key: ${key}`);
|
|
28
|
+
}
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// Fields can be null (rather than missing or `undefined`), e.g. the
|
|
32
|
+
// `userHandle` field of the `AuthenticatorAssertionResponse`:
|
|
33
|
+
// https://www.w3.org/TR/webauthn/#iface-authenticatorassertionresponse
|
|
34
|
+
if (input[key] == null) {
|
|
35
|
+
output[key] = null;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
output[key] = convert(conversionFn, schemaField.schema, input[key]);
|
|
39
|
+
}
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function derived(schema, derive) {
|
|
44
|
+
return {
|
|
45
|
+
required: true,
|
|
46
|
+
schema,
|
|
47
|
+
derive,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function required(schema) {
|
|
51
|
+
return {
|
|
52
|
+
required: true,
|
|
53
|
+
schema,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function optional(schema) {
|
|
57
|
+
return {
|
|
58
|
+
required: false,
|
|
59
|
+
schema,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/webauthn-json/convert.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0CAA0C;AAI1C,iDAAiD;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AAEtC,MAAM,UAAU,OAAO,CACrB,YAA6B,EAC7B,MAAc,EACd,KAAU;IAEV,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IACD,IAAI,MAAM,KAAK,YAAY,EAAE;QAC3B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;KAC5B;IACD,IAAI,MAAM,YAAY,KAAK,EAAE;QAC3B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAW,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAC7E;IACD,IAAI,MAAM,YAAY,MAAM,EAAE;QAC5B,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvD,IAAI,WAAW,CAAC,MAAM,EAAE;gBACtB,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,CAAC,KAAK,SAAS,EAAE;oBACnB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAChB;aACF;YAED,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE;gBACnB,IAAI,WAAW,CAAC,QAAQ,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;iBACxC;gBACD,SAAS;aACV;YACD,oEAAoE;YACpE,8DAA8D;YAC9D,uEAAuE;YACvE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;gBACtB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACnB,SAAS;aACV;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CACnB,YAAY,EACZ,WAAW,CAAC,MAAM,EAClB,KAAK,CAAC,GAAG,CAAC,CACX,CAAC;SACH;QACD,OAAO,MAAM,CAAC;KACf;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,MAAc,EACd,MAAuB;IAEvB,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequestFromJSON as parseCreationOptionsFromJSON, createResponseToJSON, getRequestFromJSON as parseRequestOptionsFromJSON, getResponseToJSON, } from "./api";
|
|
2
|
+
export { parseCreationOptionsFromJSON, parseRequestOptionsFromJSON };
|
|
3
|
+
export async function create(options) {
|
|
4
|
+
const response = (await navigator.credentials.create(options));
|
|
5
|
+
response.toJSON = () => createResponseToJSON(response);
|
|
6
|
+
return response;
|
|
7
|
+
}
|
|
8
|
+
export async function get(options) {
|
|
9
|
+
const response = (await navigator.credentials.get(options));
|
|
10
|
+
response.toJSON = () => getResponseToJSON(response);
|
|
11
|
+
return response;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webauthn-json/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,IAAI,4BAA4B,EACrD,oBAAoB,EACpB,kBAAkB,IAAI,2BAA2B,EACjD,iBAAiB,GAClB,MAAM,OAAO,CAAC;AAcf,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,CAAC;AAYrE,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAkC;IAElC,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAClD,OAAO,CACR,CAAoC,CAAC;IACtC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,OAAiC;IAEjC,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,GAAG,CAC/C,OAAO,CACR,CAAsC,CAAC;IACxC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/webauthn-json/json.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-format.js","sourceRoot":"","sources":["../../../src/webauthn-json/schema-format.ts"],"names":[],"mappings":""}
|