@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 +1 -1
- package/dist/client/auth/browser.d.ts +1 -4
- package/dist/client/auth/browser.d.ts.map +1 -1
- package/dist/client/auth/hosted-popup.d.ts.map +1 -1
- package/dist/client/auth/provider.d.ts.map +1 -1
- package/dist/client/index.js +163 -161
- package/dist/client/index.js.map +7 -8
- package/dist/contracts/index.js +39 -1
- package/dist/contracts/index.js.map +2 -2
- package/dist/errors.js +39 -1
- package/dist/errors.js.map +2 -2
- package/dist/grade-level.js +39 -1
- package/dist/grade-level.js.map +2 -2
- package/dist/subject-pcis.js +39 -1
- package/dist/subject-pcis.js.map +2 -2
- package/dist/subject.js +39 -1
- package/dist/subject.js.map +2 -2
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -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
|
-
|
|
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":"
|
|
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":"
|
|
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,
|
|
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"}
|
package/dist/client/index.js
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
1298
|
-
|
|
1299
|
-
|
|
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
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
if (
|
|
1306
|
-
|
|
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
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
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
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1302
|
+
const status = stringField(data, "status");
|
|
1303
|
+
if (status === "error") {
|
|
1304
|
+
return { kind: "error", error: ErrAuthCallbackInvalid };
|
|
1316
1305
|
}
|
|
1317
|
-
|
|
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
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
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
|
-
|
|
1339
|
-
|
|
1332
|
+
function finishWithToken(token) {
|
|
1333
|
+
if (settled) {
|
|
1334
|
+
return;
|
|
1335
|
+
}
|
|
1336
|
+
settled = true;
|
|
1340
1337
|
logger.debug("hosted auth popup completed");
|
|
1341
|
-
|
|
1338
|
+
resolve(token);
|
|
1342
1339
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
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
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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=
|
|
1640
|
+
//# debugId=9A3E7149C52454D064756E2164756E21
|