@eid-easy/eideasy-browser-client 2.7.0 → 2.10.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 (117) hide show
  1. package/CHANGELOG.md +46 -2
  2. package/README.md +1 -2
  3. package/dist/eideasy-browser-client.js +1 -1
  4. package/package.json +8 -5
  5. package/.editorconfig +0 -14
  6. package/.env.development +0 -1
  7. package/.env.production +0 -1
  8. package/.env.staging +0 -1
  9. package/.eslintrc.js +0 -22
  10. package/.github/ISSUE_TEMPLATE/---bug-report.md +0 -35
  11. package/.github/ISSUE_TEMPLATE/---feature-request.md +0 -20
  12. package/.github/workflows/ci.yml +0 -37
  13. package/.github/workflows/github-release.yml +0 -24
  14. package/babel.config.js +0 -19
  15. package/build-utils/loadPresets.js +0 -12
  16. package/build-utils/presets/webpack.analyze.js +0 -5
  17. package/build-utils/presets/webpack.compress.js +0 -5
  18. package/build-utils/webpack.development.js +0 -3
  19. package/build-utils/webpack.production.js +0 -3
  20. package/docs/.vuepress/components/AppChallenge.vue +0 -24
  21. package/docs/.vuepress/components/AppError.vue +0 -55
  22. package/docs/.vuepress/components/AppIdentification.vue +0 -177
  23. package/docs/.vuepress/components/AppSigning.vue +0 -171
  24. package/docs/.vuepress/components/GetClientConfig.vue +0 -56
  25. package/docs/.vuepress/components/IdentAtHandy.vue +0 -102
  26. package/docs/.vuepress/components/IdentEParakstsMobile.vue +0 -111
  27. package/docs/.vuepress/components/IdentFinnishTrustNetwork.vue +0 -102
  28. package/docs/.vuepress/components/IdentFrejaEid.vue +0 -86
  29. package/docs/.vuepress/components/IdentIdCard.vue +0 -65
  30. package/docs/.vuepress/components/IdentMobileId.vue +0 -100
  31. package/docs/.vuepress/components/IdentMojeId.vue +0 -99
  32. package/docs/.vuepress/components/IdentSmartId.vue +0 -93
  33. package/docs/.vuepress/components/IdentZealId.vue +0 -85
  34. package/docs/.vuepress/components/MethodCard.vue +0 -95
  35. package/docs/.vuepress/components/SignAtHandy.vue +0 -103
  36. package/docs/.vuepress/components/SignEParakstsMobile.vue +0 -103
  37. package/docs/.vuepress/components/SignEvrotrust.vue +0 -113
  38. package/docs/.vuepress/components/SignFtn.vue +0 -103
  39. package/docs/.vuepress/components/SignIdCard.vue +0 -70
  40. package/docs/.vuepress/components/SignMobileId.vue +0 -100
  41. package/docs/.vuepress/components/SignOtp.vue +0 -93
  42. package/docs/.vuepress/components/SignSmartId.vue +0 -89
  43. package/docs/.vuepress/components/SignZealId.vue +0 -106
  44. package/docs/.vuepress/components/eidEasyDemoClient.js +0 -25
  45. package/docs/.vuepress/components/logResult.js +0 -17
  46. package/docs/.vuepress/config.js +0 -34
  47. package/docs/.vuepress/public/assets/img/eid-easy-icon.png +0 -0
  48. package/docs/.vuepress/public/assets/img/eid-easy-logo.png +0 -0
  49. package/docs/.vuepress/styles/core.scss +0 -32
  50. package/docs/.vuepress/styles/index.scss +0 -124
  51. package/docs/.vuepress/styles/palette.scss +0 -9
  52. package/docs/.vuepress/styles/variables.scss +0 -1468
  53. package/docs/README.md +0 -12
  54. package/docs/contributing/README.md +0 -47
  55. package/docs/demos/README.md +0 -21
  56. package/docs/guide/README.md +0 -248
  57. package/jest.config.js +0 -16
  58. package/scripts/release.js +0 -204
  59. package/scripts/update-translations.js +0 -19
  60. package/src/MethodException.js +0 -10
  61. package/src/apiClient/createApiClient.js +0 -52
  62. package/src/apiClient/createApiClient.test.js +0 -20
  63. package/src/apiClient/createApiEndpoints.js +0 -71
  64. package/src/cloneDeep.js +0 -3
  65. package/src/config.js +0 -260
  66. package/src/coreSettingsSchema.js +0 -76
  67. package/src/createApiPoller.js +0 -54
  68. package/src/createClientCore.js +0 -84
  69. package/src/createGetClientConfig.js +0 -14
  70. package/src/createModuleCreator.js +0 -66
  71. package/src/createMonitoringService.js +0 -33
  72. package/src/createRequestError.js +0 -24
  73. package/src/createSettings.js +0 -26
  74. package/src/createStep.js +0 -49
  75. package/src/formatError.js +0 -19
  76. package/src/i18n/createI18n.js +0 -52
  77. package/src/i18n/createI18n.test.js +0 -63
  78. package/src/i18n/de.json +0 -1
  79. package/src/i18n/en.json +0 -1
  80. package/src/i18n/et.json +0 -1
  81. package/src/i18n/lt.json +0 -1
  82. package/src/i18n/lv.json +0 -1
  83. package/src/i18n/ru.json +0 -1
  84. package/src/identificationModules/createAtHandy.js +0 -37
  85. package/src/identificationModules/createEParakstsMobile.js +0 -37
  86. package/src/identificationModules/createFinnishTrustNetwork.js +0 -40
  87. package/src/identificationModules/createFrejaEid.js +0 -118
  88. package/src/identificationModules/createIdCard.js +0 -70
  89. package/src/identificationModules/createMobileId.js +0 -117
  90. package/src/identificationModules/createMojeId.js +0 -37
  91. package/src/identificationModules/createSmartId.js +0 -110
  92. package/src/identificationModules/createZealId.js +0 -107
  93. package/src/identificationModules/identificationModules.js +0 -21
  94. package/src/identificationModules/identificationModules.test.js +0 -21
  95. package/src/index.js +0 -9
  96. package/src/main.js +0 -78
  97. package/src/modes.js +0 -6
  98. package/src/poll.js +0 -36
  99. package/src/request.js +0 -45
  100. package/src/signatureModules/createAtHandySignature.js +0 -70
  101. package/src/signatureModules/createEParakstsMobileSignature.js +0 -70
  102. package/src/signatureModules/createEvrotrustSignature.js +0 -144
  103. package/src/signatureModules/createFtnSignature.js +0 -70
  104. package/src/signatureModules/createIdCardSignature.js +0 -217
  105. package/src/signatureModules/createMobileIdSignature.js +0 -129
  106. package/src/signatureModules/createOtpSignature.js +0 -68
  107. package/src/signatureModules/createSmartIdSignature.js +0 -124
  108. package/src/signatureModules/createZealIdSignature.js +0 -37
  109. package/src/signatureModules/signatureModules.js +0 -21
  110. package/src/tests/cloneDeep.test.js +0 -31
  111. package/src/tests/config.test.js +0 -25
  112. package/src/tests/createRequestError.test.js +0 -36
  113. package/src/tests/main.test.js +0 -7
  114. package/src/tests/poll.test.js +0 -64
  115. package/src/tests/windowOpen.test.js +0 -43
  116. package/src/windowOpen.js +0 -46
  117. package/webpack.config.js +0 -55
