@data-client/core 0.1.0
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/LICENSE +201 -0
- package/README.md +71 -0
- package/dist/index.js +1643 -0
- package/dist/index.umd.min.js +1 -0
- package/dist/next.js +461 -0
- package/dist/package.json +1 -0
- package/legacy/actionTypes.js +12 -0
- package/legacy/compatibleActions.js +2 -0
- package/legacy/controller/BaseController.js +289 -0
- package/legacy/controller/Controller.js +20 -0
- package/legacy/controller/createFetch.js +42 -0
- package/legacy/controller/createInvalidate.js +12 -0
- package/legacy/controller/createInvalidateAll.js +8 -0
- package/legacy/controller/createOptimistic.js +33 -0
- package/legacy/controller/createReceive.js +36 -0
- package/legacy/controller/createReset.js +8 -0
- package/legacy/controller/createSubscription.js +30 -0
- package/legacy/controller/types.js +2 -0
- package/legacy/endpoint/index.js +2 -0
- package/legacy/endpoint/shapes.js +2 -0
- package/legacy/endpoint/types.js +2 -0
- package/legacy/fsa.js +2 -0
- package/legacy/index.js +22 -0
- package/legacy/internal.js +4 -0
- package/legacy/legacyActions.js +2 -0
- package/legacy/manager/ConnectionListener.js +2 -0
- package/legacy/manager/DefaultConnectionListener.js +40 -0
- package/legacy/manager/DevtoolsManager.js +73 -0
- package/legacy/manager/LogoutManager.js +34 -0
- package/legacy/manager/NetworkManager.js +291 -0
- package/legacy/manager/PollingSubscription.js +159 -0
- package/legacy/manager/SubscriptionManager.js +117 -0
- package/legacy/manager/applyManager.js +23 -0
- package/legacy/manager/devtoolsTypes.js +2 -0
- package/legacy/manager/index.js +6 -0
- package/legacy/middlewareTypes.js +2 -0
- package/legacy/newActions.js +2 -0
- package/legacy/next/Controller.js +24 -0
- package/legacy/next/index.js +3 -0
- package/legacy/previousActions.js +2 -0
- package/legacy/state/RIC.js +3 -0
- package/legacy/state/applyUpdatersToResults.js +4 -0
- package/legacy/state/legacy-actions/createFetch.js +62 -0
- package/legacy/state/legacy-actions/createReceive.js +37 -0
- package/legacy/state/legacy-actions/createReceiveError.js +28 -0
- package/legacy/state/legacy-actions/index.js +4 -0
- package/legacy/state/reducer/createReducer.js +54 -0
- package/legacy/state/reducer/fetchReducer.js +32 -0
- package/legacy/state/reducer/invalidateReducer.js +28 -0
- package/legacy/state/reducer/setReducer.js +113 -0
- package/legacy/state/reducerInstance.js +9 -0
- package/legacy/state/selectMeta.js +4 -0
- package/legacy/types.js +8 -0
- package/lib/actionTypes.d.ts +11 -0
- package/lib/actionTypes.d.ts.map +1 -0
- package/lib/actionTypes.js +12 -0
- package/lib/compatibleActions.d.ts +47 -0
- package/lib/compatibleActions.d.ts.map +1 -0
- package/lib/compatibleActions.js +2 -0
- package/lib/controller/BaseController.d.ts +128 -0
- package/lib/controller/BaseController.d.ts.map +1 -0
- package/lib/controller/BaseController.js +289 -0
- package/lib/controller/Controller.d.ts +14 -0
- package/lib/controller/Controller.d.ts.map +1 -0
- package/lib/controller/Controller.js +20 -0
- package/lib/controller/createFetch.d.ts +12 -0
- package/lib/controller/createFetch.d.ts.map +1 -0
- package/lib/controller/createFetch.js +42 -0
- package/lib/controller/createInvalidate.d.ts +6 -0
- package/lib/controller/createInvalidate.d.ts.map +1 -0
- package/lib/controller/createInvalidate.js +12 -0
- package/lib/controller/createInvalidateAll.d.ts +3 -0
- package/lib/controller/createInvalidateAll.d.ts.map +1 -0
- package/lib/controller/createInvalidateAll.js +8 -0
- package/lib/controller/createOptimistic.d.ts +10 -0
- package/lib/controller/createOptimistic.d.ts.map +1 -0
- package/lib/controller/createOptimistic.js +33 -0
- package/lib/controller/createReceive.d.ts +20 -0
- package/lib/controller/createReceive.d.ts.map +1 -0
- package/lib/controller/createReceive.js +36 -0
- package/lib/controller/createReset.d.ts +3 -0
- package/lib/controller/createReset.d.ts.map +1 -0
- package/lib/controller/createReset.js +8 -0
- package/lib/controller/createSubscription.d.ts +9 -0
- package/lib/controller/createSubscription.d.ts.map +1 -0
- package/lib/controller/createSubscription.js +30 -0
- package/lib/controller/types.d.ts +6 -0
- package/lib/controller/types.d.ts.map +1 -0
- package/lib/controller/types.js +2 -0
- package/lib/endpoint/index.d.ts +3 -0
- package/lib/endpoint/index.d.ts.map +1 -0
- package/lib/endpoint/index.js +2 -0
- package/lib/endpoint/shapes.d.ts +25 -0
- package/lib/endpoint/shapes.d.ts.map +1 -0
- package/lib/endpoint/shapes.js +2 -0
- package/lib/endpoint/types.d.ts +45 -0
- package/lib/endpoint/types.d.ts.map +1 -0
- package/lib/endpoint/types.js +2 -0
- package/lib/fsa.d.ts +41 -0
- package/lib/fsa.d.ts.map +1 -0
- package/lib/fsa.js +2 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +22 -0
- package/lib/internal.d.ts +4 -0
- package/lib/internal.d.ts.map +1 -0
- package/lib/internal.js +4 -0
- package/lib/legacyActions.d.ts +92 -0
- package/lib/legacyActions.d.ts.map +1 -0
- package/lib/legacyActions.js +2 -0
- package/lib/manager/ConnectionListener.d.ts +8 -0
- package/lib/manager/ConnectionListener.d.ts.map +1 -0
- package/lib/manager/ConnectionListener.js +2 -0
- package/lib/manager/DefaultConnectionListener.d.ts +20 -0
- package/lib/manager/DefaultConnectionListener.d.ts.map +1 -0
- package/lib/manager/DefaultConnectionListener.js +40 -0
- package/lib/manager/DevtoolsManager.d.ts +24 -0
- package/lib/manager/DevtoolsManager.d.ts.map +1 -0
- package/lib/manager/DevtoolsManager.js +74 -0
- package/lib/manager/LogoutManager.d.ts +25 -0
- package/lib/manager/LogoutManager.d.ts.map +1 -0
- package/lib/manager/LogoutManager.js +34 -0
- package/lib/manager/NetworkManager.d.ts +82 -0
- package/lib/manager/NetworkManager.d.ts.map +1 -0
- package/lib/manager/NetworkManager.js +295 -0
- package/lib/manager/PollingSubscription.d.ts +45 -0
- package/lib/manager/PollingSubscription.d.ts.map +1 -0
- package/lib/manager/PollingSubscription.js +159 -0
- package/lib/manager/SubscriptionManager.d.ts +55 -0
- package/lib/manager/SubscriptionManager.d.ts.map +1 -0
- package/lib/manager/SubscriptionManager.js +117 -0
- package/lib/manager/applyManager.d.ts +10 -0
- package/lib/manager/applyManager.d.ts.map +1 -0
- package/lib/manager/applyManager.js +23 -0
- package/lib/manager/devtoolsTypes.d.ts +205 -0
- package/lib/manager/devtoolsTypes.d.ts.map +1 -0
- package/lib/manager/devtoolsTypes.js +2 -0
- package/lib/manager/index.d.ts +8 -0
- package/lib/manager/index.d.ts.map +1 -0
- package/lib/manager/index.js +6 -0
- package/lib/middlewareTypes.d.ts +18 -0
- package/lib/middlewareTypes.d.ts.map +1 -0
- package/lib/middlewareTypes.js +2 -0
- package/lib/newActions.d.ts +85 -0
- package/lib/newActions.d.ts.map +1 -0
- package/lib/newActions.js +2 -0
- package/lib/next/Controller.d.ts +14 -0
- package/lib/next/Controller.d.ts.map +1 -0
- package/lib/next/Controller.js +24 -0
- package/lib/next/index.d.ts +3 -0
- package/lib/next/index.d.ts.map +1 -0
- package/lib/next/index.js +3 -0
- package/lib/previousActions.d.ts +91 -0
- package/lib/previousActions.d.ts.map +1 -0
- package/lib/previousActions.js +2 -0
- package/lib/state/RIC.d.ts +2 -0
- package/lib/state/RIC.js +3 -0
- package/lib/state/applyUpdatersToResults.d.ts +13 -0
- package/lib/state/applyUpdatersToResults.d.ts.map +1 -0
- package/lib/state/applyUpdatersToResults.js +7 -0
- package/lib/state/legacy-actions/createFetch.d.ts +19 -0
- package/lib/state/legacy-actions/createFetch.d.ts.map +1 -0
- package/lib/state/legacy-actions/createFetch.js +62 -0
- package/lib/state/legacy-actions/createReceive.d.ts +14 -0
- package/lib/state/legacy-actions/createReceive.d.ts.map +1 -0
- package/lib/state/legacy-actions/createReceive.js +37 -0
- package/lib/state/legacy-actions/createReceiveError.d.ts +9 -0
- package/lib/state/legacy-actions/createReceiveError.d.ts.map +1 -0
- package/lib/state/legacy-actions/createReceiveError.js +28 -0
- package/lib/state/legacy-actions/index.d.ts +4 -0
- package/lib/state/legacy-actions/index.d.ts.map +1 -0
- package/lib/state/legacy-actions/index.js +4 -0
- package/lib/state/reducer/createReducer.d.ts +7 -0
- package/lib/state/reducer/createReducer.d.ts.map +1 -0
- package/lib/state/reducer/createReducer.js +55 -0
- package/lib/state/reducer/fetchReducer.d.ts +4 -0
- package/lib/state/reducer/fetchReducer.d.ts.map +1 -0
- package/lib/state/reducer/fetchReducer.js +34 -0
- package/lib/state/reducer/invalidateReducer.d.ts +37 -0
- package/lib/state/reducer/invalidateReducer.d.ts.map +1 -0
- package/lib/state/reducer/invalidateReducer.js +34 -0
- package/lib/state/reducer/setReducer.d.ts +40 -0
- package/lib/state/reducer/setReducer.d.ts.map +1 -0
- package/lib/state/reducer/setReducer.js +119 -0
- package/lib/state/reducerInstance.d.ts +7 -0
- package/lib/state/reducerInstance.d.ts.map +1 -0
- package/lib/state/reducerInstance.js +9 -0
- package/lib/state/selectMeta.d.ts +3 -0
- package/lib/state/selectMeta.d.ts.map +1 -0
- package/lib/state/selectMeta.js +4 -0
- package/lib/types.d.ts +71 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +8 -0
- package/node.mjs +1 -0
- package/package.json +127 -0
- package/src/actionTypes.ts +11 -0
- package/src/compatibleActions.ts +96 -0
- package/src/controller/BaseController.ts +508 -0
- package/src/controller/Controller.ts +32 -0
- package/src/controller/__tests__/Controller.ts +29 -0
- package/src/controller/__tests__/__snapshots__/getResponse.ts.snap +35 -0
- package/src/controller/__tests__/getResponse.ts +182 -0
- package/src/controller/createFetch.ts +54 -0
- package/src/controller/createInvalidate.ts +16 -0
- package/src/controller/createInvalidateAll.ts +11 -0
- package/src/controller/createOptimistic.ts +47 -0
- package/src/controller/createReceive.ts +85 -0
- package/src/controller/createReset.ts +9 -0
- package/src/controller/createSubscription.ts +39 -0
- package/src/controller/types.ts +22 -0
- package/src/endpoint/index.ts +14 -0
- package/src/endpoint/shapes.ts +53 -0
- package/src/endpoint/types.ts +72 -0
- package/src/fsa.ts +99 -0
- package/src/index.ts +61 -0
- package/src/internal.ts +3 -0
- package/src/legacyActions.ts +163 -0
- package/src/manager/ConnectionListener.ts +7 -0
- package/src/manager/DefaultConnectionListener.ts +54 -0
- package/src/manager/DevtoolsManager.ts +99 -0
- package/src/manager/LogoutManager.ts +57 -0
- package/src/manager/NetworkManager.ts +346 -0
- package/src/manager/PollingSubscription.ts +190 -0
- package/src/manager/SubscriptionManager.ts +156 -0
- package/src/manager/__tests__/__snapshots__/pollingSubscription-endpoint.ts.snap +49 -0
- package/src/manager/__tests__/__snapshots__/pollingSubscription.ts.snap +43 -0
- package/src/manager/__tests__/logoutManager.ts +112 -0
- package/src/manager/__tests__/manager.ts +44 -0
- package/src/manager/__tests__/networkManager-legacy.ts +394 -0
- package/src/manager/__tests__/networkManager.ts +426 -0
- package/src/manager/__tests__/pollingSubscription-endpoint.ts +423 -0
- package/src/manager/__tests__/pollingSubscription.ts +313 -0
- package/src/manager/__tests__/subscriptionManager.ts +208 -0
- package/src/manager/applyManager.ts +33 -0
- package/src/manager/devtoolsTypes.ts +210 -0
- package/src/manager/index.ts +7 -0
- package/src/middlewareTypes.ts +49 -0
- package/src/newActions.ts +140 -0
- package/src/next/Controller.ts +39 -0
- package/src/next/index.ts +2 -0
- package/src/package.json +1 -0
- package/src/previousActions.ts +159 -0
- package/src/state/RIC.d.ts +2 -0
- package/src/state/RIC.js +5 -0
- package/src/state/__tests__/RIC.web.ts +16 -0
- package/src/state/__tests__/__snapshots__/reducer.ts.snap +56 -0
- package/src/state/__tests__/applyUpdatersToResults.ts +40 -0
- package/src/state/__tests__/reducer.ts +868 -0
- package/src/state/applyUpdatersToResults.ts +29 -0
- package/src/state/legacy-actions/createFetch.ts +95 -0
- package/src/state/legacy-actions/createReceive.ts +68 -0
- package/src/state/legacy-actions/createReceiveError.ts +43 -0
- package/src/state/legacy-actions/index.ts +3 -0
- package/src/state/reducer/createReducer.ts +80 -0
- package/src/state/reducer/fetchReducer.ts +48 -0
- package/src/state/reducer/invalidateReducer.ts +39 -0
- package/src/state/reducer/setReducer.ts +157 -0
- package/src/state/reducerInstance.ts +14 -0
- package/src/state/selectMeta.ts +8 -0
- package/src/types.ts +125 -0
- package/ts3.4/actionTypes.d.ts +11 -0
- package/ts3.4/compatibleActions.d.ts +47 -0
- package/ts3.4/controller/BaseController.d.ts +170 -0
- package/ts3.4/controller/Controller.d.ts +14 -0
- package/ts3.4/controller/createFetch.d.ts +14 -0
- package/ts3.4/controller/createInvalidate.d.ts +8 -0
- package/ts3.4/controller/createInvalidateAll.d.ts +3 -0
- package/ts3.4/controller/createOptimistic.d.ts +12 -0
- package/ts3.4/controller/createReceive.d.ts +24 -0
- package/ts3.4/controller/createReset.d.ts +3 -0
- package/ts3.4/controller/createSubscription.d.ts +13 -0
- package/ts3.4/controller/types.d.ts +6 -0
- package/ts3.4/endpoint/index.d.ts +3 -0
- package/ts3.4/endpoint/shapes.d.ts +25 -0
- package/ts3.4/endpoint/types.d.ts +45 -0
- package/ts3.4/fsa.d.ts +41 -0
- package/ts3.4/index.d.ts +22 -0
- package/ts3.4/internal.d.ts +4 -0
- package/ts3.4/legacyActions.d.ts +95 -0
- package/ts3.4/manager/ConnectionListener.d.ts +8 -0
- package/ts3.4/manager/DefaultConnectionListener.d.ts +20 -0
- package/ts3.4/manager/DevtoolsManager.d.ts +24 -0
- package/ts3.4/manager/LogoutManager.d.ts +25 -0
- package/ts3.4/manager/NetworkManager.d.ts +82 -0
- package/ts3.4/manager/PollingSubscription.d.ts +45 -0
- package/ts3.4/manager/SubscriptionManager.d.ts +55 -0
- package/ts3.4/manager/applyManager.d.ts +10 -0
- package/ts3.4/manager/devtoolsTypes.d.ts +205 -0
- package/ts3.4/manager/index.d.ts +8 -0
- package/ts3.4/middlewareTypes.d.ts +18 -0
- package/ts3.4/newActions.d.ts +88 -0
- package/ts3.4/next/Controller.d.ts +14 -0
- package/ts3.4/next/index.d.ts +3 -0
- package/ts3.4/previousActions.d.ts +94 -0
- package/ts3.4/state/RIC.d.ts +2 -0
- package/ts3.4/state/applyUpdatersToResults.d.ts +13 -0
- package/ts3.4/state/legacy-actions/createFetch.d.ts +19 -0
- package/ts3.4/state/legacy-actions/createReceive.d.ts +14 -0
- package/ts3.4/state/legacy-actions/createReceiveError.d.ts +9 -0
- package/ts3.4/state/legacy-actions/index.d.ts +4 -0
- package/ts3.4/state/reducer/createReducer.d.ts +7 -0
- package/ts3.4/state/reducer/fetchReducer.d.ts +4 -0
- package/ts3.4/state/reducer/invalidateReducer.d.ts +37 -0
- package/ts3.4/state/reducer/setReducer.d.ts +40 -0
- package/ts3.4/state/reducerInstance.d.ts +7 -0
- package/ts3.4/state/selectMeta.d.ts +3 -0
- package/ts3.4/types.d.ts +73 -0
- package/typescript.svg +8 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DevToolsConfig } from './devtoolsTypes.js';
|
|
2
|
+
import type { Middleware } from './LogoutManager.js';
|
|
3
|
+
import type { Manager, State, ActionTypes } from '../types.js';
|
|
4
|
+
export type { DevToolsConfig };
|
|
5
|
+
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
6
|
+
*
|
|
7
|
+
* Options: https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md
|
|
8
|
+
*
|
|
9
|
+
* @see https://resthooks.io/docs/api/DevToolsManager
|
|
10
|
+
*/
|
|
11
|
+
export default class DevToolsManager implements Manager {
|
|
12
|
+
protected middleware: Middleware;
|
|
13
|
+
protected devTools: undefined | any;
|
|
14
|
+
constructor(config?: DevToolsConfig, skipLogging?: (action: ActionTypes) => boolean);
|
|
15
|
+
/** Called when initial state is ready */
|
|
16
|
+
init(state: State<any>): void;
|
|
17
|
+
/** Ensures all subscriptions are cleaned up. */
|
|
18
|
+
cleanup(): void;
|
|
19
|
+
/** Attaches Manager to store
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
getMiddleware(): Middleware;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=DevtoolsManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevtoolsManager.d.ts","sourceRoot":"","sources":["../../src/manager/DevtoolsManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,YAAY,EAAE,cAAc,EAAE,CAAC;AA8B/B;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,OAAO;IACrD,UAAkB,UAAU,EAAE,UAAU,CAAC;IACzC,UAAkB,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC;gBAG1C,MAAM,CAAC,EAAE,cAAc,EACvB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO;IAoChD,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAKtB,gDAAgD;IAChD,OAAO;IAEP;;OAEG;IACH,aAAa;CAGd"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
var _globalThis$document;
|
|
2
|
+
import createReducer from '../state/reducer/createReducer.js';
|
|
3
|
+
const HASINTL = typeof Intl !== 'undefined';
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
name: `Rest Hooks: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
|
|
6
|
+
autoPause: true,
|
|
7
|
+
serialize: {
|
|
8
|
+
options: undefined,
|
|
9
|
+
/* istanbul ignore next */
|
|
10
|
+
replacer: HASINTL ? (key, value) => {
|
|
11
|
+
if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
|
|
12
|
+
return Intl.DateTimeFormat('en-US', {
|
|
13
|
+
hour: 'numeric',
|
|
14
|
+
minute: 'numeric',
|
|
15
|
+
second: 'numeric',
|
|
16
|
+
fractionalSecondDigits: 3
|
|
17
|
+
}).format(value);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
} : undefined
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** Integrates with https://github.com/reduxjs/redux-devtools
|
|
25
|
+
*
|
|
26
|
+
* Options: https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md
|
|
27
|
+
*
|
|
28
|
+
* @see https://resthooks.io/docs/api/DevToolsManager
|
|
29
|
+
*/
|
|
30
|
+
export default class DevToolsManager {
|
|
31
|
+
constructor(config, skipLogging) {
|
|
32
|
+
/* istanbul ignore next */
|
|
33
|
+
this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect({
|
|
34
|
+
...DEFAULT_CONFIG,
|
|
35
|
+
config
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/* istanbul ignore if */
|
|
39
|
+
/* istanbul ignore next */
|
|
40
|
+
if (this.devTools) {
|
|
41
|
+
this.middleware = controller => {
|
|
42
|
+
const reducer = createReducer(controller);
|
|
43
|
+
return next => action => {
|
|
44
|
+
const ret = next(action);
|
|
45
|
+
ret.then(() => {
|
|
46
|
+
if (skipLogging != null && skipLogging(action)) return;
|
|
47
|
+
const state = controller.getState();
|
|
48
|
+
this.devTools.send(action, state.optimistic.reduce(reducer, state), undefined, 'REST_HOOKS');
|
|
49
|
+
});
|
|
50
|
+
return ret;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
this.middleware = () => next => action => next(action);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Called when initial state is ready */
|
|
59
|
+
init(state) {
|
|
60
|
+
/* istanbul ignore if */
|
|
61
|
+
if (this.devTools) this.devTools.init(state);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Ensures all subscriptions are cleaned up. */
|
|
65
|
+
cleanup() {}
|
|
66
|
+
|
|
67
|
+
/** Attaches Manager to store
|
|
68
|
+
*
|
|
69
|
+
*/
|
|
70
|
+
getMiddleware() {
|
|
71
|
+
return this.middleware;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiSEFTSU5UTCIsIkludGwiLCJERUZBVUxUX0NPTkZJRyIsIm5hbWUiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImdsb2JhbFRoaXMiLCJkb2N1bWVudCIsInRpdGxlIiwiYXV0b1BhdXNlIiwic2VyaWFsaXplIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc0Zpbml0ZSIsImVuZHNXaXRoIiwiRGF0ZVRpbWVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiZnJhY3Rpb25hbFNlY29uZERpZ2l0cyIsImZvcm1hdCIsIkRldlRvb2xzTWFuYWdlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwic2tpcExvZ2dpbmciLCJkZXZUb29scyIsIndpbmRvdyIsIl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18iLCJjb25uZWN0IiwibWlkZGxld2FyZSIsImNvbnRyb2xsZXIiLCJyZWR1Y2VyIiwibmV4dCIsImFjdGlvbiIsInJldCIsInRoZW4iLCJzdGF0ZSIsImdldFN0YXRlIiwic2VuZCIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiLCJpbml0IiwiY2xlYW51cCIsImdldE1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuL0xvZ291dE1hbmFnZXIuanMnO1xuaW1wb3J0IGNyZWF0ZVJlZHVjZXIgZnJvbSAnLi4vc3RhdGUvcmVkdWNlci9jcmVhdGVSZWR1Y2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuYWdlciwgU3RhdGUsIEFjdGlvblR5cGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSB7IERldlRvb2xzQ29uZmlnIH07XG5cbmNvbnN0IEhBU0lOVEwgPSB0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCc7XG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcbiAgbmFtZTogYFJlc3QgSG9va3M6ICR7Z2xvYmFsVGhpcy5kb2N1bWVudD8udGl0bGV9YCxcbiAgYXV0b1BhdXNlOiB0cnVlLFxuICBzZXJpYWxpemU6IHtcbiAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXBsYWNlcjogSEFTSU5UTFxuICAgICAgPyAoa2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIGlzRmluaXRlKHZhbHVlKSAmJlxuICAgICAgICAgICAgKGtleSA9PT0gJ2RhdGUnIHx8IGtleS5lbmRzV2l0aCgnQXQnKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgICAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsXG4gICAgICAgICAgICB9KS5mb3JtYXQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9LFxufTtcblxuLyoqIEludGVncmF0ZXMgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vcmVkdXhqcy9yZWR1eC1kZXZ0b29sc1xuICpcbiAqIE9wdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzL2Jsb2IvbWFpbi9leHRlbnNpb24vZG9jcy9BUEkvQXJndW1lbnRzLm1kXG4gKlxuICogQHNlZSBodHRwczovL3Jlc3Rob29rcy5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBkZWNsYXJlIGRldlRvb2xzOiB1bmRlZmluZWQgfCBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aGlzLmRldlRvb2xzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyAmJlxuICAgICAgKHdpbmRvdyBhcyBhbnkpLl9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18uY29ubmVjdCh7XG4gICAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgICBjb25maWcsXG4gICAgICB9KTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuZGV2VG9vbHMpIHtcbiAgICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcihjb250cm9sbGVyIGFzIGFueSk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIHJldC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChza2lwTG9nZ2luZz8uKGFjdGlvbikpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5kZXZUb29scy5zZW5kKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHN0YXRlLm9wdGltaXN0aWMucmVkdWNlKHJlZHVjZXIsIHN0YXRlKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAnUkVTVF9IT09LUycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmUgPSAoKSA9PiBuZXh0ID0+IGFjdGlvbiA9PiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIGluaXRpYWwgc3RhdGUgaXMgcmVhZHkgKi9cbiAgaW5pdChzdGF0ZTogU3RhdGU8YW55Pikge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLmRldlRvb2xzKSB0aGlzLmRldlRvb2xzLmluaXQoc3RhdGUpO1xuICB9XG5cbiAgLyoqIEVuc3VyZXMgYWxsIHN1YnNjcmlwdGlvbnMgYXJlIGNsZWFuZWQgdXAuICovXG4gIGNsZWFudXAoKSB7fVxuXG4gIC8qKiBBdHRhY2hlcyBNYW5hZ2VyIHRvIHN0b3JlXG4gICAqXG4gICAqL1xuICBnZXRNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiB0aGlzLm1pZGRsZXdhcmU7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsTUFBTUMsT0FBTyxHQUFH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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Controller from '../controller/Controller.js';
|
|
2
|
+
import { UnknownError } from '../index.js';
|
|
3
|
+
import type { CombinedActionTypes } from '../types.js';
|
|
4
|
+
import { Manager } from '../types.js';
|
|
5
|
+
/** Handling network unauthorized indicators like HTTP 401
|
|
6
|
+
*
|
|
7
|
+
* @see https://resthooks.io/docs/api/LogoutManager
|
|
8
|
+
*/
|
|
9
|
+
export default class LogoutManager implements Manager<CombinedActionTypes> {
|
|
10
|
+
protected middleware: Middleware;
|
|
11
|
+
constructor({ handleLogout, shouldLogout }?: Props);
|
|
12
|
+
cleanup(): void;
|
|
13
|
+
getMiddleware(): Middleware;
|
|
14
|
+
protected shouldLogout(error: UnknownError): boolean;
|
|
15
|
+
handleLogout(controller: Controller<Dispatch>): void;
|
|
16
|
+
}
|
|
17
|
+
type Dispatch = (value: CombinedActionTypes) => Promise<void>;
|
|
18
|
+
export type Middleware = <C extends Controller<Dispatch>>(controller: C) => (next: C['dispatch']) => C['dispatch'];
|
|
19
|
+
type HandleLogout = (controller: Controller<Dispatch>) => void;
|
|
20
|
+
interface Props {
|
|
21
|
+
handleLogout?: HandleLogout;
|
|
22
|
+
shouldLogout?: (error: UnknownError) => boolean;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=LogoutManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogoutManager.d.ts","sourceRoot":"","sources":["../../src/manager/LogoutManager.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,OAAO,CAAC,mBAAmB,CAAC;IACxE,UAAkB,UAAU,EAAE,UAAU,CAAC;gBAE7B,EAAE,YAAY,EAAE,YAAY,EAAE,GAAE,KAAU;IAetD,OAAO;IAEP,aAAa;IAIb,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY;IAK1C,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;CAG9C;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAG9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,UAAU,CAAC,QAAQ,CAAC,EACtD,UAAU,EAAE,CAAC,KACV,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;AAE5C,KAAK,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAE/D,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CACjD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SET_TYPE } from '../actionTypes.js';
|
|
2
|
+
/** Handling network unauthorized indicators like HTTP 401
|
|
3
|
+
*
|
|
4
|
+
* @see https://resthooks.io/docs/api/LogoutManager
|
|
5
|
+
*/
|
|
6
|
+
export default class LogoutManager {
|
|
7
|
+
constructor({
|
|
8
|
+
handleLogout,
|
|
9
|
+
shouldLogout
|
|
10
|
+
} = {}) {
|
|
11
|
+
if (handleLogout) this.handleLogout = handleLogout;
|
|
12
|
+
if (shouldLogout) this.shouldLogout = shouldLogout;
|
|
13
|
+
this.middleware = controller => next => async action => {
|
|
14
|
+
await next(action);
|
|
15
|
+
if (action.type === SET_TYPE && action.error && this.shouldLogout(action.payload)) {
|
|
16
|
+
this.handleLogout(controller);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
cleanup() {}
|
|
21
|
+
getMiddleware() {
|
|
22
|
+
return this.middleware;
|
|
23
|
+
}
|
|
24
|
+
shouldLogout(error) {
|
|
25
|
+
// 401 indicates reauthorization is needed
|
|
26
|
+
return error.status === 401;
|
|
27
|
+
}
|
|
28
|
+
handleLogout(controller) {
|
|
29
|
+
controller.resetEntireStore();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// this further restricts the types to be future compatible
|
|
34
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkxvZ291dE1hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImhhbmRsZUxvZ291dCIsInNob3VsZExvZ291dCIsIm1pZGRsZXdhcmUiLCJjb250cm9sbGVyIiwibmV4dCIsImFjdGlvbiIsInR5cGUiLCJlcnJvciIsInBheWxvYWQiLCJjbGVhbnVwIiwiZ2V0TWlkZGxld2FyZSIsInN0YXR1cyIsInJlc2V0RW50aXJlU3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9Mb2dvdXRNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFVF9UWVBFIH0gZnJvbSAnLi4vYWN0aW9uVHlwZXMuanMnO1xuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi4vY29udHJvbGxlci9Db250cm9sbGVyLmpzJztcbmltcG9ydCB7IFVua25vd25FcnJvciB9IGZyb20gJy4uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRBY3Rpb25UeXBlcyB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKiBIYW5kbGluZyBuZXR3b3JrIHVuYXV0aG9yaXplZCBpbmRpY2F0b3JzIGxpa2UgSFRUUCA0MDFcbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL0xvZ291dE1hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nb3V0TWFuYWdlciBpbXBsZW1lbnRzIE1hbmFnZXI8Q29tYmluZWRBY3Rpb25UeXBlcz4ge1xuICBwcm90ZWN0ZWQgZGVjbGFyZSBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlO1xuXG4gIGNvbnN0cnVjdG9yKHsgaGFuZGxlTG9nb3V0LCBzaG91bGRMb2dvdXQgfTogUHJvcHMgPSB7fSkge1xuICAgIGlmIChoYW5kbGVMb2dvdXQpIHRoaXMuaGFuZGxlTG9nb3V0ID0gaGFuZGxlTG9nb3V0O1xuICAgIGlmIChzaG91bGRMb2dvdXQpIHRoaXMuc2hvdWxkTG9nb3V0ID0gc2hvdWxkTG9nb3V0O1xuICAgIHRoaXMubWlkZGxld2FyZSA9IGNvbnRyb2xsZXIgPT4gbmV4dCA9PiBhc3luYyBhY3Rpb24gPT4ge1xuICAgICAgYXdhaXQgbmV4dChhY3Rpb24pO1xuICAgICAgaWYgKFxuICAgICAgICBhY3Rpb24udHlwZSA9PT0gU0VUX1RZUEUgJiZcbiAgICAgICAgYWN0aW9uLmVycm9yICYmXG4gICAgICAgIHRoaXMuc2hvdWxkTG9nb3V0KGFjdGlvbi5wYXlsb2FkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTG9nb3V0KGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjbGVhbnVwKCkge31cblxuICBnZXRNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiB0aGlzLm1pZGRsZXdhcmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkTG9nb3V0KGVycm9yOiBVbmtub3duRXJyb3IpIHtcbiAgICAvLyA0MDEgaW5kaWNhdGVzIHJlYXV0aG9yaXphdGlvbiBpcyBuZWVkZWRcbiAgICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDE7XG4gIH1cblxuICBoYW5kbGVMb2dvdXQoY29udHJvbGxlcjogQ29udHJvbGxlcjxEaXNwYXRjaD4pIHtcbiAgICBjb250cm9sbGVyLnJlc2V0RW50aXJlU3RvcmUoKTtcbiAgfVxufVxuXG50eXBlIERpc3BhdGNoID0gKHZhbHVlOiBDb21iaW5lZEFjdGlvblR5cGVzKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vLyB0aGlzIGZ1cnRoZXIgcmVzdHJpY3RzIHRoZSB0eXBlcyB0byBiZSBmdXR1cmUgY29tcGF0aWJsZVxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZSA9IDxDIGV4dGVuZHMgQ29udHJvbGxlcjxEaXNwYXRjaD4+KFxuICBjb250cm9sbGVyOiBDLFxuKSA9PiAobmV4dDogQ1snZGlzcGF0Y2gnXSkgPT4gQ1snZGlzcGF0Y2gnXTtcblxudHlwZSBIYW5kbGVMb2dvdXQgPSAoY29udHJvbGxlcjogQ29udHJvbGxlcjxEaXNwYXRjaD4pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIGhhbmRsZUxvZ291dD86IEhhbmRsZUxvZ291dDtcbiAgc2hvdWxkTG9nb3V0PzogKGVycm9yOiBVbmtub3duRXJyb3IpID0+IGJvb2xlYW47XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsUUFBUSxtQkFBbUI7QUFNNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU1DLGFBQWEsQ0FBeUM7RUFHekVDLFdBQVdBLENBQUM7SUFBRUMsWUFBWTtJQUFFQztFQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDdEQsSUFBSUQsWUFBWSxFQUFFLElBQUksQ0FBQ0EsWUFBWSxHQUFHQSxZQUFZO0lBQ2xELElBQUlDLFlBQVksRUFBRSxJQUFJLENBQUNBLFlBQVksR0FBR0EsWUFBWTtJQUNsRCxJQUFJLENBQUNDLFVBQVUsR0FBR0MsVUFBVSxJQUFJQyxJQUFJLElBQUksTUFBTUMsTUFBTSxJQUFJO01BQ3RELE1BQU1ELElBQUksQ0FBQ0MsTUFBTSxDQUFDO01BQ2xCLElBQ0VBLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLVCxRQUFRLElBQ3hCUSxNQUFNLENBQUNFLEtBQUssSUFDWixJQUFJLENBQUNOLFlBQVksQ0FBQ0ksTUFBTSxDQUFDRyxPQUFPLENBQUMsRUFDakM7UUFDQSxJQUFJLENBQUNSLFlBQVksQ0FBQ0csVUFBVSxDQUFDO01BQy9CO0lBQ0YsQ0FBQztFQUNIO0VBRUFNLE9BQU9BLENBQUEsRUFBRyxDQUFDO0VBRVhDLGFBQWFBLENBQUEsRUFBRztJQUNkLE9BQU8sSUFBSSxDQUFDUixVQUFVO0VBQ3hCO0VBRVVELFlBQVlBLENBQUNNLEtBQW1CLEVBQUU7SUFDMUM7SUFDQSxPQUFPQSxLQUFLLENBQUNJLE1BQU0sS0FBSyxHQUFHO0VBQzdCO0VBRUFYLFlBQVlBLENBQUNHLFVBQWdDLEVBQUU7SUFDN0NBLFVBQVUsQ0FBQ1MsZ0JBQWdCLENBQUMsQ0FBQztFQUMvQjtBQUNGOztBQUlBIn0=
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import Controller from '../controller/Controller.js';
|
|
2
|
+
import type { FetchAction, ReceiveAction, Manager, ActionTypes, Middleware, State } from '../types.js';
|
|
3
|
+
export declare class ResetError extends Error {
|
|
4
|
+
name: string;
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
/** Handles all async network dispatches
|
|
8
|
+
*
|
|
9
|
+
* Dedupes concurrent requests by keeping track of all fetches in flight
|
|
10
|
+
* and returning existing promises for requests already in flight.
|
|
11
|
+
*
|
|
12
|
+
* Interfaces with store via a redux-compatible middleware.
|
|
13
|
+
*
|
|
14
|
+
* @see https://resthooks.io/docs/api/NetworkManager
|
|
15
|
+
*/
|
|
16
|
+
export default class NetworkManager implements Manager {
|
|
17
|
+
protected fetched: {
|
|
18
|
+
[k: string]: Promise<any>;
|
|
19
|
+
};
|
|
20
|
+
protected resolvers: {
|
|
21
|
+
[k: string]: (value?: any) => void;
|
|
22
|
+
};
|
|
23
|
+
protected rejectors: {
|
|
24
|
+
[k: string]: (value?: any) => void;
|
|
25
|
+
};
|
|
26
|
+
protected fetchedAt: {
|
|
27
|
+
[k: string]: number;
|
|
28
|
+
};
|
|
29
|
+
readonly dataExpiryLength: number;
|
|
30
|
+
readonly errorExpiryLength: number;
|
|
31
|
+
protected middleware: Middleware;
|
|
32
|
+
protected getState: () => State<unknown>;
|
|
33
|
+
protected controller: Controller;
|
|
34
|
+
cleanupDate?: number;
|
|
35
|
+
constructor(dataExpiryLength?: number, errorExpiryLength?: number);
|
|
36
|
+
/** Used by DevtoolsManager to determine whether to log an action */
|
|
37
|
+
skipLogging(action: ActionTypes): boolean;
|
|
38
|
+
/** On mount */
|
|
39
|
+
init(): void;
|
|
40
|
+
/** Ensures all promises are completed by rejecting remaining. */
|
|
41
|
+
cleanup(): void;
|
|
42
|
+
allSettled(): Promise<PromiseSettledResult<any>[]> | undefined;
|
|
43
|
+
/** Clear all promise state */
|
|
44
|
+
protected clearAll(): void;
|
|
45
|
+
/** Clear promise state for a given key */
|
|
46
|
+
protected clear(key: string): void;
|
|
47
|
+
protected getLastReset(): number;
|
|
48
|
+
/** Called when middleware intercepts 'rest-hooks/fetch' action.
|
|
49
|
+
*
|
|
50
|
+
* Will then start a promise for a key and potentially start the network
|
|
51
|
+
* fetch.
|
|
52
|
+
*
|
|
53
|
+
* Uses throttle only when instructed by action meta. This is valuable
|
|
54
|
+
* for ensures mutation requests always go through.
|
|
55
|
+
*/
|
|
56
|
+
protected handleFetch(action: FetchAction, dispatch: (action: any) => Promise<void>, controller: Controller): Promise<any>;
|
|
57
|
+
/** Called when middleware intercepts a receive action.
|
|
58
|
+
*
|
|
59
|
+
* Will resolve the promise associated with receive key.
|
|
60
|
+
*/
|
|
61
|
+
protected handleReceive(action: ReceiveAction): void;
|
|
62
|
+
/** Attaches NetworkManager to store
|
|
63
|
+
*
|
|
64
|
+
* Intercepts 'rest-hooks/fetch' actions to start requests.
|
|
65
|
+
*
|
|
66
|
+
* Resolve/rejects a request when matching 'rest-hooks/receive' event
|
|
67
|
+
* is seen.
|
|
68
|
+
*/
|
|
69
|
+
getMiddleware(): Middleware;
|
|
70
|
+
/** Ensures only one request for a given key is in flight at any time
|
|
71
|
+
*
|
|
72
|
+
* Uses key to either retrieve in-flight promise, or if not
|
|
73
|
+
* create a new promise and call fetch.
|
|
74
|
+
*
|
|
75
|
+
* Note: The new promise is not actually tied to fetch at all,
|
|
76
|
+
* but is resolved when the expected 'recieve' action is processed.
|
|
77
|
+
* This ensures promises are resolved only once their data is processed
|
|
78
|
+
* by the reducer.
|
|
79
|
+
*/
|
|
80
|
+
protected throttle(key: string, fetch: () => Promise<any>, createdAt: number): Promise<any>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=NetworkManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkManager.d.ts","sourceRoot":"","sources":["../../src/manager/NetworkManager.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,6BAA6B,CAAC;AAOrD,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,WAAW,EAEX,UAAU,EACV,KAAK,EACN,MAAM,aAAa,CAAC;AAErB,qBAAa,UAAW,SAAQ,KAAK;IACnC,IAAI,SAAgB;;CAKrB;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,YAAW,OAAO;IACpD,SAAS,CAAC,OAAO,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;KAAE,CAAuB;IACvE,SAAS,CAAC,SAAS,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;KAAE,CAAM;IACjE,SAAS,CAAC,SAAS,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;KAAE,CAAM;IACjE,SAAS,CAAC,SAAS,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAM;IAClD,SAAiB,gBAAgB,EAAE,MAAM,CAAC;IAC1C,SAAiB,iBAAiB,EAAE,MAAM,CAAC;IAC3C,UAAkB,UAAU,EAAE,UAAU,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAsB;IAC9D,SAAS,CAAC,UAAU,EAAE,UAAU,CAAoB;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;gBAEjB,gBAAgB,SAAQ,EAAE,iBAAiB,SAAO;IA8D9D,oEAAoE;IACpE,WAAW,CAAC,MAAM,EAAE,WAAW;IAK/B,eAAe;IACf,IAAI;IAIJ,iEAAiE;IACjE,OAAO;IAMP,UAAU;IAKV,8BAA8B;IAC9B,SAAS,CAAC,QAAQ;IAMlB,0CAA0C;IAC1C,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;IAQ3B,SAAS,CAAC,YAAY;IAQtB;;;;;;;OAOG;IACH,SAAS,CAAC,WAAW,CACnB,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,EACxC,UAAU,EAAE,UAAU;IA4GxB;;;OAGG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa;IAe7C;;;;;;OAMG;IACH,aAAa;IAIb;;;;;;;;;OASG;IACH,SAAS,CAAC,QAAQ,CAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EACzB,SAAS,EAAE,MAAM;CA2BpB"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { SET_TYPE, FETCH_TYPE, RESET_TYPE } from '../actionTypes.js';
|
|
2
|
+
import Controller from '../controller/Controller.js';
|
|
3
|
+
import { initialState } from '../internal.js';
|
|
4
|
+
import { createReceive, createReceiveError } from '../state/legacy-actions/index.js';
|
|
5
|
+
import RIC from '../state/RIC.js';
|
|
6
|
+
export class ResetError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('Aborted due to RESET');
|
|
9
|
+
this.name = 'ResetError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Handles all async network dispatches
|
|
14
|
+
*
|
|
15
|
+
* Dedupes concurrent requests by keeping track of all fetches in flight
|
|
16
|
+
* and returning existing promises for requests already in flight.
|
|
17
|
+
*
|
|
18
|
+
* Interfaces with store via a redux-compatible middleware.
|
|
19
|
+
*
|
|
20
|
+
* @see https://resthooks.io/docs/api/NetworkManager
|
|
21
|
+
*/
|
|
22
|
+
export default class NetworkManager {
|
|
23
|
+
constructor(dataExpiryLength = 60000, errorExpiryLength = 1000) {
|
|
24
|
+
this.fetched = Object.create(null);
|
|
25
|
+
this.resolvers = {};
|
|
26
|
+
this.rejectors = {};
|
|
27
|
+
this.fetchedAt = {};
|
|
28
|
+
this.getState = () => initialState;
|
|
29
|
+
this.controller = new Controller();
|
|
30
|
+
this.dataExpiryLength = dataExpiryLength;
|
|
31
|
+
this.errorExpiryLength = errorExpiryLength;
|
|
32
|
+
this.middleware = ({
|
|
33
|
+
dispatch,
|
|
34
|
+
getState,
|
|
35
|
+
controller
|
|
36
|
+
}) => {
|
|
37
|
+
this.getState = getState;
|
|
38
|
+
this.controller = controller;
|
|
39
|
+
return next => action => {
|
|
40
|
+
var _action$endpoint;
|
|
41
|
+
switch (action.type) {
|
|
42
|
+
case FETCH_TYPE:
|
|
43
|
+
this.handleFetch(action, dispatch, controller);
|
|
44
|
+
// This is the only case that causes any state change
|
|
45
|
+
// It's important to intercept other fetches as we don't want to trigger reducers during
|
|
46
|
+
// render - so we need to stop 'readonly' fetches which can be triggered in render
|
|
47
|
+
if (action.meta.optimisticResponse !== undefined || ((_action$endpoint = action.endpoint) == null ? void 0 : _action$endpoint.getOptimisticResponse) !== undefined && action.endpoint.sideEffect) {
|
|
48
|
+
return next(action);
|
|
49
|
+
}
|
|
50
|
+
return Promise.resolve();
|
|
51
|
+
case SET_TYPE:
|
|
52
|
+
// only receive after new state is computed
|
|
53
|
+
return next(action).then(() => {
|
|
54
|
+
if (action.meta.key in this.fetched) {
|
|
55
|
+
var _controller$getState$;
|
|
56
|
+
// Note: meta *must* be set by reducer so this should be safe
|
|
57
|
+
const error = (_controller$getState$ = controller.getState().meta[action.meta.key]) == null ? void 0 : _controller$getState$.error;
|
|
58
|
+
// processing errors result in state meta having error, so we should reject the promise
|
|
59
|
+
if (error) {
|
|
60
|
+
// TODO: use only new action types
|
|
61
|
+
this.handleReceive(createReceiveError(error, action.meta));
|
|
62
|
+
} else {
|
|
63
|
+
this.handleReceive(action);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
case RESET_TYPE:
|
|
68
|
+
{
|
|
69
|
+
const rejectors = {
|
|
70
|
+
...this.rejectors
|
|
71
|
+
};
|
|
72
|
+
this.clearAll();
|
|
73
|
+
return next(action).then(() => {
|
|
74
|
+
// there could be external listeners to the promise
|
|
75
|
+
// this must happen after commit so our own rejector knows not to dispatch an error based on this
|
|
76
|
+
for (const k in rejectors) {
|
|
77
|
+
rejectors[k](new ResetError());
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
default:
|
|
82
|
+
return next(action);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Used by DevtoolsManager to determine whether to log an action */
|
|
89
|
+
skipLogging(action) {
|
|
90
|
+
/* istanbul ignore next */
|
|
91
|
+
return action.type === FETCH_TYPE && action.meta.key in this.fetched;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** On mount */
|
|
95
|
+
init() {
|
|
96
|
+
delete this.cleanupDate;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Ensures all promises are completed by rejecting remaining. */
|
|
100
|
+
cleanup() {
|
|
101
|
+
// ensure no dispatches after unmount
|
|
102
|
+
// this must be reversible (done in init) so useEffect() remains symmetric
|
|
103
|
+
this.cleanupDate = Date.now();
|
|
104
|
+
}
|
|
105
|
+
allSettled() {
|
|
106
|
+
const fetches = Object.values(this.fetched);
|
|
107
|
+
if (fetches.length) return Promise.allSettled(fetches);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Clear all promise state */
|
|
111
|
+
clearAll() {
|
|
112
|
+
for (const k in this.rejectors) {
|
|
113
|
+
this.clear(k);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Clear promise state for a given key */
|
|
118
|
+
clear(key) {
|
|
119
|
+
this.fetched[key].catch(() => {});
|
|
120
|
+
delete this.resolvers[key];
|
|
121
|
+
delete this.rejectors[key];
|
|
122
|
+
delete this.fetched[key];
|
|
123
|
+
delete this.fetchedAt[key];
|
|
124
|
+
}
|
|
125
|
+
getLastReset() {
|
|
126
|
+
if (this.cleanupDate) return this.cleanupDate;
|
|
127
|
+
const lastReset = this.controller.getState().lastReset;
|
|
128
|
+
if (lastReset instanceof Date) return lastReset.valueOf();
|
|
129
|
+
if (typeof lastReset !== 'number') return -Infinity;
|
|
130
|
+
return lastReset;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Called when middleware intercepts 'rest-hooks/fetch' action.
|
|
134
|
+
*
|
|
135
|
+
* Will then start a promise for a key and potentially start the network
|
|
136
|
+
* fetch.
|
|
137
|
+
*
|
|
138
|
+
* Uses throttle only when instructed by action meta. This is valuable
|
|
139
|
+
* for ensures mutation requests always go through.
|
|
140
|
+
*/
|
|
141
|
+
handleFetch(action, dispatch, controller) {
|
|
142
|
+
const fetch = action.payload;
|
|
143
|
+
const {
|
|
144
|
+
key,
|
|
145
|
+
throttle,
|
|
146
|
+
resolve,
|
|
147
|
+
reject
|
|
148
|
+
} = action.meta;
|
|
149
|
+
// TODO(breaking): remove support for Date type in 'Receive' action
|
|
150
|
+
const createdAt = typeof action.meta.createdAt !== 'number' ? action.meta.createdAt.getTime() : action.meta.createdAt;
|
|
151
|
+
const deferedFetch = () => {
|
|
152
|
+
let promise = fetch();
|
|
153
|
+
const resolvePromise = promise => promise.then(data => {
|
|
154
|
+
resolve(data);
|
|
155
|
+
return data;
|
|
156
|
+
}).catch(error => {
|
|
157
|
+
reject(error);
|
|
158
|
+
throw error;
|
|
159
|
+
});
|
|
160
|
+
// schedule non-throttled resolutions in a microtask before receive
|
|
161
|
+
// this enables users awaiting their fetch to trigger any react updates needed to deal
|
|
162
|
+
// with upcoming changes because of the fetch (for instance avoiding suspense if something is deleted)
|
|
163
|
+
if (!throttle && action.endpoint) {
|
|
164
|
+
promise = resolvePromise(promise);
|
|
165
|
+
}
|
|
166
|
+
promise = promise.then(data => {
|
|
167
|
+
let lastReset = this.getLastReset();
|
|
168
|
+
|
|
169
|
+
/* istanbul ignore else */
|
|
170
|
+
if (process.env.NODE_ENV !== 'production' && isNaN(lastReset)) {
|
|
171
|
+
console.error('state.lastReset is NaN. Only positive timestamps are valid.');
|
|
172
|
+
lastReset = 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// don't update state with promises started before last clear
|
|
176
|
+
if (createdAt >= lastReset) {
|
|
177
|
+
// we still check for controller in case someone didn't have type protection since this didn't always exist
|
|
178
|
+
if (action.endpoint && this.controller) {
|
|
179
|
+
this.controller.resolve(action.endpoint, {
|
|
180
|
+
args: action.meta.args,
|
|
181
|
+
response: data,
|
|
182
|
+
fetchedAt: createdAt
|
|
183
|
+
});
|
|
184
|
+
} else {
|
|
185
|
+
var _action$meta$options$, _action$meta$options;
|
|
186
|
+
// TODO(breaking): is this branch still possible? remove in next major update
|
|
187
|
+
// does this throw if the reducer fails? - no because reducer is wrapped in try/catch
|
|
188
|
+
this.controller.dispatch(createReceive(data, {
|
|
189
|
+
...action.meta,
|
|
190
|
+
fetchedAt: createdAt,
|
|
191
|
+
dataExpiryLength: (_action$meta$options$ = (_action$meta$options = action.meta.options) == null ? void 0 : _action$meta$options.dataExpiryLength) != null ? _action$meta$options$ : this.dataExpiryLength
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return data;
|
|
196
|
+
}).catch(error => {
|
|
197
|
+
const lastReset = this.getLastReset();
|
|
198
|
+
// don't update state with promises started before last clear
|
|
199
|
+
if (createdAt >= lastReset) {
|
|
200
|
+
if (action.endpoint && this.controller) {
|
|
201
|
+
this.controller.resolve(action.endpoint, {
|
|
202
|
+
args: action.meta.args,
|
|
203
|
+
response: error,
|
|
204
|
+
fetchedAt: createdAt,
|
|
205
|
+
error: true
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
var _action$meta$options$2, _action$meta$options2;
|
|
209
|
+
this.controller.dispatch(createReceiveError(error, {
|
|
210
|
+
...action.meta,
|
|
211
|
+
errorExpiryLength: (_action$meta$options$2 = (_action$meta$options2 = action.meta.options) == null ? void 0 : _action$meta$options2.errorExpiryLength) != null ? _action$meta$options$2 : this.errorExpiryLength,
|
|
212
|
+
fetchedAt: createdAt
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
});
|
|
218
|
+
// legacy behavior schedules resolution after dispatch
|
|
219
|
+
if (!throttle && !action.endpoint) {
|
|
220
|
+
promise = resolvePromise(promise);
|
|
221
|
+
}
|
|
222
|
+
return promise;
|
|
223
|
+
};
|
|
224
|
+
if (throttle) {
|
|
225
|
+
return this.throttle(key, deferedFetch, createdAt).then(data => resolve(data)).catch(error => reject(error));
|
|
226
|
+
} else {
|
|
227
|
+
return deferedFetch().catch(() => {});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** Called when middleware intercepts a receive action.
|
|
232
|
+
*
|
|
233
|
+
* Will resolve the promise associated with receive key.
|
|
234
|
+
*/
|
|
235
|
+
handleReceive(action) {
|
|
236
|
+
// this can still turn out to be untrue since this is async
|
|
237
|
+
if (action.meta.key in this.fetched) {
|
|
238
|
+
let promiseHandler;
|
|
239
|
+
if (action.error) {
|
|
240
|
+
promiseHandler = this.rejectors[action.meta.key];
|
|
241
|
+
} else {
|
|
242
|
+
promiseHandler = this.resolvers[action.meta.key];
|
|
243
|
+
}
|
|
244
|
+
promiseHandler(action.payload);
|
|
245
|
+
// since we're resolved we no longer need to keep track of this promise
|
|
246
|
+
this.clear(action.meta.key);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Attaches NetworkManager to store
|
|
251
|
+
*
|
|
252
|
+
* Intercepts 'rest-hooks/fetch' actions to start requests.
|
|
253
|
+
*
|
|
254
|
+
* Resolve/rejects a request when matching 'rest-hooks/receive' event
|
|
255
|
+
* is seen.
|
|
256
|
+
*/
|
|
257
|
+
getMiddleware() {
|
|
258
|
+
return this.middleware;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Ensures only one request for a given key is in flight at any time
|
|
262
|
+
*
|
|
263
|
+
* Uses key to either retrieve in-flight promise, or if not
|
|
264
|
+
* create a new promise and call fetch.
|
|
265
|
+
*
|
|
266
|
+
* Note: The new promise is not actually tied to fetch at all,
|
|
267
|
+
* but is resolved when the expected 'recieve' action is processed.
|
|
268
|
+
* This ensures promises are resolved only once their data is processed
|
|
269
|
+
* by the reducer.
|
|
270
|
+
*/
|
|
271
|
+
throttle(key, fetch, createdAt) {
|
|
272
|
+
const lastReset = this.getLastReset();
|
|
273
|
+
// we're already fetching so reuse the promise
|
|
274
|
+
// fetches after reset do not count
|
|
275
|
+
if (key in this.fetched && this.fetchedAt[key] > lastReset) {
|
|
276
|
+
return this.fetched[key];
|
|
277
|
+
}
|
|
278
|
+
this.fetched[key] = new Promise((resolve, reject) => {
|
|
279
|
+
this.resolvers[key] = resolve;
|
|
280
|
+
this.rejectors[key] = reject;
|
|
281
|
+
});
|
|
282
|
+
this.fetchedAt[key] = createdAt;
|
|
283
|
+
|
|
284
|
+
// since our real promise is resolved via the wrapReducer(),
|
|
285
|
+
// we should just stop all errors here.
|
|
286
|
+
// TODO: decouple this from useFetcher() (that's what's dispatching the error the resolves in here)
|
|
287
|
+
RIC(() => {
|
|
288
|
+
fetch().catch(() => null);
|
|
289
|
+
}, {
|
|
290
|
+
timeout: 500
|
|
291
|
+
});
|
|
292
|
+
return this.fetched[key];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTRVRfVFlQRSIsIkZFVENIX1RZUEUiLCJSRVNFVF9UWVBFIiwiQ29udHJvbGxlciIsImluaXRpYWxTdGF0ZSIsImNyZWF0ZVJlY2VpdmUiLCJjcmVhdGVSZWNlaXZlRXJyb3IiLCJSSUMiLCJSZXNldEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJOZXR3b3JrTWFuYWdlciIsImRhdGFFeHBpcnlMZW5ndGgiLCJlcnJvckV4cGlyeUxlbmd0aCIsImZldGNoZWQiLCJPYmplY3QiLCJjcmVhdGUiLCJyZXNvbHZlcnMiLCJyZWplY3RvcnMiLCJmZXRjaGVkQXQiLCJnZXRTdGF0ZSIsImNvbnRyb2xsZXIiLCJtaWRkbGV3YXJlIiwiZGlzcGF0Y2giLCJuZXh0IiwiYWN0aW9uIiwiX2FjdGlvbiRlbmRwb2ludCIsInR5cGUiLCJoYW5kbGVGZXRjaCIsIm1ldGEiLCJvcHRpbWlzdGljUmVzcG9uc2UiLCJ1bmRlZmluZWQiLCJlbmRwb2ludCIsImdldE9wdGltaXN0aWNSZXNwb25zZSIsInNpZGVFZmZlY3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJrZXkiLCJfY29udHJvbGxlciRnZXRTdGF0ZSQiLCJlcnJvciIsImhhbmRsZVJlY2VpdmUiLCJjbGVhckFsbCIsImsiLCJza2lwTG9nZ2luZyIsImluaXQiLCJjbGVhbnVwRGF0ZSIsImNsZWFudXAiLCJEYXRlIiwibm93IiwiYWxsU2V0dGxlZCIsImZldGNoZXMiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJjbGVhciIsImNhdGNoIiwiZ2V0TGFzdFJlc2V0IiwibGFzdFJlc2V0IiwidmFsdWVPZiIsIkluZmluaXR5IiwiZmV0Y2giLCJwYXlsb2FkIiwidGhyb3R0bGUiLCJyZWplY3QiLCJjcmVhdGVkQXQiLCJnZXRUaW1lIiwiZGVmZXJlZEZldGNoIiwicHJvbWlzZSIsInJlc29sdmVQcm9taXNlIiwiZGF0YSIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImlzTmFOIiwiY29uc29sZSIsImFyZ3MiLCJyZXNwb25zZSIsIl9hY3Rpb24kbWV0YSRvcHRpb25zJCIsIl9hY3Rpb24kbWV0YSRvcHRpb25zIiwib3B0aW9ucyIsIl9hY3Rpb24kbWV0YSRvcHRpb25zJDIiLCJfYWN0aW9uJG1ldGEkb3B0aW9uczIiLCJwcm9taXNlSGFuZGxlciIsImdldE1pZGRsZXdhcmUiLCJ0aW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hbmFnZXIvTmV0d29ya01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU0VUX1RZUEUsIEZFVENIX1RZUEUsIFJFU0VUX1RZUEUgfSBmcm9tICcuLi9hY3Rpb25UeXBlcy5qcyc7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICcuLi9jb250cm9sbGVyL0NvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHsgaW5pdGlhbFN0YXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVjZWl2ZSxcbiAgY3JlYXRlUmVjZWl2ZUVycm9yLFxufSBmcm9tICcuLi9zdGF0ZS9sZWdhY3ktYWN0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgUklDIGZyb20gJy4uL3N0YXRlL1JJQy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZldGNoQWN0aW9uLFxuICBSZWNlaXZlQWN0aW9uLFxuICBNYW5hZ2VyLFxuICBBY3Rpb25UeXBlcyxcbiAgTWlkZGxld2FyZUFQSSxcbiAgTWlkZGxld2FyZSxcbiAgU3RhdGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFJlc2V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWUgPSAnUmVzZXRFcnJvcic7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0Fib3J0ZWQgZHVlIHRvIFJFU0VUJyk7XG4gIH1cbn1cblxuLyoqIEhhbmRsZXMgYWxsIGFzeW5jIG5ldHdvcmsgZGlzcGF0Y2hlc1xuICpcbiAqIERlZHVwZXMgY29uY3VycmVudCByZXF1ZXN0cyBieSBrZWVwaW5nIHRyYWNrIG9mIGFsbCBmZXRjaGVzIGluIGZsaWdodFxuICogYW5kIHJldHVybmluZyBleGlzdGluZyBwcm9taXNlcyBmb3IgcmVxdWVzdHMgYWxyZWFkeSBpbiBmbGlnaHQuXG4gKlxuICogSW50ZXJmYWNlcyB3aXRoIHN0b3JlIHZpYSBhIHJlZHV4LWNvbXBhdGlibGUgbWlkZGxld2FyZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vcmVzdGhvb2tzLmlvL2RvY3MvYXBpL05ldHdvcmtNYW5hZ2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5ldHdvcmtNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIHByb3RlY3RlZCBmZXRjaGVkOiB7IFtrOiBzdHJpbmddOiBQcm9taXNlPGFueT4gfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHByb3RlY3RlZCByZXNvbHZlcnM6IHsgW2s6IHN0cmluZ106ICh2YWx1ZT86IGFueSkgPT4gdm9pZCB9ID0ge307XG4gIHByb3RlY3RlZCByZWplY3RvcnM6IHsgW2s6IHN0cmluZ106ICh2YWx1ZT86IGFueSkgPT4gdm9pZCB9ID0ge307XG4gIHByb3RlY3RlZCBmZXRjaGVkQXQ6IHsgW2s6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gIGRlY2xhcmUgcmVhZG9ubHkgZGF0YUV4cGlyeUxlbmd0aDogbnVtYmVyO1xuICBkZWNsYXJlIHJlYWRvbmx5IGVycm9yRXhwaXJ5TGVuZ3RoOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkZWNsYXJlIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmU7XG4gIHByb3RlY3RlZCBnZXRTdGF0ZTogKCkgPT4gU3RhdGU8dW5rbm93bj4gPSAoKSA9PiBpbml0aWFsU3RhdGU7XG4gIHByb3RlY3RlZCBjb250cm9sbGVyOiBDb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgZGVjbGFyZSBjbGVhbnVwRGF0ZT86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhRXhwaXJ5TGVuZ3RoID0gNjAwMDAsIGVycm9yRXhwaXJ5TGVuZ3RoID0gMTAwMCkge1xuICAgIHRoaXMuZGF0YUV4cGlyeUxlbmd0aCA9IGRhdGFFeHBpcnlMZW5ndGg7XG4gICAgdGhpcy5lcnJvckV4cGlyeUxlbmd0aCA9IGVycm9yRXhwaXJ5TGVuZ3RoO1xuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gPEMgZXh0ZW5kcyBNaWRkbGV3YXJlQVBJPih7XG4gICAgICBkaXNwYXRjaCxcbiAgICAgIGdldFN0YXRlLFxuICAgICAgY29udHJvbGxlcixcbiAgICB9OiBDKSA9PiB7XG4gICAgICB0aGlzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgcmV0dXJuIChuZXh0OiBDWydkaXNwYXRjaCddKTogQ1snZGlzcGF0Y2gnXSA9PlxuICAgICAgICAoYWN0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBGRVRDSF9UWVBFOlxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZldGNoKGFjdGlvbiwgZGlzcGF0Y2gsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgdGhhdCBjYXVzZXMgYW55IHN0YXRlIGNoYW5nZVxuICAgICAgICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBpbnRlcmNlcHQgb3RoZXIgZmV0Y2hlcyBhcyB3ZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgcmVkdWNlcnMgZHVyaW5nXG4gICAgICAgICAgICAgIC8vIHJlbmRlciAtIHNvIHdlIG5lZWQgdG8gc3RvcCAncmVhZG9ubHknIGZldGNoZXMgd2hpY2ggY2FuIGJlIHRyaWdnZXJlZCBpbiByZW5kZXJcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFjdGlvbi5tZXRhLm9wdGltaXN0aWNSZXNwb25zZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgKGFjdGlvbi5lbmRwb2ludD8uZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgIGFjdGlvbi5lbmRwb2ludC5zaWRlRWZmZWN0KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgIGNhc2UgU0VUX1RZUEU6XG4gICAgICAgICAgICAgIC8vIG9ubHkgcmVjZWl2ZSBhZnRlciBuZXcgc3RhdGUgaXMgY29tcHV0ZWRcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLm1ldGEua2V5IGluIHRoaXMuZmV0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgLy8gTm90ZTogbWV0YSAqbXVzdCogYmUgc2V0IGJ5IHJlZHVjZXIgc28gdGhpcyBzaG91bGQgYmUgc2FmZVxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmdldFN0YXRlKCkubWV0YVthY3Rpb24ubWV0YS5rZXldPy5lcnJvcjtcbiAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgZXJyb3JzIHJlc3VsdCBpbiBzdGF0ZSBtZXRhIGhhdmluZyBlcnJvciwgc28gd2Ugc2hvdWxkIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG5ldyBhY3Rpb24gdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZWNlaXZlKGNyZWF0ZVJlY2VpdmVFcnJvcihlcnJvciwgYWN0aW9uLm1ldGEpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVjZWl2ZShhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlIFJFU0VUX1RZUEU6IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVqZWN0b3JzID0geyAuLi50aGlzLnJlamVjdG9ycyB9O1xuXG4gICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBleHRlcm5hbCBsaXN0ZW5lcnMgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICAvLyB0aGlzIG11c3QgaGFwcGVuIGFmdGVyIGNvbW1pdCBzbyBvdXIgb3duIHJlamVjdG9yIGtub3dzIG5vdCB0byBkaXNwYXRjaCBhbiBlcnJvciBiYXNlZCBvbiB0aGlzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHJlamVjdG9ycykge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0b3JzW2tdKG5ldyBSZXNldEVycm9yKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgLyoqIFVzZWQgYnkgRGV2dG9vbHNNYW5hZ2VyIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGxvZyBhbiBhY3Rpb24gKi9cbiAgc2tpcExvZ2dpbmcoYWN0aW9uOiBBY3Rpb25UeXBlcykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGFjdGlvbi50eXBlID09PSBGRVRDSF9UWVBFICYmIGFjdGlvbi5tZXRhLmtleSBpbiB0aGlzLmZldGNoZWQ7XG4gIH1cblxuICAvKiogT24gbW91bnQgKi9cbiAgaW5pdCgpIHtcbiAgICBkZWxldGUgdGhpcy5jbGVhbnVwRGF0ZTtcbiAgfVxuXG4gIC8qKiBFbnN1cmVzIGFsbCBwcm9taXNlcyBhcmUgY29tcGxldGVkIGJ5IHJlamVjdGluZyByZW1haW5pbmcuICovXG4gIGNsZWFudXAoKSB7XG4gICAgLy8gZW5zdXJlIG5vIGRpc3BhdGNoZXMgYWZ0ZXIgdW5tb3VudFxuICAgIC8vIHRoaXMgbXVzdCBiZSByZXZlcnNpYmxlIChkb25lIGluIGluaXQpIHNvIHVzZUVmZmVjdCgpIHJlbWFpbnMgc3ltbWV0cmljXG4gICAgdGhpcy5jbGVhbnVwRGF0ZSA9IERhdGUubm93KCk7XG4gIH1cblxuICBhbGxTZXR0bGVkKCkge1xuICAgIGNvbnN0IGZldGNoZXMgPSBPYmplY3QudmFsdWVzKHRoaXMuZmV0Y2hlZCk7XG4gICAgaWYgKGZldGNoZXMubGVuZ3RoKSByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGZldGNoZXMpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBwcm9taXNlIHN0YXRlICovXG4gIHByb3RlY3RlZCBjbGVhckFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IGsgaW4gdGhpcy5yZWplY3RvcnMpIHtcbiAgICAgIHRoaXMuY2xlYXIoayk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIHByb21pc2Ugc3RhdGUgZm9yIGEgZ2l2ZW4ga2V5ICovXG4gIHByb3RlY3RlZCBjbGVhcihrZXk6IHN0cmluZykge1xuICAgIHRoaXMuZmV0Y2hlZFtrZXldLmNhdGNoKCgpID0+IHt9KTtcbiAgICBkZWxldGUgdGhpcy5yZXNvbHZlcnNba2V5XTtcbiAgICBkZWxldGUgdGhpcy5yZWplY3RvcnNba2V5XTtcbiAgICBkZWxldGUgdGhpcy5mZXRjaGVkW2tleV07XG4gICAgZGVsZXRlIHRoaXMuZmV0Y2hlZEF0W2tleV07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TGFzdFJlc2V0KCkge1xuICAgIGlmICh0aGlzLmNsZWFudXBEYXRlKSByZXR1cm4gdGhpcy5jbGVhbnVwRGF0ZTtcbiAgICBjb25zdCBsYXN0UmVzZXQgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKS5sYXN0UmVzZXQ7XG4gICAgaWYgKGxhc3RSZXNldCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBsYXN0UmVzZXQudmFsdWVPZigpO1xuICAgIGlmICh0eXBlb2YgbGFzdFJlc2V0ICE9PSAnbnVtYmVyJykgcmV0dXJuIC1JbmZpbml0eTtcbiAgICByZXR1cm4gbGFzdFJlc2V0O1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIG1pZGRsZXdhcmUgaW50ZXJjZXB0cyAncmVzdC1ob29rcy9mZXRjaCcgYWN0aW9uLlxuICAgKlxuICAgKiBXaWxsIHRoZW4gc3RhcnQgYSBwcm9taXNlIGZvciBhIGtleSBhbmQgcG90ZW50aWFsbHkgc3RhcnQgdGhlIG5ldHdvcmtcbiAgICogZmV0Y2guXG4gICAqXG4gICAqIFVzZXMgdGhyb3R0bGUgb25seSB3aGVuIGluc3RydWN0ZWQgYnkgYWN0aW9uIG1ldGEuIFRoaXMgaXMgdmFsdWFibGVcbiAgICogZm9yIGVuc3VyZXMgbXV0YXRpb24gcmVxdWVzdHMgYWx3YXlzIGdvIHRocm91Z2guXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlRmV0Y2goXG4gICAgYWN0aW9uOiBGZXRjaEFjdGlvbixcbiAgICBkaXNwYXRjaDogKGFjdGlvbjogYW55KSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIGNvbnRyb2xsZXI6IENvbnRyb2xsZXIsXG4gICkge1xuICAgIGNvbnN0IGZldGNoID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgY29uc3QgeyBrZXksIHRocm90dGxlLCByZXNvbHZlLCByZWplY3QgfSA9IGFjdGlvbi5tZXRhO1xuICAgIC8vIFRPRE8oYnJlYWtpbmcpOiByZW1vdmUgc3VwcG9ydCBmb3IgRGF0ZSB0eXBlIGluICdSZWNlaXZlJyBhY3Rpb25cbiAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgdHlwZW9mIGFjdGlvbi5tZXRhLmNyZWF0ZWRBdCAhPT0gJ251bWJlcidcbiAgICAgICAgPyBhY3Rpb24ubWV0YS5jcmVhdGVkQXQuZ2V0VGltZSgpXG4gICAgICAgIDogYWN0aW9uLm1ldGEuY3JlYXRlZEF0O1xuXG4gICAgY29uc3QgZGVmZXJlZEZldGNoID0gKCkgPT4ge1xuICAgICAgbGV0IHByb21pc2UgPSBmZXRjaCgpO1xuICAgICAgY29uc3QgcmVzb2x2ZVByb21pc2UgPSAoXG4gICAgICAgIHByb21pc2U6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0IHwgbnVsbD4sXG4gICAgICApID0+XG4gICAgICAgIHByb21pc2VcbiAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICAvLyBzY2hlZHVsZSBub24tdGhyb3R0bGVkIHJlc29sdXRpb25zIGluIGEgbWljcm90YXNrIGJlZm9yZSByZWNlaXZlXG4gICAgICAvLyB0aGlzIGVuYWJsZXMgdXNlcnMgYXdhaXRpbmcgdGhlaXIgZmV0Y2ggdG8gdHJpZ2dlciBhbnkgcmVhY3QgdXBkYXRlcyBuZWVkZWQgdG8gZGVhbFxuICAgICAgLy8gd2l0aCB1cGNvbWluZyBjaGFuZ2VzIGJlY2F1c2Ugb2YgdGhlIGZldGNoIChmb3IgaW5zdGFuY2UgYXZvaWRpbmcgc3VzcGVuc2UgaWYgc29tZXRoaW5nIGlzIGRlbGV0ZWQpXG4gICAgICBpZiAoIXRocm90dGxlICYmIGFjdGlvbi5lbmRwb2ludCkge1xuICAgICAgICBwcm9taXNlID0gcmVzb2x2ZVByb21pc2UocHJvbWlzZSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlID0gcHJvbWlzZVxuICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICBsZXQgbGFzdFJlc2V0ID0gdGhpcy5nZXRMYXN0UmVzZXQoKTtcblxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNOYU4obGFzdFJlc2V0KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ3N0YXRlLmxhc3RSZXNldCBpcyBOYU4uIE9ubHkgcG9zaXRpdmUgdGltZXN0YW1wcyBhcmUgdmFsaWQuJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsYXN0UmVzZXQgPSAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRvbid0IHVwZGF0ZSBzdGF0ZSB3aXRoIHByb21pc2VzIHN0YXJ0ZWQgYmVmb3JlIGxhc3QgY2xlYXJcbiAgICAgICAgICBpZiAoY3JlYXRlZEF0ID49IGxhc3RSZXNldCkge1xuICAgICAgICAgICAgLy8gd2Ugc3RpbGwgY2hlY2sgZm9yIGNvbnRyb2xsZXIgaW4gY2FzZSBzb21lb25lIGRpZG4ndCBoYXZlIHR5cGUgcHJvdGVjdGlvbiBzaW5jZSB0aGlzIGRpZG4ndCBhbHdheXMgZXhpc3RcbiAgICAgICAgICAgIGlmIChhY3Rpb24uZW5kcG9pbnQgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5yZXNvbHZlKGFjdGlvbi5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFjdGlvbi5tZXRhLmFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBkYXRhLFxuICAgICAgICAgICAgICAgIGZldGNoZWRBdDogY3JlYXRlZEF0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8oYnJlYWtpbmcpOiBpcyB0aGlzIGJyYW5jaCBzdGlsbCBwb3NzaWJsZT8gcmVtb3ZlIGluIG5leHQgbWFqb3IgdXBkYXRlXG4gICAgICAgICAgICAgIC8vIGRvZXMgdGhpcyB0aHJvdyBpZiB0aGUgcmVkdWNlciBmYWlscz8gLSBubyBiZWNhdXNlIHJlZHVjZXIgaXMgd3JhcHBlZCBpbiB0cnkvY2F0Y2hcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZVJlY2VpdmUoZGF0YSwge1xuICAgICAgICAgICAgICAgICAgLi4uYWN0aW9uLm1ldGEsXG4gICAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICAgIGRhdGFFeHBpcnlMZW5ndGg6XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5tZXRhLm9wdGlvbnM/LmRhdGFFeHBpcnlMZW5ndGggPz9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhRXhwaXJ5TGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zdCBsYXN0UmVzZXQgPSB0aGlzLmdldExhc3RSZXNldCgpO1xuICAgICAgICAgIC8vIGRvbid0IHVwZGF0ZSBzdGF0ZSB3aXRoIHByb21pc2VzIHN0YXJ0ZWQgYmVmb3JlIGxhc3QgY2xlYXJcbiAgICAgICAgICBpZiAoY3JlYXRlZEF0ID49IGxhc3RSZXNldCkge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi5lbmRwb2ludCAmJiB0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlc29sdmUoYWN0aW9uLmVuZHBvaW50LCB7XG4gICAgICAgICAgICAgICAgYXJnczogYWN0aW9uLm1ldGEuYXJncyBhcyBhbnksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGZldGNoZWRBdDogY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICBjcmVhdGVSZWNlaXZlRXJyb3IoZXJyb3IsIHtcbiAgICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5tZXRhLFxuICAgICAgICAgICAgICAgICAgZXJyb3JFeHBpcnlMZW5ndGg6XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5tZXRhLm9wdGlvbnM/LmVycm9yRXhwaXJ5TGVuZ3RoID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JFeHBpcnlMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBmZXRjaGVkQXQ6IGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgICAgLy8gbGVnYWN5IGJlaGF2aW9yIHNjaGVkdWxlcyByZXNvbHV0aW9uIGFmdGVyIGRpc3BhdGNoXG4gICAgICBpZiAoIXRocm90dGxlICYmICFhY3Rpb24uZW5kcG9pbnQpIHtcbiAgICAgICAgcHJvbWlzZSA9IHJlc29sdmVQcm9taXNlKHByb21pc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGlmICh0aHJvdHRsZSkge1xuICAgICAgcmV0dXJuIHRoaXMudGhyb3R0bGUoa2V5LCBkZWZlcmVkRmV0Y2gsIGNyZWF0ZWRBdClcbiAgICAgICAgLnRoZW4oZGF0YSA9PiByZXNvbHZlKGRhdGEpKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWZlcmVkRmV0Y2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIG1pZGRsZXdhcmUgaW50ZXJjZXB0cyBhIHJlY2VpdmUgYWN0aW9uLlxuICAgKlxuICAgKiBXaWxsIHJlc29sdmUgdGhlIHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIHJlY2VpdmUga2V5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZVJlY2VpdmUoYWN0aW9uOiBSZWNlaXZlQWN0aW9uKSB7XG4gICAgLy8gdGhpcyBjYW4gc3RpbGwgdHVybiBvdXQgdG8gYmUgdW50cnVlIHNpbmNlIHRoaXMgaXMgYXN5bmNcbiAgICBpZiAoYWN0aW9uLm1ldGEua2V5IGluIHRoaXMuZmV0Y2hlZCkge1xuICAgICAgbGV0IHByb21pc2VIYW5kbGVyOiAodmFsdWU/OiBhbnkpID0+IHZvaWQ7XG4gICAgICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgICAgIHByb21pc2VIYW5kbGVyID0gdGhpcy5yZWplY3RvcnNbYWN0aW9uLm1ldGEua2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2VIYW5kbGVyID0gdGhpcy5yZXNvbHZlcnNbYWN0aW9uLm1ldGEua2V5XTtcbiAgICAgIH1cbiAgICAgIHByb21pc2VIYW5kbGVyKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgIC8vIHNpbmNlIHdlJ3JlIHJlc29sdmVkIHdlIG5vIGxvbmdlciBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBwcm9taXNlXG4gICAgICB0aGlzLmNsZWFyKGFjdGlvbi5tZXRhLmtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEF0dGFjaGVzIE5ldHdvcmtNYW5hZ2VyIHRvIHN0b3JlXG4gICAqXG4gICAqIEludGVyY2VwdHMgJ3Jlc3QtaG9va3MvZmV0Y2gnIGFjdGlvbnMgdG8gc3RhcnQgcmVxdWVzdHMuXG4gICAqXG4gICAqIFJlc29sdmUvcmVqZWN0cyBhIHJlcXVlc3Qgd2hlbiBtYXRjaGluZyAncmVzdC1ob29rcy9yZWNlaXZlJyBldmVudFxuICAgKiBpcyBzZWVuLlxuICAgKi9cbiAgZ2V0TWlkZGxld2FyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5taWRkbGV3YXJlO1xuICB9XG5cbiAgLyoqIEVuc3VyZXMgb25seSBvbmUgcmVxdWVzdCBmb3IgYSBnaXZlbiBrZXkgaXMgaW4gZmxpZ2h0IGF0IGFueSB0aW1lXG4gICAqXG4gICAqIFVzZXMga2V5IHRvIGVpdGhlciByZXRyaWV2ZSBpbi1mbGlnaHQgcHJvbWlzZSwgb3IgaWYgbm90XG4gICAqIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGFuZCBjYWxsIGZldGNoLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgbmV3IHByb21pc2UgaXMgbm90IGFjdHVhbGx5IHRpZWQgdG8gZmV0Y2ggYXQgYWxsLFxuICAgKiBidXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZXhwZWN0ZWQgJ3JlY2lldmUnIGFjdGlvbiBpcyBwcm9jZXNzZWQuXG4gICAqIFRoaXMgZW5zdXJlcyBwcm9taXNlcyBhcmUgcmVzb2x2ZWQgb25seSBvbmNlIHRoZWlyIGRhdGEgaXMgcHJvY2Vzc2VkXG4gICAqIGJ5IHRoZSByZWR1Y2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRocm90dGxlKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZldGNoOiAoKSA9PiBQcm9taXNlPGFueT4sXG4gICAgY3JlYXRlZEF0OiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IGxhc3RSZXNldCA9IHRoaXMuZ2V0TGFzdFJlc2V0KCk7XG4gICAgLy8gd2UncmUgYWxyZWFkeSBmZXRjaGluZyBzbyByZXVzZSB0aGUgcHJvbWlzZVxuICAgIC8vIGZldGNoZXMgYWZ0ZXIgcmVzZXQgZG8gbm90IGNvdW50XG4gICAgaWYgKGtleSBpbiB0aGlzLmZldGNoZWQgJiYgdGhpcy5mZXRjaGVkQXRba2V5XSA+IGxhc3RSZXNldCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hlZFtrZXldO1xuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hlZFtrZXldID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcnNba2V5XSA9IHJlc29sdmU7XG4gICAgICB0aGlzLnJlamVjdG9yc1trZXldID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIHRoaXMuZmV0Y2hlZEF0W2tleV0gPSBjcmVhdGVkQXQ7XG5cbiAgICAvLyBzaW5jZSBvdXIgcmVhbCBwcm9taXNlIGlzIHJlc29sdmVkIHZpYSB0aGUgd3JhcFJlZHVjZXIoKSxcbiAgICAvLyB3ZSBzaG91bGQganVzdCBzdG9wIGFsbCBlcnJvcnMgaGVyZS5cbiAgICAvLyBUT0RPOiBkZWNvdXBsZSB0aGlzIGZyb20gdXNlRmV0Y2hlcigpICh0aGF0J3Mgd2hhdCdzIGRpc3BhdGNoaW5nIHRoZSBlcnJvciB0aGUgcmVzb2x2ZXMgaW4gaGVyZSlcbiAgICBSSUMoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGZldGNoKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9LFxuICAgICAgeyB0aW1lb3V0OiA1MDAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hlZFtrZXldO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsVUFBVSxFQUFFQyxVQUFVLFFBQVEsbUJBQW1CO0FBQ3BFLE9BQU9DLFVBQVUsTUFBTSw2QkFBNkI7QUFDcEQsU0FBU0MsWUFBWSxRQUFRLGdCQUFnQjtBQUM3QyxTQUNFQyxhQUFhLEVBQ2JDLGtCQUFrQixRQUNiLGtDQUFrQztBQUN6QyxPQUFPQyxHQUFHLE1BQU0saUJBQWlCO0FBV2pDLE9BQU8sTUFBTUMsVUFBVSxTQUFTQyxLQUFLLENBQUM7RUFHcENDLFdBQVdBLENBQUEsRUFBRztJQUNaLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztJQUFDLEtBSGhDQyxJQUFJLEdBQUcsWUFBWTtFQUluQjtBQUNG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
|