oidc-spa 8.6.17 → 8.6.19

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.
Files changed (41) hide show
  1. package/README.md +11 -8
  2. package/core/createOidc.js +11 -4
  3. package/core/createOidc.js.map +1 -1
  4. package/core/evtIsUserActive.d.ts +8 -1
  5. package/core/evtIsUserActive.js +4 -2
  6. package/core/evtIsUserActive.js.map +1 -1
  7. package/core/loginOrGoToAuthServer.js +0 -7
  8. package/core/loginOrGoToAuthServer.js.map +1 -1
  9. package/core/loginSilent.js +0 -8
  10. package/core/loginSilent.js.map +1 -1
  11. package/esm/core/createOidc.mjs +11 -4
  12. package/esm/core/createOidc.mjs.map +1 -1
  13. package/esm/core/evtIsUserActive.d.ts +8 -1
  14. package/esm/core/evtIsUserActive.mjs +4 -2
  15. package/esm/core/evtIsUserActive.mjs.map +1 -1
  16. package/esm/core/loginOrGoToAuthServer.mjs +0 -7
  17. package/esm/core/loginOrGoToAuthServer.mjs.map +1 -1
  18. package/esm/core/loginSilent.mjs +0 -8
  19. package/esm/core/loginSilent.mjs.map +1 -1
  20. package/esm/tools/loadWebcryptoLinerShim.d.ts +1 -0
  21. package/esm/tools/loadWebcryptoLinerShim.mjs +9 -0
  22. package/esm/tools/loadWebcryptoLinerShim.mjs.map +1 -0
  23. package/esm/tools/startCountdown.mjs +9 -3
  24. package/esm/tools/startCountdown.mjs.map +1 -1
  25. package/esm/vendor/frontend/webcrypto-liner-shim.d.ts +2 -0
  26. package/esm/vendor/frontend/webcrypto-liner-shim.mjs +23977 -0
  27. package/package.json +1 -1
  28. package/src/core/createOidc.ts +13 -3
  29. package/src/core/evtIsUserActive.ts +11 -5
  30. package/src/core/loginOrGoToAuthServer.ts +0 -10
  31. package/src/core/loginSilent.ts +0 -11
  32. package/src/tools/loadWebcryptoLinerShim.ts +11 -0
  33. package/src/tools/startCountdown.ts +10 -3
  34. package/src/vendor/frontend/webcrypto-liner-shim.ts +3 -0
  35. package/tools/loadWebcryptoLinerShim.d.ts +1 -0
  36. package/tools/loadWebcryptoLinerShim.js +45 -0
  37. package/tools/loadWebcryptoLinerShim.js.map +1 -0
  38. package/tools/startCountdown.js +9 -3
  39. package/tools/startCountdown.js.map +1 -1
  40. package/vendor/frontend/webcrypto-liner-shim.d.ts +2 -0
  41. package/vendor/frontend/webcrypto-liner-shim.js +3 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oidc-spa",
3
- "version": "8.6.17",
3
+ "version": "8.6.19",
4
4
  "description": "OpenID Connect / OAuth2 solution for Centric Web Applications",
