@superbuilders/primer-tives 3.6.0 → 3.7.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/README.md CHANGED
@@ -17,7 +17,7 @@ bun add @superbuilders/primer-tives
17
17
 
18
18
  ## Version
19
19
 
20
- The current SDK version is `3.6.0`.
20
+ The current SDK version is `3.7.0`.
21
21
 
22
22
  ## Entrypoints
23
23
 
@@ -11,10 +11,7 @@ declare function browserStorage(options: HostedAuthOptions | undefined, logger:
11
11
  declare function currentUrl(options: HostedAuthOptions | undefined, logger: PrimerLogger): URL;
12
12
  declare function redirectUri(options: HostedAuthOptions | undefined, url: URL, logger: PrimerLogger): string;
13
13
  declare function randomClientState(logger: PrimerLogger): string;
14
- declare function clearCallbackHash(options: HostedAuthOptions | undefined, url: URL): void;
15
14
  declare function openAuthPopup(url: string, options: HostedAuthOptions | undefined, logger: PrimerLogger): Window;
16
- declare function readablePopupUrl(popup: Window): string | null;
17
- declare function sleep(ms: number): Promise<void>;
18
- export { browserStorage, clearCallbackHash, currentUrl, openAuthPopup, randomClientState, readablePopupUrl, redirectUri, sleep };
15
+ export { browserStorage, currentUrl, openAuthPopup, randomClientState, redirectUri };
19
16
  export type { HostedAuthOptions };
20
17
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/client/auth/browser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEtE,KAAK,iBAAiB,GAAG;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED,iBAAS,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAS7F;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,GAAG,CAarF;AAED,iBAAS,WAAW,CACnB,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GAClB,MAAM,CASR;AAED,iBAAS,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAYvD;AAED,iBAAS,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,CASjF;AAED,iBAAS,aAAa,CACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,YAAY,GAClB,MAAM,CAmBR;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtD;AAED,iBAAS,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxC;AAED,OAAO,EACN,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,KAAK,EACL,CAAA;AACD,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/client/auth/browser.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEtE,KAAK,iBAAiB,GAAG;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED,iBAAS,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAS7F;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,GAAG,CAarF;AAED,iBAAS,WAAW,CACnB,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,GAClB,MAAM,CASR;AAED,iBAAS,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAYvD;AAED,iBAAS,aAAa,CACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,YAAY,GAClB,MAAM,CAmBR;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAA;AACpF,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"hosted-popup.d.ts","sourceRoot":"","sources":["../../../src/client/auth/hosted-popup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,iDAAiD,CAAA;AAMxD,KAAK,iBAAiB,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B,CAAA;AA6CD,iBAAe,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B1E;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAC3B,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"hosted-popup.d.ts","sourceRoot":"","sources":["../../../src/client/auth/hosted-popup.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAGN,KAAK,iBAAiB,EACtB,MAAM,iDAAiD,CAAA;AAOxD,KAAK,iBAAiB,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B,CAAA;AAwJD,iBAAe,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1E;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA;AAC3B,YAAY,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/client/auth/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,iDAAiD,CAAA;AAMxD,OAAO,EAEN,KAAK,mBAAmB,EACxB,MAAM,sDAAsD,CAAA;AAU7D,KAAK,0BAA0B,GAAG;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B,CAAA;AAED,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;CACzC,CAAA;AAED,KAAK,gCAAgC,GAAG;IACvC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,KAAK,sBAAsB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACrB,CAAA;AAED,KAAK,yBAAyB,GAC3B,yBAAyB,GACzB,gCAAgC,GAChC,sBAAsB,CAAA;AAEzB,KAAK,iBAAiB,GAAG,yBAAyB,GAAG,gCAAgC,CAAA;AAkGrF,iBAAS,0BAA0B,CAClC,OAAO,EAAE,0BAA0B,GACjC,yBAAyB,CAqB3B;AAED,iBAAe,gBAAgB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqC/F;AAED,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,CAAA;AACvD,YAAY,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/client/auth/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAIN,KAAK,iBAAiB,EACtB,MAAM,iDAAiD,CAAA;AAExD,OAAO,EAEN,KAAK,mBAAmB,EACxB,MAAM,sDAAsD,CAAA;AAS7D,KAAK,0BAA0B,GAAG;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B,CAAA;AAED,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;CACzC,CAAA;AAED,KAAK,gCAAgC,GAAG;IACvC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,KAAK,sBAAsB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACrB,CAAA;AAED,KAAK,yBAAyB,GAC3B,yBAAyB,GACzB,gCAAgC,GAChC,sBAAsB,CAAA;AAEzB,KAAK,iBAAiB,GAAG,yBAAyB,GAAG,gCAAgC,CAAA;AA4DrF,iBAAS,0BAA0B,CAClC,OAAO,EAAE,0BAA0B,GACjC,yBAAyB,CAe3B;AAED,iBAAe,gBAAgB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqC/F;AAED,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,CAAA;AACvD,YAAY,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1,3 +1,41 @@
1
+ var __dispose = Symbol.dispose || /* @__PURE__ */ Symbol.for("Symbol.dispose");
2
+ var __asyncDispose = Symbol.asyncDispose || /* @__PURE__ */ Symbol.for("Symbol.asyncDispose");
3
+ var __using = (stack, value, async) => {
4
+ if (value != null) {
5
+ if (typeof value !== "object" && typeof value !== "function")
6
+ throw TypeError('Object expected to be assigned to "using" declaration');
7
+ var dispose;
8
+ if (async)
9
+ dispose = value[__asyncDispose];
10
+ if (dispose === undefined)
11
+ dispose = value[__dispose];
12
+ if (typeof dispose !== "function")
13
+ throw TypeError("Object not disposable");
14
+ stack.push([async, dispose, value]);
15
+ } else if (async) {
16
+ stack.push([async]);
17
+ }
18
+ return value;
19
+ };
20
+ var __callDispose = (stack, error, hasError) => {
21
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
22
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
23
+ }, fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e), next = (it) => {
24
+ while (it = stack.pop()) {
25
+ try {
26
+ var result = it[1] && it[1].call(it[2]);
27
+ if (it[0])
28
+ return Promise.resolve(result).then(next, (e) => (fail(e), next()));
29
+ } catch (e) {
30
+ fail(e);
31
+ }
32
+ }
33
+ if (hasError)
34
+ throw error;
35
+ };
36
+ return next();
37
+ };
38
+
1
39
  // src/errors.ts
