@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.mjs CHANGED
@@ -1,32 +1,32 @@
1
1
  // ../core/dist/index.js
2
- var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3
- function g(e) {
4
- let r = "", n = e.length;
5
- for (let t = 0; t < n; t += 3) {
6
- let c = e[t], d = t + 1 < n ? e[t + 1] : 0, i = t + 2 < n ? e[t + 2] : 0, o = c << 16 | d << 8 | i;
7
- r += u[o >> 18 & 63], r += u[o >> 12 & 63], r += t + 1 < n ? u[o >> 6 & 63] : "", r += t + 2 < n ? u[o & 63] : "";
8
- }
9
- return r.replace(/\+/g, "-").replace(/\//g, "_");
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 y() {
11
+ function B() {
12
12
  let e = new Uint8Array(32);
13
- return crypto.getRandomValues(e), g(e);
13
+ return crypto.getRandomValues(e), u(e);
14
14
  }
15
- async function x(e) {
16
- let n = new TextEncoder().encode(e), t = await crypto.subtle.digest("SHA-256", n);
17
- return new Uint8Array(t);
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 k(e, r) {
20
- let t = await (r ?? x)(e);
21
- return g(t);
19
+ async function W(e, n) {
20
+ let r = await (n ?? I)(e);
21
+ return u(r);
22
22
  }
23
- function m() {
23
+ function j() {
24
24
  let e = new Uint8Array(16);
25
- return crypto.getRandomValues(e), g(e);
25
+ return crypto.getRandomValues(e), u(e);
26
26
  }
27
- function T(e) {
28
- let { host: r, clientId: n, redirectUri: t, codeChallenge: c, state: d, scopes: i, authorizePath: o = "/api/auth/oauth2/authorize" } = e, s = new URL(o, r);
29
- return s.searchParams.set("client_id", n), s.searchParams.set("redirect_uri", t), s.searchParams.set("response_type", "code"), s.searchParams.set("scope", i.join(" ")), s.searchParams.set("state", d), s.searchParams.set("code_challenge", c), s.searchParams.set("code_challenge_method", "S256"), s.toString();
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
- return `${this.host}/widget/embed/nostr/approve?origin=${origin}`;
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 k2 of knownKeys) {
285
- if (k2.id === id) return k2.keyType;
286
- if (k2.address && k2.address.toLowerCase() === id.toLowerCase()) return k2.keyType;
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.nostr = new OpenKeyNostr(this.host);
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 = y();
1042
- const challenge = await k(verifier);
1043
- const state = config.state || m();
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 = T({
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