5
5
  "repository": {
6
6
  "type": "git",
@@ -59,6 +59,7 @@ import {
59
59
  getIsStateDataCookieEnabled
60
60
  } from "./StateDataCookie";
61
61
  import { getIsTokenSubstitutionEnabled } from "./tokenPlaceholderSubstitution";
62
+ import { loadWebcryptoLinerShim } from "../tools/loadWebcryptoLinerShim";
62
63
 
63
64
  // NOTE: Replaced at build time
64
65
  const VERSION = "{{OIDC_SPA_VERSION}}";
@@ -388,6 +389,11 @@ export async function createOidc_nonMemoized<
388
389
 
389
390
  const { issuerUri, clientId, configId, log } = preProcessedParams;
390
391
 
392
+ if (window.crypto.subtle === undefined) {
393
+ log?.("window.crypto.subtle not present, lazily loading polyfills.");
394
+ await loadWebcryptoLinerShim();
395
+ }
396
+
391
397
  const getExtraQueryParams = (() => {
392
398
  if (extraQueryParamsOrGetter === undefined) {
393
399
  return undefined;
@@ -2053,8 +2059,8 @@ export async function createOidc_nonMemoized<
2053
2059
  sessionId
2054
2060
  });
2055
2061
 
2056
- const { unsubscribe: unsubscribeFromIsUserActive } = evtIsUserActive.subscribe(isUserActive => {
2057
- if (isUserActive) {
2062
+ const { unsubscribe: unsubscribeFromIsUserActive } = evtIsUserActive.subscribe(eventData => {
2063
+ if (eventData.isUserActive) {
2058
2064
  if (stopCountdown !== undefined) {
2059
2065
  stopCountdown();
2060
2066
  stopCountdown = undefined;
@@ -2067,7 +2073,11 @@ export async function createOidc_nonMemoized<
2067
2073
  assert(currentRefreshTokenTtlInSeconds !== undefined, "902992326");
2068
2074
 
2069
2075
  stopCountdown = startCountdown({
2070
- countDownFromSeconds: currentRefreshTokenTtlInSeconds
2076
+ countDownFromSeconds: Math.floor(
2077
+ (currentRefreshTokenTtlInSeconds * 1_000 -
2078
+ eventData.hasBeenInactiveForHowLongMs) /
2079
+ 1_000
2080
+ )
2071
2081
  }).stopCountdown;
2072
2082
  }
2073
2083
  });
@@ -5,13 +5,15 @@ import { id } from "../tools/tsafe/id";
5
5
 
6
6
  const globalContext = {
7
7
  appInstanceId: Math.random().toString(36).slice(2),
8
- evtIsUserActiveBySessionId: new Map<string, NonPostableEvt<boolean>>()
8
+ evtIsUserActiveBySessionId: new Map<string, NonPostableEvt<EventData>>()
9
9
  };
10
10
 
11
+ type EventData = { isUserActive: true } | { isUserActive: false; hasBeenInactiveForHowLongMs: number };
12
+
11
13
  export function createEvtIsUserActive(params: {
12
14
  configId: string;
13
15
  sessionId: string | undefined;
14
- }): NonPostableEvt<boolean> {
16
+ }): NonPostableEvt<EventData> {
15
17
  const { configId, sessionId } = params;
16
18
 
17
19
  use_existing_instance: {
@@ -60,15 +62,19 @@ export function createEvtIsUserActive(params: {
60
62
  return { notifyOtherTabsOfUserInteraction, subscribeToUserInteractionOnOtherTabs };
61
63
  })();
62
64
 
63
- const evtIsUserActive = createEvt<boolean>();
65
+ const evtIsUserActive = createEvt<EventData>();
64
66
  let isUserActive = true;
65
67
 
66
68
  const scheduleSetInactive = () => {
69
+ const start = performance.now();
70
+
67
71
  const timer = setTimeout(() => {
72
+ const elapsed = performance.now() - start;
68
73
  assert(isUserActive, "011507");
69
74
  isUserActive = false;
70
- evtIsUserActive.post(isUserActive);
75
+ evtIsUserActive.post({ isUserActive, hasBeenInactiveForHowLongMs: elapsed });
71
76
  }, 5_000);
77
+
72
78
  return () => {
73
79
  clearTimeout(timer);
74
80
  clearScheduledSetInactive = undefined;
@@ -89,7 +95,7 @@ export function createEvtIsUserActive(params: {
89
95
 
90
96
  if (!isUserActive) {
91
97
  isUserActive = true;
92
- evtIsUserActive.post(isUserActive);
98
+ evtIsUserActive.post({ isUserActive });
93
99
  }
94
100
  };
95
101
 
@@ -356,16 +356,6 @@ export function createLoginOrGoToAuthServer(params: {
356
356
  error => {
357
357
  assert(error instanceof Error, "393430");
358
358
 
359
- if (error.message.includes("Crypto.subtle is available only in secure contexts")) {
360
- throw new Error(
361
- [
362
- `oidc-spa: ${error.message}.`,
363
- "\nTo fix this error see:",
364
- "https://docs.oidc-spa.dev/v/v8/resources/fixing-crypto.subtle-is-available-only-in-secure-contexts-https"
365
- ].join(" ")
366
- );
367
- }
368
-
369
359
  assert(false, `This is a bug in oidc-spa, please report: ${error.message}`);
370
360
  }
371
361
  );
@@ -207,17 +207,6 @@ export async function loginSilent(params: {
207
207
  return;
208
208
  }
209
209
 
210
- if (error.message.includes("Crypto.subtle is available only in secure contexts")) {
211
- clearTimeouts({ wasSuccess: false });
212
- throw new Error(
213
- [
214
- `oidc-spa: ${error.message}.`,
215
- "\nTo fix this error see:",
216
- "https://docs.oidc-spa.dev/v/v8/resources/fixing-crypto.subtle-is-available-only-in-secure-contexts-https"
217
- ].join(" ")
218
- );
219
- }
220
-
221
210
  assert(false, `This is a bug in oidc-spa, please report: ${error.message}`);
222
211
  }
223
212
  );
@@ -0,0 +1,11 @@
1
+ let prLoaded: Promise<void> | undefined = undefined;
2
+
3
+ export function loadWebcryptoLinerShim() {
4
+ if (prLoaded !== undefined) {
5
+ return prLoaded;
6
+ }
7
+
8
+ prLoaded = import("../vendor/frontend/webcrypto-liner-shim").then(() => {});
9
+
10
+ return prLoaded;
11
+ }
@@ -6,10 +6,15 @@ export function createStartCountdown(params: {
6
6
  function startCountdown(params: { countDownFromSeconds: number }) {
7
7
  const { countDownFromSeconds } = params;
8
8
 
9
- let timer: ReturnType<typeof setTimeout>;
9
+ let timer: ReturnType<typeof setTimeout> | undefined = undefined;
10
10
 
11
11
  (async () => {
12
- let secondsLeft = Math.floor(countDownFromSeconds);
12
+ let secondsLeft = Math.max(0, Math.floor(countDownFromSeconds));
13
+
14
+ if (secondsLeft === 0) {
15
+ tickCallback({ secondsLeft: 0 });
16
+ return;
17
+ }
13
18
 
14
19
  while (true) {
15
20
  const start = performance.now();
@@ -35,7 +40,9 @@ export function createStartCountdown(params: {
35
40
  })();
36
41
 
37
42
  const stopCountdown = () => {
38
- clearTimeout(timer);
43
+ if (timer !== undefined) {
44
+ clearTimeout(timer);
45
+ }
39
46
  tickCallback({ secondsLeft: undefined });
40
47
  };
41
48
 
@@ -0,0 +1,3 @@
1
+ import "webcrypto-liner-shim";
2
+
3
+ export {};
@@ -0,0 +1 @@
1
+ export declare function loadWebcryptoLinerShim(): Promise<void>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadWebcryptoLinerShim = loadWebcryptoLinerShim;
37
+ let prLoaded = undefined;
38
+ function loadWebcryptoLinerShim() {
39
+ if (prLoaded !== undefined) {
40
+ return prLoaded;
41
+ }
42
+ prLoaded = Promise.resolve().then(() => __importStar(require("../vendor/frontend/webcrypto-liner-shim"))).then(() => { });
43
+ return prLoaded;
44
+ }
45
+ //# sourceMappingURL=loadWebcryptoLinerShim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadWebcryptoLinerShim.js","sourceRoot":"","sources":["../src/tools/loadWebcryptoLinerShim.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,wDAQC;AAVD,IAAI,QAAQ,GAA8B,SAAS,CAAC;AAEpD,SAAgB,sBAAsB;IAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,QAAQ,GAAG,kDAAO,yCAAyC,IAAE,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE5E,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -5,9 +5,13 @@ function createStartCountdown(params) {
5
5
  const { tickCallback } = params;
6
6
  function startCountdown(params) {
7
7
  const { countDownFromSeconds } = params;
8
- let timer;
8
+ let timer = undefined;
9
9
  (async () => {
10
- let secondsLeft = Math.floor(countDownFromSeconds);
10
+ let secondsLeft = Math.max(0, Math.floor(countDownFromSeconds));
11
+ if (secondsLeft === 0) {
12
+ tickCallback({ secondsLeft: 0 });
13
+ return;
14
+ }
11
15
  while (true) {
12
16
  const start = performance.now();
13
17
  await new Promise(resolve => {
@@ -25,7 +29,9 @@ function createStartCountdown(params) {
25
29
  }
26
30
  })();
27
31
  const stopCountdown = () => {
28
- clearTimeout(timer);
32
+ if (timer !== undefined) {
33
+ clearTimeout(timer);
34
+ }
29
35
  tickCallback({ secondsLeft: undefined });
30
36
  };
31
37
  return { stopCountdown };
@@ -1 +1 @@
1
- {"version":3,"file":"startCountdown.js","sourceRoot":"","sources":["../src/tools/startCountdown.ts"],"names":[],"mappings":";;AAAA,oDA6CC;AA7CD,SAAgB,oBAAoB,CAAC,MAEpC;IACG,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAEhC,SAAS,cAAc,CAAC,MAAwC;QAC5D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC;QAExC,IAAI,KAAoC,CAAC;QAEzC,CAAC,KAAK,IAAI,EAAE;YACR,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAEnD,OAAO,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAEhC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;oBAC9B,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,IAAK,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;gBAE/D,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;gBAEpC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBAClB,WAAW,GAAG,CAAC,CAAC;gBACpB,CAAC;gBAED,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;gBAE9B,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;oBACpB,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,aAAa,GAAG,GAAG,EAAE;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,OAAO,EAAE,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"startCountdown.js","sourceRoot":"","sources":["../src/tools/startCountdown.ts"],"names":[],"mappings":";;AAAA,oDAoDC;AApDD,SAAgB,oBAAoB,CAAC,MAEpC;IACG,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAEhC,SAAS,cAAc,CAAC,MAAwC;QAC5D,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC;QAExC,IAAI,KAAK,GAA8C,SAAS,CAAC;QAEjE,CAAC,KAAK,IAAI,EAAE;YACR,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAEhE,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACpB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjC,OAAO;YACX,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAEhC,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;oBAC9B,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,IAAK,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;gBAE/D,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;gBAEpC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBAClB,WAAW,GAAG,CAAC,CAAC;gBACpB,CAAC;gBAED,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;gBAE9B,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;oBACpB,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,aAAa,GAAG,GAAG,EAAE;YACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;YACD,YAAY,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,OAAO,EAAE,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "webcrypto-liner-shim";
2
+ export {};