studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.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.
- package/lib/components/ActionList.js +164 -37
- package/lib/components/AlertDialog.js +128 -12
- package/lib/components/AlertWithIcon.js +88 -29
- package/lib/components/ConnectedModal.js +35 -12
- package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
- package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
- package/lib/components/Dropdowns/UserDropdown.js +105 -24
- package/lib/components/Dropdowns/index.js +4 -10
- package/lib/components/EntityOwnerList.js +47 -21
- package/lib/components/Error.js +101 -12
- package/lib/components/ErrorBoundary.js +127 -38
- package/lib/components/ErrorMessage.js +39 -12
- package/lib/components/Forms/DateField.js +56 -45
- package/lib/components/Forms/TimeField.js +76 -45
- package/lib/components/Forms/index.js +3 -5
- package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
- package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
- package/lib/components/Groups/ExternalGroups/Table.js +176 -48
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
- package/lib/components/Groups/RosterSyncInfo.js +142 -23
- package/lib/components/HOC/AccessibleAppComponent.js +88 -72
- package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
- package/lib/components/HOC/AsyncComponent.js +49 -41
- package/lib/components/HOC/AuthenticatedComponent.js +55 -44
- package/lib/components/HOC/CollectionComponent.js +154 -104
- package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
- package/lib/components/HOC/CollectionItemComponent.js +152 -100
- package/lib/components/HOC/ConnectedModalComponent.js +87 -69
- package/lib/components/HOC/DataDependentComponent.js +26 -27
- package/lib/components/HOC/EntityComponent.js +57 -53
- package/lib/components/HOC/FullscreenModalComponent.js +139 -108
- package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
- package/lib/components/HOC/GuidComponent.js +20 -20
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
- package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
- package/lib/components/HOC/SearchPersistorComponent.js +237 -173
- package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
- package/lib/components/HOC/UserComponent.js +6 -8
- package/lib/components/Icons/IconAlphaList.js +28 -8
- package/lib/components/Icons/IconExternalUser.js +28 -8
- package/lib/components/Icons/IconImpersonation.js +28 -8
- package/lib/components/Icons/IconStopImpersonating.js +28 -8
- package/lib/components/Icons/IconTable.js +29 -9
- package/lib/components/Icons/IconTableDeleteCol.js +28 -8
- package/lib/components/Icons/IconTableDeleteRow.js +28 -8
- package/lib/components/Icons/IconTableInsertCol.js +28 -8
- package/lib/components/Icons/IconTableInsertRow.js +28 -8
- package/lib/components/Impersonation/Button.js +71 -16
- package/lib/components/Impersonation/Link.js +72 -16
- package/lib/components/Impersonation/UserDetail.js +60 -11
- package/lib/components/Loading.js +23 -8
- package/lib/components/LockDownBrowser/Check.js +188 -51
- package/lib/components/LockDownBrowser/ExitButton.js +22 -13
- package/lib/components/LockDownBrowser/Launch.js +64 -64
- package/lib/components/Lti/Confirm.js +147 -14
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
- package/lib/components/Lti/Launch.js +99 -25
- package/lib/components/Lti/LaunchGroup.js +81 -16
- package/lib/components/ManageTable.js +304 -90
- package/lib/components/ManageTableNoDataComponent.js +38 -7
- package/lib/components/NewVersionAlert.js +76 -49
- package/lib/components/NotFound.js +81 -11
- package/lib/components/Notifications.js +179 -129
- package/lib/components/PaginationNextButton.js +28 -9
- package/lib/components/PaginationPreviousButton.js +28 -9
- package/lib/components/Quill/CustomToolbar.js +427 -222
- package/lib/components/Quill/Formats/Image.js +67 -67
- package/lib/components/Quill/Formats/List.js +38 -47
- package/lib/components/Quill/Formats/Video.js +23 -26
- package/lib/components/Quill/ImageDropModule.js +136 -114
- package/lib/components/Quill/ImageWarning.js +41 -12
- package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
- package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
- package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
- package/lib/components/Quill/TableModule/constants.js +40 -42
- package/lib/components/Quill/TableModule/index.js +357 -305
- package/lib/components/Quill/TableModule/utils.js +39 -48
- package/lib/components/Quill/accessibilityFix.js +219 -223
- package/lib/components/Quill/index.js +30 -33
- package/lib/components/RefreshIndicator/Bordered.js +44 -10
- package/lib/components/RefreshIndicator/Inline.js +43 -12
- package/lib/components/RefreshIndicator/index.js +257 -62
- package/lib/components/SearchControls.js +211 -14
- package/lib/components/SentryRoute.js +5 -7
- package/lib/components/Tables/RoleFilter.js +66 -38
- package/lib/components/Tables/TextFilter.js +58 -18
- package/lib/components/UserRoles/Add.js +193 -99
- package/lib/components/UserRoles/Context.js +3 -6
- package/lib/components/UserRoles/RoleCell.js +176 -75
- package/lib/components/UserRoles/Select.js +151 -20
- package/lib/components/UserRoles/Table.js +215 -82
- package/lib/components/UserRoles/index.js +526 -386
- package/lib/config/eslint/index.js +26 -29
- package/lib/config/eslint/lib/order.js +21 -28
- package/lib/config/eslint/lib/prettier.js +15 -19
- package/lib/config/eslint/lib/typescript.js +87 -113
- package/lib/config/eslint/react.js +18 -15
- package/lib/constants/baseActivity.js +26 -28
- package/lib/constants/baseRole.js +10 -12
- package/lib/constants/configuration.js +43 -55
- package/lib/constants/externalProviderType.js +6 -8
- package/lib/constants/fetchErrorData.js +10 -12
- package/lib/constants/index.js +13 -15
- package/lib/constants/lockDownBrowser.js +23 -25
- package/lib/constants/mockData.js +370 -300
- package/lib/constants/modelStatus.js +11 -13
- package/lib/constants/notificationType.js +8 -10
- package/lib/constants/operatingSystem.js +8 -10
- package/lib/constants/shard.js +7 -9
- package/lib/constants/table.js +18 -22
- package/lib/constants/tier.js +8 -10
- package/lib/constants/userRole.js +11 -8
- package/lib/endpointMappings.js +191 -182
- package/lib/hooks/useCollection.js +79 -65
- package/lib/hooks/useCollectionConfiguration.js +220 -80
- package/lib/hooks/useCollectionItem.js +151 -57
- package/lib/hooks/useGuid.js +16 -9
- package/lib/hooks/usePrevious.js +14 -13
- package/lib/index.js +11 -26
- package/lib/redux/actionCreator.js +44 -35
- package/lib/redux/actions/AuthAction.js +45 -32
- package/lib/redux/actions/ModalAction.js +6 -8
- package/lib/redux/actions/ModelAction.js +95 -43
- package/lib/redux/actions/NotificationAction.js +6 -8
- package/lib/redux/actions/SearchAction.js +5 -7
- package/lib/redux/actions/index.js +6 -8
- package/lib/redux/configureReducers.js +48 -46
- package/lib/redux/configureStore.js +77 -91
- package/lib/redux/helpers.js +2 -5
- package/lib/redux/reducers/authReducer.js +44 -43
- package/lib/redux/reducers/index.js +7 -14
- package/lib/redux/reducers/modalsReducer.js +43 -31
- package/lib/redux/reducers/modelsReducer.js +131 -137
- package/lib/redux/reducers/notificationsReducer.js +20 -20
- package/lib/redux/reducers/searchReducer.js +13 -13
- package/lib/redux/sagas/appInsightsSaga.js +19 -21
- package/lib/redux/sagas/authSaga.js +248 -234
- package/lib/redux/sagas/caliperSaga.js +142 -131
- package/lib/redux/sagas/clockOffsetSaga.js +29 -32
- package/lib/redux/sagas/configurationSaga.js +8 -10
- package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
- package/lib/redux/sagas/errorSaga.js +23 -24
- package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
- package/lib/redux/sagas/identityProviderSaga.js +19 -21
- package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
- package/lib/redux/sagas/modelFetchSaga.js +302 -286
- package/lib/redux/sagas/noStoreSaga.js +60 -61
- package/lib/redux/sagas/postLoginDataSaga.js +37 -32
- package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
- package/lib/redux/sagas/rootSaga.js +77 -60
- package/lib/redux/sagas/sentrySaga.js +25 -28
- package/lib/redux/sagas/userIdSaga.js +13 -15
- package/lib/services/codeProviderService.js +21 -21
- package/lib/services/dateService.js +6 -8
- package/lib/services/documentService.js +10 -11
- package/lib/services/fetchService.js +103 -95
- package/lib/services/persistenceService.js +27 -30
- package/lib/services/ticketProviderService.js +25 -25
- package/lib/services/tokenPersistenceService.js +8 -10
- package/lib/services/windowService.js +14 -16
- package/lib/startup.js +110 -101
- package/lib/types/AppConfiguration.js +2 -2
- package/lib/types/Artifact.js +7 -9
- package/lib/types/BaseReduxState.js +2 -2
- package/lib/types/Client.js +2 -2
- package/lib/types/Collection.js +2 -2
- package/lib/types/Configuration.js +2 -2
- package/lib/types/DeepLinkingResponseRequest.js +2 -2
- package/lib/types/DeletableModel.js +2 -2
- package/lib/types/Event.js +2 -2
- package/lib/types/ExternalGroup.js +2 -2
- package/lib/types/ExternalProvider.js +2 -2
- package/lib/types/ExternalTerm.js +2 -2
- package/lib/types/Group.js +2 -2
- package/lib/types/IdentityProvider.js +2 -2
- package/lib/types/LtiLaunch.js +2 -2
- package/lib/types/NameOnlyEntity.js +2 -2
- package/lib/types/Notification.js +2 -2
- package/lib/types/OptionalRecord.js +2 -2
- package/lib/types/OwnerSchedule.js +2 -2
- package/lib/types/PropertyOfType.js +2 -2
- package/lib/types/Quill.js +2 -2
- package/lib/types/RoleDescription.js +2 -2
- package/lib/types/Search.js +2 -2
- package/lib/types/SimpleLocation.js +2 -2
- package/lib/types/UniTime.js +2 -2
- package/lib/types/User.js +2 -2
- package/lib/types/UserRole.js +2 -2
- package/lib/types/auth/AuthState.js +2 -2
- package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
- package/lib/types/auth/ClientCredentials.js +2 -2
- package/lib/types/auth/CodeProviderService.js +2 -2
- package/lib/types/auth/LocalLoginRequestBody.js +2 -2
- package/lib/types/auth/TicketProviderService.js +2 -2
- package/lib/types/auth/TokenPersistenceService.js +2 -2
- package/lib/types/auth/index.js +8 -10
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +29 -31
- package/lib/types/net/EndpointConfig.js +2 -2
- package/lib/types/net/EndpointMapping.js +2 -2
- package/lib/types/net/EndpointMappings.js +2 -2
- package/lib/types/net/ErrorHandler.js +2 -2
- package/lib/types/net/FetchConfig.js +2 -2
- package/lib/types/net/FetchErrorData.js +6 -8
- package/lib/types/net/FetchResult.js +2 -2
- package/lib/types/net/HTTPMethod.js +2 -2
- package/lib/types/net/HTTPStatusCode.js +12 -14
- package/lib/types/net/Metadata.js +2 -2
- package/lib/types/net/Model.js +2 -2
- package/lib/types/net/ModelCollection.js +2 -2
- package/lib/types/net/ModelsState.js +2 -2
- package/lib/types/net/OAuthToken.js +2 -2
- package/lib/types/net/OAuthTokenOrNull.js +2 -2
- package/lib/types/net/TokenAccessFunction.js +2 -2
- package/lib/types/net/index.js +17 -19
- package/lib/utils/baseActivity.js +83 -85
- package/lib/utils/baseRole.js +32 -36
- package/lib/utils/collection.js +403 -297
- package/lib/utils/cookies.js +19 -23
- package/lib/utils/date.js +188 -205
- package/lib/utils/dom.js +130 -131
- package/lib/utils/domainIdentifier.js +4 -8
- package/lib/utils/entityUserRole.js +2 -5
- package/lib/utils/error.js +14 -19
- package/lib/utils/events.js +32 -31
- package/lib/utils/externalGroup.js +20 -25
- package/lib/utils/externalProviders.js +4 -7
- package/lib/utils/externalTerms.js +6 -6
- package/lib/utils/fetch.js +168 -176
- package/lib/utils/group.js +14 -11
- package/lib/utils/groupDates.js +38 -46
- package/lib/utils/groupRoles.js +23 -32
- package/lib/utils/lockDownBrowser.js +12 -15
- package/lib/utils/logger.js +23 -28
- package/lib/utils/lti.js +4 -7
- package/lib/utils/model.js +28 -43
- package/lib/utils/number.js +9 -13
- package/lib/utils/promise.js +23 -26
- package/lib/utils/quill.js +55 -60
- package/lib/utils/route.js +52 -60
- package/lib/utils/search.js +72 -87
- package/lib/utils/shard.js +33 -42
- package/lib/utils/sort.js +47 -50
- package/lib/utils/string.js +10 -12
- package/lib/utils/table.js +29 -33
- package/lib/utils/timezone.js +7 -12
- package/lib/utils/url.js +130 -144
- package/lib/utils/user.js +54 -64
- package/lib/utils/userAgent.js +7 -14
- package/lib/utils/userRole.js +36 -39
- package/package.json +17 -3
|
@@ -1,183 +1,194 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const actionCreator_1 = require("../actionCreator");
|
|
10
|
-
const actions_1 = require("../actions");
|
|
1
|
+
import { call, cancel, delay, fork, race, take } from 'redux-saga/effects';
|
|
2
|
+
import { BrowserCaliperService } from 'studiokit-caliper-js';
|
|
3
|
+
import { getAppConfig, getShardConfig } from '../../constants/configuration';
|
|
4
|
+
import { persistenceService } from '../../services/persistenceService';
|
|
5
|
+
import { getServerNowUtc } from '../../utils/date';
|
|
6
|
+
import { dispatchModelFetchRequest } from '../actionCreator';
|
|
7
|
+
import { AUTH_ACTION_TYPE, isModelFetchResultAction, isTransientModelFetchErrorAction, isTransientModelFetchResultAction } from '../actions';
|
|
8
|
+
|
|
11
9
|
//#region Local Variables
|
|
10
|
+
|
|
12
11
|
let service;
|
|
13
12
|
let caliperToken;
|
|
13
|
+
|
|
14
14
|
//#endregion Local Variables
|
|
15
|
+
|
|
15
16
|
//#region CaliperService Helpers
|
|
17
|
+
|
|
16
18
|
function initializeCaliperService(shardConfig) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return service;
|
|
19
|
+
const appConfig = getAppConfig();
|
|
20
|
+
if (!shardConfig.caliperEventStoreHostname) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const sensorOptions = Object.assign({}, appConfig.CALIPER_EVENT_STORE_OPTIONS, {
|
|
24
|
+
hostname: shardConfig.caliperEventStoreHostname
|
|
25
|
+
});
|
|
26
|
+
const options = {
|
|
27
|
+
sensorId: appConfig.CALIPER_SENSOR_ID,
|
|
28
|
+
sensorOptions,
|
|
29
|
+
appId: appConfig.CALIPER_SENSOR_APP_ID,
|
|
30
|
+
appName: appConfig.CALIPER_SENSOR_APP_NAME,
|
|
31
|
+
getToken: function () {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
if (caliperToken) {
|
|
34
|
+
resolve(caliperToken);
|
|
35
|
+
} else {
|
|
36
|
+
reject(new Error('`caliperToken` is undefined'));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
// disable auto send, the saga will handle this
|
|
41
|
+
autoSend: false
|
|
42
|
+
};
|
|
43
|
+
const service = new BrowserCaliperService(options);
|
|
44
|
+
return service;
|
|
44
45
|
}
|
|
45
46
|
function setCaliperPerson(userData) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return Promise.resolve();
|
|
47
|
+
const appConfig = getAppConfig();
|
|
48
|
+
const shardConfig = getShardConfig();
|
|
49
|
+
const personNamespace = shardConfig.caliperPersonNamespace;
|
|
50
|
+
const id = `${personNamespace}${userData.puid}`;
|
|
51
|
+
const extensions = {};
|
|
52
|
+
extensions[`${appConfig.CALIPER_EXTENSIONS_NAMESPACE}.userId`] = userData.id;
|
|
53
|
+
service.setPerson(id, userData.firstName ?? undefined, userData.lastName ?? undefined, extensions);
|
|
54
|
+
return Promise.resolve();
|
|
55
55
|
}
|
|
56
56
|
function startCaliperSession() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
const appConfig = getAppConfig();
|
|
58
|
+
const extensions = {};
|
|
59
|
+
extensions[`${appConfig.CALIPER_EXTENSIONS_NAMESPACE}.userAgent`] = navigator.userAgent;
|
|
60
|
+
service.startSession(extensions);
|
|
61
|
+
return Promise.resolve();
|
|
62
62
|
}
|
|
63
63
|
function endCaliperSession() {
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
service.endSession();
|
|
65
|
+
return Promise.resolve();
|
|
66
66
|
}
|
|
67
67
|
function setPersonAndStartCaliperSession(userData) {
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
void setCaliperPerson(userData);
|
|
69
|
+
void startCaliperSession();
|
|
70
70
|
}
|
|
71
71
|
function isTokenExpired(caliperToken) {
|
|
72
|
-
|
|
72
|
+
return new Date(caliperToken.expires) <= getServerNowUtc();
|
|
73
73
|
}
|
|
74
|
+
|
|
74
75
|
//#endregion CaliperService Helpers
|
|
76
|
+
|
|
75
77
|
/**
|
|
76
78
|
* Load the persisted `caliperToken`, if any. This token is persisted by the CaliperService,
|
|
77
79
|
* but we load it in order to check expiry.
|
|
78
80
|
*/
|
|
79
81
|
function* loadToken() {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return undefined;
|
|
82
|
+
const caliperToken = yield call(persistenceService.getPersistedCaliperToken);
|
|
83
|
+
if (caliperToken) return caliperToken;
|
|
84
|
+
return undefined;
|
|
84
85
|
}
|
|
86
|
+
|
|
85
87
|
/**
|
|
86
88
|
* Load a new `caliperToken` from the API. Returns `undefined` if the data request fails.
|
|
87
89
|
*/
|
|
88
90
|
function* getToken() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
91
|
+
dispatchModelFetchRequest({
|
|
92
|
+
modelName: 'caliperToken',
|
|
93
|
+
noStore: true
|
|
94
|
+
});
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
96
|
+
const {
|
|
97
|
+
receivedResult,
|
|
98
|
+
failedResult
|
|
99
|
+
} = yield race({
|
|
100
|
+
receivedResult: take(action => isTransientModelFetchResultAction(action) && action.modelPath === 'caliperToken'),
|
|
101
|
+
failedResult: take(action => isTransientModelFetchErrorAction(action) && action.modelPath === 'caliperToken')
|
|
102
|
+
});
|
|
103
|
+
if (receivedResult && receivedResult.data) {
|
|
104
|
+
// convert to CaliperToken from OAuthToken
|
|
105
|
+
const caliperToken = {
|
|
106
|
+
accessToken: receivedResult.data.access_token,
|
|
107
|
+
expires: receivedResult.data['.expires']
|
|
108
|
+
};
|
|
109
|
+
return caliperToken;
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
107
112
|
}
|
|
113
|
+
|
|
108
114
|
/**
|
|
109
115
|
* Calls `getToken`, but keeps retrying until a token is successfully loaded, using a back-off delay strategy.
|
|
110
116
|
*/
|
|
111
117
|
function* getTokenWithRetry() {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
118
|
+
// get token
|
|
119
|
+
let caliperToken = yield call(getToken);
|
|
120
|
+
// handle failing to load token
|
|
121
|
+
let tryCount = 1;
|
|
122
|
+
while (!caliperToken) {
|
|
123
|
+
// back-off delay
|
|
124
|
+
yield delay(Math.min(1000 * 60, 2 ^ tryCount * 100)); // 100, 200, 400...
|
|
125
|
+
caliperToken = yield call(getToken);
|
|
126
|
+
tryCount++;
|
|
127
|
+
}
|
|
128
|
+
return caliperToken;
|
|
123
129
|
}
|
|
130
|
+
|
|
124
131
|
/**
|
|
125
132
|
* Saga decorator for the `CaliperService.send` method
|
|
126
133
|
*/
|
|
127
134
|
function* send() {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
catch
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
+
try {
|
|
136
|
+
yield call(service.send);
|
|
137
|
+
} catch {
|
|
138
|
+
// catch error to avoid breaking the saga
|
|
139
|
+
// ignore error since `CaliperService` already tracks send errors
|
|
140
|
+
}
|
|
135
141
|
}
|
|
142
|
+
|
|
136
143
|
/**
|
|
137
144
|
* Saga decorator for the `CaliperService.send` method,
|
|
138
145
|
* which will refresh the `caliperToken` if needed before calling `send`
|
|
139
146
|
*/
|
|
140
147
|
function* sendWithTokenRefreshIfNeeded() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
148
|
+
// refresh token, if needed
|
|
149
|
+
if (!caliperToken || isTokenExpired(caliperToken)) {
|
|
150
|
+
caliperToken = yield call(getTokenWithRetry);
|
|
151
|
+
}
|
|
152
|
+
// send
|
|
153
|
+
yield call(send);
|
|
147
154
|
}
|
|
155
|
+
|
|
148
156
|
/**
|
|
149
157
|
* Saga fork implementing the "auto send" functionality from `CaliperService.
|
|
150
158
|
* Calls `send` every 10 seconds.
|
|
151
159
|
*/
|
|
152
160
|
function* autoSend() {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
161
|
+
while (true) {
|
|
162
|
+
// try to send every 10 seconds
|
|
163
|
+
yield delay(10 * 1000);
|
|
164
|
+
yield call(sendWithTokenRefreshIfNeeded);
|
|
165
|
+
}
|
|
158
166
|
}
|
|
159
|
-
function* caliperSaga() {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
167
|
+
export default function* caliperSaga() {
|
|
168
|
+
// on app start, get the configuration
|
|
169
|
+
const configurationResult = yield take(action => isModelFetchResultAction(action) && action.modelPath === 'configuration');
|
|
170
|
+
const configuration = configurationResult.data;
|
|
171
|
+
// do not proceed if caliper is not enabled or is missing hostname
|
|
172
|
+
if (!configuration.caliperEnabled || !configuration.caliperEventStoreHostname) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// load persisted token, if any
|
|
177
|
+
caliperToken = yield call(loadToken);
|
|
178
|
+
// initialize caliper service
|
|
179
|
+
service = yield call(initializeCaliperService, configuration);
|
|
180
|
+
while (true) {
|
|
181
|
+
// user is loaded and authenticated => can get token and can start session
|
|
182
|
+
const userInfo = yield take(action => isModelFetchResultAction(action) && action.modelPath === 'user.userInfo');
|
|
183
|
+
const autoSendTask = yield fork(autoSend);
|
|
184
|
+
setPersonAndStartCaliperSession(userInfo.data);
|
|
185
|
+
|
|
186
|
+
// user logs out => stop auto-send and end session
|
|
187
|
+
yield take(AUTH_ACTION_TYPE.LOG_OUT_REQUESTED);
|
|
188
|
+
yield cancel(autoSendTask);
|
|
189
|
+
void endCaliperSession();
|
|
190
|
+
// attempt to send the session end event once, w/ no token refresh since logged out
|
|
191
|
+
yield call(send);
|
|
192
|
+
}
|
|
183
193
|
}
|
|
194
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsIiwiY2FuY2VsIiwiZGVsYXkiLCJmb3JrIiwicmFjZSIsInRha2UiLCJCcm93c2VyQ2FsaXBlclNlcnZpY2UiLCJnZXRBcHBDb25maWciLCJnZXRTaGFyZENvbmZpZyIsInBlcnNpc3RlbmNlU2VydmljZSIsImdldFNlcnZlck5vd1V0YyIsImRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QiLCJBVVRIX0FDVElPTl9UWVBFIiwiaXNNb2RlbEZldGNoUmVzdWx0QWN0aW9uIiwiaXNUcmFuc2llbnRNb2RlbEZldGNoRXJyb3JBY3Rpb24iLCJpc1RyYW5zaWVudE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb24iLCJzZXJ2aWNlIiwiY2FsaXBlclRva2VuIiwiaW5pdGlhbGl6ZUNhbGlwZXJTZXJ2aWNlIiwic2hhcmRDb25maWciLCJhcHBDb25maWciLCJjYWxpcGVyRXZlbnRTdG9yZUhvc3RuYW1lIiwic2Vuc29yT3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsIkNBTElQRVJfRVZFTlRfU1RPUkVfT1BUSU9OUyIsImhvc3RuYW1lIiwib3B0aW9ucyIsInNlbnNvcklkIiwiQ0FMSVBFUl9TRU5TT1JfSUQiLCJhcHBJZCIsIkNBTElQRVJfU0VOU09SX0FQUF9JRCIsImFwcE5hbWUiLCJDQUxJUEVSX1NFTlNPUl9BUFBfTkFNRSIsImdldFRva2VuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJFcnJvciIsImF1dG9TZW5kIiwic2V0Q2FsaXBlclBlcnNvbiIsInVzZXJEYXRhIiwicGVyc29uTmFtZXNwYWNlIiwiY2FsaXBlclBlcnNvbk5hbWVzcGFjZSIsImlkIiwicHVpZCIsImV4dGVuc2lvbnMiLCJDQUxJUEVSX0VYVEVOU0lPTlNfTkFNRVNQQUNFIiwic2V0UGVyc29uIiwiZmlyc3ROYW1lIiwidW5kZWZpbmVkIiwibGFzdE5hbWUiLCJzdGFydENhbGlwZXJTZXNzaW9uIiwibmF2aWdhdG9yIiwidXNlckFnZW50Iiwic3RhcnRTZXNzaW9uIiwiZW5kQ2FsaXBlclNlc3Npb24iLCJlbmRTZXNzaW9uIiwic2V0UGVyc29uQW5kU3RhcnRDYWxpcGVyU2Vzc2lvbiIsImlzVG9rZW5FeHBpcmVkIiwiRGF0ZSIsImV4cGlyZXMiLCJsb2FkVG9rZW4iLCJnZXRQZXJzaXN0ZWRDYWxpcGVyVG9rZW4iLCJtb2RlbE5hbWUiLCJub1N0b3JlIiwicmVjZWl2ZWRSZXN1bHQiLCJmYWlsZWRSZXN1bHQiLCJhY3Rpb24iLCJtb2RlbFBhdGgiLCJkYXRhIiwiYWNjZXNzVG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJnZXRUb2tlbldpdGhSZXRyeSIsInRyeUNvdW50IiwiTWF0aCIsIm1pbiIsInNlbmQiLCJzZW5kV2l0aFRva2VuUmVmcmVzaElmTmVlZGVkIiwiY2FsaXBlclNhZ2EiLCJjb25maWd1cmF0aW9uUmVzdWx0IiwiY29uZmlndXJhdGlvbiIsImNhbGlwZXJFbmFibGVkIiwidXNlckluZm8iLCJhdXRvU2VuZFRhc2siLCJMT0dfT1VUX1JFUVVFU1RFRCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWR1eC9zYWdhcy9jYWxpcGVyU2FnYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYXNrIH0gZnJvbSAnQHJlZHV4LXNhZ2EvY29yZSdcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCdcbmltcG9ydCB7IFNhZ2FJdGVyYXRvciB9IGZyb20gJ3JlZHV4LXNhZ2EnXG5pbXBvcnQgeyBjYWxsLCBjYW5jZWwsIGRlbGF5LCBmb3JrLCByYWNlLCB0YWtlIH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJ1xuaW1wb3J0IHsgQnJvd3NlckNhbGlwZXJTZXJ2aWNlIH0gZnJvbSAnc3R1ZGlva2l0LWNhbGlwZXItanMnXG5pbXBvcnQge1xuXHRDYWxpcGVyU2Vuc29yT3B0aW9ucyxcblx0Q2FsaXBlclNlcnZpY2UsXG5cdENhbGlwZXJTZXJ2aWNlT3B0aW9ucyxcblx0Q2FsaXBlclRva2VuXG59IGZyb20gJ3N0dWRpb2tpdC1jYWxpcGVyLWpzL2xpYi90eXBlcydcbmltcG9ydCB7IGdldEFwcENvbmZpZywgZ2V0U2hhcmRDb25maWcgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29uZmlndXJhdGlvbidcbmltcG9ydCB7IHBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BlcnNpc3RlbmNlU2VydmljZSdcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24sIEZldGNoUmVzdWx0LCBVc2VySW5mbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHsgZ2V0U2VydmVyTm93VXRjIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZSdcbmltcG9ydCB7IGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QgfSBmcm9tICcuLi9hY3Rpb25DcmVhdG9yJ1xuaW1wb3J0IHtcblx0QVVUSF9BQ1RJT05fVFlQRSxcblx0aXNNb2RlbEZldGNoUmVzdWx0QWN0aW9uLFxuXHRpc1RyYW5zaWVudE1vZGVsRmV0Y2hFcnJvckFjdGlvbixcblx0aXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uXG59IGZyb20gJy4uL2FjdGlvbnMnXG5cbi8vI3JlZ2lvbiBMb2NhbCBWYXJpYWJsZXNcblxubGV0IHNlcnZpY2U6IENhbGlwZXJTZXJ2aWNlXG5sZXQgY2FsaXBlclRva2VuOiBDYWxpcGVyVG9rZW4gfCB1bmRlZmluZWRcblxuLy8jZW5kcmVnaW9uIExvY2FsIFZhcmlhYmxlc1xuXG4vLyNyZWdpb24gQ2FsaXBlclNlcnZpY2UgSGVscGVyc1xuXG5mdW5jdGlvbiBpbml0aWFsaXplQ2FsaXBlclNlcnZpY2Uoc2hhcmRDb25maWc6IENvbmZpZ3VyYXRpb24pIHtcblx0Y29uc3QgYXBwQ29uZmlnID0gZ2V0QXBwQ29uZmlnKClcblx0aWYgKCFzaGFyZENvbmZpZy5jYWxpcGVyRXZlbnRTdG9yZUhvc3RuYW1lKSB7XG5cdFx0cmV0dXJuXG5cdH1cblx0Y29uc3Qgc2Vuc29yT3B0aW9uczogQ2FsaXBlclNlbnNvck9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBhcHBDb25maWcuQ0FMSVBFUl9FVkVOVF9TVE9SRV9PUFRJT05TLCB7XG5cdFx0aG9zdG5hbWU6IHNoYXJkQ29uZmlnLmNhbGlwZXJFdmVudFN0b3JlSG9zdG5hbWVcblx0fSlcblx0Y29uc3Qgb3B0aW9uczogUGFydGlhbDxDYWxpcGVyU2VydmljZU9wdGlvbnM+ID0ge1xuXHRcdHNlbnNvcklkOiBhcHBDb25maWcuQ0FMSVBFUl9TRU5TT1JfSUQsXG5cdFx0c2Vuc29yT3B0aW9ucyxcblx0XHRhcHBJZDogYXBwQ29uZmlnLkNBTElQRVJfU0VOU09SX0FQUF9JRCxcblx0XHRhcHBOYW1lOiBhcHBDb25maWcuQ0FMSVBFUl9TRU5TT1JfQVBQX05BTUUsXG5cdFx0Z2V0VG9rZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGlmIChjYWxpcGVyVG9rZW4pIHtcblx0XHRcdFx0XHRyZXNvbHZlKGNhbGlwZXJUb2tlbilcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKCdgY2FsaXBlclRva2VuYCBpcyB1bmRlZmluZWQnKSlcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9LFxuXHRcdC8vIGRpc2FibGUgYXV0byBzZW5kLCB0aGUgc2FnYSB3aWxsIGhhbmRsZSB0aGlzXG5cdFx0YXV0b1NlbmQ6IGZhbHNlXG5cdH1cblx0Y29uc3Qgc2VydmljZTogQ2FsaXBlclNlcnZpY2UgPSBuZXcgQnJvd3NlckNhbGlwZXJTZXJ2aWNlKG9wdGlvbnMpXG5cdHJldHVybiBzZXJ2aWNlXG59XG5cbmZ1bmN0aW9uIHNldENhbGlwZXJQZXJzb24odXNlckRhdGE6IFVzZXJJbmZvKSB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGNvbnN0IHNoYXJkQ29uZmlnID0gZ2V0U2hhcmRDb25maWcoKVxuXHRjb25zdCBwZXJzb25OYW1lc3BhY2UgPSBzaGFyZENvbmZpZy5jYWxpcGVyUGVyc29uTmFtZXNwYWNlXG5cdGNvbnN0IGlkID0gYCR7cGVyc29uTmFtZXNwYWNlfSR7dXNlckRhdGEucHVpZH1gXG5cdGNvbnN0IGV4dGVuc2lvbnM6IERpY3Rpb25hcnk8YW55PiA9IHt9XG5cdGV4dGVuc2lvbnNbYCR7YXBwQ29uZmlnLkNBTElQRVJfRVhURU5TSU9OU19OQU1FU1BBQ0V9LnVzZXJJZGBdID0gdXNlckRhdGEuaWRcblx0c2VydmljZS5zZXRQZXJzb24oaWQsIHVzZXJEYXRhLmZpcnN0TmFtZSA/PyB1bmRlZmluZWQsIHVzZXJEYXRhLmxhc3ROYW1lID8/IHVuZGVmaW5lZCwgZXh0ZW5zaW9ucylcblx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG59XG5cbmZ1bmN0aW9uIHN0YXJ0Q2FsaXBlclNlc3Npb24oKSB7XG5cdGNvbnN0IGFwcENvbmZpZyA9IGdldEFwcENvbmZpZygpXG5cdGNvbnN0IGV4dGVuc2lvbnM6IERpY3Rpb25hcnk8YW55PiA9IHt9XG5cdGV4dGVuc2lvbnNbYCR7YXBwQ29uZmlnLkNBTElQRVJfRVhURU5TSU9OU19OQU1FU1BBQ0V9LnVzZXJBZ2VudGBdID0gbmF2aWdhdG9yLnVzZXJBZ2VudFxuXHRzZXJ2aWNlLnN0YXJ0U2Vzc2lvbihleHRlbnNpb25zKVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbn1cblxuZnVuY3Rpb24gZW5kQ2FsaXBlclNlc3Npb24oKSB7XG5cdHNlcnZpY2UuZW5kU2Vzc2lvbigpXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxufVxuXG5mdW5jdGlvbiBzZXRQZXJzb25BbmRTdGFydENhbGlwZXJTZXNzaW9uKHVzZXJEYXRhOiBVc2VySW5mbykge1xuXHR2b2lkIHNldENhbGlwZXJQZXJzb24odXNlckRhdGEpXG5cdHZvaWQgc3RhcnRDYWxpcGVyU2Vzc2lvbigpXG59XG5cbmZ1bmN0aW9uIGlzVG9rZW5FeHBpcmVkKGNhbGlwZXJUb2tlbjogQ2FsaXBlclRva2VuKSB7XG5cdHJldHVybiBuZXcgRGF0ZShjYWxpcGVyVG9rZW4uZXhwaXJlcykgPD0gZ2V0U2VydmVyTm93VXRjKClcbn1cblxuLy8jZW5kcmVnaW9uIENhbGlwZXJTZXJ2aWNlIEhlbHBlcnNcblxuLyoqXG4gKiBMb2FkIHRoZSBwZXJzaXN0ZWQgYGNhbGlwZXJUb2tlbmAsIGlmIGFueS4gVGhpcyB0b2tlbiBpcyBwZXJzaXN0ZWQgYnkgdGhlIENhbGlwZXJTZXJ2aWNlLFxuICogYnV0IHdlIGxvYWQgaXQgaW4gb3JkZXIgdG8gY2hlY2sgZXhwaXJ5LlxuICovXG5mdW5jdGlvbiogbG9hZFRva2VuKCk6IFNhZ2FJdGVyYXRvcjxDYWxpcGVyVG9rZW4gfCB1bmRlZmluZWQ+IHtcblx0Y29uc3QgY2FsaXBlclRva2VuOiBDYWxpcGVyVG9rZW4gfCBudWxsID0geWllbGQgY2FsbChwZXJzaXN0ZW5jZVNlcnZpY2UuZ2V0UGVyc2lzdGVkQ2FsaXBlclRva2VuKVxuXHRpZiAoY2FsaXBlclRva2VuKSByZXR1cm4gY2FsaXBlclRva2VuXG5cdHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBMb2FkIGEgbmV3IGBjYWxpcGVyVG9rZW5gIGZyb20gdGhlIEFQSS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgZGF0YSByZXF1ZXN0IGZhaWxzLlxuICovXG5mdW5jdGlvbiogZ2V0VG9rZW4oKTogU2FnYUl0ZXJhdG9yPENhbGlwZXJUb2tlbiB8IHVuZGVmaW5lZD4ge1xuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRtb2RlbE5hbWU6ICdjYWxpcGVyVG9rZW4nLFxuXHRcdG5vU3RvcmU6IHRydWVcblx0fSlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRjb25zdCB7IHJlY2VpdmVkUmVzdWx0LCBmYWlsZWRSZXN1bHQgfSA9IHlpZWxkIHJhY2Uoe1xuXHRcdHJlY2VpdmVkUmVzdWx0OiB0YWtlKFxuXHRcdFx0KGFjdGlvbjogQW55QWN0aW9uKSA9PiBpc1RyYW5zaWVudE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24ubW9kZWxQYXRoID09PSAnY2FsaXBlclRva2VuJ1xuXHRcdCksXG5cdFx0ZmFpbGVkUmVzdWx0OiB0YWtlKFxuXHRcdFx0KGFjdGlvbjogQW55QWN0aW9uKSA9PiBpc1RyYW5zaWVudE1vZGVsRmV0Y2hFcnJvckFjdGlvbihhY3Rpb24pICYmIGFjdGlvbi5tb2RlbFBhdGggPT09ICdjYWxpcGVyVG9rZW4nXG5cdFx0KVxuXHR9KVxuXHRpZiAocmVjZWl2ZWRSZXN1bHQgJiYgcmVjZWl2ZWRSZXN1bHQuZGF0YSkge1xuXHRcdC8vIGNvbnZlcnQgdG8gQ2FsaXBlclRva2VuIGZyb20gT0F1dGhUb2tlblxuXHRcdGNvbnN0IGNhbGlwZXJUb2tlbjogQ2FsaXBlclRva2VuID0ge1xuXHRcdFx0YWNjZXNzVG9rZW46IHJlY2VpdmVkUmVzdWx0LmRhdGEuYWNjZXNzX3Rva2VuLFxuXHRcdFx0ZXhwaXJlczogcmVjZWl2ZWRSZXN1bHQuZGF0YVsnLmV4cGlyZXMnXVxuXHRcdH1cblx0XHRyZXR1cm4gY2FsaXBlclRva2VuXG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIENhbGxzIGBnZXRUb2tlbmAsIGJ1dCBrZWVwcyByZXRyeWluZyB1bnRpbCBhIHRva2VuIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHVzaW5nIGEgYmFjay1vZmYgZGVsYXkgc3RyYXRlZ3kuXG4gKi9cbmZ1bmN0aW9uKiBnZXRUb2tlbldpdGhSZXRyeSgpOiBTYWdhSXRlcmF0b3I8Q2FsaXBlclRva2VuPiB7XG5cdC8vIGdldCB0b2tlblxuXHRsZXQgY2FsaXBlclRva2VuID0geWllbGQgY2FsbChnZXRUb2tlbilcblx0Ly8gaGFuZGxlIGZhaWxpbmcgdG8gbG9hZCB0b2tlblxuXHRsZXQgdHJ5Q291bnQgPSAxXG5cdHdoaWxlICghY2FsaXBlclRva2VuKSB7XG5cdFx0Ly8gYmFjay1vZmYgZGVsYXlcblx0XHR5aWVsZCBkZWxheShNYXRoLm1pbigxMDAwICogNjAsIDIgXiAodHJ5Q291bnQgKiAxMDApKSkgLy8gMTAwLCAyMDAsIDQwMC4uLlxuXHRcdGNhbGlwZXJUb2tlbiA9IHlpZWxkIGNhbGwoZ2V0VG9rZW4pXG5cdFx0dHJ5Q291bnQrK1xuXHR9XG5cdHJldHVybiBjYWxpcGVyVG9rZW5cbn1cblxuLyoqXG4gKiBTYWdhIGRlY29yYXRvciBmb3IgdGhlIGBDYWxpcGVyU2VydmljZS5zZW5kYCBtZXRob2RcbiAqL1xuZnVuY3Rpb24qIHNlbmQoKSB7XG5cdHRyeSB7XG5cdFx0eWllbGQgY2FsbChzZXJ2aWNlLnNlbmQpXG5cdH0gY2F0Y2gge1xuXHRcdC8vIGNhdGNoIGVycm9yIHRvIGF2b2lkIGJyZWFraW5nIHRoZSBzYWdhXG5cdFx0Ly8gaWdub3JlIGVycm9yIHNpbmNlIGBDYWxpcGVyU2VydmljZWAgYWxyZWFkeSB0cmFja3Mgc2VuZCBlcnJvcnNcblx0fVxufVxuXG4vKipcbiAqIFNhZ2EgZGVjb3JhdG9yIGZvciB0aGUgYENhbGlwZXJTZXJ2aWNlLnNlbmRgIG1ldGhvZCxcbiAqIHdoaWNoIHdpbGwgcmVmcmVzaCB0aGUgYGNhbGlwZXJUb2tlbmAgaWYgbmVlZGVkIGJlZm9yZSBjYWxsaW5nIGBzZW5kYFxuICovXG5mdW5jdGlvbiogc2VuZFdpdGhUb2tlblJlZnJlc2hJZk5lZWRlZCgpIHtcblx0Ly8gcmVmcmVzaCB0b2tlbiwgaWYgbmVlZGVkXG5cdGlmICghY2FsaXBlclRva2VuIHx8IGlzVG9rZW5FeHBpcmVkKGNhbGlwZXJUb2tlbikpIHtcblx0XHRjYWxpcGVyVG9rZW4gPSB5aWVsZCBjYWxsKGdldFRva2VuV2l0aFJldHJ5KVxuXHR9XG5cdC8vIHNlbmRcblx0eWllbGQgY2FsbChzZW5kKVxufVxuXG4vKipcbiAqIFNhZ2EgZm9yayBpbXBsZW1lbnRpbmcgdGhlIFwiYXV0byBzZW5kXCIgZnVuY3Rpb25hbGl0eSBmcm9tIGBDYWxpcGVyU2VydmljZS5cbiAqIENhbGxzIGBzZW5kYCBldmVyeSAxMCBzZWNvbmRzLlxuICovXG5mdW5jdGlvbiogYXV0b1NlbmQoKSB7XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0Ly8gdHJ5IHRvIHNlbmQgZXZlcnkgMTAgc2Vjb25kc1xuXHRcdHlpZWxkIGRlbGF5KDEwICogMTAwMClcblx0XHR5aWVsZCBjYWxsKHNlbmRXaXRoVG9rZW5SZWZyZXNoSWZOZWVkZWQpXG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qIGNhbGlwZXJTYWdhKCk6IFNhZ2FJdGVyYXRvciB7XG5cdC8vIG9uIGFwcCBzdGFydCwgZ2V0IHRoZSBjb25maWd1cmF0aW9uXG5cdGNvbnN0IGNvbmZpZ3VyYXRpb25SZXN1bHQgPSB5aWVsZCB0YWtlKFxuXHRcdChhY3Rpb246IEFueUFjdGlvbikgPT4gaXNNb2RlbEZldGNoUmVzdWx0QWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLm1vZGVsUGF0aCA9PT0gJ2NvbmZpZ3VyYXRpb24nXG5cdClcblx0Y29uc3QgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25SZXN1bHQuZGF0YVxuXHQvLyBkbyBub3QgcHJvY2VlZCBpZiBjYWxpcGVyIGlzIG5vdCBlbmFibGVkIG9yIGlzIG1pc3NpbmcgaG9zdG5hbWVcblx0aWYgKCFjb25maWd1cmF0aW9uLmNhbGlwZXJFbmFibGVkIHx8ICFjb25maWd1cmF0aW9uLmNhbGlwZXJFdmVudFN0b3JlSG9zdG5hbWUpIHtcblx0XHRyZXR1cm5cblx0fVxuXG5cdC8vIGxvYWQgcGVyc2lzdGVkIHRva2VuLCBpZiBhbnlcblx0Y2FsaXBlclRva2VuID0geWllbGQgY2FsbChsb2FkVG9rZW4pXG5cdC8vIGluaXRpYWxpemUgY2FsaXBlciBzZXJ2aWNlXG5cdHNlcnZpY2UgPSB5aWVsZCBjYWxsKGluaXRpYWxpemVDYWxpcGVyU2VydmljZSwgY29uZmlndXJhdGlvbilcblxuXHR3aGlsZSAodHJ1ZSkge1xuXHRcdC8vIHVzZXIgaXMgbG9hZGVkIGFuZCBhdXRoZW50aWNhdGVkID0+IGNhbiBnZXQgdG9rZW4gYW5kIGNhbiBzdGFydCBzZXNzaW9uXG5cdFx0Y29uc3QgdXNlckluZm86IEZldGNoUmVzdWx0PFVzZXJJbmZvPiA9IHlpZWxkIHRha2UoXG5cdFx0XHQoYWN0aW9uOiBBbnlBY3Rpb24pID0+IGlzTW9kZWxGZXRjaFJlc3VsdEFjdGlvbihhY3Rpb24pICYmIGFjdGlvbi5tb2RlbFBhdGggPT09ICd1c2VyLnVzZXJJbmZvJ1xuXHRcdClcblx0XHRjb25zdCBhdXRvU2VuZFRhc2s6IFRhc2sgPSB5aWVsZCBmb3JrKGF1dG9TZW5kKVxuXHRcdHNldFBlcnNvbkFuZFN0YXJ0Q2FsaXBlclNlc3Npb24odXNlckluZm8uZGF0YSlcblxuXHRcdC8vIHVzZXIgbG9ncyBvdXQgPT4gc3RvcCBhdXRvLXNlbmQgYW5kIGVuZCBzZXNzaW9uXG5cdFx0eWllbGQgdGFrZShBVVRIX0FDVElPTl9UWVBFLkxPR19PVVRfUkVRVUVTVEVEKVxuXHRcdHlpZWxkIGNhbmNlbChhdXRvU2VuZFRhc2spXG5cdFx0dm9pZCBlbmRDYWxpcGVyU2Vzc2lvbigpXG5cdFx0Ly8gYXR0ZW1wdCB0byBzZW5kIHRoZSBzZXNzaW9uIGVuZCBldmVudCBvbmNlLCB3LyBubyB0b2tlbiByZWZyZXNoIHNpbmNlIGxvZ2dlZCBvdXRcblx0XHR5aWVsZCBjYWxsKHNlbmQpXG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBSUEsU0FBU0EsSUFBSSxFQUFFQyxNQUFNLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLElBQUksUUFBUSxvQkFBb0I7QUFDMUUsU0FBU0MscUJBQXFCLFFBQVEsc0JBQXNCO0FBTzVELFNBQVNDLFlBQVksRUFBRUMsY0FBYyxRQUFRLCtCQUErQjtBQUM1RSxTQUFTQyxrQkFBa0IsUUFBUSxtQ0FBbUM7QUFFdEUsU0FBU0MsZUFBZSxRQUFRLGtCQUFrQjtBQUNsRCxTQUFTQyx5QkFBeUIsUUFBUSxrQkFBa0I7QUFDNUQsU0FDQ0Ms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
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const date_1 = require("../../utils/date");
|
|
8
|
-
const logger_1 = require("../../utils/logger");
|
|
9
|
-
const actions_1 = require("../actions");
|
|
1
|
+
import moment from 'moment-timezone';
|
|
2
|
+
import { call, take } from 'redux-saga/effects';
|
|
3
|
+
import { setClockOffset } from '../../utils/date';
|
|
4
|
+
import { getLogger } from '../../utils/logger';
|
|
5
|
+
import { isTransientModelFetchResultAction } from '../actions';
|
|
6
|
+
|
|
10
7
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
Periodically, we fetch the current UTC server time. To insure against browser clock time being set
|
|
9
|
+
incorrectly, we track the difference between server time and browser time by storing that
|
|
10
|
+
difference in a module-level variable in the date utilities module. That module provides a method
|
|
11
|
+
to get the current UTC time, according to the API server.
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
If the calculated difference is less than one second, we can assume that's a result of network
|
|
14
|
+
latency and will not store that offset.
|
|
18
15
|
*/
|
|
19
|
-
function* clockOffsetSaga() {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
yield (0, effects_1.call)(date_1.setClockOffset, 0);
|
|
35
|
-
}
|
|
16
|
+
export default function* clockOffsetSaga() {
|
|
17
|
+
const logger = getLogger();
|
|
18
|
+
while (true) {
|
|
19
|
+
const timeResult = yield take(action => isTransientModelFetchResultAction(action) && action.modelPath === 'time');
|
|
20
|
+
const time = timeResult.data;
|
|
21
|
+
const offset = moment.utc(time).diff(moment.utc());
|
|
22
|
+
if (Math.abs(offset) > 1000) {
|
|
23
|
+
logger.debug('> 1 second server <-> browser time difference');
|
|
24
|
+
logger.debug('server', time);
|
|
25
|
+
logger.debug('browser', new Date().toISOString());
|
|
26
|
+
logger.debug('calculated', new Date(Date.now() + offset).toISOString());
|
|
27
|
+
yield call(setClockOffset, offset);
|
|
28
|
+
} else {
|
|
29
|
+
logger.debug('clear clock offset');
|
|
30
|
+
yield call(setClockOffset, 0);
|
|
36
31
|
}
|
|
32
|
+
}
|
|
37
33
|
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb21lbnQiLCJjYWxsIiwidGFrZSIsInNldENsb2NrT2Zmc2V0IiwiZ2V0TG9nZ2VyIiwiaXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uIiwiY2xvY2tPZmZzZXRTYWdhIiwibG9nZ2VyIiwidGltZVJlc3VsdCIsImFjdGlvbiIsIm1vZGVsUGF0aCIsInRpbWUiLCJkYXRhIiwib2Zmc2V0IiwidXRjIiwiZGlmZiIsIk1hdGgiLCJhYnMiLCJkZWJ1ZyIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIm5vdyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWR1eC9zYWdhcy9jbG9ja09mZnNldFNhZ2EudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnXG5pbXBvcnQgeyBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCdcbmltcG9ydCB7IFNhZ2FJdGVyYXRvciB9IGZyb20gJ3JlZHV4LXNhZ2EnXG5pbXBvcnQgeyBjYWxsLCB0YWtlIH0gZnJvbSAncmVkdXgtc2FnYS9lZmZlY3RzJ1xuaW1wb3J0IHsgc2V0Q2xvY2tPZmZzZXQgfSBmcm9tICcuLi8uLi91dGlscy9kYXRlJ1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJ1xuaW1wb3J0IHsgaXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9ucydcblxuLyoqXG5cdFBlcmlvZGljYWxseSwgd2UgZmV0Y2ggdGhlIGN1cnJlbnQgVVRDIHNlcnZlciB0aW1lLiBUbyBpbnN1cmUgYWdhaW5zdCBicm93c2VyIGNsb2NrIHRpbWUgYmVpbmcgc2V0XG5cdGluY29ycmVjdGx5LCB3ZSB0cmFjayB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNlcnZlciB0aW1lIGFuZCBicm93c2VyIHRpbWUgYnkgc3RvcmluZyB0aGF0XG5cdGRpZmZlcmVuY2UgaW4gYSBtb2R1bGUtbGV2ZWwgdmFyaWFibGUgaW4gdGhlIGRhdGUgdXRpbGl0aWVzIG1vZHVsZS4gVGhhdCBtb2R1bGUgcHJvdmlkZXMgYSBtZXRob2Rcblx0dG8gZ2V0IHRoZSBjdXJyZW50IFVUQyB0aW1lLCBhY2NvcmRpbmcgdG8gdGhlIEFQSSBzZXJ2ZXIuXG5cblx0SWYgdGhlIGNhbGN1bGF0ZWQgZGlmZmVyZW5jZSBpcyBsZXNzIHRoYW4gb25lIHNlY29uZCwgd2UgY2FuIGFzc3VtZSB0aGF0J3MgYSByZXN1bHQgb2YgbmV0d29ya1xuXHRsYXRlbmN5IGFuZCB3aWxsIG5vdCBzdG9yZSB0aGF0IG9mZnNldC5cbiovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiogY2xvY2tPZmZzZXRTYWdhKCk6IFNhZ2FJdGVyYXRvciB7XG5cdGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpXG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHRjb25zdCB0aW1lUmVzdWx0ID0geWllbGQgdGFrZShcblx0XHRcdChhY3Rpb246IEFueUFjdGlvbikgPT4gaXNUcmFuc2llbnRNb2RlbEZldGNoUmVzdWx0QWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLm1vZGVsUGF0aCA9PT0gJ3RpbWUnXG5cdFx0KVxuXHRcdGNvbnN0IHRpbWU6IHN0cmluZyA9IHRpbWVSZXN1bHQuZGF0YVxuXHRcdGNvbnN0IG9mZnNldCA9IG1vbWVudC51dGModGltZSkuZGlmZihtb21lbnQudXRjKCkpXG5cdFx0aWYgKE1hdGguYWJzKG9mZnNldCkgPiAxMDAwKSB7XG5cdFx0XHRsb2dnZXIuZGVidWcoJz4gMSBzZWNvbmQgc2VydmVyIDwtPiBicm93c2VyIHRpbWUgZGlmZmVyZW5jZScpXG5cdFx0XHRsb2dnZXIuZGVidWcoJ3NlcnZlcicsIHRpbWUpXG5cdFx0XHRsb2dnZXIuZGVidWcoJ2Jyb3dzZXInLCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpXG5cdFx0XHRsb2dnZXIuZGVidWcoJ2NhbGN1bGF0ZWQnLCBuZXcgRGF0ZShEYXRlLm5vdygpICsgb2Zmc2V0KS50b0lTT1N0cmluZygpKVxuXHRcdFx0eWllbGQgY2FsbChzZXRDbG9ja09mZnNldCwgb2Zmc2V0KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2dnZXIuZGVidWcoJ2NsZWFyIGNsb2NrIG9mZnNldCcpXG5cdFx0XHR5aWVsZCBjYWxsKHNldENsb2NrT2Zmc2V0LCAwKVxuXHRcdH1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFNLE1BQU0saUJBQWlCO0FBR3BDLFNBQVNDLElBQUksRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUMvQyxTQUFTQyxjQUFjLFFBQVEsa0JBQWtCO0FBQ2pELFNBQVNDLFNBQVMsUUFBUSxvQkFBb0I7QUFDOUMsU0FBU0MsaUNBQWlDLFFBQVEsWUFBWTs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVQyxlQUFlQSxDQUFBLEVBQWlCO0VBQ3hELE1BQU1DLE1BQU0sR0FBR0gsU0FBUyxDQUFDLENBQUM7RUFFMUIsT0FBTyxJQUFJLEVBQUU7SUFDWixNQUFNSSxVQUFVLEdBQUcsTUFBTU4sSUFBSSxDQUMzQk8sTUFBaUIsSUFBS0osaUNBQWlDLENBQUNJLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNDLFNBQVMsS0FBSyxNQUMxRixDQUFDO0lBQ0QsTUFBTUMsSUFBWSxHQUFHSCxVQUFVLENBQUNJLElBQUk7SUFDcEMsTUFBTUMsTUFBTSxHQUFHYixNQUFNLENBQUNjLEdBQUcsQ0FBQ0gsSUFBSSxDQUFDLENBQUNJLElBQUksQ0FBQ2YsTUFBTSxDQUFDYyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUlFLElBQUksQ0FBQ0MsR0FBRyxDQUFDSixNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUU7TUFDNUJOLE1BQU0sQ0FBQ1csS0FBSyxDQUFDLCtDQUErQyxDQUFDO01BQzdEWCxNQUFNLENBQUNXLEtBQUssQ0FBQyxRQUFRLEVBQUVQLElBQUksQ0FBQztNQUM1QkosTUFBTSxDQUFDVyxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUlDLElBQUksQ0FBQyxDQUFDLENBQUNDLFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFDakRiLE1BQU0sQ0FBQ1csS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJQyxJQUFJLENBQUNBLElBQUksQ0FBQ0UsR0FBRyxDQUFDLENBQUMsR0FBR1IsTUFBTSxDQUFDLENBQUNPLFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFDdkUsTUFBTW5CLElBQUksQ0FBQ0UsY0FBYyxFQUFFVSxNQUFNLENBQUM7SUFDbkMsQ0FBQyxNQUFNO01BQ05OLE1BQU0sQ0FBQ1csS0FBSyxDQUFDLG9CQUFvQixDQUFDO01BQ2xDLE1BQU1qQixJQUFJLENBQUNFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDOUI7RUFDRDtBQUNEIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const configurationResult = yield (0, effects_1.take)((action) => (0, actions_1.isModelFetchResultAction)(action) && action.modelPath === 'configuration');
|
|
9
|
-
const configuration = configurationResult.data;
|
|
10
|
-
yield (0, effects_1.call)(configuration_1.setShardConfig, configuration);
|
|
1
|
+
import { call, take } from 'redux-saga/effects';
|
|
2
|
+
import { setShardConfig } from '../../constants/configuration';
|
|
3
|
+
import { isModelFetchResultAction } from '../actions';
|
|
4
|
+
export default function* configurationSaga() {
|
|
5
|
+
const configurationResult = yield take(action => isModelFetchResultAction(action) && action.modelPath === 'configuration');
|
|
6
|
+
const configuration = configurationResult.data;
|
|
7
|
+
yield call(setShardConfig, configuration);
|
|
11
8
|
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsIiwidGFrZSIsInNldFNoYXJkQ29uZmlnIiwiaXNNb2RlbEZldGNoUmVzdWx0QWN0aW9uIiwiY29uZmlndXJhdGlvblNhZ2EiLCJjb25maWd1cmF0aW9uUmVzdWx0IiwiYWN0aW9uIiwibW9kZWxQYXRoIiwiY29uZmlndXJhdGlvbiIsImRhdGEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVkdXgvc2FnYXMvY29uZmlndXJhdGlvblNhZ2EudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QWN0aW9uIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgeyBTYWdhSXRlcmF0b3IgfSBmcm9tICdyZWR1eC1zYWdhJ1xuaW1wb3J0IHsgY2FsbCwgdGFrZSB9IGZyb20gJ3JlZHV4LXNhZ2EvZWZmZWN0cydcbmltcG9ydCB7IHNldFNoYXJkQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbmZpZ3VyYXRpb24nXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBpc01vZGVsRmV0Y2hSZXN1bHRBY3Rpb24gfSBmcm9tICcuLi9hY3Rpb25zJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiogY29uZmlndXJhdGlvblNhZ2EoKTogU2FnYUl0ZXJhdG9yIHtcblx0Y29uc3QgY29uZmlndXJhdGlvblJlc3VsdCA9IHlpZWxkIHRha2UoXG5cdFx0KGFjdGlvbjogQW55QWN0aW9uKSA9PiBpc01vZGVsRmV0Y2hSZXN1bHRBY3Rpb24oYWN0aW9uKSAmJiBhY3Rpb24ubW9kZWxQYXRoID09PSAnY29uZmlndXJhdGlvbidcblx0KVxuXHRjb25zdCBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblJlc3VsdC5kYXRhXG5cdHlpZWxkIGNhbGwoc2V0U2hhcmRDb25maWcsIGNvbmZpZ3VyYXRpb24pXG59XG4iXSwibWFwcGluZ3MiOiJBQUVBLFNBQVNBLElBQUksRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUMvQyxTQUFTQyxjQUFjLFFBQVEsK0JBQStCO0FBRTlELFNBQVNDLHdCQUF3QixRQUFRLFlBQVk7QUFFckQsZUFBZSxVQUFVQyxpQkFBaUJBLENBQUEsRUFBaUI7RUFDMUQsTUFBTUMsbUJBQW1CLEdBQUcsTUFBTUosSUFBSSxDQUNwQ0ssTUFBaUIsSUFBS0gsd0JBQXdCLENBQUNHLE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNDLFNBQVMsS0FBSyxlQUNqRixDQUFDO0VBQ0QsTUFBTUMsYUFBNEIsR0FBR0gsbUJBQW1CLENBQUNJLElBQUk7RUFDN0QsTUFBTVQsSUFBSSxDQUFDRSxjQUFjLEVBQUVNLGFBQWEsQ0FBQztBQUMxQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
function* downtimeApiErrorSaga(runIndefinitely = true) {
|
|
1
|
+
import { push } from 'connected-react-router';
|
|
2
|
+
import { put, take } from 'redux-saga/effects';
|
|
3
|
+
import { HTTP_STATUS_CODE } from '../../types';
|
|
4
|
+
import { isModelTryFetchErrorAction } from '../actions';
|
|
5
|
+
export default function downtimeApiErrorSaga() {
|
|
6
|
+
let runIndefinitely = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
7
|
+
return function* () {
|
|
9
8
|
do {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// redirect to downtime route
|
|
18
|
-
yield (0, effects_1.put)((0, connected_react_router_1.push)({
|
|
19
|
-
pathname: '/downtime'
|
|
20
|
-
}));
|
|
9
|
+
// wait for any downtime error response
|
|
10
|
+
yield take(action => isModelTryFetchErrorAction(action) && action.errorData?.status === HTTP_STATUS_CODE.FORBIDDEN && action.errorData.title.includes("We'll be right back!"));
|
|
11
|
+
|
|
12
|
+
// redirect to downtime route
|
|
13
|
+
yield put(push({
|
|
14
|
+
pathname: '/downtime'
|
|
15
|
+
}));
|
|
21
16
|
} while (runIndefinitely);
|
|
17
|
+
}();
|
|
22
18
|
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwdXNoIiwicHV0IiwidGFrZSIsIkhUVFBfU1RBVFVTX0NPREUiLCJpc01vZGVsVHJ5RmV0Y2hFcnJvckFjdGlvbiIsImRvd250aW1lQXBpRXJyb3JTYWdhIiwicnVuSW5kZWZpbml0ZWx5IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiYWN0aW9uIiwiZXJyb3JEYXRhIiwic3RhdHVzIiwiRk9SQklEREVOIiwidGl0bGUiLCJpbmNsdWRlcyIsInBhdGhuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlZHV4L3NhZ2FzL2Rvd250aW1lQXBpRXJyb3JTYWdhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHB1c2ggfSBmcm9tICdjb25uZWN0ZWQtcmVhY3Qtcm91dGVyJ1xuaW1wb3J0IHsgQW55QWN0aW9uIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgeyBwdXQsIHRha2UgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnXG5pbXBvcnQgeyBIVFRQX1NUQVRVU19DT0RFIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBpc01vZGVsVHJ5RmV0Y2hFcnJvckFjdGlvbiB9IGZyb20gJy4uL2FjdGlvbnMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKiBkb3dudGltZUFwaUVycm9yU2FnYShydW5JbmRlZmluaXRlbHkgPSB0cnVlKSB7XG5cdGRvIHtcblx0XHQvLyB3YWl0IGZvciBhbnkgZG93bnRpbWUgZXJyb3IgcmVzcG9uc2Vcblx0XHR5aWVsZCB0YWtlKFxuXHRcdFx0KGFjdGlvbjogQW55QWN0aW9uKSA9PlxuXHRcdFx0XHRpc01vZGVsVHJ5RmV0Y2hFcnJvckFjdGlvbihhY3Rpb24pICYmXG5cdFx0XHRcdGFjdGlvbi5lcnJvckRhdGE/LnN0YXR1cyA9PT0gSFRUUF9TVEFUVVNfQ09ERS5GT1JCSURERU4gJiZcblx0XHRcdFx0YWN0aW9uLmVycm9yRGF0YS50aXRsZS5pbmNsdWRlcyhcIldlJ2xsIGJlIHJpZ2h0IGJhY2shXCIpXG5cdFx0KVxuXG5cdFx0Ly8gcmVkaXJlY3QgdG8gZG93bnRpbWUgcm91dGVcblx0XHR5aWVsZCBwdXQoXG5cdFx0XHRwdXNoKHtcblx0XHRcdFx0cGF0aG5hbWU6ICcvZG93bnRpbWUnXG5cdFx0XHR9KVxuXHRcdClcblx0fSB3aGlsZSAocnVuSW5kZWZpbml0ZWx5KVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxJQUFJLFFBQVEsd0JBQXdCO0FBRTdDLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUM5QyxTQUFTQyxnQkFBZ0IsUUFBUSxhQUFhO0FBQzlDLFNBQVNDLDBCQUEwQixRQUFRLFlBQVk7QUFFdkQsZUFBZSxTQUFVQyxvQkFBb0JBLENBQUE7RUFBQSxJQUFDQyxlQUFlLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFBQSxvQkFBRTtJQUNyRSxHQUFHO01BQ0Y7TUFDQSxNQUFNTCxJQUFJLENBQ1JRLE1BQWlCLElBQ2pCTiwwQkFBMEIsQ0FBQ00sTUFBTSxDQUFDLElBQ2xDQSxNQUFNLENBQUNDLFNBQVMsRUFBRUMsTUFBTSxLQUFLVCxnQkFBZ0IsQ0FBQ1UsU0FBUyxJQUN2REgsTUFBTSxDQUFDQyxTQUFTLENBQUNHLEtBQUssQ0FBQ0MsUUFBUSxDQUFDLHNCQUFzQixDQUN4RCxDQUFDOztNQUVEO01BQ0EsTUFBTWQsR0FBRyxDQUNSRCxJQUFJLENBQUM7UUFDSmdCLFFBQVEsRUFBRTtNQUNYLENBQUMsQ0FDRixDQUFDO0lBQ0YsQ0FBQyxRQUFRVixlQUFlO0VBQ3pCLENBQUM7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -1,26 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
search: (0, query_string_1.stringify)({ message })
|
|
21
|
-
}));
|
|
22
|
-
}
|
|
23
|
-
// check for error messages on location changes
|
|
24
|
-
yield (0, effects_1.take)((action) => action.type === connected_react_router_1.LOCATION_CHANGE);
|
|
1
|
+
import { LOCATION_CHANGE, push } from 'connected-react-router';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { parse, stringify } from 'query-string';
|
|
4
|
+
import { put, take } from 'redux-saga/effects';
|
|
5
|
+
import { windowService } from '../../services/windowService';
|
|
6
|
+
export default function* errorSaga() {
|
|
7
|
+
while (true) {
|
|
8
|
+
// check for error messages immediately at app startup
|
|
9
|
+
const location = windowService.getLocation();
|
|
10
|
+
const parsedSearch = parse(location.search);
|
|
11
|
+
// check possible error message keys
|
|
12
|
+
const message = parsedSearch._ltierrormsg || parsedSearch.error;
|
|
13
|
+
if (!_.isNil(message)) {
|
|
14
|
+
yield put(push({
|
|
15
|
+
pathname: '/error',
|
|
16
|
+
search: stringify({
|
|
17
|
+
message
|
|
18
|
+
})
|
|
19
|
+
}));
|
|
25
20
|
}
|
|
21
|
+
// check for error messages on location changes
|
|
22
|
+
yield take(action => action.type === LOCATION_CHANGE);
|
|
23
|
+
}
|
|
26
24
|
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMT0NBVElPTl9DSEFOR0UiLCJwdXNoIiwiXyIsInBhcnNlIiwic3RyaW5naWZ5IiwicHV0IiwidGFrZSIsIndpbmRvd1NlcnZpY2UiLCJlcnJvclNhZ2EiLCJsb2NhdGlvbiIsImdldExvY2F0aW9uIiwicGFyc2VkU2VhcmNoIiwic2VhcmNoIiwibWVzc2FnZSIsIl9sdGllcnJvcm1zZyIsImVycm9yIiwiaXNOaWwiLCJwYXRobmFtZSIsImFjdGlvbiIsInR5cGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVkdXgvc2FnYXMvZXJyb3JTYWdhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExPQ0FUSU9OX0NIQU5HRSwgcHVzaCB9IGZyb20gJ2Nvbm5lY3RlZC1yZWFjdC1yb3V0ZXInXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBwYXJzZSwgc3RyaW5naWZ5IH0gZnJvbSAncXVlcnktc3RyaW5nJ1xuaW1wb3J0IHsgQW55QWN0aW9uIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgeyBwdXQsIHRha2UgfSBmcm9tICdyZWR1eC1zYWdhL2VmZmVjdHMnXG5pbXBvcnQgeyB3aW5kb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvd2luZG93U2VydmljZSdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qIGVycm9yU2FnYSgpIHtcblx0d2hpbGUgKHRydWUpIHtcblx0XHQvLyBjaGVjayBmb3IgZXJyb3IgbWVzc2FnZXMgaW1tZWRpYXRlbHkgYXQgYXBwIHN0YXJ0dXBcblx0XHRjb25zdCBsb2NhdGlvbiA9IHdpbmRvd1NlcnZpY2UuZ2V0TG9jYXRpb24oKVxuXHRcdGNvbnN0IHBhcnNlZFNlYXJjaCA9IHBhcnNlKGxvY2F0aW9uLnNlYXJjaClcblx0XHQvLyBjaGVjayBwb3NzaWJsZSBlcnJvciBtZXNzYWdlIGtleXNcblx0XHRjb25zdCBtZXNzYWdlID0gcGFyc2VkU2VhcmNoLl9sdGllcnJvcm1zZyB8fCBwYXJzZWRTZWFyY2guZXJyb3Jcblx0XHRpZiAoIV8uaXNOaWwobWVzc2FnZSkpIHtcblx0XHRcdHlpZWxkIHB1dChcblx0XHRcdFx0cHVzaCh7XG5cdFx0XHRcdFx0cGF0aG5hbWU6ICcvZXJyb3InLFxuXHRcdFx0XHRcdHNlYXJjaDogc3RyaW5naWZ5KHsgbWVzc2FnZSB9KVxuXHRcdFx0XHR9KVxuXHRcdFx0KVxuXHRcdH1cblx0XHQvLyBjaGVjayBmb3IgZXJyb3IgbWVzc2FnZXMgb24gbG9jYXRpb24gY2hhbmdlc1xuXHRcdHlpZWxkIHRha2UoKGFjdGlvbjogQW55QWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gTE9DQVRJT05fQ0hBTkdFKVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsRUFBRUMsSUFBSSxRQUFRLHdCQUF3QjtBQUM5RCxPQUFPQyxDQUFDLE1BQU0sUUFBUTtBQUN0QixTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxjQUFjO0FBRS9DLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLG9CQUFvQjtBQUM5QyxTQUFTQyxhQUFhLFFBQVEsOEJBQThCO0FBRTVELGVBQWUsVUFBVUMsU0FBU0EsQ0FBQSxFQUFHO0VBQ3BDLE9BQU8sSUFBSSxFQUFFO0lBQ1o7SUFDQSxNQUFNQyxRQUFRLEdBQUdGLGFBQWEsQ0FBQ0csV0FBVyxDQUFDLENBQUM7SUFDNUMsTUFBTUMsWUFBWSxHQUFHUixLQUFLLENBQUNNLFFBQVEsQ0FBQ0csTUFBTSxDQUFDO0lBQzNDO0lBQ0EsTUFBTUMsT0FBTyxHQUFHRixZQUFZLENBQUNHLFlBQVksSUFBSUgsWUFBWSxDQUFDSSxLQUFLO0lBQy9ELElBQUksQ0FBQ2IsQ0FBQyxDQUFDYyxLQUFLLENBQUNILE9BQU8sQ0FBQyxFQUFFO01BQ3RCLE1BQU1SLEdBQUcsQ0FDUkosSUFBSSxDQUFDO1FBQ0pnQixRQUFRLEVBQUUsUUFBUTtRQUNsQkwsTUFBTSxFQUFFUixTQUFTLENBQUM7VUFBRVM7UUFBUSxDQUFDO01BQzlCLENBQUMsQ0FDRixDQUFDO0lBQ0Y7SUFDQTtJQUNBLE1BQU1QLElBQUksQ0FBRVksTUFBaUIsSUFBS0EsTUFBTSxDQUFDQyxJQUFJLEtBQUtuQixlQUFlLENBQUM7RUFDbkU7QUFDRCIsImlnbm9yZUxpc3QiOltdfQ==
|