@axa-fr/react-oidc 6.15.9 → 6.16.1

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 (135) hide show
  1. package/bin/{copy.js → copy.cjs} +5 -2
  2. package/dist/FetchToken.js +7 -12
  3. package/dist/FetchToken.js.map +1 -1
  4. package/dist/OidcProvider.js +43 -50
  5. package/dist/OidcProvider.js.map +1 -1
  6. package/dist/OidcSecure.js +9 -14
  7. package/dist/OidcSecure.js.map +1 -1
  8. package/dist/ReactOidc.js +29 -35
  9. package/dist/ReactOidc.js.map +1 -1
  10. package/dist/User.js +8 -12
  11. package/dist/User.js.map +1 -1
  12. package/dist/core/default-component/AuthenticateError.component.js +3 -5
  13. package/dist/core/default-component/AuthenticateError.component.js.map +1 -1
  14. package/dist/core/default-component/Authenticating.component.js +3 -5
  15. package/dist/core/default-component/Authenticating.component.js.map +1 -1
  16. package/dist/core/default-component/Callback.component.js +15 -22
  17. package/dist/core/default-component/Callback.component.js.map +1 -1
  18. package/dist/core/default-component/Loading.component.js +3 -5
  19. package/dist/core/default-component/Loading.component.js.map +1 -1
  20. package/dist/core/default-component/ServiceWorkerNotSupported.component.js +3 -5
  21. package/dist/core/default-component/ServiceWorkerNotSupported.component.js.map +1 -1
  22. package/dist/core/default-component/SessionLost.component.js +3 -7
  23. package/dist/core/default-component/SessionLost.component.js.map +1 -1
  24. package/dist/core/default-component/SilentCallback.component.js +7 -9
  25. package/dist/core/default-component/SilentCallback.component.js.map +1 -1
  26. package/dist/core/default-component/SilentLogin.component.js +9 -11
  27. package/dist/core/default-component/SilentLogin.component.js.map +1 -1
  28. package/dist/core/default-component/index.js +6 -19
  29. package/dist/core/default-component/index.js.map +1 -1
  30. package/dist/core/routes/OidcRoutes.js +18 -46
  31. package/dist/core/routes/OidcRoutes.js.map +1 -1
  32. package/dist/core/routes/withRouter.js +2 -7
  33. package/dist/core/routes/withRouter.js.map +1 -1
  34. package/dist/index.js +6 -20
  35. package/dist/index.js.map +1 -1
  36. package/dist/service_worker/OidcServiceWorker.d.ts +2 -0
  37. package/dist/service_worker/OidcServiceWorker.d.ts.map +1 -0
  38. package/dist/service_worker/OidcServiceWorker.js +369 -0
  39. package/dist/service_worker/OidcServiceWorker.js.map +1 -0
  40. package/dist/service_worker/constants.d.ts +18 -0
  41. package/dist/service_worker/constants.d.ts.map +1 -0
  42. package/dist/service_worker/types.d.ts +80 -0
  43. package/dist/service_worker/types.d.ts.map +1 -0
  44. package/dist/service_worker/utils/domains.d.ts +6 -0
  45. package/dist/service_worker/utils/domains.d.ts.map +1 -0
  46. package/dist/service_worker/utils/index.d.ts +6 -0
  47. package/dist/service_worker/utils/index.d.ts.map +1 -0
  48. package/dist/service_worker/utils/serializeHeaders.d.ts +3 -0
  49. package/dist/service_worker/utils/serializeHeaders.d.ts.map +1 -0
  50. package/dist/service_worker/utils/sleep.d.ts +3 -0
  51. package/dist/service_worker/utils/sleep.d.ts.map +1 -0
  52. package/dist/service_worker/utils/strings.d.ts +8 -0
  53. package/dist/service_worker/utils/strings.d.ts.map +1 -0
  54. package/dist/service_worker/utils/tokens.d.ts +12 -0
  55. package/dist/service_worker/utils/tokens.d.ts.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -1
  57. package/dist/vanilla/cache.js +2 -7
  58. package/dist/vanilla/cache.js.map +1 -1
  59. package/dist/vanilla/checkSession.js +5 -9
  60. package/dist/vanilla/checkSession.js.map +1 -1
  61. package/dist/vanilla/checkSessionIFrame.js +1 -5
  62. package/dist/vanilla/checkSessionIFrame.js.map +1 -1
  63. package/dist/vanilla/crypto.js +4 -33
  64. package/dist/vanilla/crypto.js.map +1 -1
  65. package/dist/vanilla/events.js +1 -4
  66. package/dist/vanilla/events.js.map +1 -1
  67. package/dist/vanilla/initSession.js +1 -5
  68. package/dist/vanilla/initSession.js.map +1 -1
  69. package/dist/vanilla/initWorker.js +11 -21
  70. package/dist/vanilla/initWorker.js.map +1 -1
  71. package/dist/vanilla/login.js +26 -31
  72. package/dist/vanilla/login.js.map +1 -1
  73. package/dist/vanilla/logout.js +11 -19
  74. package/dist/vanilla/logout.js.map +1 -1
  75. package/dist/vanilla/oidc.js +76 -107
  76. package/dist/vanilla/oidc.js.map +1 -1
  77. package/dist/vanilla/parseTokens.js +15 -24
  78. package/dist/vanilla/parseTokens.js.map +1 -1
  79. package/dist/vanilla/renewTokens.js +13 -21
  80. package/dist/vanilla/renewTokens.js.map +1 -1
  81. package/dist/vanilla/requests.js +18 -26
  82. package/dist/vanilla/requests.js.map +1 -1
  83. package/dist/vanilla/route-utils.js +5 -11
  84. package/dist/vanilla/route-utils.js.map +1 -1
  85. package/dist/vanilla/silentLogin.js +16 -24
  86. package/dist/vanilla/silentLogin.js.map +1 -1
  87. package/dist/vanilla/timer.js +1 -3
  88. package/dist/vanilla/timer.js.map +1 -1
  89. package/dist/vanilla/types.js +1 -2
  90. package/dist/vanilla/user.js +5 -9
  91. package/dist/vanilla/user.js.map +1 -1
  92. package/dist/vanilla/vanillaOidc.js +7 -11
  93. package/dist/vanilla/vanillaOidc.js.map +1 -1
  94. package/package.json +17 -9
  95. package/service_worker/.eslintrc.cjs +18 -0
  96. package/service_worker/OidcServiceWorker.ts +387 -0
  97. package/service_worker/constants.ts +32 -0
  98. package/service_worker/dist/OidcServiceWorker.d.ts +2 -0
  99. package/service_worker/dist/OidcServiceWorker.d.ts.map +1 -0
  100. package/service_worker/dist/OidcServiceWorker.js +369 -0
  101. package/service_worker/dist/OidcServiceWorker.js.map +1 -0
  102. package/service_worker/dist/constants.d.ts +18 -0
  103. package/service_worker/dist/constants.d.ts.map +1 -0
  104. package/service_worker/dist/types.d.ts +80 -0
  105. package/service_worker/dist/types.d.ts.map +1 -0
  106. package/service_worker/dist/utils/domains.d.ts +6 -0
  107. package/service_worker/dist/utils/domains.d.ts.map +1 -0
  108. package/service_worker/dist/utils/index.d.ts +6 -0
  109. package/service_worker/dist/utils/index.d.ts.map +1 -0
  110. package/service_worker/dist/utils/serializeHeaders.d.ts +3 -0
  111. package/service_worker/dist/utils/serializeHeaders.d.ts.map +1 -0
  112. package/service_worker/dist/utils/sleep.d.ts +3 -0
  113. package/service_worker/dist/utils/sleep.d.ts.map +1 -0
  114. package/service_worker/dist/utils/strings.d.ts +8 -0
  115. package/service_worker/dist/utils/strings.d.ts.map +1 -0
  116. package/service_worker/dist/utils/tokens.d.ts +12 -0
  117. package/service_worker/dist/utils/tokens.d.ts.map +1 -0
  118. package/service_worker/tsconfig.json +26 -0
  119. package/service_worker/types.ts +93 -0
  120. package/service_worker/utils/__tests__/domains.spec.ts +63 -0
  121. package/service_worker/utils/__tests__/serializeHeaders.spec.ts +11 -0
  122. package/service_worker/utils/__tests__/strings.spec.ts +9 -0
  123. package/service_worker/utils/__tests__/testHelper.ts +346 -0
  124. package/service_worker/utils/__tests__/tokens.spec.ts +68 -0
  125. package/service_worker/utils/domains.ts +95 -0
  126. package/service_worker/utils/index.ts +5 -0
  127. package/service_worker/utils/serializeHeaders.ts +12 -0
  128. package/service_worker/utils/sleep.ts +2 -0
  129. package/service_worker/utils/strings.ts +9 -0
  130. package/service_worker/utils/tokens.ts +198 -0
  131. package/dist/OidcServiceWorker.d.ts +0 -119
  132. package/dist/OidcServiceWorker.d.ts.map +0 -1
  133. package/dist/OidcServiceWorker.js +0 -498
  134. package/dist/OidcServiceWorker.js.map +0 -1
  135. /package/{dist → service_worker}/OidcTrustedDomains.js +0 -0
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,11 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
8
  });
