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.
- package/README.md +11 -8
- package/core/createOidc.js +11 -4
- package/core/createOidc.js.map +1 -1
- package/core/evtIsUserActive.d.ts +8 -1
- package/core/evtIsUserActive.js +4 -2
- package/core/evtIsUserActive.js.map +1 -1
- package/core/loginOrGoToAuthServer.js +0 -7
- package/core/loginOrGoToAuthServer.js.map +1 -1
- package/core/loginSilent.js +0 -8
- package/core/loginSilent.js.map +1 -1
- package/esm/core/createOidc.mjs +11 -4
- package/esm/core/createOidc.mjs.map +1 -1
- package/esm/core/evtIsUserActive.d.ts +8 -1
- package/esm/core/evtIsUserActive.mjs +4 -2
- package/esm/core/evtIsUserActive.mjs.map +1 -1
- package/esm/core/loginOrGoToAuthServer.mjs +0 -7
- package/esm/core/loginOrGoToAuthServer.mjs.map +1 -1
- package/esm/core/loginSilent.mjs +0 -8
- package/esm/core/loginSilent.mjs.map +1 -1
- package/esm/tools/loadWebcryptoLinerShim.d.ts +1 -0
- package/esm/tools/loadWebcryptoLinerShim.mjs +9 -0
- package/esm/tools/loadWebcryptoLinerShim.mjs.map +1 -0
- package/esm/tools/startCountdown.mjs +9 -3
- package/esm/tools/startCountdown.mjs.map +1 -1
- package/esm/vendor/frontend/webcrypto-liner-shim.d.ts +2 -0
- package/esm/vendor/frontend/webcrypto-liner-shim.mjs +23977 -0
- package/package.json +1 -1
- package/src/core/createOidc.ts +13 -3
- package/src/core/evtIsUserActive.ts +11 -5
- package/src/core/loginOrGoToAuthServer.ts +0 -10
- package/src/core/loginSilent.ts +0 -11
- package/src/tools/loadWebcryptoLinerShim.ts +11 -0
- package/src/tools/startCountdown.ts +10 -3
- package/src/vendor/frontend/webcrypto-liner-shim.ts +3 -0
- package/tools/loadWebcryptoLinerShim.d.ts +1 -0
- package/tools/loadWebcryptoLinerShim.js +45 -0
- package/tools/loadWebcryptoLinerShim.js.map +1 -0
- package/tools/startCountdown.js +9 -3
- package/tools/startCountdown.js.map +1 -1
- package/vendor/frontend/webcrypto-liner-shim.d.ts +2 -0
- package/vendor/frontend/webcrypto-liner-shim.js +3 -0
package/package.json
CHANGED
package/src/core/createOidc.ts
CHANGED
|
@@ -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(
|
|
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:
|
|
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<
|
|
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<
|
|
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<
|
|
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
|
);
|
package/src/core/loginSilent.ts
CHANGED
|
@@ -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
|
-
|
|
43
|
+
if (timer !== undefined) {
|
|
44
|
+
clearTimeout(timer);
|
|
45
|
+
}
|
|
39
46
|
tickCallback({ secondsLeft: undefined });
|
|
40
47
|
};
|
|
41
48
|
|
|
@@ -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"}
|
package/tools/startCountdown.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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"}
|