@@ -1,26 +0,0 @@
1
- const createSettings = function createSettings({ rawSettings, schema }) {
2
- const settings = { ...rawSettings };
3
-
4
- Object.keys(schema).forEach((key) => {
5
- const thisSchema = schema[key];
6
- const setting = rawSettings[key];
7
-
8
- if (thisSchema.required && setting === undefined) {
9
- throw new Error(`Missing required setting "${key}"`);
10
- }
11
-
12
- // set defaults
13
- if (setting === undefined) {
14
- settings[key] = thisSchema.default;
15
- }
16
-
17
- // eslint-disable-next-line valid-typeof
18
- if (settings[key] !== undefined && thisSchema.type !== undefined && thisSchema.type !== typeof settings[key]) {
19
- throw new Error(`Expected "${key}" to be type of "${thisSchema.type}", but received "${typeof settings[key]}"`);
20
- }
21
- });
22
-
23
- return settings;
24
- };
25
-
26
- export default createSettings;
package/src/createStep.js DELETED
@@ -1,49 +0,0 @@
1
- import cloneDeep from './cloneDeep';
2
- import formatError from './formatError';
3
-
4
- const formatResult = function formatResult(result = {}) {
5
- const { data, message } = result;
6
- const formattedResult = cloneDeep({
7
- message,
8
- });
9
-
10
- if (data) {
11
- formattedResult.data = data;
12
- } else if (result.result && result.result.data) {
13
- // our polling function returns {error, result}
14
- // that's why we are checking whether the result contains a response object
15
- formattedResult.data = result.result.data;
16
- } else {
17
- // eslint-disable-next-line max-len
18
- throw new Error(`Formatting the result failed.
19
- The function provided to createStep must return an object that has a "data" property.
20
- You provided: ${JSON.stringify(formattedResult)}
21
- Set shouldFormatResult to false if you wish to disable autoformatting`);
22
- }
23
-
24
- return formattedResult;
25
- };
26
-
27
- const getError = function getError(result) {
28
- return result.error;
29
- };
30
-
31
- // step functions can return errors that are inside of some object
32
- // step functions can also throw regular js Error objects
33
- // when there's an error in a step, then next steps should not be executed
34
- // however, the whole execution should not crash, as we still need to
35
- // call the success or fail callbacks in the end
36
- const createStep = function createStep(fn, {
37
- shouldFormatResult = true,
38
- } = {}) {
39
- return async function runStep(...args) {
40
- const result = await fn(...args);
41
- const error = getError(result);
42
- if (error) {
43
- throw formatError(error);
44
- }
45
- return shouldFormatResult ? formatResult(result) : result;
46
- };
47
- };
48
-
49
- export default createStep;
@@ -1,19 +0,0 @@
1
- import { isCancel } from './request';
2
-
3
- const formatError = function formatError(error) {
4
- const formattedError = error;
5
- if (isCancel(error)) {
6
- formattedError.isCancel = true;
7
- }
8
- if (formattedError.response && formattedError.response.data) {
9
- if (formattedError.response.data.message) {
10
- formattedError.userMessage = formattedError.response.data.message;
11
- }
12
- if (formattedError.response.data.errors) {
13
- formattedError.userDetails = formattedError.response.data.errors;
14
- }
15
- }
16
- return formattedError;
17
- };
18
-
19
- export default formatError;
@@ -1,52 +0,0 @@
1
- import * as de from './de.json';
2
- import * as en from './en.json';
3
- import * as et from './et.json';
4
- import * as lt from './lt.json';
5
- import * as lv from './lv.json';
6
- import * as ru from './ru.json';
7
-
8
- const availableLocales = {
9
- de,
10
- en,
11
- et,
12
- lt,
13
- lv,
14
- ru,
15
- };
16
-
17
- const createI18n = function createI18n({ currentLanguage = 'en', locales = availableLocales } = {}) {
18
- const state = {
19
- currentLanguage,
20
- };
21
-
22
- const defaultLang = 'en';
23
-
24
- const setLanguage = function setLanguage(language) {
25
- state.currentLanguage = language;
26
- };
27
-
28
- const getCurrentLanguage = function getCurrentLanguage() {
29
- return state.currentLanguage;
30
- };
31
-
32
- const t = function t(key) {
33
- let translations = locales[state.currentLanguage];
34
- if (!translations) {
35
- translations = locales[defaultLang];
36
- }
37
- let value = translations[key] || locales[defaultLang][key];
38
- if (!value) {
39
- value = key;
40
- }
41
-
42
- return value;
43
- };
44
-
45
- return Object.freeze({
46
- setLanguage,
47
- t,
48
- getCurrentLanguage,
49
- });
50
- };
51
-
52
- export default createI18n;
@@ -1,63 +0,0 @@
1
- import createI18n from './createI18n';
2
-
3
- const availableLocales = {
4
- en: {
5
- testText: 'I am a piece of text for testing.',
6
- testText2: 'I am testText2.',
7
- },
8
- et: {
9
- testText: 'Ma olen tekstijupp testimiseks.',
10
- },
11
- lv: {
12
- testText: 'Es esmu teksta gabals testēšanai.',
13
- },
14
- };
15
-
16
- describe('createI18n', () => {
17
- let i18n;
18
- beforeEach(() => {
19
- i18n = createI18n({
20
- locales: availableLocales,
21
- currentLanguage: 'et',
22
- });
23
- });
24
-
25
- it('should have a method "getCurrentLanguage"', () => {
26
- expect(typeof i18n.getCurrentLanguage).toBe('function');
27
- });
28
-
29
- it('should have a method "setLanguage"', () => {
30
- expect(typeof i18n.setLanguage).toBe('function');
31
- });
32
-
33
- it('should have a method "t"', () => {
34
- expect(typeof i18n.t).toBe('function');
35
- });
36
-
37
- it('without settings, getCurrentLanguage should return default value en', () => {
38
- const i18nWithoutSettings = createI18n();
39
- expect(i18nWithoutSettings.getCurrentLanguage()).toBe('en');
40
- });
41
-
42
- it('getCurrentLanguage should return "et" when currentLanguage "et" is provided in settings', () => {
43
- const i18nEt = createI18n({
44
- currentLanguage: 'et',
45
- });
46
- expect(i18nEt.getCurrentLanguage()).toBe('et');
47
- });
48
-
49
- it('calling getCurrentLanguage after setting the language to "lv" should return "lv"', () => {
50
- i18n.setLanguage('lv');
51
- expect(i18n.getCurrentLanguage()).toBe('lv');
52
- });
53
-
54
- it('method t should return the correct translation', () => {
55
- i18n.setLanguage('lv');
56
- expect(i18n.t('testText')).toBe(availableLocales.lv.testText);
57
- });
58
-
59
- it('if translation does not exist, then method t should return the translation in the default language', () => {
60
- i18n.setLanguage('lv');
61
- expect(i18n.t('testText2')).toBe(availableLocales.en.testText2);
62
- });
63
- });
package/src/i18n/de.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"Das Auslesen des Ausweises hat zu lange gedauert. Bitte schließen Sie alle geöffneten Browserfenster und versuchen Sie es erneut.","no_certificates":"Zertifikate konnten nicht gelesen werden. Stellen Sie sicher, dass sich die Karte im Lesegerät befindet und das Lesegerät ordnungsgemäß funktioniert."}
package/src/i18n/en.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"Reading the ID card took too long. Please close all the open browser windows and then try again.","no_certificates":"Could not read certificates. Make sure that the card is in the reader and the reader is working properly."}
package/src/i18n/et.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"ID kaardi lugemine võttis liiga kaua aega. Palun sulge kõik brauseri aknad ja proovi uuesti.","no_certificates":"Sertfikaatide lugemine ebaõnnestus. Veendu, et ID kaart on lugejas ning lugeja on arvutiga ühendatud."}
package/src/i18n/lt.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"Perskaityti asmens tapatybės kortelę užtruko per ilgai. Uždarykite visus atidarytus naršyklės langus ir bandykite dar kartą.","no_certificates":"Nepavyko perskaityti sertifikatų. Įsitikinkite, kad kortelė yra skaitytuve ir skaitytuvas veikia tinkamai."}
package/src/i18n/lv.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"ID kartes lasīšana aizņēma pārāk ilgu laiku. Lūdzu, aizveriet visus atvērtos pārlūkprogrammas logus un pēc tam mēģiniet vēlreiz.","no_certificates":"Nevarēja nolasīt sertifikātus. Pārliecinieties, vai karte ir lasītājā un lasītājs darbojas pareizi."}
package/src/i18n/ru.json DELETED
@@ -1 +0,0 @@
1
- {"id-card-read-timeout":"Чтение удостоверения личности заняло слишком много времени. Закройте все открытые окна браузера и повторите попытку.","no_certificates":"Не удалось прочитать сертификаты. Убедитесь, что карта находится в считывателе и считыватель работает исправно."}
@@ -1,37 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { moduleNames } from '../config';
4
-
5
- const MODULE_NAME = moduleNames.atHandy;
6
-
7
- const getRedirectUrl = function getRedirectUrl({ apiEndpoints, clientId, redirectUri }) {
8
- const redirectUrl = apiEndpoints.inCurrentMode.atHandy({
9
- clientId,
10
- redirectUri,
11
- });
12
-
13
- return {
14
- data: {
15
- // we use snake case for redirect_uri to maintain consistency with the responses coming from the core API
16
- redirect_uri: redirectUrl,
17
- },
18
- };
19
- };
20
-
21
- const executable = async function executable(config) {
22
- const {
23
- redirect,
24
- apiEndpoints,
25
- clientId,
26
- redirectUri,
27
- } = config;
28
-
29
- const redirectUrlResult = await createStep(getRedirectUrl)({
30
- apiEndpoints, clientId, redirectUri,
31
- });
32
-
33
- return createStep(redirect, { shouldFormatResult: false })(redirectUrlResult);
34
- };
35
-
36
- const createAtHandy = createModuleCreator(MODULE_NAME, executable);
37
- export default createAtHandy;
@@ -1,37 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { moduleNames } from '../config';
4
-
5
- const MODULE_NAME = moduleNames.eParakstsMobile;
6
-
7
- const getRedirectUrl = function getRedirectUrl({ apiEndpoints, clientId, redirectUri }) {
8
- const redirectUrl = apiEndpoints.inCurrentMode.eParakstsMobile({
9
- clientId,
10
- redirectUri,
11
- });
12
-
13
- return {
14
- data: {
15
- // we use snake case for redirect_uri to maintain consistency with the responses coming from the core API
16
- redirect_uri: redirectUrl,
17
- },
18
- };
19
- };
20
-
21
- const executable = async function executable(config) {
22
- const {
23
- redirect,
24
- apiEndpoints,
25
- clientId,
26
- redirectUri,
27
- } = config;
28
-
29
- const redirectUrlResult = await createStep(getRedirectUrl)({
30
- apiEndpoints, clientId, redirectUri,
31
- });
32
-
33
- return createStep(redirect, { shouldFormatResult: false })(redirectUrlResult);
34
- };
35
-
36
- const createEParakstsMobile = createModuleCreator(MODULE_NAME, executable);
37
- export default createEParakstsMobile;
@@ -1,40 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { moduleNames } from '../config';
4
-
5
- const MODULE_NAME = moduleNames.finnishTrustNetwork;
6
- const getRedirectUrl = function getRedirectUrl({
7
- apiEndpoints, clientId, redirectUri, language,
8
- }) {
9
- const redirectUrl = apiEndpoints.inCurrentMode.finnishTrustNetwork({
10
- clientId,
11
- redirectUri,
12
- language,
13
- });
14
-
15
- return {
16
- data: {
17
- // we use snake case for redirect_uri to maintain consistency with the responses coming from the core API
18
- redirect_uri: redirectUrl,
19
- },
20
- };
21
- };
22
-
23
- const executable = async function executable(config) {
24
- const {
25
- redirect,
26
- apiEndpoints,
27
- clientId,
28
- redirectUri,
29
- language,
30
- } = config;
31
-
32
- const redirectUrlResult = await createStep(getRedirectUrl)({
33
- apiEndpoints, clientId, redirectUri, language,
34
- });
35
-
36
- return createStep(redirect, { shouldFormatResult: false })(redirectUrlResult);
37
- };
38
-
39
- const createFinnishTrustNetwork = createModuleCreator(MODULE_NAME, executable);
40
- export default createFinnishTrustNetwork;
@@ -1,118 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { isCancel } from '../request';
4
- import { getMethodByHandlingModule, methodTypes, moduleNames } from '../config';
5
- import poll from '../poll';
6
-
7
- const MODULE_NAME = moduleNames.frejaEid;
8
- const settingsSchema = {
9
- countryCode: {
10
- type: 'string',
11
- required: true,
12
- },
13
- idcode: {
14
- type: 'string',
15
- required: true,
16
- },
17
- };
18
-
19
- const executable = async function executable(config) {
20
- const {
21
- started = () => {
22
- },
23
- idcode,
24
- pollInterval = 1000,
25
- cancelToken,
26
- language,
27
- apiClient,
28
- } = config;
29
-
30
- const identityStart = function identityStart(settings) {
31
- const method = getMethodByHandlingModule(methodTypes.IDENTIFICATION, MODULE_NAME);
32
- return apiClient.post({
33
- cancelToken: settings.cancelToken,
34
- url: settings.apiEndpoints.inCurrentMode.identityStart(),
35
- data: {
36
- idcode: settings.idcode,
37
- country: settings.countryCode,
38
- method: method.actionType,
39
- lang: settings.language,
40
- },
41
- });
42
- };
43
-
44
- const identityFinish = function identityFinish(settings) {
45
- const method = getMethodByHandlingModule(methodTypes.IDENTIFICATION, MODULE_NAME);
46
- return apiClient.post({
47
- cancelToken: settings.cancelToken,
48
- url: settings.apiEndpoints.inCurrentMode.identityFinish(),
49
- data: {
50
- token: settings.data.token,
51
- method: method.actionType,
52
- lang: settings.language,
53
- timeout: 2,
54
- },
55
- });
56
- };
57
-
58
- const pollIdentityFinish = function pollIdentityFinish(settings) {
59
- const maxPollAttempts = (100 * 1000) / settings.pollInterval;
60
- let totalFails = 0;
61
- return poll({
62
- fn: () => identityFinish({
63
- ...settings.config,
64
- data: settings.data,
65
- language: settings.language,
66
- cancelToken: settings.cancelToken,
67
- }),
68
- shouldContinue: (pollContext) => {
69
- const { result } = pollContext;
70
- const responseStatus = result
71
- && result.data
72
- && result.data.status;
73
-
74
- const cancelled = isCancel(pollContext.error);
75
- // probably a network error
76
- const networkFail = pollContext.error && !pollContext.error.response && !cancelled;
77
- if (networkFail) {
78
- totalFails += 1;
79
- }
80
- let keepGoing = false;
81
- // we want to retry a couple of times in case of network errors
82
- // because:
83
- // 1. we are polling and waiting for the confirmation
84
- // 2. meanwhile the identification app opens a confirmation prompt and our page is thrown to the background
85
- // 3. on the background, network requests are halted and the currently running request fails (network error)
86
- // 4. User confirms the action in the prompt
87
- // 5. our page becomes active again, but the request has failed, so we need to retry now
88
- if (pollContext.attempts < maxPollAttempts && totalFails < 3) {
89
- keepGoing = networkFail || responseStatus === 'RUNNING';
90
- }
91
- return keepGoing;
92
- },
93
- interval: 2000,
94
- });
95
- };
96
-
97
- let result;
98
- result = await createStep(identityStart)({
99
- ...config,
100
- cancelToken,
101
- language,
102
- idcode,
103
- });
104
- started(result);
105
- result = await createStep(pollIdentityFinish)({
106
- config,
107
- data: {
108
- ...result.data,
109
- },
110
- cancelToken,
111
- language,
112
- pollInterval,
113
- });
114
- return result;
115
- };
116
-
117
- const createFrejaEid = createModuleCreator(MODULE_NAME, executable, settingsSchema);
118
- export default createFrejaEid;
@@ -1,70 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { methodTypes, moduleNames, getMethodByHandlingModule } from '../config';
4
-
5
- const MODULE_NAME = moduleNames.idCard;
6
- const settingsSchema = {
7
- countryCode: {
8
- type: 'string',
9
- required: true,
10
- },
11
- };
12
-
13
- const executable = async function executable(config) {
14
- const {
15
- cancelToken,
16
- language,
17
- apiClient,
18
- i18n,
19
- } = config;
20
-
21
- const readCard = function readCard(settings = {}) {
22
- // eslint-disable-next-line max-len
23
- let url = settings.apiEndpoints.inCurrentMode.readCard({
24
- countryCode: settings.countryCode,
25
- clientId: settings.clientId,
26
- });
27
- if (settings.nonce) {
28
- url += `?nonce=${settings.nonce}`;
29
- }
30
- return apiClient.get({ url, cancelToken: settings.cancelToken });
31
- };
32
-
33
- const identityFinish = function identityFinish(settings = {}) {
34
- const method = getMethodByHandlingModule(methodTypes.IDENTIFICATION, MODULE_NAME, settings.countryCode);
35
-
36
- return apiClient.post({
37
- url: settings.apiEndpoints.inCurrentMode.identityFinish(),
38
- data: {
39
- token: settings.data.token,
40
- country: settings.countryCode,
41
- method: method.actionType,
42
- lang: settings.language,
43
- },
44
- cancelToken: settings.cancelToken,
45
- });
46
- };
47
-
48
- let result;
49
- result = await createStep(readCard)({
50
- ...config,
51
- language,
52
- cancelToken,
53
- }).catch((error) => {
54
- if (error.code === 'ECONNABORTED') {
55
- error.userMessage = i18n.t('id-card-read-timeout'); // eslint-disable-line no-param-reassign
56
- }
57
- throw error;
58
- });
59
-
60
- result = await createStep(identityFinish)({
61
- ...config,
62
- cancelToken,
63
- language,
64
- data: result.data,
65
- });
66
- return result;
67
- };
68
-
69
- const createIdCard = createModuleCreator(MODULE_NAME, executable, settingsSchema);
70
- export default createIdCard;
@@ -1,117 +0,0 @@
1
- import poll from '../poll';
2
- import createStep from '../createStep';
3
- import createModuleCreator from '../createModuleCreator';
4
- import { getMethodByHandlingModule, methodTypes, moduleNames } from '../config';
5
- import { isCancel } from '../request';
6
-
7
- const MODULE_NAME = moduleNames.mobileId;
8
- const settingsSchema = {
9
- countryCode: {
10
- type: 'string',
11
- required: true,
12
- },
13
- idcode: {
14
- type: 'string',
15
- required: true,
16
- },
17
- phone: {
18
- type: 'string',
19
- required: true,
20
- },
21
- };
22
-
23
- const executable = async function executable(config) {
24
- const {
25
- cancelToken,
26
- language,
27
- apiClient,
28
- started = () => {},
29
- idcode,
30
- phone,
31
- pollInterval = 1000,
32
- } = config;
33
-
34
- const identityStart = function identityStart(settings) {
35
- const method = getMethodByHandlingModule(methodTypes.IDENTIFICATION, MODULE_NAME, settings.countryCode);
36
- return apiClient.post({
37
- url: settings.apiEndpoints.inCurrentMode.identityStart(),
38
- data: {
39
- idcode: settings.idcode,
40
- phone: settings.phone,
41
- country: settings.countryCode,
42
- method: method.actionType,
43
- lang: settings.language,
44
- },
45
- cancelToken: settings.cancelToken,
46
- });
47
- };
48
-
49
- const identityFinish = function identityFinish(settings) {
50
- const method = getMethodByHandlingModule(methodTypes.IDENTIFICATION, MODULE_NAME, settings.countryCode);
51
- return apiClient.post({
52
- url: settings.apiEndpoints.inCurrentMode.identityFinish(),
53
- data: {
54
- token: settings.data.token,
55
- method: method.actionType,
56
- timeout: 2,
57
- lang: settings.language,
58
- },
59
- cancelToken: settings.cancelToken,
60
- });
61
- };
62
-
63
- const pollIdentityFinish = function pollIdentityFinish(settings) {
64
- // Mobile ID users have 120 seconds to enter their pin,
65
- // so it doesn't make sense to poll longer than that
66
- const maxPollAttempts = (120 * 1000) / pollInterval;
67
- let totalFails = 0;
68
- return poll({
69
- fn: () => identityFinish({
70
- ...settings.config,
71
- data: settings.data,
72
- cancelToken: settings.cancelToken,
73
- language: settings.language,
74
- }),
75
- shouldContinue: (pollContext) => {
76
- const { result } = pollContext;
77
- const responseStatus = result
78
- && result.data
79
- && result.data.status;
80
-
81
- const cancelled = isCancel(pollContext.error);
82
- // probably a network error
83
- const networkFail = pollContext.error && !pollContext.error.response && !cancelled;
84
- if (networkFail) {
85
- totalFails += 1;
86
- }
87
- let keepGoing = false;
88
- if (pollContext.attempts < maxPollAttempts && totalFails < 3) {
89
- keepGoing = networkFail || responseStatus === 'RUNNING';
90
- }
91
- return keepGoing;
92
- },
93
- interval: 1000,
94
- });
95
- };
96
-
97
- let result;
98
- result = await createStep(identityStart)({
99
- ...config,
100
- cancelToken,
101
- language,
102
- idcode,
103
- phone,
104
- });
105
- started(result);
106
- result = await createStep(pollIdentityFinish)({
107
- config,
108
- data: result.data,
109
- cancelToken,
110
- language,
111
- pollInterval,
112
- });
113
- return result;
114
- };
115
-
116
- const createMobileId = createModuleCreator(MODULE_NAME, executable, settingsSchema);
117
- export default createMobileId;
@@ -1,37 +0,0 @@
1
- import createStep from '../createStep';
2
- import createModuleCreator from '../createModuleCreator';
3
- import { moduleNames } from '../config';
4
-
5
- const MODULE_NAME = moduleNames.mojeId;
6
-
7
- const getRedirectUrl = function getRedirectUrl({ apiEndpoints, clientId, redirectUri }) {
8
- const redirectUrl = apiEndpoints.inCurrentMode.mojeId({
9
- clientId,
10
- redirectUri,
11
- });
12
-
13
- return {
14
- data: {
15
- // we use snake case for redirect_uri to maintain consistency with the responses coming from the core API
16
- redirect_uri: redirectUrl,
17
- },
18
- };
19
- };
20
-
21
- const executable = async function executable(config) {
22
- const {
23
- redirect,
24
- apiEndpoints,
25
- clientId,
26
- redirectUri,
27
- } = config;
28
-
29
- const redirectUrlResult = await createStep(getRedirectUrl)({
30
- apiEndpoints, clientId, redirectUri,
31
- });
32
-
33
- return createStep(redirect, { shouldFormatResult: false })(redirectUrlResult);
34
- };
35
-
36
- const createMojeId = createModuleCreator(MODULE_NAME, executable);
37
- export default createMojeId;