@ngxs/storage-plugin 3.7.4 → 3.7.5-dev.master-17a1bb8

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.
@@ -1,183 +1,231 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { PLATFORM_ID, Inject, Injectable } from '@angular/core';
7
- import { isPlatformServer } from '@angular/common';
8
- import { setValue, getValue, InitState, UpdateState, actionMatcher } from '@ngxs/store';
9
- import { tap } from 'rxjs/operators';
10
- import { STORAGE_ENGINE, NGXS_STORAGE_PLUGIN_OPTIONS } from './symbols';
11
- import { DEFAULT_STATE_KEY } from './internals';
12
- var NgxsStoragePlugin = /** @class */ (function () {
13
- function NgxsStoragePlugin(_options, _engine, _platformId) {
14
- this._options = _options;
15
- this._engine = _engine;
16
- this._platformId = _platformId;
17
- }
18
- /**
19
- * @param {?} state
20
- * @param {?} event
21
- * @param {?} next
22
- * @return {?}
23
- */
24
- NgxsStoragePlugin.prototype.handle = /**
25
- * @param {?} state
26
- * @param {?} event
27
- * @param {?} next
28
- * @return {?}
29
- */
30
- function (state, event, next) {
31
- var _this = this;
32
- var e_1, _a;
33
- if (isPlatformServer(this._platformId) && this._engine === null) {
34
- return next(state, event);
35
- }
36
- // We cast to `string[]` here as we're sure that this option has been
37
- // transformed by the `storageOptionsFactory` function that provided token
38
- /** @type {?} */
39
- var keys = (/** @type {?} */ (this._options.key));
40
- /** @type {?} */
41
- var matches = actionMatcher(event);
42
- /** @type {?} */
43
- var isInitAction = matches(InitState);
44
- /** @type {?} */
45
- var isUpdateAction = matches(UpdateState);
46
- /** @type {?} */
47
- var isInitOrUpdateAction = isInitAction || isUpdateAction;
48
- /** @type {?} */
49
- var hasMigration = false;
50
- if (isInitOrUpdateAction) {
51
- var _loop_1 = function (key) {
52
- // We're checking what states have been added by NGXS and if any of these states should be handled by
53
- // the storage plugin. For instance, we only want to deserialize the `auth` state, NGXS has added
54
- // the `user` state, the storage plugin will be rerun and will do redundant deserialization.
55
- if (isUpdateAction && event.addedStates && !event.addedStates.hasOwnProperty(key)) {
56
- return "continue";
57
- }
58
- /** @type {?} */
59
- var isMaster = key === DEFAULT_STATE_KEY;
60
- /** @type {?} */
61
- var val = this_1._engine.getItem((/** @type {?} */ (key)));
62
- if (val !== 'undefined' && val != null) {
63
- try {
64
- /** @type {?} */
65
- var newVal = (/** @type {?} */ (this_1._options.deserialize))(val);
66
- val = (/** @type {?} */ (this_1._options.afterDeserialize))(newVal, key);
67
- }
68
- catch (e) {
69
- // Caretaker note: we have still left the `typeof` condition in order to avoid
70
- // creating a breaking change for projects that still use the View Engine.
71
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
72
- console.error("Error ocurred while deserializing the " + key + " store value, falling back to empty object, the value obtained from the store: ", val);
73
- }
74
- val = {};
75
- }
76
- if (this_1._options.migrations) {
77
- this_1._options.migrations.forEach((/**
78
- * @param {?} strategy
79
- * @return {?}
80
- */
81
- function (strategy) {
82
- /** @type {?} */
83
- var versionMatch = strategy.version === getValue(val, strategy.versionKey || 'version');
84
- /** @type {?} */
85
- var keyMatch = (!strategy.key && isMaster) || strategy.key === key;
86
- if (versionMatch && keyMatch) {
87
- val = strategy.migrate(val);
88
- hasMigration = true;
89
- }
90
- }));
91
- }
92
- if (!isMaster) {
93
- state = setValue(state, (/** @type {?} */ (key)), val);
94
- }
95
- else {
96
- state = tslib_1.__assign({}, state, val);
97
- }
98
- }
99
- };
100
- var this_1 = this;
101
- try {
102
- for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
103
- var key = keys_1_1.value;
104
- _loop_1(key);
105
- }
106
- }
107
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
108
- finally {
109
- try {
110
- if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
111
- }
112
- finally { if (e_1) throw e_1.error; }
113
- }
114
- }
115
- return next(state, event).pipe(tap((/**
116
- * @param {?} nextState
117
- * @return {?}
118
- */
119
- function (nextState) {
120
- var e_2, _a;
121
- if (!isInitOrUpdateAction || (isInitOrUpdateAction && hasMigration)) {
122
- try {
123
- for (var keys_2 = tslib_1.__values(keys), keys_2_1 = keys_2.next(); !keys_2_1.done; keys_2_1 = keys_2.next()) {
124
- var key = keys_2_1.value;
125
- /** @type {?} */
126
- var val = nextState;
127
- if (key !== DEFAULT_STATE_KEY) {
128
- val = getValue(nextState, (/** @type {?} */ (key)));
129
- }
130
- try {
131
- /** @type {?} */
132
- var newVal = (/** @type {?} */ (_this._options.beforeSerialize))(val, key);
133
- _this._engine.setItem((/** @type {?} */ (key)), (/** @type {?} */ (_this._options.serialize))(newVal));
134
- }
135
- catch (e) {
136
- // Caretaker note: we have still left the `typeof` condition in order to avoid
137
- // creating a breaking change for projects that still use the View Engine.
138
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
139
- console.error("Error ocurred while serializing the " + key + " store value, value not updated, the value obtained from the store: ", val);
140
- }
141
- }
142
- }
143
- }
144
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
145
- finally {
146
- try {
147
- if (keys_2_1 && !keys_2_1.done && (_a = keys_2.return)) _a.call(keys_2);
148
- }
149
- finally { if (e_2) throw e_2.error; }
150
- }
151
- }
152
- })));
153
- };
154
- NgxsStoragePlugin.decorators = [
155
- { type: Injectable }
156
- ];
157
- /** @nocollapse */
158
- NgxsStoragePlugin.ctorParameters = function () { return [
159
- { type: undefined, decorators: [{ type: Inject, args: [NGXS_STORAGE_PLUGIN_OPTIONS,] }] },
160
- { type: undefined, decorators: [{ type: Inject, args: [STORAGE_ENGINE,] }] },
161
- { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
162
- ]; };
163
- return NgxsStoragePlugin;
164
- }());
165
- export { NgxsStoragePlugin };
166
- if (false) {
167
- /**
168
- * @type {?}
169
- * @private
170
- */
171
- NgxsStoragePlugin.prototype._options;
172
- /**
173
- * @type {?}
174
- * @private
175
- */
176
- NgxsStoragePlugin.prototype._engine;
177
- /**
178
- * @type {?}
179
- * @private
180
- */
181
- NgxsStoragePlugin.prototype._platformId;
182
- }
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5wbHVnaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy9zdG9yYWdlLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9zdG9yYWdlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFFZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUdMLGNBQWMsRUFDZCwyQkFBMkIsRUFDNUIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUWhEO0lBRUUsMkJBQytDLFFBQWtDLEVBQy9DLE9BQXNCLEVBQ3pCLFdBQW1CO1FBRkgsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDL0MsWUFBTyxHQUFQLE9BQU8sQ0FBZTtRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtJQUMvQyxDQUFDOzs7Ozs7O0lBRUosa0NBQU07Ozs7OztJQUFOLFVBQU8sS0FBVSxFQUFFLEtBQVUsRUFBRSxJQUFzQjtRQUFyRCxpQkEwRkM7O1FBekZDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQjs7OztZQUlLLElBQUksR0FBRyxtQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBWTs7WUFDcEMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENB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QVEsQ0FBQyxTQUFTLEVBQUUsbUJBQUEsR0FBRyxFQUFDLENBQUMsQ0FBQzt5QkFDakM7d0JBRUQsSUFBSTs7Z0NBQ0ksTUFBTSxHQUFHLG1CQUFBLEtBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzs0QkFDdkQsS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQUEsR0FBRyxFQUFDLEVBQUUsbUJBQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO3lCQUM5RDt3QkFBQyxPQUFPLENBQUMsRUFBRTs0QkFDViw4RUFBOEU7NEJBQzlFLDBFQUEwRTs0QkFDMUUsSUFBSSxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxFQUFFO2dDQUNqRCxPQUFPLENBQUMsS0FBSyxDQUNYLHlDQUF1QyxHQUFHLHlFQUFzRSxFQUNoSCxHQUFHLENBQ0osQ0FBQzs2QkFDSDt5QkFDRjtxQkFDRjs7Ozs7Ozs7O2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7Z0JBbEdGLFVBQVU7Ozs7Z0RBR04sTUFBTSxTQUFDLDJCQUEyQjtnREFDbEMsTUFBTSxTQUFDLGNBQWM7NkNBQ3JCLE1BQU0sU0FBQyxXQUFXOztJQThGdkIsd0JBQUM7Q0FBQSxBQW5HRCxJQW1HQztTQWxHWSxpQkFBaUI7Ozs7OztJQUUxQixxQ0FBK0U7Ozs7O0lBQy9FLG9DQUFzRDs7Ozs7SUFDdEQsd0NBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUExBVEZPUk1fSUQsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBOZ3hzUGx1Z2luLFxyXG4gIHNldFZhbHVlLFxyXG4gIGdldFZhbHVlLFxyXG4gIEluaXRTdGF0ZSxcclxuICBVcGRhdGVTdGF0ZSxcclxuICBhY3Rpb25NYXRjaGVyLFxyXG4gIE5neHNOZXh0UGx1Z2luRm5cclxufSBmcm9tICdAbmd4cy9zdG9yZSc7XHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU3RvcmFnZUVuZ2luZSxcclxuICBOZ3hzU3RvcmFnZVBsdWdpbk9wdGlvbnMsXHJcbiAgU1RPUkFHRV9FTkdJTkUsXHJcbiAgTkdYU19TVE9SQUdFX1BMVUdJTl9PUFRJT05TXHJcbn0gZnJvbSAnLi9zeW1ib2xzJztcclxuaW1wb3J0IHsgREVGQVVMVF9TVEFURV9LRVkgfSBmcm9tICcuL2ludGVybmFscyc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIFdpbGwgYmUgcHJvdmlkZWQgdGhyb3VnaCBUZXJzZXIgZ2xvYmFsIGRlZmluaXRpb25zIGJ5IEFuZ3VsYXIgQ0xJXHJcbiAqIGR1cmluZyB0aGUgcHJvZHVjdGlvbiBidWlsZC4gVGhpcyBpcyBob3cgQW5ndWxhciBkb2VzIHRyZWUtc2hha2luZyBpbnRlcm5hbGx5LlxyXG4gKi9cclxuZGVjbGFyZSBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW47XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZ3hzU3RvcmFnZVBsdWdpbiBpbXBsZW1lbnRzIE5neHNQbHVnaW4ge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChOR1hTX1NUT1JBR0VfUExVR0lOX09QVElPTlMpIHByaXZhdGUgX29wdGlvbnM6IE5neHNTdG9yYWdlUGx1Z2luT3B0aW9ucyxcclxuICAgIEBJbmplY3QoU1RPUkFHRV9FTkdJTkUpIHByaXZhdGUgX2VuZ2luZTogU3RvcmFnZUVuZ2luZSxcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgX3BsYXRmb3JtSWQ6IHN0cmluZ1xyXG4gICkge31cclxuXHJcbiAgaGFuZGxlKHN0YXRlOiBhbnksIGV2ZW50OiBhbnksIG5leHQ6IE5neHNOZXh0UGx1Z2luRm4pIHtcclxuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMuX3BsYXRmb3JtSWQpICYmIHRoaXMuX2VuZ2luZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbmV4dChzdGF0ZSwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdlIGNhc3QgdG8gYHN0cmluZ1tdYCBoZXJlIGFzIHdlJ3JlIHN1cmUgdGhhdCB0aGlzIG9wdGlvbiBoYXMgYmVlblxyXG4gICAgLy8gdHJhbnNmb3JtZWQgYnkgdGhlIGBzdG9yYWdlT3B0aW9uc0ZhY3RvcnlgIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZWQgdG9rZW5cclxuICAgIGNvbnN0IGtleXMgPSB0aGlzLl9vcHRpb25zLmtleSBhcyBzdHJpbmdbXTtcclxuICAgIGNvbnN0IG1hdGNoZXMgPSBhY3Rpb25NYXRjaGVyKGV2ZW50KTtcclxuICAgIGNvbnN0IGlzSW5pdEFjdGlvbiA9IG1hdGNoZXMoSW5pdFN0YXRlKTtcclxuICAgIGNvbnN0IGlzVXBkYXRlQWN0aW9uID0gbWF0Y2hlcyhVcGRhdGVTdGF0ZSk7XHJcbiAgICBjb25zdCBpc0luaXRPclVwZGF0ZUFjdGlvbiA9IGlzSW5pdEFjdGlvbiB8fCBpc1VwZGF0ZUFjdGlvbjtcclxuICAgIGxldCBoYXNNaWdyYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoaXNJbml0T3JVcGRhdGVBY3Rpb24pIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgIC8vIFdlJ3JlIGNoZWNraW5nIHdoYXQgc3RhdGVzIGhhdmUgYmVlbiBhZGRlZCBieSBOR1hTIGFuZCBpZiBhbnkgb2YgdGhlc2Ugc3RhdGVzIHNob3VsZCBiZSBoYW5kbGVkIGJ5XHJcbiAgICAgICAgLy8gdGhlIHN0b3JhZ2UgcGx1Z2luLiBGb3IgaW5zdGFuY2UsIHdlIG9ubHkgd2FudCB0byBkZXNlcmlhbGl6ZSB0aGUgYGF1dGhgIHN0YXRlLCBOR1hTIGhhcyBhZGRlZFxyXG4gICAgICAgIC8vIHRoZSBgdXNlcmAgc3RhdGUsIHRoZSBzdG9yYWdlIHBsdWdpbiB3aWxsIGJlIHJlcnVuIGFuZCB3aWxsIGRvIHJlZHVuZGFudCBkZXNlcmlhbGl6YXRpb24uXHJcbiAgICAgICAgaWYgKGlzVXBkYXRlQWN0aW9uICYmIGV2ZW50LmFkZGVkU3RhdGVzICYmICFldmVudC5hZGRlZFN0YXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlzTWFzdGVyID0ga2V5ID09PSBERUZBVUxUX1NUQVRFX0tFWTtcclxuICAgICAgICBsZXQgdmFsOiBhbnkgPSB0aGlzLl9lbmdpbmUuZ2V0SXRlbShrZXkhKTtcclxuXHJcbiAgICAgICAgaWYgKHZhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsICE9IG51bGwpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuX29wdGlvbnMuZGVzZXJpYWxpemUhKHZhbCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuX29wdGlvbnMuYWZ0ZXJEZXNlcmlhbGl6ZSEobmV3VmFsLCBrZXkpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBDYXJldGFrZXIgbm90ZTogd2UgaGF2ZSBzdGlsbCBsZWZ0IHRoZSBgdHlwZW9mYCBjb25kaXRpb24gaW4gb3JkZXIgdG8gYXZvaWRcclxuICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBicmVha2luZyBjaGFuZ2UgZm9yIHByb2plY3RzIHRoYXQgc3RpbGwgdXNlIHRoZSBWaWV3IEVuZ2luZS5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgRXJyb3Igb2N1cnJlZCB3aGlsZSBkZXNlcmlhbGl6aW5nIHRoZSAke2tleX0gc3RvcmUgdmFsdWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBvYmplY3QsIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBzdG9yZTogYCxcclxuICAgICAgICAgICAgICAgIHZhbFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFsID0ge307XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWlncmF0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLm1pZ3JhdGlvbnMuZm9yRWFjaChzdHJhdGVneSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID1cclxuICAgICAgICAgICAgICAgIHN0cmF0ZWd5LnZlcnNpb24gPT09IGdldFZhbHVlKHZhbCwgc3RyYXRlZ3kudmVyc2lvbktleSB8fCAndmVyc2lvbicpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGtleU1hdGNoID0gKCFzdHJhdGVneS5rZXkgJiYgaXNNYXN0ZXIpIHx8IHN0cmF0ZWd5LmtleSA9PT0ga2V5O1xyXG4gICAgICAgICAgICAgIGlmICh2ZXJzaW9uTWF0Y2ggJiYga2V5TWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmF0ZWd5Lm1pZ3JhdGUodmFsKTtcclxuICAgICAgICAgICAgICAgIGhhc01pZ3JhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWlzTWFzdGVyKSB7XHJcbiAgICAgICAgICAgIHN0YXRlID0gc2V0VmFsdWUoc3RhdGUsIGtleSEsIHZhbCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdGF0ZSA9IHsgLi4uc3RhdGUsIC4uLnZhbCB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXh0KHN0YXRlLCBldmVudCkucGlwZShcclxuICAgICAgdGFwKG5leHRTdGF0ZSA9PiB7XHJcbiAgICAgICAgaWYgKCFpc0luaXRPclVwZGF0ZUFjdGlvbiB8fCAoaXNJbml0T3JVcGRhdGVBY3Rpb24gJiYgaGFzTWlncmF0aW9uKSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gbmV4dFN0YXRlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGtleSAhPT0gREVGQVVMVF9TVEFURV9LRVkpIHtcclxuICAgICAgICAgICAgICB2YWwgPSBnZXRWYWx1ZShuZXh0U3RhdGUsIGtleSEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuX29wdGlvbnMuYmVmb3JlU2VyaWFsaXplISh2YWwsIGtleSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fZW5naW5lLnNldEl0ZW0oa2V5ISwgdGhpcy5fb3B0aW9ucy5zZXJpYWxpemUhKG5ld1ZhbCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IHdlIGhhdmUgc3RpbGwgbGVmdCB0aGUgYHR5cGVvZmAgY29uZGl0aW9uIGluIG9yZGVyIHRvIGF2b2lkXHJcbiAgICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBicmVha2luZyBjaGFuZ2UgZm9yIHByb2plY3RzIHRoYXQgc3RpbGwgdXNlIHRoZSBWaWV3IEVuZ2luZS5cclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgICBgRXJyb3Igb2N1cnJlZCB3aGlsZSBzZXJpYWxpemluZyB0aGUgJHtrZXl9IHN0b3JlIHZhbHVlLCB2YWx1ZSBub3QgdXBkYXRlZCwgdGhlIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIHN0b3JlOiBgLFxyXG4gICAgICAgICAgICAgICAgICB2YWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { PLATFORM_ID, Inject, Injectable } from '@angular/core';
7
+ import { isPlatformServer } from '@angular/common';
8
+ import { setValue, getValue, InitState, UpdateState, actionMatcher } from '@ngxs/store';
9
+ import { tap } from 'rxjs/operators';
10
+ import { STORAGE_ENGINE, NGXS_STORAGE_PLUGIN_OPTIONS } from './symbols';
11
+ import { DEFAULT_STATE_KEY } from './internals';
12
+ var NgxsStoragePlugin = /** @class */ (function () {
13
+ function NgxsStoragePlugin(_options, _engine, _platformId) {
14
+ this._options = _options;
15
+ this._engine = _engine;
16
+ this._platformId = _platformId;
17
+ // We cast to `string[]` here as we're sure that this option has been
18
+ // transformed by the `storageOptionsFactory` function that provided token.
19
+ this._keys = (/** @type {?} */ (this._options.key));
20
+ // We default to `[DEFAULT_STATE_KEY]` if the user explicitly does not provide the `key` option.
21
+ this._usesDefaultStateKey = this._keys.length === 1 && this._keys[0] === DEFAULT_STATE_KEY;
22
+ }
23
+ /**
24
+ * @param {?} state
25
+ * @param {?} event
26
+ * @param {?} next
27
+ * @return {?}
28
+ */
29
+ NgxsStoragePlugin.prototype.handle = /**
30
+ * @param {?} state
31
+ * @param {?} event
32
+ * @param {?} next
33
+ * @return {?}
34
+ */
35
+ function (state, event, next) {
36
+ var _this = this;
37
+ var e_1, _a;
38
+ if (isPlatformServer(this._platformId) && this._engine === null) {
39
+ return next(state, event);
40
+ }
41
+ /** @type {?} */
42
+ var matches = actionMatcher(event);
43
+ /** @type {?} */
44
+ var isInitAction = matches(InitState);
45
+ /** @type {?} */
46
+ var isUpdateAction = matches(UpdateState);
47
+ /** @type {?} */
48
+ var isInitOrUpdateAction = isInitAction || isUpdateAction;
49
+ /** @type {?} */
50
+ var hasMigration = false;
51
+ if (isInitOrUpdateAction) {
52
+ /** @type {?} */
53
+ var addedStates = isUpdateAction && event.addedStates;
54
+ var _loop_1 = function (key) {
55
+ // We're checking what states have been added by NGXS and if any of these states should be handled by
56
+ // the storage plugin. For instance, we only want to deserialize the `auth` state, NGXS has added
57
+ // the `user` state, the storage plugin will be rerun and will do redundant deserialization.
58
+ // `usesDefaultStateKey` is necessary to check since `event.addedStates` never contains `@@STATE`.
59
+ if (!this_1._usesDefaultStateKey && addedStates && !addedStates.hasOwnProperty(key)) {
60
+ return "continue";
61
+ }
62
+ /** @type {?} */
63
+ var storedValue = this_1._engine.getItem((/** @type {?} */ (key)));
64
+ if (storedValue !== 'undefined' && storedValue != null) {
65
+ try {
66
+ /** @type {?} */
67
+ var newVal = (/** @type {?} */ (this_1._options.deserialize))(storedValue);
68
+ storedValue = (/** @type {?} */ (this_1._options.afterDeserialize))(newVal, key);
69
+ }
70
+ catch (_a) {
71
+ // Caretaker note: we have still left the `typeof` condition in order to avoid
72
+ // creating a breaking change for projects that still use the View Engine.
73
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
74
+ console.error("Error ocurred while deserializing the " + key + " store value, falling back to empty object, the value obtained from the store: ", storedValue);
75
+ }
76
+ storedValue = {};
77
+ }
78
+ if (this_1._options.migrations) {
79
+ this_1._options.migrations.forEach((/**
80
+ * @param {?} strategy
81
+ * @return {?}
82
+ */
83
+ function (strategy) {
84
+ /** @type {?} */
85
+ var versionMatch = strategy.version === getValue(storedValue, strategy.versionKey || 'version');
86
+ /** @type {?} */
87
+ var keyMatch = (!strategy.key && _this._usesDefaultStateKey) || strategy.key === key;
88
+ if (versionMatch && keyMatch) {
89
+ storedValue = strategy.migrate(storedValue);
90
+ hasMigration = true;
91
+ }
92
+ }));
93
+ }
94
+ if (!this_1._usesDefaultStateKey) {
95
+ state = setValue(state, (/** @type {?} */ (key)), storedValue);
96
+ }
97
+ else {
98
+ // The `UpdateState` action is dispatched whenever the feature state is added.
99
+ // The below condition is met only when the `UpdateState` is dispatched.
100
+ // Let's assume that we have 2 states `counter` and `@ngxs/router-plugin` state.
101
+ // `CounterState` is provided on the root level when calling `NgxsModule.forRoot()`
102
+ // and `@ngxs/router-plugin` is provided as a feature state.
103
+ // The storage plugin may save the `counter` state value as `10` before.
104
+ // The `CounterState` may implement the `ngxsOnInit` hook and call `ctx.setState(999)`.
105
+ // The storage plugin will re-hydrate the whole state when the `RouterState` is registered,
106
+ // and the `counter` state will again equal `10` (not `999`).
107
+ if (storedValue && addedStates && Object.keys(addedStates).length > 0) {
108
+ storedValue = Object.keys(addedStates).reduce((/**
109
+ * @param {?} accumulator
110
+ * @param {?} addedState
111
+ * @return {?}
112
+ */
113
+ function (accumulator, addedState) {
114
+ // The `storedValue` may equal the whole state (when the default state key is used).
115
+ // If `addedStates` contains only `router` then we want to merge the state only
116
+ // with the `router` value.
117
+ // Let's assume that the `storedValue` is an object:
118
+ // `{ counter: 10, router: {...} }`
119
+ // This will pick only the `router` object from the `storedValue` and `counter`
120
+ // state will not be re-hydrated unnecessary.
121
+ if (storedValue.hasOwnProperty(addedState)) {
122
+ accumulator[addedState] = storedValue[addedState];
123
+ }
124
+ return accumulator;
125
+ }), (/** @type {?} */ ({})));
126
+ }
127
+ state = tslib_1.__assign({}, state, storedValue);
128
+ }
129
+ }
130
+ };
131
+ var this_1 = this;
132
+ try {
133
+ for (var _b = tslib_1.__values(this._keys), _c = _b.next(); !_c.done; _c = _b.next()) {
134
+ var key = _c.value;
135
+ _loop_1(key);
136
+ }
137
+ }
138
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
139
+ finally {
140
+ try {
141
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
142
+ }
143
+ finally { if (e_1) throw e_1.error; }
144
+ }
145
+ }
146
+ return next(state, event).pipe(tap((/**
147
+ * @param {?} nextState
148
+ * @return {?}
149
+ */
150
+ function (nextState) {
151
+ var e_2, _a;
152
+ if (!isInitOrUpdateAction || (isInitOrUpdateAction && hasMigration)) {
153
+ try {
154
+ for (var _b = tslib_1.__values(_this._keys), _c = _b.next(); !_c.done; _c = _b.next()) {
155
+ var key = _c.value;
156
+ /** @type {?} */
157
+ var val = nextState;
158
+ if (key !== DEFAULT_STATE_KEY) {
159
+ val = getValue(nextState, (/** @type {?} */ (key)));
160
+ }
161
+ try {
162
+ /** @type {?} */
163
+ var newVal = (/** @type {?} */ (_this._options.beforeSerialize))(val, key);
164
+ _this._engine.setItem((/** @type {?} */ (key)), (/** @type {?} */ (_this._options.serialize))(newVal));
165
+ }
166
+ catch (error) {
167
+ // Caretaker note: we have still left the `typeof` condition in order to avoid
168
+ // creating a breaking change for projects that still use the View Engine.
169
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
170
+ if (error &&
171
+ (error.name === 'QuotaExceededError' ||
172
+ error.name === 'NS_ERROR_DOM_QUOTA_REACHED')) {
173
+ console.error("The " + key + " store value exceeds the browser storage quota: ", val);
174
+ }
175
+ else {
176
+ console.error("Error ocurred while serializing the " + key + " store value, value not updated, the value obtained from the store: ", val);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
183
+ finally {
184
+ try {
185
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
186
+ }
187
+ finally { if (e_2) throw e_2.error; }
188
+ }
189
+ }
190
+ })));
191
+ };
192
+ NgxsStoragePlugin.decorators = [
193
+ { type: Injectable }
194
+ ];
195
+ /** @nocollapse */
196
+ NgxsStoragePlugin.ctorParameters = function () { return [
197
+ { type: undefined, decorators: [{ type: Inject, args: [NGXS_STORAGE_PLUGIN_OPTIONS,] }] },
198
+ { type: undefined, decorators: [{ type: Inject, args: [STORAGE_ENGINE,] }] },
199
+ { type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
200
+ ]; };
201
+ return NgxsStoragePlugin;
202
+ }());
203
+ export { NgxsStoragePlugin };
204
+ if (false) {
205
+ /**
206
+ * @type {?}
207
+ * @private
208
+ */
209
+ NgxsStoragePlugin.prototype._keys;
210
+ /**
211
+ * @type {?}
212
+ * @private
213
+ */
214
+ NgxsStoragePlugin.prototype._usesDefaultStateKey;
215
+ /**
216
+ * @type {?}
217
+ * @private
218
+ */
219
+ NgxsStoragePlugin.prototype._options;
220
+ /**
221
+ * @type {?}
222
+ * @private
223
+ */
224
+ NgxsStoragePlugin.prototype._engine;
225
+ /**
226
+ * @type {?}
227
+ * @private
228
+ */
229
+ NgxsStoragePlugin.prototype._platformId;
230
+ }
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5wbHVnaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4cy9zdG9yYWdlLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9zdG9yYWdlLnBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRCxPQUFPLEVBRUwsUUFBUSxFQUNSLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLGFBQWEsRUFFZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUdMLGNBQWMsRUFDZCwyQkFBMkIsRUFDNUIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUWhEO0lBU0UsMkJBQytDLFFBQWtDLEVBQy9DLE9BQXNCLEVBQ3pCLFdBQW1CO1FBRkgsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDL0MsWUFBTyxHQUFQLE9BQU8sQ0FBZTtRQUN6QixnQkFBVyxHQUFYLFdBQVcsQ0FBUTs7O1FBUjFDLFVBQUssR0FBRyxtQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBWSxDQUFDOztRQUV0Qyx5QkFBb0IsR0FDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUM7SUFNOUQsQ0FBQzs7Ozs7OztJQUVKLGtDQUFNOzs7Ozs7SUFBTixVQUFPLEtBQVUsRUFBRSxLQUFVLEVBQUUsSUFBc0I7UUFBckQsaUJBOEhDOztRQTdIQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJ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LE9BQU8sQ0FBQyxtQkFBQSxHQUFHLEVBQUMsRUFBRSxtQkFBQSxLQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7eUJBQzlEO3dCQUFDLE9BQU8sS0FBSyxFQUFFOzRCQUNkLDhFQUE4RTs0QkFDOUUsMEVBQTBFOzRCQUMxRSxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLEVBQUU7Z0NBQ2pELElBQ0UsS0FBSztvQ0FDTCxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssb0JBQW9CO3dDQUNsQyxLQUFLLENBQUMsSUFBSSxLQUFLLDRCQUE0QixDQUFDLEVBQzlDO29DQUNBLE9BQU8sQ0FBQyxLQUFLLENBQ1gsU0FBTyxHQUFHLHFEQUFrRCxFQUM1RCxHQUFHLENBQ0osQ0FBQztpQ0FDSDtxQ0FBTTtvQ0FDTCxPQUFPLENBQUMsS0FBSyxDQUNYLHlDQUF1QyxHQUFHLHlFQUFzRSxFQUNoSCxHQUFHLENBQ0osQ0FBQztpQ0FDSDs2QkFDRjt5QkFDRjtxQkFDRjs7Ozs7Ozs7O2FBQ0Y7UUFDSCxDQUFDLEVBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7Z0JBN0lGLFVBQVU7Ozs7Z0RBVU4sTUFBTSxTQUFDLDJCQUEyQjtnREFDbEMsTUFBTSxTQUFDLGNBQWM7NkNBQ3JCLE1BQU0sU0FBQyxXQUFXOztJQWtJdkIsd0JBQUM7Q0FBQSxBQTlJRCxJQThJQztTQTdJWSxpQkFBaUI7Ozs7OztJQUc1QixrQ0FBOEM7Ozs7O0lBRTlDLGlEQUNpRTs7Ozs7SUFHL0QscUNBQStFOzs7OztJQUMvRSxvQ0FBc0Q7Ozs7O0lBQ3RELHdDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBMQVRGT1JNX0lELCBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUGxhaW5PYmplY3QgfSBmcm9tICdAbmd4cy9zdG9yZS9pbnRlcm5hbHMnO1xuaW1wb3J0IHtcbiAgTmd4c1BsdWdpbixcbiAgc2V0VmFsdWUsXG4gIGdldFZhbHVlLFxuICBJbml0U3RhdGUsXG4gIFVwZGF0ZVN0YXRlLFxuICBhY3Rpb25NYXRjaGVyLFxuICBOZ3hzTmV4dFBsdWdpbkZuXG59IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgU3RvcmFnZUVuZ2luZSxcbiAgTmd4c1N0b3JhZ2VQbHVnaW5PcHRpb25zLFxuICBTVE9SQUdFX0VOR0lORSxcbiAgTkdYU19TVE9SQUdFX1BMVUdJTl9PUFRJT05TXG59IGZyb20gJy4vc3ltYm9scyc7XG5pbXBvcnQgeyBERUZBVUxUX1NUQVRFX0tFWSB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV2lsbCBiZSBwcm92aWRlZCB0aHJvdWdoIFRlcnNlciBnbG9iYWwgZGVmaW5pdGlvbnMgYnkgQW5ndWxhciBDTElcbiAqIGR1cmluZyB0aGUgcHJvZHVjdGlvbiBidWlsZC4gVGhpcyBpcyBob3cgQW5ndWxhciBkb2VzIHRyZWUtc2hha2luZyBpbnRlcm5hbGx5LlxuICovXG5kZWNsYXJlIGNvbnN0IG5nRGV2TW9kZTogYm9vbGVhbjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5neHNTdG9yYWdlUGx1Z2luIGltcGxlbWVudHMgTmd4c1BsdWdpbiB7XG4gIC8vIFdlIGNhc3QgdG8gYHN0cmluZ1tdYCBoZXJlIGFzIHdlJ3JlIHN1cmUgdGhhdCB0aGlzIG9wdGlvbiBoYXMgYmVlblxuICAvLyB0cmFuc2Zvcm1lZCBieSB0aGUgYHN0b3JhZ2VPcHRpb25zRmFjdG9yeWAgZnVuY3Rpb24gdGhhdCBwcm92aWRlZCB0b2tlbi5cbiAgcHJpdmF0ZSBfa2V5cyA9IHRoaXMuX29wdGlvbnMua2V5IGFzIHN0cmluZ1tdO1xuICAvLyBXZSBkZWZhdWx0IHRvIGBbREVGQVVMVF9TVEFURV9LRVldYCBpZiB0aGUgdXNlciBleHBsaWNpdGx5IGRvZXMgbm90IHByb3ZpZGUgdGhlIGBrZXlgIG9wdGlvbi5cbiAgcHJpdmF0ZSBfdXNlc0RlZmF1bHRTdGF0ZUtleSA9XG4gICAgdGhpcy5fa2V5cy5sZW5ndGggPT09IDEgJiYgdGhpcy5fa2V5c1swXSA9PT0gREVGQVVMVF9TVEFURV9LRVk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOR1hTX1NUT1JBR0VfUExVR0lOX09QVElPTlMpIHByaXZhdGUgX29wdGlvbnM6IE5neHNTdG9yYWdlUGx1Z2luT3B0aW9ucyxcbiAgICBASW5qZWN0KFNUT1JBR0VfRU5HSU5FKSBwcml2YXRlIF9lbmdpbmU6IFN0b3JhZ2VFbmdpbmUsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBfcGxhdGZvcm1JZDogc3RyaW5nXG4gICkge31cblxuICBoYW5kbGUoc3RhdGU6IGFueSwgZXZlbnQ6IGFueSwgbmV4dDogTmd4c05leHRQbHVnaW5Gbikge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMuX3BsYXRmb3JtSWQpICYmIHRoaXMuX2VuZ2luZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5leHQoc3RhdGUsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGVzID0gYWN0aW9uTWF0Y2hlcihldmVudCk7XG4gICAgY29uc3QgaXNJbml0QWN0aW9uID0gbWF0Y2hlcyhJbml0U3RhdGUpO1xuICAgIGNvbnN0IGlzVXBkYXRlQWN0aW9uID0gbWF0Y2hlcyhVcGRhdGVTdGF0ZSk7XG4gICAgY29uc3QgaXNJbml0T3JVcGRhdGVBY3Rpb24gPSBpc0luaXRBY3Rpb24gfHwgaXNVcGRhdGVBY3Rpb247XG4gICAgbGV0IGhhc01pZ3JhdGlvbiA9IGZhbHNlO1xuXG4gICAgaWYgKGlzSW5pdE9yVXBkYXRlQWN0aW9uKSB7XG4gICAgICBjb25zdCBhZGRlZFN0YXRlcyA9IGlzVXBkYXRlQWN0aW9uICYmIGV2ZW50LmFkZGVkU3RhdGVzO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLl9rZXlzKSB7XG4gICAgICAgIC8vIFdlJ3JlIGNoZWNraW5nIHdoYXQgc3RhdGVzIGhhdmUgYmVlbiBhZGRlZCBieSBOR1hTIGFuZCBpZiBhbnkgb2YgdGhlc2Ugc3RhdGVzIHNob3VsZCBiZSBoYW5kbGVkIGJ5XG4gICAgICAgIC8vIHRoZSBzdG9yYWdlIHBsdWdpbi4gRm9yIGluc3RhbmNlLCB3ZSBvbmx5IHdhbnQgdG8gZGVzZXJpYWxpemUgdGhlIGBhdXRoYCBzdGF0ZSwgTkdYUyBoYXMgYWRkZWRcbiAgICAgICAgLy8gdGhlIGB1c2VyYCBzdGF0ZSwgdGhlIHN0b3JhZ2UgcGx1Z2luIHdpbGwgYmUgcmVydW4gYW5kIHdpbGwgZG8gcmVkdW5kYW50IGRlc2VyaWFsaXphdGlvbi5cbiAgICAgICAgLy8gYHVzZXNEZWZhdWx0U3RhdGVLZXlgIGlzIG5lY2Vzc2FyeSB0byBjaGVjayBzaW5jZSBgZXZlbnQuYWRkZWRTdGF0ZXNgIG5ldmVyIGNvbnRhaW5zIGBAQFNUQVRFYC5cbiAgICAgICAgaWYgKCF0aGlzLl91c2VzRGVmYXVsdFN0YXRlS2V5ICYmIGFkZGVkU3RhdGVzICYmICFhZGRlZFN0YXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RvcmVkVmFsdWU6IGFueSA9IHRoaXMuX2VuZ2luZS5nZXRJdGVtKGtleSEpO1xuXG4gICAgICAgIGlmIChzdG9yZWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RvcmVkVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSB0aGlzLl9vcHRpb25zLmRlc2VyaWFsaXplIShzdG9yZWRWYWx1ZSk7XG4gICAgICAgICAgICBzdG9yZWRWYWx1ZSA9IHRoaXMuX29wdGlvbnMuYWZ0ZXJEZXNlcmlhbGl6ZSEobmV3VmFsLCBrZXkpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IHdlIGhhdmUgc3RpbGwgbGVmdCB0aGUgYHR5cGVvZmAgY29uZGl0aW9uIGluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgcHJvamVjdHMgdGhhdCBzdGlsbCB1c2UgdGhlIFZpZXcgRW5naW5lLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBvY3VycmVkIHdoaWxlIGRlc2VyaWFsaXppbmcgdGhlICR7a2V5fSBzdG9yZSB2YWx1ZSwgZmFsbGluZyBiYWNrIHRvIGVtcHR5IG9iamVjdCwgdGhlIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIHN0b3JlOiBgLFxuICAgICAgICAgICAgICAgIHN0b3JlZFZhbHVlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yZWRWYWx1ZSA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLm1pZ3JhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMubWlncmF0aW9ucy5mb3JFYWNoKHN0cmF0ZWd5ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID1cbiAgICAgICAgICAgICAgICBzdHJhdGVneS52ZXJzaW9uID09PSBnZXRWYWx1ZShzdG9yZWRWYWx1ZSwgc3RyYXRlZ3kudmVyc2lvbktleSB8fCAndmVyc2lvbicpO1xuICAgICAgICAgICAgICBjb25zdCBrZXlNYXRjaCA9XG4gICAgICAgICAgICAgICAgKCFzdHJhdGVneS5rZXkgJiYgdGhpcy5fdXNlc0RlZmF1bHRTdGF0ZUtleSkgfHwgc3RyYXRlZ3kua2V5ID09PSBrZXk7XG4gICAgICAgICAgICAgIGlmICh2ZXJzaW9uTWF0Y2ggJiYga2V5TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdG9yZWRWYWx1ZSA9IHN0cmF0ZWd5Lm1pZ3JhdGUoc3RvcmVkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGhhc01pZ3JhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5fdXNlc0RlZmF1bHRTdGF0ZUtleSkge1xuICAgICAgICAgICAgc3RhdGUgPSBzZXRWYWx1ZShzdGF0ZSwga2V5ISwgc3RvcmVkVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgYFVwZGF0ZVN0YXRlYCBhY3Rpb24gaXMgZGlzcGF0Y2hlZCB3aGVuZXZlciB0aGUgZmVhdHVyZSBzdGF0ZSBpcyBhZGRlZC5cbiAgICAgICAgICAgIC8vIFRoZSBiZWxvdyBjb25kaXRpb24gaXMgbWV0IG9ubHkgd2hlbiB0aGUgYFVwZGF0ZVN0YXRlYCBpcyBkaXNwYXRjaGVkLlxuICAgICAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgd2UgaGF2ZSAyIHN0YXRlcyBgY291bnRlcmAgYW5kIGBAbmd4cy9yb3V0ZXItcGx1Z2luYCBzdGF0ZS5cbiAgICAgICAgICAgIC8vIGBDb3VudGVyU3RhdGVgIGlzIHByb3ZpZGVkIG9uIHRoZSByb290IGxldmVsIHdoZW4gY2FsbGluZyBgTmd4c01vZHVsZS5mb3JSb290KClgXG4gICAgICAgICAgICAvLyBhbmQgYEBuZ3hzL3JvdXRlci1wbHVnaW5gIGlzIHByb3ZpZGVkIGFzIGEgZmVhdHVyZSBzdGF0ZS5cbiAgICAgICAgICAgIC8vIFRoZSBzdG9yYWdlIHBsdWdpbiBtYXkgc2F2ZSB0aGUgYGNvdW50ZXJgIHN0YXRlIHZhbHVlIGFzIGAxMGAgYmVmb3JlLlxuICAgICAgICAgICAgLy8gVGhlIGBDb3VudGVyU3RhdGVgIG1heSBpbXBsZW1lbnQgdGhlIGBuZ3hzT25Jbml0YCBob29rIGFuZCBjYWxsIGBjdHguc2V0U3RhdGUoOTk5KWAuXG4gICAgICAgICAgICAvLyBUaGUgc3RvcmFnZSBwbHVnaW4gd2lsbCByZS1oeWRyYXRlIHRoZSB3aG9sZSBzdGF0ZSB3aGVuIHRoZSBgUm91dGVyU3RhdGVgIGlzIHJlZ2lzdGVyZWQsXG4gICAgICAgICAgICAvLyBhbmQgdGhlIGBjb3VudGVyYCBzdGF0ZSB3aWxsIGFnYWluIGVxdWFsIGAxMGAgKG5vdCBgOTk5YCkuXG4gICAgICAgICAgICBpZiAoc3RvcmVkVmFsdWUgJiYgYWRkZWRTdGF0ZXMgJiYgT2JqZWN0LmtleXMoYWRkZWRTdGF0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RvcmVkVmFsdWUgPSBPYmplY3Qua2V5cyhhZGRlZFN0YXRlcykucmVkdWNlKChhY2N1bXVsYXRvciwgYWRkZWRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBgc3RvcmVkVmFsdWVgIG1heSBlcXVhbCB0aGUgd2hvbGUgc3RhdGUgKHdoZW4gdGhlIGRlZmF1bHQgc3RhdGUga2V5IGlzIHVzZWQpLlxuICAgICAgICAgICAgICAgIC8vIElmIGBhZGRlZFN0YXRlc2AgY29udGFpbnMgb25seSBgcm91dGVyYCB0aGVuIHdlIHdhbnQgdG8gbWVyZ2UgdGhlIHN0YXRlIG9ubHlcbiAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBgcm91dGVyYCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgYHN0b3JlZFZhbHVlYCBpcyBhbiBvYmplY3Q6XG4gICAgICAgICAgICAgICAgLy8gYHsgY291bnRlcjogMTAsIHJvdXRlcjogey4uLn0gfWBcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcGljayBvbmx5IHRoZSBgcm91dGVyYCBvYmplY3QgZnJvbSB0aGUgYHN0b3JlZFZhbHVlYCBhbmQgYGNvdW50ZXJgXG4gICAgICAgICAgICAgICAgLy8gc3RhdGUgd2lsbCBub3QgYmUgcmUtaHlkcmF0ZWQgdW5uZWNlc3NhcnkuXG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlZFZhbHVlLmhhc093blByb3BlcnR5KGFkZGVkU3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRvclthZGRlZFN0YXRlXSA9IHN0b3JlZFZhbHVlW2FkZGVkU3RhdGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICAgICAgICAgIH0sIDxQbGFpbk9iamVjdD57fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXRlID0geyAuLi5zdGF0ZSwgLi4uc3RvcmVkVmFsdWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChzdGF0ZSwgZXZlbnQpLnBpcGUoXG4gICAgICB0YXAobmV4dFN0YXRlID0+IHtcbiAgICAgICAgaWYgKCFpc0luaXRPclVwZGF0ZUFjdGlvbiB8fCAoaXNJbml0T3JVcGRhdGVBY3Rpb24gJiYgaGFzTWlncmF0aW9uKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuX2tleXMpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBuZXh0U3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChrZXkgIT09IERFRkFVTFRfU1RBVEVfS0VZKSB7XG4gICAgICAgICAgICAgIHZhbCA9IGdldFZhbHVlKG5leHRTdGF0ZSwga2V5ISk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHRoaXMuX29wdGlvbnMuYmVmb3JlU2VyaWFsaXplISh2YWwsIGtleSk7XG4gICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5zZXRJdGVtKGtleSEsIHRoaXMuX29wdGlvbnMuc2VyaWFsaXplIShuZXdWYWwpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIENhcmV0YWtlciBub3RlOiB3ZSBoYXZlIHN0aWxsIGxlZnQgdGhlIGB0eXBlb2ZgIGNvbmRpdGlvbiBpbiBvcmRlciB0byBhdm9pZFxuICAgICAgICAgICAgICAvLyBjcmVhdGluZyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgcHJvamVjdHMgdGhhdCBzdGlsbCB1c2UgdGhlIFZpZXcgRW5naW5lLlxuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgIChlcnJvci5uYW1lID09PSAnUXVvdGFFeGNlZWRlZEVycm9yJyB8fFxuICAgICAgICAgICAgICAgICAgICBlcnJvci5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFRoZSAke2tleX0gc3RvcmUgdmFsdWUgZXhjZWVkcyB0aGUgYnJvd3NlciBzdG9yYWdlIHF1b3RhOiBgLFxuICAgICAgICAgICAgICAgICAgICB2YWxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBFcnJvciBvY3VycmVkIHdoaWxlIHNlcmlhbGl6aW5nIHRoZSAke2tleX0gc3RvcmUgdmFsdWUsIHZhbHVlIG5vdCB1cGRhdGVkLCB0aGUgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgc3RvcmU6IGAsXG4gICAgICAgICAgICAgICAgICAgIHZhbFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19