10
9
  };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.VanillaOidc = void 0;
13
- const oidc_1 = require("./oidc");
14
- const parseTokens_1 = require("./parseTokens");
15
- class VanillaOidc {
10
+ import { Oidc } from './oidc';
11
+ import { getValidTokenAsync } from './parseTokens';
12
+ export class VanillaOidc {
16
13
  constructor(oidc) {
17
14
  this._oidc = oidc;
18
15
  }
@@ -26,10 +23,10 @@ class VanillaOidc {
26
23
  this._oidc.publishEvent(eventName, data);
27
24
  }
28
25
  static getOrCreate(configuration, name = 'default') {
29
- return new VanillaOidc(oidc_1.Oidc.getOrCreate(configuration, name));
26
+ return new VanillaOidc(Oidc.getOrCreate(configuration, name));
30
27
  }
31
28
  static get(name = 'default') {
32
- return new VanillaOidc(oidc_1.Oidc.get(name));
29
+ return new VanillaOidc(Oidc.get(name));
33
30
  }
34
31
  tryKeepExistingSessionAsync() {
35
32
  return this._oidc.tryKeepExistingSessionAsync();
@@ -57,7 +54,7 @@ class VanillaOidc {
57
54
  }
58
55
  getValidTokenAsync(waitMs = 200, numberWait = 50) {
59
56
  return __awaiter(this, void 0, void 0, function* () {
60
- return (0, parseTokens_1.getValidTokenAsync)(this._oidc, waitMs, numberWait);
57
+ return getValidTokenAsync(this._oidc, waitMs, numberWait);
61
58
  });
62
59
  }
63
60
  userInfoAsync() {
@@ -66,6 +63,5 @@ class VanillaOidc {
66
63
  });
67
64
  }
68
65
  }
69
- exports.VanillaOidc = VanillaOidc;
70
- VanillaOidc.eventNames = oidc_1.Oidc.eventNames;
66
+ VanillaOidc.eventNames = Oidc.eventNames;
71
67
  //# sourceMappingURL=vanillaOidc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vanillaOidc.js","sourceRoot":"","sources":["../../src/oidc/vanilla/vanillaOidc.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iCAA6C;AAC7C,+CAAuE;AAOvE,MAAa,WAAW;IAEpB,YAAY,IAAU;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,IAAoB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,uBAAuB,CAAC,EAAS;QAC7B,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,SAAgB,EAAE,IAAQ;QACnC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,aAA+B,EAAE,IAAI,GAAG,SAAS;QAChE,OAAO,IAAI,WAAW,CAAC,WAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS;QACvB,OAAO,IAAI,WAAW,CAAC,WAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAGD,2BAA2B;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,eAAsB,SAAS,EAAE,SAAmB,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,QAAe,SAAS,EAAE,eAAe,GAAG,KAAK;QAC1I,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAC/F,CAAC;IAED,WAAW,CAAC,oBAA+C,SAAS,EAAE,SAAoB,IAAI;QAC1F,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,wBAAwB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,SAAmB,IAAI;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IACpC,CAAC;IAEK,kBAAkB,CAAC,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE;;YAClD,OAAO,IAAA,gCAAkB,EAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC;KAAA;IAEK,aAAa;;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;KAAA;;AAjEL,kCAkEC;AAxCU,sBAAU,GAAG,WAAI,CAAC,UAAU,CAAC"}
1
+ {"version":3,"file":"vanillaOidc.js","sourceRoot":"","sources":["../../src/oidc/vanilla/vanillaOidc.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAiB,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AAOvE,MAAM,OAAO,WAAW;IAEpB,YAAY,IAAU;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,IAAoB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,uBAAuB,CAAC,EAAS;QAC7B,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,SAAgB,EAAE,IAAQ;QACnC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,aAA+B,EAAE,IAAI,GAAG,SAAS;QAChE,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS;QACvB,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAGD,2BAA2B;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,eAAsB,SAAS,EAAE,SAAmB,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,QAAe,SAAS,EAAE,eAAe,GAAG,KAAK;QAC1I,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAC/F,CAAC;IAED,WAAW,CAAC,oBAA+C,SAAS,EAAE,SAAoB,IAAI;QAC1F,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,wBAAwB;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,SAAmB,IAAI;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IACpC,CAAC;IAEK,kBAAkB,CAAC,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE;;YAClD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC;KAAA;IAEK,aAAa;;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;KAAA;;AAvCM,sBAAU,GAAG,IAAI,CAAC,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@axa-fr/react-oidc",
3
- "version": "6.15.9",
3
+ "version": "6.16.1",
4
4
  "private": false,
5
+ "type": "module",
5
6
  "main": "dist/index.js",
6
7
  "jsnext:main": "dist/index.js",
7
8
  "types": "dist/index.d.ts",
@@ -15,6 +16,7 @@
15
16
  "bin",
16
17
  "src/oidc",
17
18
  "src/override",
19
+ "service_worker",
18
20
  "README.md",
19
21
  "package.json",
20
22
  "package-lock.json"
@@ -30,15 +32,17 @@
30
32
  "next"
31
33
  ],
32
34
  "scripts": {
33
- "copy": "copyfiles -f ./dist/OidcServiceWorker.js ./public && copyfiles -f -soft ./dist/OidcTrustedDomains.js ./public",
34
- "start": "npm run build:service-worker && npm run copy && cross-env PORT=4200 react-scripts start",
35
- "build": "npm run build:service-worker && npm run copy && react-scripts build",
35
+ "copy:public": "copyfiles -f ./service_worker/dist/* ./public && copyfiles -f -soft ./dist/OidcTrustedDomains.js ./public",
36
+ "copy:dist": "copyfiles -f ./service_worker/dist/* ./dist/service_worker && copyfiles -f ./service_worker/dist/utils/* ./dist/service_worker/utils && copyfiles -f ./service_worker/oidcTrustedDomains.js ./dist",
37
+ "start": "npm run build:service-worker && npm run copy:public && cross-env PORT=4200 react-scripts start",
38
+ "build": "npm run build:service-worker && npm run copy:public && react-scripts build",
36
39
  "test": "react-scripts test --coverage",
37
40
  "eject": "react-scripts eject",
38
- "clean": "rimraf dist",
39
- "postinstall": "node ./bin/copy.js",
40
- "build:service-worker": "tsc --build \"./service_worker/tsconfig.json\" && copyfiles -f ./service_worker/OidcTrustedDomains.js ./dist",
41
- "prepare": "npm run clean && tsc --build \"./tsconfig.json\" && npm run build:service-worker && node ./bin/copy.js",
41
+ "clean": "rimraf dist && rimraf service_worker/dist",
42
+ "postinstall": "node ./bin/copy.cjs",
43
+ "test:service-worker": "vitest --root ./service_worker --coverage",
44
+ "build:service-worker": "tsc -p ./service_worker/tsconfig.json && vite build ./service_worker --config ./vite.serviceWorker.config.js",
45
+ "prepare": "npm run clean && tsc --build \"./tsconfig.json\" && npm run build && npm run copy:dist",
42
46
  "lint": "eslint src"
43
47
  },
44
48
  "dependencies": {
@@ -55,6 +59,7 @@
55
59
  "@types/react": "^18.0.21",
56
60
  "@typescript-eslint/eslint-plugin": "^5.40.1",
57
61
  "@typescript-eslint/parser": "^5.40.1",
62
+ "@vitest/coverage-c8": "^0.29.2",
58
63
  "bootstrap": "4.6.1",
59
64
  "copyfiles": "2.4.1",
60
65
  "cross-env": "^7.0.3",
@@ -69,7 +74,10 @@
69
74
  "react-dom": "^18.2.0",
70
75
  "react-router-dom": "6.3.0",
71
76
  "react-scripts": "5.0.1",
72
- "typescript": "4.8.2"
77
+ "typescript": "4.8.2",
78
+ "vite": "^4.1.4",
79
+ "vite-plugin-dts": "^2.0.2",
80
+ "vitest": "^0.29.2"
73
81
  },
74
82
  "license": "MIT",
75
83
  "publishConfig": {
@@ -0,0 +1,18 @@
1
+ module.exports = {
2
+ extends: [__dirname + '/config/defaultEslintConfig'],
3
+ parserOptions: {
4
+ project: '../tsconfig.eslint.json',
5
+ tsconfigRootDir: __dirname,
6
+ },
7
+ rules: {
8
+ '@typescript-eslint/naming-convention': [
9
+ 'error',
10
+ {
11
+ selector: 'variable',
12
+ types: ['boolean'],
13
+ format: ['PascalCase'],
14
+ prefix: ['is', 'with', 'should', 'has', 'can', 'did', 'will'],
15
+ },
16
+ ],
17
+ },
18
+ };
@@ -0,0 +1,387 @@
1
+ import { acceptAnyDomainToken, TOKEN, scriptFilename } from './constants';
2
+ import {
3
+ TrustedDomains,
4
+ Database,
5
+ OidcConfig,
6
+ OidcConfiguration,
7
+ MessageEventData,
8
+ } from './types';
9
+ import {
10
+ checkDomain,
11
+ getCurrentDatabaseDomain,
12
+ hideTokens,
13
+ isTokensValid,
14
+ serializeHeaders,
15
+ sleep,
16
+ } from './utils';
17
+
18
+ const _self = self as ServiceWorkerGlobalScope & typeof globalThis;
19
+
20
+ declare let trustedDomains: TrustedDomains;
21
+
22
+ _self.importScripts(scriptFilename);
23
+
24
+ const id = Math.round(new Date().getTime() / 1000).toString();
25
+
26
+ const keepAliveJsonFilename = 'OidcKeepAliveServiceWorker.json';
27
+ const handleInstall = (event: ExtendableEvent) => {
28
+ console.log('[OidcServiceWorker] service worker installed ' + id);
29
+ event.waitUntil(_self.skipWaiting());
30
+ };
31
+
32
+ const handleActivate = (event: ExtendableEvent) => {
33
+ console.log('[OidcServiceWorker] service worker activated ' + id);
34
+ event.waitUntil(_self.clients.claim());
35
+ };
36
+
37
+ let currentLoginCallbackConfigurationName: string | null = null;
38
+ const database: Database = {
39
+ default: {
40
+ configurationName: 'default',
41
+ tokens: null,
42
+ status: null,
43
+ state: null,
44
+ codeVerifier: null,
45
+ nonce: null,
46
+ oidcServerConfiguration: null,
47
+ },
48
+ };
49
+
50
+ const getCurrentDatabasesTokenEndpoint = (database: Database, url: string) => {
51
+ const databases: OidcConfig[] = [];
52
+ for (const [, value] of Object.entries<OidcConfig>(database)) {
53
+ if (
54
+ value.oidcServerConfiguration != null &&
55
+ url.startsWith(value.oidcServerConfiguration.tokenEndpoint)
56
+ ) {
57
+ databases.push(value);
58
+ } else if (
59
+ value.oidcServerConfiguration != null &&
60
+ value.oidcServerConfiguration.revocationEndpoint &&
61
+ url.startsWith(value.oidcServerConfiguration.revocationEndpoint)
62
+ ) {
63
+ databases.push(value);
64
+ }
65
+ }
66
+ return databases;
67
+ };
68
+
69
+ const keepAliveAsync = async (event: FetchEvent) => {
70
+ const originalRequest = event.request;
71
+ const isFromVanilla = originalRequest.headers.has('oidc-vanilla');
72
+ const init = { status: 200, statusText: 'oidc-service-worker' };
73
+ const response = new Response('{}', init);
74
+ if (!isFromVanilla) {
75
+ for (let i = 0; i < 240; i++) {
76
+ await sleep(1000 + Math.floor(Math.random() * 1000));
77
+ const cache = await caches.open('oidc_dummy_cache');
78
+ await cache.put(event.request, response.clone());
79
+ }
80
+ }
81
+
82
+ return response;
83
+ };
84
+
85
+ const handleFetch = async (event: FetchEvent) => {
86
+ const originalRequest = event.request;
87
+ const url = originalRequest.url;
88
+ if (originalRequest.url.includes(keepAliveJsonFilename)) {
89
+ event.respondWith(keepAliveAsync(event));
90
+ return;
91
+ }
92
+
93
+ const currentDatabaseForRequestAccessToken = getCurrentDatabaseDomain(
94
+ database,
95
+ originalRequest.url,
96
+ trustedDomains
97
+ );
98
+ if (
99
+ currentDatabaseForRequestAccessToken &&
100
+ currentDatabaseForRequestAccessToken.tokens &&
101
+ currentDatabaseForRequestAccessToken.tokens.access_token
102
+ ) {
103
+ while (
104
+ currentDatabaseForRequestAccessToken.tokens &&
105
+ !isTokensValid(currentDatabaseForRequestAccessToken.tokens)
106
+ ) {
107
+ await sleep(200);
108
+ }
109
+ const newRequest = new Request(originalRequest, {
110
+ headers: {
111
+ ...serializeHeaders(originalRequest.headers),
112
+ authorization:
113
+ 'Bearer ' + currentDatabaseForRequestAccessToken.tokens.access_token,
114
+ },
115
+ mode: (
116
+ currentDatabaseForRequestAccessToken.oidcConfiguration as OidcConfiguration
117
+ ).service_worker_convert_all_requests_to_cors
118
+ ? 'cors'
119
+ : originalRequest.mode,
120
+ });
121
+
122
+ //@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
123
+ event.waitUntil(event.respondWith(fetch(newRequest)));
124
+
125
+ return;
126
+ }
127
+
128
+ if (event.request.method !== 'POST') {
129
+ return;
130
+ }
131
+
132
+ let currentDatabase: OidcConfig | null = null;
133
+ const currentDatabases = getCurrentDatabasesTokenEndpoint(
134
+ database,
135
+ originalRequest.url
136
+ );
137
+ const numberDatabase = currentDatabases.length;
138
+ if (numberDatabase > 0) {
139
+ const maPromesse = new Promise<Response>((resolve, reject) => {
140
+ const clonedRequest = originalRequest.clone();
141
+ const response = clonedRequest.text().then((actualBody) => {
142
+ if (
143
+ actualBody.includes(TOKEN.REFRESH_TOKEN) ||
144
+ actualBody.includes(TOKEN.ACCESS_TOKEN)
145
+ ) {
146
+ let newBody = actualBody;
147
+ for (let i = 0; i < numberDatabase; i++) {
148
+ const currentDb = currentDatabases[i];
149
+
150
+ if (currentDb && currentDb.tokens != null) {
151
+ const keyRefreshToken =
152
+ TOKEN.REFRESH_TOKEN + '_' + currentDb.configurationName;
153
+ if (actualBody.includes(keyRefreshToken)) {
154
+ newBody = newBody.replace(
155
+ keyRefreshToken,
156
+ encodeURIComponent(currentDb.tokens.refresh_token as string)
157
+ );
158
+ currentDatabase = currentDb;
159
+ break;
160
+ }
161
+ const keyAccessToken =
162
+ TOKEN.ACCESS_TOKEN + '_' + currentDb.configurationName;
163
+ if (actualBody.includes(keyAccessToken)) {
164
+ newBody = newBody.replace(
165
+ keyAccessToken,
166
+ encodeURIComponent(currentDb.tokens.access_token)
167
+ );
168
+ currentDatabase = currentDb;
169
+ break;
170
+ }
171
+ }
172
+ }
173
+ const fetchPromise = fetch(originalRequest, {
174
+ body: newBody,
175
+ method: clonedRequest.method,
176
+ headers: {
177
+ ...serializeHeaders(originalRequest.headers),
178
+ },
179
+ mode: clonedRequest.mode,
180
+ cache: clonedRequest.cache,
181
+ redirect: clonedRequest.redirect,
182
+ referrer: clonedRequest.referrer,
183
+ credentials: clonedRequest.credentials,
184
+ integrity: clonedRequest.integrity,
185
+ });
186
+
187
+ if (
188
+ currentDatabase &&
189
+ currentDatabase.oidcServerConfiguration != null &&
190
+ currentDatabase.oidcServerConfiguration.revocationEndpoint &&
191
+ url.startsWith(
192
+ currentDatabase.oidcServerConfiguration.revocationEndpoint
193
+ )
194
+ ) {
195
+ return fetchPromise.then(async (response) => {
196
+ const text = await response.text();
197
+ return new Response(text, response);
198
+ });
199
+ }
200
+ return fetchPromise.then(hideTokens(currentDatabase as OidcConfig)); //todo type assertion to OidcConfig but could be null, NEEDS REVIEW
201
+ } else if (
202
+ actualBody.includes('code_verifier=') &&
203
+ currentLoginCallbackConfigurationName
204
+ ) {
205
+ currentDatabase = database[currentLoginCallbackConfigurationName];
206
+ currentLoginCallbackConfigurationName = null;
207
+ let newBody = actualBody;
208
+ if (currentDatabase && currentDatabase.codeVerifier != null) {
209
+ const keyCodeVerifier =
210
+ TOKEN.CODE_VERIFIER + '_' + currentDatabase.configurationName;
211
+ if (actualBody.includes(keyCodeVerifier)) {
212
+ newBody = newBody.replace(
213
+ keyCodeVerifier,
214
+ currentDatabase.codeVerifier
215
+ );
216
+ }
217
+ }
218
+
219
+ return fetch(originalRequest, {
220
+ body: newBody,
221
+ method: clonedRequest.method,
222
+ headers: {
223
+ ...serializeHeaders(originalRequest.headers),
224
+ },
225
+ mode: clonedRequest.mode,
226
+ cache: clonedRequest.cache,
227
+ redirect: clonedRequest.redirect,
228
+ referrer: clonedRequest.referrer,
229
+ credentials: clonedRequest.credentials,
230
+ integrity: clonedRequest.integrity,
231
+ }).then(hideTokens(currentDatabase));
232
+ }
233
+ return undefined;
234
+ });
235
+ response
236
+ .then((r) => {
237
+ if (r !== undefined) {
238
+ resolve(r);
239
+ } else {
240
+ console.log('success undefined');
241
+ reject(new Error('Response is undefined inside a success'));
242
+ }
243
+ })
244
+ .catch((err) => {
245
+ if (err !== undefined) {
246
+ reject(err);
247
+ } else {
248
+ console.log('error undefined');
249
+ reject(new Error('Response is undefined inside a error'));
250
+ }
251
+ });
252
+ });
253
+
254
+ //@ts-ignore -- TODO: review, waitUntil takes a promise, this returns a void
255
+ event.waitUntil(event.respondWith(maPromesse));
256
+ }
257
+ };
258
+
259
+ const handleMessage = (event: ExtendableMessageEvent) => {
260
+ const port = event.ports[0];
261
+ const data = event.data as MessageEventData;
262
+ const configurationName = data.configurationName;
263
+ let currentDatabase = database[configurationName];
264
+
265
+ if (!currentDatabase) {
266
+ database[configurationName] = {
267
+ tokens: null,
268
+ state: null,
269
+ codeVerifier: null,
270
+ oidcServerConfiguration: null,
271
+ oidcConfiguration: undefined,
272
+ nonce: null,
273
+ status: null,
274
+ configurationName,
275
+ };
276
+ currentDatabase = database[configurationName];
277
+ if (!trustedDomains[configurationName]) {
278
+ trustedDomains[configurationName] = [];
279
+ }
280
+ }
281
+
282
+ switch (data.type) {
283
+ case 'clear':
284
+ currentDatabase.tokens = null;
285
+ currentDatabase.state = null;
286
+ currentDatabase.codeVerifier = null;
287
+ currentDatabase.status = data.data.status;
288
+ port.postMessage({ configurationName });
289
+ return;
290
+ case 'init': {
291
+ const oidcServerConfiguration = data.data.oidcServerConfiguration;
292
+ const domains = trustedDomains[configurationName];
293
+ if (!domains.find((f) => f === acceptAnyDomainToken)) {
294
+ [
295
+ oidcServerConfiguration.tokenEndpoint,
296
+ oidcServerConfiguration.revocationEndpoint,
297
+ oidcServerConfiguration.userInfoEndpoint,
298
+ oidcServerConfiguration.issuer,
299
+ ].forEach((url) => {
300
+ checkDomain(domains, url);
301
+ });
302
+ }
303
+ currentDatabase.oidcServerConfiguration = oidcServerConfiguration;
304
+ currentDatabase.oidcConfiguration = data.data.oidcConfiguration;
305
+ const where = data.data.where;
306
+ if (
307
+ where === 'loginCallbackAsync' ||
308
+ where === 'tryKeepExistingSessionAsync'
309
+ ) {
310
+ currentLoginCallbackConfigurationName = configurationName;
311
+ } else {
312
+ currentLoginCallbackConfigurationName = null;
313
+ }
314
+
315
+ if (!currentDatabase.tokens) {
316
+ port.postMessage({
317
+ tokens: null,
318
+ status: currentDatabase.status,
319
+ configurationName,
320
+ });
321
+ } else {
322
+ const tokens = {
323
+ ...currentDatabase.tokens,
324
+ access_token: TOKEN.ACCESS_TOKEN + '_' + configurationName,
325
+ };
326
+ if (tokens.refresh_token) {
327
+ tokens.refresh_token = TOKEN.REFRESH_TOKEN + '_' + configurationName;
328
+ }
329
+ if (
330
+ tokens.idTokenPayload &&
331
+ tokens.idTokenPayload.nonce &&
332
+ currentDatabase.nonce != null
333
+ ) {
334
+ tokens.idTokenPayload.nonce =
335
+ TOKEN.NONCE_TOKEN + '_' + configurationName;
336
+ }
337
+ port.postMessage({
338
+ tokens,
339
+ status: currentDatabase.status,
340
+ configurationName,
341
+ });
342
+ }
343
+ return;
344
+ }
345
+ case 'setState':
346
+ currentDatabase.state = data.data.state;
347
+ port.postMessage({ configurationName });
348
+ return;
349
+ case 'getState': {
350
+ const state = currentDatabase.state;
351
+ port.postMessage({ configurationName, state });
352
+ return;
353
+ }
354
+ case 'setCodeVerifier':
355
+ currentDatabase.codeVerifier = data.data.codeVerifier;
356
+ port.postMessage({ configurationName });
357
+ return;
358
+ case 'getCodeVerifier': {
359
+ port.postMessage({
360
+ configurationName,
361
+ codeVerifier: TOKEN.CODE_VERIFIER + '_' + configurationName,
362
+ });
363
+ return;
364
+ }
365
+ case 'setSessionState':
366
+ currentDatabase.sessionState = data.data.sessionState;
367
+ port.postMessage({ configurationName });
368
+ return;
369
+ case 'getSessionState': {
370
+ const sessionState = currentDatabase.sessionState;
371
+ port.postMessage({ configurationName, sessionState });
372
+ return;
373
+ }
374
+ case 'setNonce':
375
+ currentDatabase.nonce = data.data.nonce;
376
+ port.postMessage({ configurationName });
377
+ return;
378
+ default:
379
+ currentDatabase.items = { ...data.data };
380
+ port.postMessage({ configurationName });
381
+ }
382
+ };
383
+
384
+ _self.addEventListener('install', handleInstall);
385
+ _self.addEventListener('activate', handleActivate);
386
+ _self.addEventListener('fetch', handleFetch);
387
+ _self.addEventListener('message', handleMessage);
@@ -0,0 +1,32 @@
1
+ const scriptFilename = 'OidcTrustedDomains.js'; /* global trustedDomains */
2
+ const acceptAnyDomainToken = '*';
3
+
4
+ type TokenType = {
5
+ readonly REFRESH_TOKEN: string;
6
+ readonly ACCESS_TOKEN: string;
7
+ readonly NONCE_TOKEN: string;
8
+ readonly CODE_VERIFIER: string;
9
+ };
10
+
11
+ const TOKEN: TokenType = {
12
+ REFRESH_TOKEN: 'REFRESH_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER',
13
+ ACCESS_TOKEN: 'ACCESS_TOKEN_SECURED_BY_OIDC_SERVICE_WORKER',
14
+ NONCE_TOKEN: 'NONCE_SECURED_BY_OIDC_SERVICE_WORKER',
15
+ CODE_VERIFIER: 'CODE_VERIFIER_SECURED_BY_OIDC_SERVICE_WORKER',
16
+ };
17
+
18
+ type TokenRenewModeType = {
19
+ readonly access_token_or_id_token_invalid: string;
20
+ readonly access_token_invalid: string;
21
+ readonly id_token_invalid: string;
22
+ };
23
+
24
+ const TokenRenewMode: TokenRenewModeType = {
25
+ access_token_or_id_token_invalid: 'access_token_or_id_token_invalid',
26
+ access_token_invalid: 'access_token_invalid',
27
+ id_token_invalid: 'id_token_invalid',
28
+ };
29
+
30
+ const openidWellknownUrlEndWith = '/.well-known/openid-configuration';
31
+
32
+ export { scriptFilename, acceptAnyDomainToken, TOKEN, TokenRenewMode, openidWellknownUrlEndWith };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=OidcServiceWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OidcServiceWorker.d.ts","sourceRoot":"","sources":["../OidcServiceWorker.ts"],"names":[],"mappings":""}