2
40
  import * as errors from "@superbuilders/errors";
3
41
  var ErrNetwork = errors.new("network");
@@ -341,7 +379,7 @@ function submissionValidationMessage(result) {
341
379
  import * as errors2 from "@superbuilders/errors";
342
380
 
343
381
  // src/version.ts
344
- var SDK_VERSION = "3.6.0";
382
+ var SDK_VERSION = "3.7.0";
345
383
  var NPM_PACKAGE_URL = "https://www.npmjs.com/package/@superbuilders/primer-tives";
346
384
 
347
385
  // src/client/transport.ts
@@ -1134,10 +1172,9 @@ function makeSession(sc) {
1134
1172
  }
1135
1173
 
1136
1174
  // src/client/auth/provider.ts
1137
- import * as errors13 from "@superbuilders/errors";
1175
+ import * as errors11 from "@superbuilders/errors";
1138
1176
 
1139
1177
  // src/client/auth/browser.ts
1140
- import * as errors10 from "@superbuilders/errors";
1141
1178
  function browserStorage(options, logger) {
1142
1179
  if (options !== undefined && options.storage !== undefined) {
1143
1180
  return options.storage;
@@ -1185,16 +1222,6 @@ function randomClientState(logger) {
1185
1222
  }
1186
1223
  return result;
1187
1224
  }
1188
- function clearCallbackHash(options, url) {
1189
- if (options !== undefined && options.currentUrl !== undefined) {
1190
- return;
1191
- }
1192
- if (typeof globalThis.history === "undefined") {
1193
- return;
1194
- }
1195
- const cleanUrl = `${url.pathname}${url.search}`;
1196
- globalThis.history.replaceState(globalThis.history.state, "", cleanUrl);
1197
- }
1198
1225
  function openAuthPopup(url, options, logger) {
1199
1226
  if (typeof globalThis.open === "undefined") {
1200
1227
  logger.error("auth popup api unavailable");
@@ -1215,67 +1242,12 @@ function openAuthPopup(url, options, logger) {
1215
1242
  }
1216
1243
  return popup;
1217
1244
  }
1218
- function readablePopupUrl(popup) {
1219
- const result = errors10.trySync(function readLocation() {
1220
- return popup.location.href;
1221
- });
1222
- if (result.error) {
1223
- return null;
1224
- }
1225
- return result.data;
1226
- }
1227
- function sleep(ms) {
1228
- return new Promise(function resolveLater(resolve) {
1229
- setTimeout(resolve, ms);
1230
- });
1231
- }
1232
-
1233
- // src/client/auth/callback.ts
1234
- var ACCESS_TOKEN_HASH_PARAM = "primer_access_token";
1235
- var AUTH_STATUS_HASH_PARAM = "primer_auth";
1236
- var AUTH_STATE_HASH_PARAM = "primer_state";
1237
- var AUTH_SUCCESS = "success";
1238
- var AUTH_ERROR = "error";
1239
- function readAuthCallback(url, logger) {
1240
- if (url.hash.length === 0) {
1241
- return null;
1242
- }
1243
- const hash = new URLSearchParams(url.hash.slice(1));
1244
- const authStatus = hash.get(AUTH_STATUS_HASH_PARAM);
1245
- if (authStatus === null) {
1246
- return null;
1247
- }
1248
- if (authStatus === AUTH_ERROR) {
1249
- logger.error("auth callback returned error");
1250
- throw ErrAuthCallbackInvalid;
1251
- }
1252
- if (authStatus !== AUTH_SUCCESS) {
1253
- logger.error("auth callback status invalid", { authStatus });
1254
- throw ErrAuthCallbackInvalid;
1255
- }
1256
- const accessToken = hash.get(ACCESS_TOKEN_HASH_PARAM);
1257
- const state = hash.get(AUTH_STATE_HASH_PARAM);
1258
- if (accessToken === null || accessToken.length === 0 || state === null || state.length === 0) {
1259
- logger.error("auth callback missing token or state");
1260
- throw ErrAuthCallbackInvalid;
1261
- }
1262
- return { accessToken, state };
1263
- }
1264
- function requireMatchingCallbackState(callback, expectedState, logger) {
1265
- if (expectedState === null) {
1266
- logger.error("auth callback expected state missing");
1267
- throw ErrAuthCallbackInvalid;
1268
- }
1269
- if (callback.state !== expectedState) {
1270
- logger.error("auth callback state mismatch");
1271
- throw ErrAuthStateMismatch;
1272
- }
1273
- }
1274
1245
 
1275
1246
  // src/client/auth/hosted-popup.ts
1276
- import * as errors11 from "@superbuilders/errors";
1277
1247
  var DEFAULT_POPUP_TIMEOUT_MS = 10 * 60 * 1000;
1278
1248
  var POPUP_POLL_MS = 250;
1249
+ var AUTH_MESSAGE_TYPE = "primer-tives.auth.result.v1";
1250
+ var AUTH_RESPONSE_MODE = "web_message";
1279
1251
  function hostedAuthUrl(config) {
1280
1252
  const logger = config.logger;
1281
1253
  if (!URL.canParse(config.origin)) {
@@ -1286,6 +1258,7 @@ function hostedAuthUrl(config) {
1286
1258
  authUrl.searchParams.set("publishableKey", config.publishableKey);
1287
1259
  authUrl.searchParams.set("redirectUri", redirectUri(config.options, config.currentUrl, logger));
1288
1260
  authUrl.searchParams.set("state", config.clientState);
1261
+ authUrl.searchParams.set("responseMode", AUTH_RESPONSE_MODE);
1289
1262
  return authUrl.toString();
1290
1263
  }
1291
1264
  function popupTimeoutMs(options) {
@@ -1294,62 +1267,132 @@ function popupTimeoutMs(options) {
1294
1267
  }
1295
1268
  return DEFAULT_POPUP_TIMEOUT_MS;
1296
1269
  }
1297
- function readPopupCallback(href, config) {
1298
- const logger = config.logger;
1299
- if (!URL.canParse(href)) {
1270
+ function isRecord(value) {
1271
+ return typeof value === "object" && value !== null;
1272
+ }
1273
+ function stringField(value, key) {
1274
+ const field = value[key];
1275
+ if (typeof field !== "string" || field.length === 0) {
1300
1276
  return null;
1301
1277
  }
1302
- const callbackResult = errors11.trySync(function readCallback() {
1303
- return readAuthCallback(new URL(href), logger);
1304
- });
1305
- if (callbackResult.error) {
1306
- logger.error("hosted auth popup callback invalid", { error: callbackResult.error });
1307
- throw callbackResult.error;
1278
+ return field;
1279
+ }
1280
+ function readPopupMessage(event, popup, config, expectedOrigin) {
1281
+ if (event.source !== popup) {
1282
+ return { kind: "ignore" };
1308
1283
  }
1309
- const callback = callbackResult.data;
1310
- if (callback === null) {
1311
- return null;
1284
+ if (event.origin !== expectedOrigin) {
1285
+ return { kind: "ignore" };
1286
+ }
1287
+ const data = event.data;
1288
+ if (!isRecord(data)) {
1289
+ return { kind: "ignore" };
1290
+ }
1291
+ const messageType = stringField(data, "type");
1292
+ if (messageType !== AUTH_MESSAGE_TYPE) {
1293
+ return { kind: "ignore" };
1294
+ }
1295
+ const state = stringField(data, "state");
1296
+ if (state === null) {
1297
+ return { kind: "error", error: ErrAuthCallbackInvalid };
1298
+ }
1299
+ if (state !== config.clientState) {
1300
+ return { kind: "error", error: ErrAuthStateMismatch };
1312
1301
  }
1313
- if (callback.state !== config.clientState) {
1314
- logger.error("hosted auth popup state mismatch");
1315
- throw ErrAuthStateMismatch;
1302
+ const status = stringField(data, "status");
1303
+ if (status === "error") {
1304
+ return { kind: "error", error: ErrAuthCallbackInvalid };
1316
1305
  }
1317
- return callback.accessToken;
1306
+ if (status !== "success") {
1307
+ return { kind: "error", error: ErrAuthCallbackInvalid };
1308
+ }
1309
+ const accessToken = stringField(data, "accessToken");
1310
+ if (accessToken === null) {
1311
+ return { kind: "error", error: ErrAuthCallbackInvalid };
1312
+ }
1313
+ return { kind: "success", accessToken };
1318
1314
  }
1319
- async function beginHostedPopup(config) {
1320
- const logger = config.logger;
1321
- const popup = openAuthPopup(hostedAuthUrl(config), config.options, logger);
1322
- const expiresAt = Date.now() + popupTimeoutMs(config.options);
1323
- while (Date.now() < expiresAt) {
1324
- if (popup.closed) {
1325
- logger.error("hosted auth popup closed");
1326
- throw ErrAuthCancelled;
1327
- }
1328
- const href = readablePopupUrl(popup);
1329
- if (href !== null) {
1330
- const accessTokenResult = errors11.trySync(function readAccessToken() {
1331
- return readPopupCallback(href, config);
1332
- });
1333
- if (accessTokenResult.error) {
1334
- popup.close();
1335
- logger.error("hosted auth popup failed", { error: accessTokenResult.error });
1336
- throw accessTokenResult.error;
1315
+ async function waitForPopupMessage(popup, config, expectedOrigin) {
1316
+ let __stack = [];
1317
+ try {
1318
+ const logger = config.logger;
1319
+ const stack = __using(__stack, new AsyncDisposableStack, 1);
1320
+ stack.defer(function closePopup() {
1321
+ popup.close();
1322
+ });
1323
+ const result = await new Promise(function waitForMessage(resolve, reject) {
1324
+ let settled = false;
1325
+ function finishWithError(error) {
1326
+ if (settled) {
1327
+ return;
1328
+ }
1329
+ settled = true;
1330
+ reject(error);
1337
1331
  }
1338
- if (accessTokenResult.data !== null) {
1339
- popup.close();
1332
+ function finishWithToken(token) {
1333
+ if (settled) {
1334
+ return;
1335
+ }
1336
+ settled = true;
1340
1337
  logger.debug("hosted auth popup completed");
1341
- return accessTokenResult.data;
1338
+ resolve(token);
1342
1339
  }
1343
- }
1344
- await sleep(POPUP_POLL_MS);
1340
+ const timeoutId = globalThis.setTimeout(function timeout() {
1341
+ logger.error("hosted auth popup timed out");
1342
+ finishWithError(ErrAuthCancelled);
1343
+ }, popupTimeoutMs(config.options));
1344
+ stack.defer(function clearPopupTimeout() {
1345
+ globalThis.clearTimeout(timeoutId);
1346
+ });
1347
+ const closedPollId = globalThis.setInterval(function checkClosed() {
1348
+ if (!popup.closed) {
1349
+ return;
1350
+ }
1351
+ logger.error("hosted auth popup closed");
1352
+ finishWithError(ErrAuthCancelled);
1353
+ }, POPUP_POLL_MS);
1354
+ stack.defer(function clearClosedPoll() {
1355
+ globalThis.clearInterval(closedPollId);
1356
+ });
1357
+ function handleMessage(event) {
1358
+ const result2 = readPopupMessage(event, popup, config, expectedOrigin);
1359
+ if (result2.kind === "ignore") {
1360
+ return;
1361
+ }
1362
+ if (result2.kind === "error") {
1363
+ logger.error("hosted auth popup failed", { error: result2.error });
1364
+ finishWithError(result2.error);
1365
+ return;
1366
+ }
1367
+ finishWithToken(result2.accessToken);
1368
+ }
1369
+ globalThis.addEventListener("message", handleMessage);
1370
+ stack.defer(function removeMessageListener() {
1371
+ globalThis.removeEventListener("message", handleMessage);
1372
+ });
1373
+ });
1374
+ return result;
1375
+ } catch (_catch) {
1376
+ var _err = _catch, _hasErr = 1;
1377
+ } finally {
1378
+ var _promise = __callDispose(__stack, _err, _hasErr);
1379
+ _promise && await _promise;
1380
+ }
1381
+ }
1382
+ async function beginHostedPopup(config) {
1383
+ const logger = config.logger;
1384
+ const url = hostedAuthUrl(config);
1385
+ if (!URL.canParse(config.origin)) {
1386
+ logger.error("hosted auth origin invalid", { origin: config.origin });
1387
+ throw ErrAuthCallbackInvalid;
1345
1388
  }
1346
- popup.close();
1347
- logger.error("hosted auth popup timed out");
1348
- throw ErrAuthCancelled;
1389
+ const expectedOrigin = new URL(config.origin).origin;
1390
+ const popup = openAuthPopup(url, config.options, logger);
1391
+ return waitForPopupMessage(popup, config, expectedOrigin);
1349
1392
  }
1350
1393
 
1351
1394
  // src/client/auth/access-token.ts
1352
- import * as errors12 from "@superbuilders/errors";
1395
+ import * as errors10 from "@superbuilders/errors";
1353
1396
  var ACCESS_TOKEN_PREFIX = "eyJ";
1354
1397
  var resolvedAccessTokenBrand = Symbol("primer resolved access token");
1355
1398
  function isMalformedJws(token) {
@@ -1362,7 +1405,7 @@ function isMalformedJws(token) {
1362
1405
  function resolveAccessToken(token, logger) {
1363
1406
  if (isMalformedJws(token)) {
1364
1407
  logger.error("malformed access token", { prefix: ACCESS_TOKEN_PREFIX });
1365
- throw errors12.wrap(ErrMalformedAccessToken, `token must start with '${ACCESS_TOKEN_PREFIX}' and contain two dots`);
1408
+ throw errors10.wrap(ErrMalformedAccessToken, `token must start with '${ACCESS_TOKEN_PREFIX}' and contain two dots`);
1366
1409
  }
1367
1410
  return { value: token, [resolvedAccessTokenBrand]: true };
1368
1411
  }
@@ -1389,13 +1432,6 @@ function storeAccessToken(storage, publishableKey, accessToken) {
1389
1432
  function clearStoredAccessToken(storage, publishableKey) {
1390
1433
  storage.removeItem(accessTokenStorageKey(publishableKey));
1391
1434
  }
1392
- function loadAuthState(storage, publishableKey) {
1393
- const state = storage.getItem(authStateStorageKey(publishableKey));
1394
- if (state === null || state.length === 0) {
1395
- return null;
1396
- }
1397
- return state;
1398
- }
1399
1435
  function storeAuthState(storage, publishableKey, state) {
1400
1436
  storage.setItem(authStateStorageKey(publishableKey), state);
1401
1437
  }
@@ -1405,7 +1441,7 @@ function clearAuthState(storage, publishableKey) {
1405
1441
 
1406
1442
  // src/client/auth/provider.ts
1407
1443
  function resolveProvidedAccessToken(token, logger) {
1408
- const result = errors13.trySync(function resolveProvidedToken() {
1444
+ const result = errors11.trySync(function resolveProvidedToken() {
1409
1445
  return resolveAccessToken(token, logger);
1410
1446
  });
1411
1447
  if (result.error) {
@@ -1414,7 +1450,7 @@ function resolveProvidedAccessToken(token, logger) {
1414
1450
  return { kind: "resolved", accessToken: result.data };
1415
1451
  }
1416
1452
  function resolveManagedAccessToken(token, logger) {
1417
- const result = errors13.trySync(function resolveManagedToken() {
1453
+ const result = errors11.trySync(function resolveManagedToken() {
1418
1454
  return resolveAccessToken(token, logger);
1419
1455
  });
1420
1456
  if (result.error) {
@@ -1424,7 +1460,7 @@ function resolveManagedAccessToken(token, logger) {
1424
1460
  }
1425
1461
  function readBrowserAuthContext(options) {
1426
1462
  const logger = options.logger;
1427
- const contextResult = errors13.trySync(function readContext() {
1463
+ const contextResult = errors11.trySync(function readContext() {
1428
1464
  const storage = browserStorage(options.hostedAuth, logger);
1429
1465
  const url = currentUrl(options.hostedAuth, logger);
1430
1466
  return { storage, url };
@@ -1434,36 +1470,6 @@ function readBrowserAuthContext(options) {
1434
1470
  }
1435
1471
  return contextResult.data;
1436
1472
  }
1437
- function resolveCallbackAccessToken(context, options) {
1438
- const logger = options.logger;
1439
- const callbackResult = errors13.trySync(function readCallback() {
1440
- return readAuthCallback(context.url, logger);
1441
- });
1442
- if (callbackResult.error) {
1443
- clearAuthState(context.storage, options.publishableKey);
1444
- return { kind: "unauthenticated", error: callbackResult.error };
1445
- }
1446
- const callback = callbackResult.data;
1447
- if (callback === null) {
1448
- return null;
1449
- }
1450
- const stateResult = errors13.trySync(function requireState() {
1451
- requireMatchingCallbackState(callback, loadAuthState(context.storage, options.publishableKey), logger);
1452
- });
1453
- if (stateResult.error) {
1454
- clearAuthState(context.storage, options.publishableKey);
1455
- return { kind: "unauthenticated", error: stateResult.error };
1456
- }
1457
- const resolved = resolveManagedAccessToken(callback.accessToken, logger);
1458
- if (resolved.kind === "unauthenticated") {
1459
- clearAuthState(context.storage, options.publishableKey);
1460
- return resolved;
1461
- }
1462
- storeAccessToken(context.storage, options.publishableKey, callback.accessToken);
1463
- clearAuthState(context.storage, options.publishableKey);
1464
- clearCallbackHash(options.hostedAuth, context.url);
1465
- return resolved;
1466
- }
1467
1473
  function resolveStoredAccessToken(context, options) {
1468
1474
  const stored = loadStoredAccessToken(context.storage, options.publishableKey);
1469
1475
  if (stored === null) {
@@ -1483,10 +1489,6 @@ function resolveExistingAccessToken(options) {
1483
1489
  if ("kind" in context) {
1484
1490
  return context;
1485
1491
  }
1486
- const callback = resolveCallbackAccessToken(context, options);
1487
- if (callback !== null) {
1488
- return callback;
1489
- }
1490
1492
  const stored = resolveStoredAccessToken(context, options);
1491
1493
  if (stored !== null) {
1492
1494
  return stored;
@@ -1499,7 +1501,7 @@ async function beginHostedLogin(options) {
1499
1501
  if ("kind" in context) {
1500
1502
  return context;
1501
1503
  }
1502
- const clientStateResult = errors13.trySync(function prepareHostedLogin() {
1504
+ const clientStateResult = errors11.trySync(function prepareHostedLogin() {
1503
1505
  const clientState2 = randomClientState(logger);
1504
1506
  storeAuthState(context.storage, options.publishableKey, clientState2);
1505
1507
  return clientState2;
@@ -1508,7 +1510,7 @@ async function beginHostedLogin(options) {
1508
1510
  return { kind: "unauthenticated", error: clientStateResult.error };
1509
1511
  }
1510
1512
  const clientState = clientStateResult.data;
1511
- const accessTokenResult = await errors13.try(beginHostedPopup({
1513
+ const accessTokenResult = await errors11.try(beginHostedPopup({
1512
1514
  origin: options.origin,
1513
1515
  publishableKey: options.publishableKey,
1514
1516
  currentUrl: context.url,
@@ -1635,4 +1637,4 @@ export {
1635
1637
  start
1636
1638
  };
1637
1639
 
1638
- //# debugId=94171F205AFFEEE264756E2164756E21
1640
+ //# debugId=9A3E7149C52454D064756E2164756E21