@openkey/sdk 0.10.2 → 0.12.0-beta.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/dist/index.d.mts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +45 -35
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -35
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
// ../core/dist/index.js
|
|
2
|
-
var
|
|
3
|
-
function
|
|
4
|
-
let
|
|
5
|
-
for (let
|
|
6
|
-
let
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
return
|
|
2
|
+
var y = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
3
|
+
function u(e) {
|
|
4
|
+
let n = "", t = e.length;
|
|
5
|
+
for (let r = 0; r < t; r += 3) {
|
|
6
|
+
let i = e[r], s = r + 1 < t ? e[r + 1] : 0, a = r + 2 < t ? e[r + 2] : 0, c = i << 16 | s << 8 | a;
|
|
7
|
+
n += y[c >> 18 & 63], n += y[c >> 12 & 63], n += r + 1 < t ? y[c >> 6 & 63] : "", n += r + 2 < t ? y[c & 63] : "";
|
|
8
|
+
}
|
|
9
|
+
return n.replace(/\+/g, "-").replace(/\//g, "_");
|
|
10
10
|
}
|
|
11
|
-
function
|
|
11
|
+
function B() {
|
|
12
12
|
let e = new Uint8Array(32);
|
|
13
|
-
return crypto.getRandomValues(e),
|
|
13
|
+
return crypto.getRandomValues(e), u(e);
|
|
14
14
|
}
|
|
15
|
-
async function
|
|
16
|
-
let
|
|
17
|
-
return new Uint8Array(
|
|
15
|
+
async function I(e) {
|
|
16
|
+
let t = new TextEncoder().encode(e), r = await crypto.subtle.digest("SHA-256", t);
|
|
17
|
+
return new Uint8Array(r);
|
|
18
18
|
}
|
|
19
|
-
async function
|
|
20
|
-
let
|
|
21
|
-
return
|
|
19
|
+
async function W(e, n) {
|
|
20
|
+
let r = await (n ?? I)(e);
|
|
21
|
+
return u(r);
|
|
22
22
|
}
|
|
23
|
-
function
|
|
23
|
+
function j() {
|
|
24
24
|
let e = new Uint8Array(16);
|
|
25
|
-
return crypto.getRandomValues(e),
|
|
25
|
+
return crypto.getRandomValues(e), u(e);
|
|
26
26
|
}
|
|
27
|
-
function
|
|
28
|
-
let { host:
|
|
29
|
-
return
|
|
27
|
+
function G(e) {
|
|
28
|
+
let { host: n, clientId: t, redirectUri: r, codeChallenge: i, state: s, scopes: a, authorizePath: c = "/api/auth/oauth2/authorize" } = e, d = new URL(c, n);
|
|
29
|
+
return d.searchParams.set("client_id", t), d.searchParams.set("redirect_uri", r), d.searchParams.set("response_type", "code"), d.searchParams.set("scope", a.join(" ")), d.searchParams.set("state", s), d.searchParams.set("code_challenge", i), d.searchParams.set("code_challenge_method", "S256"), d.toString();
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
// src/nostr.ts
|
|
@@ -141,8 +141,9 @@ var NostrFrame = class {
|
|
|
141
141
|
}
|
|
142
142
|
};
|
|
143
143
|
var OpenKeyNostr = class {
|
|
144
|
-
constructor(host) {
|
|
144
|
+
constructor(host, passkeysSupported = true) {
|
|
145
145
|
this.host = host;
|
|
146
|
+
this.passkeysSupported = passkeysSupported;
|
|
146
147
|
}
|
|
147
148
|
/**
|
|
148
149
|
* Get-or-create the user's OpenKey-custodied Nostr identity. Always shows
|
|
@@ -185,7 +186,8 @@ var OpenKeyNostr = class {
|
|
|
185
186
|
}
|
|
186
187
|
widgetUrl() {
|
|
187
188
|
const origin = encodeURIComponent(window.location.origin);
|
|
188
|
-
|
|
189
|
+
const passkeysFlag = this.passkeysSupported ? "" : "&passkeys=false";
|
|
190
|
+
return `${this.host}/widget/embed/nostr/approve?origin=${origin}${passkeysFlag}`;
|
|
189
191
|
}
|
|
190
192
|
run(url, request, onData) {
|
|
191
193
|
return new Promise((resolve, reject) => {
|
|
@@ -229,6 +231,9 @@ var OpenKeyNostr = class {
|
|
|
229
231
|
};
|
|
230
232
|
|
|
231
233
|
// src/index.ts
|
|
234
|
+
function passkeysQueryFlag(passkeysSupported) {
|
|
235
|
+
return passkeysSupported ? "" : "&passkeys=false";
|
|
236
|
+
}
|
|
232
237
|
var DEFAULT_HOST = "https://openkey.so";
|
|
233
238
|
var POPUP_WIDTH = 400;
|
|
234
239
|
var POPUP_HEIGHT = 600;
|
|
@@ -281,9 +286,9 @@ function resolveAuthorizeTinyCloudRouting(state) {
|
|
|
281
286
|
const requestKeyId = rawRequestKeyId && rawRequestKeyId.length > 0 ? rawRequestKeyId : null;
|
|
282
287
|
const knownKeys = state.knownKeys ?? [];
|
|
283
288
|
const lookupType = (id) => {
|
|
284
|
-
for (const
|
|
285
|
-
if (
|
|
286
|
-
if (
|
|
289
|
+
for (const k of knownKeys) {
|
|
290
|
+
if (k.id === id) return k.keyType;
|
|
291
|
+
if (k.address && k.address.toLowerCase() === id.toLowerCase()) return k.keyType;
|
|
287
292
|
}
|
|
288
293
|
if (id.startsWith("external:")) return "EXTERNAL";
|
|
289
294
|
return null;
|
|
@@ -548,6 +553,7 @@ var OpenKey = class {
|
|
|
548
553
|
oauthHost;
|
|
549
554
|
appName;
|
|
550
555
|
mode;
|
|
556
|
+
passkeysSupported;
|
|
551
557
|
config;
|
|
552
558
|
popup = null;
|
|
553
559
|
lastAuth = null;
|
|
@@ -568,7 +574,8 @@ var OpenKey = class {
|
|
|
568
574
|
this.oauthHost = config.oauthHost || this.deriveOAuthHost(this.host);
|
|
569
575
|
this.appName = config.appName || window.location.hostname;
|
|
570
576
|
this.mode = config.mode ?? "iframe";
|
|
571
|
-
this.
|
|
577
|
+
this.passkeysSupported = config.passkeysSupported ?? true;
|
|
578
|
+
this.nostr = new OpenKeyNostr(this.host, this.passkeysSupported);
|
|
572
579
|
if (typeof window !== "undefined") {
|
|
573
580
|
this.discoveredProviders = [];
|
|
574
581
|
window.addEventListener("eip6963:announceProvider", (event) => {
|
|
@@ -1038,14 +1045,14 @@ var OpenKey = class {
|
|
|
1038
1045
|
* @returns Promise that resolves with authorization code after user consent
|
|
1039
1046
|
*/
|
|
1040
1047
|
connect: async (config) => {
|
|
1041
|
-
const verifier =
|
|
1042
|
-
const challenge = await
|
|
1043
|
-
const state = config.state ||
|
|
1048
|
+
const verifier = B();
|
|
1049
|
+
const challenge = await W(verifier);
|
|
1050
|
+
const state = config.state || j();
|
|
1044
1051
|
sessionStorage.setItem(
|
|
1045
1052
|
OAUTH_STORAGE_KEY,
|
|
1046
1053
|
JSON.stringify({ verifier, state })
|
|
1047
1054
|
);
|
|
1048
|
-
const authUrl =
|
|
1055
|
+
const authUrl = G({
|
|
1049
1056
|
host: this.oauthHost,
|
|
1050
1057
|
clientId: config.clientId,
|
|
1051
1058
|
redirectUri: config.redirectUri,
|
|
@@ -1215,17 +1222,18 @@ var OpenKey = class {
|
|
|
1215
1222
|
const mode = this.resolveMode(modeOverride);
|
|
1216
1223
|
const origin = encodeURIComponent(window.location.origin);
|
|
1217
1224
|
const eoaFlag = action === "connect" && this.hasDetectedEoa() ? "&hasEoa=true" : "";
|
|
1225
|
+
const passkeysFlag = passkeysQueryFlag(this.passkeysSupported);
|
|
1218
1226
|
if (mode === "popup") {
|
|
1219
|
-
const url2 = `${this.host}/widget/${action}?origin=${origin}${eoaFlag}`;
|
|
1227
|
+
const url2 = `${this.host}/widget/${action}?origin=${origin}${eoaFlag}${passkeysFlag}`;
|
|
1220
1228
|
return new Promise((resolve, reject) => this.openPopup(action, url2, message, resolve, reject));
|
|
1221
1229
|
}
|
|
1222
1230
|
if (mode === "redirect") {
|
|
1223
|
-
const url2 = `${this.host}/widget/${action}?origin=${origin}${eoaFlag}`;
|
|
1231
|
+
const url2 = `${this.host}/widget/${action}?origin=${origin}${eoaFlag}${passkeysFlag}`;
|
|
1224
1232
|
window.location.href = url2;
|
|
1225
1233
|
return new Promise(() => {
|
|
1226
1234
|
});
|
|
1227
1235
|
}
|
|
1228
|
-
const url = `${this.host}/widget/embed/${action}?origin=${origin}${eoaFlag}`;
|
|
1236
|
+
const url = `${this.host}/widget/embed/${action}?origin=${origin}${eoaFlag}${passkeysFlag}`;
|
|
1229
1237
|
return this.openIframeModal(url, action, message, origin);
|
|
1230
1238
|
}
|
|
1231
1239
|
openIframeModal(url, action, message, origin) {
|
|
@@ -1331,7 +1339,7 @@ var OpenKey = class {
|
|
|
1331
1339
|
cleanup();
|
|
1332
1340
|
console.warn("OpenKey: iframe blocked by CSP, falling back to popup. Add frame-src https://openkey.so to your CSP.");
|
|
1333
1341
|
showToast();
|
|
1334
|
-
const popupUrl = `${this.host}/widget/${action}?origin=${origin}`;
|
|
1342
|
+
const popupUrl = `${this.host}/widget/${action}?origin=${origin}${passkeysQueryFlag(this.passkeysSupported)}`;
|
|
1335
1343
|
this.openPopup(action, popupUrl, message, (val) => settle(() => resolve(val)), (err) => settle(() => reject(err)));
|
|
1336
1344
|
}, IFRAME_READY_TIMEOUT);
|
|
1337
1345
|
const overallTimeout = setTimeout(() => {
|
|
@@ -1635,6 +1643,7 @@ export {
|
|
|
1635
1643
|
OpenKeyProvider,
|
|
1636
1644
|
index_default as default,
|
|
1637
1645
|
getOpenKey,
|
|
1646
|
+
passkeysQueryFlag,
|
|
1638
1647
|
resolveAuthorizeTinyCloudRouting,
|
|
1639
1648
|
shouldRouteAuthorizeTinyCloudExternal,
|
|
1640
1649
|
validateIframeResize
|