@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.
Files changed (308) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +71 -0
  3. package/dist/index.js +1643 -0
  4. package/dist/index.umd.min.js +1 -0
  5. package/dist/next.js +461 -0
  6. package/dist/package.json +1 -0
  7. package/legacy/actionTypes.js +12 -0
  8. package/legacy/compatibleActions.js +2 -0
  9. package/legacy/controller/BaseController.js +289 -0
  10. package/legacy/controller/Controller.js +20 -0
  11. package/legacy/controller/createFetch.js +42 -0
  12. package/legacy/controller/createInvalidate.js +12 -0
  13. package/legacy/controller/createInvalidateAll.js +8 -0
  14. package/legacy/controller/createOptimistic.js +33 -0
  15. package/legacy/controller/createReceive.js +36 -0
  16. package/legacy/controller/createReset.js +8 -0
  17. package/legacy/controller/createSubscription.js +30 -0
  18. package/legacy/controller/types.js +2 -0
  19. package/legacy/endpoint/index.js +2 -0
  20. package/legacy/endpoint/shapes.js +2 -0
  21. package/legacy/endpoint/types.js +2 -0
  22. package/legacy/fsa.js +2 -0
  23. package/legacy/index.js +22 -0
  24. package/legacy/internal.js +4 -0
  25. package/legacy/legacyActions.js +2 -0
  26. package/legacy/manager/ConnectionListener.js +2 -0
  27. package/legacy/manager/DefaultConnectionListener.js +40 -0
  28. package/legacy/manager/DevtoolsManager.js +73 -0
  29. package/legacy/manager/LogoutManager.js +34 -0
  30. package/legacy/manager/NetworkManager.js +291 -0
  31. package/legacy/manager/PollingSubscription.js +159 -0
  32. package/legacy/manager/SubscriptionManager.js +117 -0
  33. package/legacy/manager/applyManager.js +23 -0
  34. package/legacy/manager/devtoolsTypes.js +2 -0
  35. package/legacy/manager/index.js +6 -0
  36. package/legacy/middlewareTypes.js +2 -0
  37. package/legacy/newActions.js +2 -0
  38. package/legacy/next/Controller.js +24 -0
  39. package/legacy/next/index.js +3 -0
  40. package/legacy/previousActions.js +2 -0
  41. package/legacy/state/RIC.js +3 -0
  42. package/legacy/state/applyUpdatersToResults.js +4 -0
  43. package/legacy/state/legacy-actions/createFetch.js +62 -0
  44. package/legacy/state/legacy-actions/createReceive.js +37 -0
  45. package/legacy/state/legacy-actions/createReceiveError.js +28 -0
  46. package/legacy/state/legacy-actions/index.js +4 -0
  47. package/legacy/state/reducer/createReducer.js +54 -0
  48. package/legacy/state/reducer/fetchReducer.js +32 -0
  49. package/legacy/state/reducer/invalidateReducer.js +28 -0
  50. package/legacy/state/reducer/setReducer.js +113 -0
  51. package/legacy/state/reducerInstance.js +9 -0
  52. package/legacy/state/selectMeta.js +4 -0
  53. package/legacy/types.js +8 -0
  54. package/lib/actionTypes.d.ts +11 -0
  55. package/lib/actionTypes.d.ts.map +1 -0
  56. package/lib/actionTypes.js +12 -0
  57. package/lib/compatibleActions.d.ts +47 -0
  58. package/lib/compatibleActions.d.ts.map +1 -0
  59. package/lib/compatibleActions.js +2 -0
  60. package/lib/controller/BaseController.d.ts +128 -0
  61. package/lib/controller/BaseController.d.ts.map +1 -0
  62. package/lib/controller/BaseController.js +289 -0
  63. package/lib/controller/Controller.d.ts +14 -0
  64. package/lib/controller/Controller.d.ts.map +1 -0
  65. package/lib/controller/Controller.js +20 -0
  66. package/lib/controller/createFetch.d.ts +12 -0
  67. package/lib/controller/createFetch.d.ts.map +1 -0
  68. package/lib/controller/createFetch.js +42 -0
  69. package/lib/controller/createInvalidate.d.ts +6 -0
  70. package/lib/controller/createInvalidate.d.ts.map +1 -0
  71. package/lib/controller/createInvalidate.js +12 -0
  72. package/lib/controller/createInvalidateAll.d.ts +3 -0
  73. package/lib/controller/createInvalidateAll.d.ts.map +1 -0
  74. package/lib/controller/createInvalidateAll.js +8 -0
  75. package/lib/controller/createOptimistic.d.ts +10 -0
  76. package/lib/controller/createOptimistic.d.ts.map +1 -0
  77. package/lib/controller/createOptimistic.js +33 -0
  78. package/lib/controller/createReceive.d.ts +20 -0
  79. package/lib/controller/createReceive.d.ts.map +1 -0
  80. package/lib/controller/createReceive.js +36 -0
  81. package/lib/controller/createReset.d.ts +3 -0
  82. package/lib/controller/createReset.d.ts.map +1 -0
  83. package/lib/controller/createReset.js +8 -0
  84. package/lib/controller/createSubscription.d.ts +9 -0
  85. package/lib/controller/createSubscription.d.ts.map +1 -0
  86. package/lib/controller/createSubscription.js +30 -0
  87. package/lib/controller/types.d.ts +6 -0
  88. package/lib/controller/types.d.ts.map +1 -0
  89. package/lib/controller/types.js +2 -0
  90. package/lib/endpoint/index.d.ts +3 -0
  91. package/lib/endpoint/index.d.ts.map +1 -0
  92. package/lib/endpoint/index.js +2 -0
  93. package/lib/endpoint/shapes.d.ts +25 -0
  94. package/lib/endpoint/shapes.d.ts.map +1 -0
  95. package/lib/endpoint/shapes.js +2 -0
  96. package/lib/endpoint/types.d.ts +45 -0
  97. package/lib/endpoint/types.d.ts.map +1 -0
  98. package/lib/endpoint/types.js +2 -0
  99. package/lib/fsa.d.ts +41 -0
  100. package/lib/fsa.d.ts.map +1 -0
  101. package/lib/fsa.js +2 -0
  102. package/lib/index.d.ts +19 -0
  103. package/lib/index.d.ts.map +1 -0
  104. package/lib/index.js +22 -0
  105. package/lib/internal.d.ts +4 -0
  106. package/lib/internal.d.ts.map +1 -0
  107. package/lib/internal.js +4 -0
  108. package/lib/legacyActions.d.ts +92 -0
  109. package/lib/legacyActions.d.ts.map +1 -0
  110. package/lib/legacyActions.js +2 -0
  111. package/lib/manager/ConnectionListener.d.ts +8 -0
  112. package/lib/manager/ConnectionListener.d.ts.map +1 -0
  113. package/lib/manager/ConnectionListener.js +2 -0
  114. package/lib/manager/DefaultConnectionListener.d.ts +20 -0
  115. package/lib/manager/DefaultConnectionListener.d.ts.map +1 -0
  116. package/lib/manager/DefaultConnectionListener.js +40 -0
  117. package/lib/manager/DevtoolsManager.d.ts +24 -0
  118. package/lib/manager/DevtoolsManager.d.ts.map +1 -0
  119. package/lib/manager/DevtoolsManager.js +74 -0
  120. package/lib/manager/LogoutManager.d.ts +25 -0
  121. package/lib/manager/LogoutManager.d.ts.map +1 -0
  122. package/lib/manager/LogoutManager.js +34 -0
  123. package/lib/manager/NetworkManager.d.ts +82 -0
  124. package/lib/manager/NetworkManager.d.ts.map +1 -0
  125. package/lib/manager/NetworkManager.js +295 -0
  126. package/lib/manager/PollingSubscription.d.ts +45 -0
  127. package/lib/manager/PollingSubscription.d.ts.map +1 -0
  128. package/lib/manager/PollingSubscription.js +159 -0
  129. package/lib/manager/SubscriptionManager.d.ts +55 -0
  130. package/lib/manager/SubscriptionManager.d.ts.map +1 -0
  131. package/lib/manager/SubscriptionManager.js +117 -0
  132. package/lib/manager/applyManager.d.ts +10 -0
  133. package/lib/manager/applyManager.d.ts.map +1 -0
  134. package/lib/manager/applyManager.js +23 -0
  135. package/lib/manager/devtoolsTypes.d.ts +205 -0
  136. package/lib/manager/devtoolsTypes.d.ts.map +1 -0
  137. package/lib/manager/devtoolsTypes.js +2 -0
  138. package/lib/manager/index.d.ts +8 -0
  139. package/lib/manager/index.d.ts.map +1 -0
  140. package/lib/manager/index.js +6 -0
  141. package/lib/middlewareTypes.d.ts +18 -0
  142. package/lib/middlewareTypes.d.ts.map +1 -0
  143. package/lib/middlewareTypes.js +2 -0
  144. package/lib/newActions.d.ts +85 -0
  145. package/lib/newActions.d.ts.map +1 -0
  146. package/lib/newActions.js +2 -0
  147. package/lib/next/Controller.d.ts +14 -0
  148. package/lib/next/Controller.d.ts.map +1 -0
  149. package/lib/next/Controller.js +24 -0
  150. package/lib/next/index.d.ts +3 -0
  151. package/lib/next/index.d.ts.map +1 -0
  152. package/lib/next/index.js +3 -0
  153. package/lib/previousActions.d.ts +91 -0
  154. package/lib/previousActions.d.ts.map +1 -0
  155. package/lib/previousActions.js +2 -0
  156. package/lib/state/RIC.d.ts +2 -0
  157. package/lib/state/RIC.js +3 -0
  158. package/lib/state/applyUpdatersToResults.d.ts +13 -0
  159. package/lib/state/applyUpdatersToResults.d.ts.map +1 -0
  160. package/lib/state/applyUpdatersToResults.js +7 -0
  161. package/lib/state/legacy-actions/createFetch.d.ts +19 -0
  162. package/lib/state/legacy-actions/createFetch.d.ts.map +1 -0
  163. package/lib/state/legacy-actions/createFetch.js +62 -0
  164. package/lib/state/legacy-actions/createReceive.d.ts +14 -0
  165. package/lib/state/legacy-actions/createReceive.d.ts.map +1 -0
  166. package/lib/state/legacy-actions/createReceive.js +37 -0
  167. package/lib/state/legacy-actions/createReceiveError.d.ts +9 -0
  168. package/lib/state/legacy-actions/createReceiveError.d.ts.map +1 -0
  169. package/lib/state/legacy-actions/createReceiveError.js +28 -0
  170. package/lib/state/legacy-actions/index.d.ts +4 -0
  171. package/lib/state/legacy-actions/index.d.ts.map +1 -0
  172. package/lib/state/legacy-actions/index.js +4 -0
  173. package/lib/state/reducer/createReducer.d.ts +7 -0
  174. package/lib/state/reducer/createReducer.d.ts.map +1 -0
  175. package/lib/state/reducer/createReducer.js +55 -0
  176. package/lib/state/reducer/fetchReducer.d.ts +4 -0
  177. package/lib/state/reducer/fetchReducer.d.ts.map +1 -0
  178. package/lib/state/reducer/fetchReducer.js +34 -0
  179. package/lib/state/reducer/invalidateReducer.d.ts +37 -0
  180. package/lib/state/reducer/invalidateReducer.d.ts.map +1 -0
  181. package/lib/state/reducer/invalidateReducer.js +34 -0
  182. package/lib/state/reducer/setReducer.d.ts +40 -0
  183. package/lib/state/reducer/setReducer.d.ts.map +1 -0
  184. package/lib/state/reducer/setReducer.js +119 -0
  185. package/lib/state/reducerInstance.d.ts +7 -0
  186. package/lib/state/reducerInstance.d.ts.map +1 -0
  187. package/lib/state/reducerInstance.js +9 -0
  188. package/lib/state/selectMeta.d.ts +3 -0
  189. package/lib/state/selectMeta.d.ts.map +1 -0
  190. package/lib/state/selectMeta.js +4 -0
  191. package/lib/types.d.ts +71 -0
  192. package/lib/types.d.ts.map +1 -0
  193. package/lib/types.js +8 -0
  194. package/node.mjs +1 -0
  195. package/package.json +127 -0
  196. package/src/actionTypes.ts +11 -0
  197. package/src/compatibleActions.ts +96 -0
  198. package/src/controller/BaseController.ts +508 -0
  199. package/src/controller/Controller.ts +32 -0
  200. package/src/controller/__tests__/Controller.ts +29 -0
  201. package/src/controller/__tests__/__snapshots__/getResponse.ts.snap +35 -0
  202. package/src/controller/__tests__/getResponse.ts +182 -0
  203. package/src/controller/createFetch.ts +54 -0
  204. package/src/controller/createInvalidate.ts +16 -0
  205. package/src/controller/createInvalidateAll.ts +11 -0
  206. package/src/controller/createOptimistic.ts +47 -0
  207. package/src/controller/createReceive.ts +85 -0
  208. package/src/controller/createReset.ts +9 -0
  209. package/src/controller/createSubscription.ts +39 -0
  210. package/src/controller/types.ts +22 -0
  211. package/src/endpoint/index.ts +14 -0
  212. package/src/endpoint/shapes.ts +53 -0
  213. package/src/endpoint/types.ts +72 -0
  214. package/src/fsa.ts +99 -0
  215. package/src/index.ts +61 -0
  216. package/src/internal.ts +3 -0
  217. package/src/legacyActions.ts +163 -0
  218. package/src/manager/ConnectionListener.ts +7 -0
  219. package/src/manager/DefaultConnectionListener.ts +54 -0
  220. package/src/manager/DevtoolsManager.ts +99 -0
  221. package/src/manager/LogoutManager.ts +57 -0
  222. package/src/manager/NetworkManager.ts +346 -0
  223. package/src/manager/PollingSubscription.ts +190 -0
  224. package/src/manager/SubscriptionManager.ts +156 -0
  225. package/src/manager/__tests__/__snapshots__/pollingSubscription-endpoint.ts.snap +49 -0
  226. package/src/manager/__tests__/__snapshots__/pollingSubscription.ts.snap +43 -0
  227. package/src/manager/__tests__/logoutManager.ts +112 -0
  228. package/src/manager/__tests__/manager.ts +44 -0
  229. package/src/manager/__tests__/networkManager-legacy.ts +394 -0
  230. package/src/manager/__tests__/networkManager.ts +426 -0
  231. package/src/manager/__tests__/pollingSubscription-endpoint.ts +423 -0
  232. package/src/manager/__tests__/pollingSubscription.ts +313 -0
  233. package/src/manager/__tests__/subscriptionManager.ts +208 -0
  234. package/src/manager/applyManager.ts +33 -0
  235. package/src/manager/devtoolsTypes.ts +210 -0
  236. package/src/manager/index.ts +7 -0
  237. package/src/middlewareTypes.ts +49 -0
  238. package/src/newActions.ts +140 -0
  239. package/src/next/Controller.ts +39 -0
  240. package/src/next/index.ts +2 -0
  241. package/src/package.json +1 -0
  242. package/src/previousActions.ts +159 -0
  243. package/src/state/RIC.d.ts +2 -0
  244. package/src/state/RIC.js +5 -0
  245. package/src/state/__tests__/RIC.web.ts +16 -0
  246. package/src/state/__tests__/__snapshots__/reducer.ts.snap +56 -0
  247. package/src/state/__tests__/applyUpdatersToResults.ts +40 -0
  248. package/src/state/__tests__/reducer.ts +868 -0
  249. package/src/state/applyUpdatersToResults.ts +29 -0
  250. package/src/state/legacy-actions/createFetch.ts +95 -0
  251. package/src/state/legacy-actions/createReceive.ts +68 -0
  252. package/src/state/legacy-actions/createReceiveError.ts +43 -0
  253. package/src/state/legacy-actions/index.ts +3 -0
  254. package/src/state/reducer/createReducer.ts +80 -0
  255. package/src/state/reducer/fetchReducer.ts +48 -0
  256. package/src/state/reducer/invalidateReducer.ts +39 -0
  257. package/src/state/reducer/setReducer.ts +157 -0
  258. package/src/state/reducerInstance.ts +14 -0
  259. package/src/state/selectMeta.ts +8 -0
  260. package/src/types.ts +125 -0
  261. package/ts3.4/actionTypes.d.ts +11 -0
  262. package/ts3.4/compatibleActions.d.ts +47 -0
  263. package/ts3.4/controller/BaseController.d.ts +170 -0
  264. package/ts3.4/controller/Controller.d.ts +14 -0
  265. package/ts3.4/controller/createFetch.d.ts +14 -0
  266. package/ts3.4/controller/createInvalidate.d.ts +8 -0
  267. package/ts3.4/controller/createInvalidateAll.d.ts +3 -0
  268. package/ts3.4/controller/createOptimistic.d.ts +12 -0
  269. package/ts3.4/controller/createReceive.d.ts +24 -0
  270. package/ts3.4/controller/createReset.d.ts +3 -0
  271. package/ts3.4/controller/createSubscription.d.ts +13 -0
  272. package/ts3.4/controller/types.d.ts +6 -0
  273. package/ts3.4/endpoint/index.d.ts +3 -0
  274. package/ts3.4/endpoint/shapes.d.ts +25 -0
  275. package/ts3.4/endpoint/types.d.ts +45 -0
  276. package/ts3.4/fsa.d.ts +41 -0
  277. package/ts3.4/index.d.ts +22 -0
  278. package/ts3.4/internal.d.ts +4 -0
  279. package/ts3.4/legacyActions.d.ts +95 -0
  280. package/ts3.4/manager/ConnectionListener.d.ts +8 -0
  281. package/ts3.4/manager/DefaultConnectionListener.d.ts +20 -0
  282. package/ts3.4/manager/DevtoolsManager.d.ts +24 -0
  283. package/ts3.4/manager/LogoutManager.d.ts +25 -0
  284. package/ts3.4/manager/NetworkManager.d.ts +82 -0
  285. package/ts3.4/manager/PollingSubscription.d.ts +45 -0
  286. package/ts3.4/manager/SubscriptionManager.d.ts +55 -0
  287. package/ts3.4/manager/applyManager.d.ts +10 -0
  288. package/ts3.4/manager/devtoolsTypes.d.ts +205 -0
  289. package/ts3.4/manager/index.d.ts +8 -0
  290. package/ts3.4/middlewareTypes.d.ts +18 -0
  291. package/ts3.4/newActions.d.ts +88 -0
  292. package/ts3.4/next/Controller.d.ts +14 -0
  293. package/ts3.4/next/index.d.ts +3 -0
  294. package/ts3.4/previousActions.d.ts +94 -0
  295. package/ts3.4/state/RIC.d.ts +2 -0
  296. package/ts3.4/state/applyUpdatersToResults.d.ts +13 -0
  297. package/ts3.4/state/legacy-actions/createFetch.d.ts +19 -0
  298. package/ts3.4/state/legacy-actions/createReceive.d.ts +14 -0
  299. package/ts3.4/state/legacy-actions/createReceiveError.d.ts +9 -0
  300. package/ts3.4/state/legacy-actions/index.d.ts +4 -0
  301. package/ts3.4/state/reducer/createReducer.d.ts +7 -0
  302. package/ts3.4/state/reducer/fetchReducer.d.ts +4 -0
  303. package/ts3.4/state/reducer/invalidateReducer.d.ts +37 -0
  304. package/ts3.4/state/reducer/setReducer.d.ts +40 -0
  305. package/ts3.4/state/reducerInstance.d.ts +7 -0
  306. package/ts3.4/state/selectMeta.d.ts +3 -0
  307. package/ts3.4/types.d.ts +73 -0
  308. 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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