parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -17
- package/lib/AccountLockout.js +11 -26
- package/lib/Adapters/AdapterLoader.js +8 -14
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
- package/lib/Adapters/Auth/AuthAdapter.js +7 -16
- package/lib/Adapters/Auth/OAuth1Client.js +32 -57
- package/lib/Adapters/Auth/apple.js +6 -22
- package/lib/Adapters/Auth/facebook.js +7 -37
- package/lib/Adapters/Auth/gcenter.js +8 -37
- package/lib/Adapters/Auth/github.js +7 -10
- package/lib/Adapters/Auth/google.js +11 -34
- package/lib/Adapters/Auth/gpgames.js +5 -8
- package/lib/Adapters/Auth/httpsRequest.js +1 -7
- package/lib/Adapters/Auth/index.js +20 -65
- package/lib/Adapters/Auth/instagram.js +5 -9
- package/lib/Adapters/Auth/janraincapture.js +8 -12
- package/lib/Adapters/Auth/janrainengage.js +7 -11
- package/lib/Adapters/Auth/keycloak.js +5 -19
- package/lib/Adapters/Auth/ldap.js +1 -15
- package/lib/Adapters/Auth/line.js +7 -10
- package/lib/Adapters/Auth/linkedin.js +7 -12
- package/lib/Adapters/Auth/meetup.js +7 -10
- package/lib/Adapters/Auth/microsoft.js +7 -10
- package/lib/Adapters/Auth/oauth2.js +6 -18
- package/lib/Adapters/Auth/phantauth.js +8 -10
- package/lib/Adapters/Auth/qq.js +7 -13
- package/lib/Adapters/Auth/spotify.js +7 -14
- package/lib/Adapters/Auth/twitter.js +5 -15
- package/lib/Adapters/Auth/vkontakte.js +9 -15
- package/lib/Adapters/Auth/wechat.js +7 -10
- package/lib/Adapters/Auth/weibo.js +7 -11
- package/lib/Adapters/Cache/CacheAdapter.js +4 -12
- package/lib/Adapters/Cache/InMemoryCache.js +5 -19
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
- package/lib/Adapters/Cache/LRUCache.js +1 -11
- package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
- package/lib/Adapters/Cache/SchemaCache.js +1 -6
- package/lib/Adapters/Email/MailAdapter.js +2 -7
- package/lib/Adapters/Files/FilesAdapter.js +7 -21
- package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
- package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
- package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
- package/lib/Adapters/Logger/WinstonLogger.js +3 -30
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
- package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
- package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
- package/lib/Adapters/Push/PushAdapter.js +2 -8
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
- package/lib/Auth.js +54 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +69 -113
- package/lib/Controllers/AdaptableController.js +6 -18
- package/lib/Controllers/AnalyticsController.js +1 -9
- package/lib/Controllers/CacheController.js +3 -23
- package/lib/Controllers/DatabaseController.js +147 -345
- package/lib/Controllers/FilesController.js +5 -34
- package/lib/Controllers/HooksController.js +1 -51
- package/lib/Controllers/LiveQueryController.js +4 -23
- package/lib/Controllers/LoggerController.js +15 -54
- package/lib/Controllers/ParseGraphQLController.js +49 -104
- package/lib/Controllers/PushController.js +20 -59
- package/lib/Controllers/SchemaController.js +154 -344
- package/lib/Controllers/UserController.js +11 -72
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -8
- package/lib/Deprecator/Deprecator.js +9 -18
- package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
- package/lib/GraphQL/ParseGraphQLServer.js +2 -29
- package/lib/GraphQL/helpers/objectsMutations.js +2 -12
- package/lib/GraphQL/helpers/objectsQueries.js +18 -76
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
- package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
- package/lib/GraphQL/loaders/filesMutations.js +2 -19
- package/lib/GraphQL/loaders/functionsMutations.js +6 -17
- package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
- package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
- package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
- package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
- package/lib/GraphQL/loaders/schemaMutations.js +1 -20
- package/lib/GraphQL/loaders/schemaQueries.js +1 -14
- package/lib/GraphQL/loaders/schemaTypes.js +2 -6
- package/lib/GraphQL/loaders/usersMutations.js +6 -28
- package/lib/GraphQL/loaders/usersQueries.js +4 -26
- package/lib/GraphQL/parseGraphQLUtils.js +6 -19
- package/lib/GraphQL/transformers/className.js +1 -4
- package/lib/GraphQL/transformers/constraintType.js +1 -20
- package/lib/GraphQL/transformers/inputType.js +1 -20
- package/lib/GraphQL/transformers/mutation.js +6 -51
- package/lib/GraphQL/transformers/outputType.js +1 -20
- package/lib/GraphQL/transformers/query.js +6 -42
- package/lib/GraphQL/transformers/schemaFields.js +7 -34
- package/lib/KeyPromiseQueue.js +1 -12
- package/lib/LiveQuery/Client.js +1 -25
- package/lib/LiveQuery/Id.js +1 -7
- package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
- package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
- package/lib/LiveQuery/ParsePubSub.js +1 -12
- package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
- package/lib/LiveQuery/QueryTools.js +14 -116
- package/lib/LiveQuery/RequestSchema.js +1 -1
- package/lib/LiveQuery/SessionTokenCache.js +1 -17
- package/lib/LiveQuery/Subscription.js +4 -18
- package/lib/LiveQuery/equalObjects.js +2 -14
- package/lib/Options/Definitions.js +79 -10
- package/lib/Options/docs.js +23 -3
- package/lib/Options/index.js +4 -12
- package/lib/Options/parsers.js +1 -18
- package/lib/Page.js +1 -9
- package/lib/ParseMessageQueue.js +1 -10
- package/lib/ParseServer.js +144 -182
- package/lib/ParseServerRESTController.js +6 -33
- package/lib/PromiseRouter.js +16 -50
- package/lib/Push/PushQueue.js +3 -15
- package/lib/Push/PushWorker.js +7 -32
- package/lib/Push/utils.js +9 -38
- package/lib/RestQuery.js +105 -242
- package/lib/RestWrite.js +212 -377
- package/lib/Routers/AggregateRouter.js +14 -51
- package/lib/Routers/AnalyticsRouter.js +2 -8
- package/lib/Routers/AudiencesRouter.js +1 -15
- package/lib/Routers/ClassesRouter.js +3 -53
- package/lib/Routers/CloudCodeRouter.js +1 -19
- package/lib/Routers/FeaturesRouter.js +1 -10
- package/lib/Routers/FilesRouter.js +29 -76
- package/lib/Routers/FunctionsRouter.js +5 -28
- package/lib/Routers/GlobalConfigRouter.js +4 -18
- package/lib/Routers/GraphQLRouter.js +1 -14
- package/lib/Routers/HooksRouter.js +1 -29
- package/lib/Routers/IAPValidationRouter.js +6 -29
- package/lib/Routers/InstallationsRouter.js +2 -12
- package/lib/Routers/LogsRouter.js +4 -16
- package/lib/Routers/PagesRouter.js +69 -129
- package/lib/Routers/PublicAPIRouter.js +3 -62
- package/lib/Routers/PurgeRouter.js +1 -15
- package/lib/Routers/PushRouter.js +2 -18
- package/lib/Routers/RolesRouter.js +1 -7
- package/lib/Routers/SchemasRouter.js +4 -34
- package/lib/Routers/SecurityRouter.js +1 -12
- package/lib/Routers/SessionsRouter.js +3 -19
- package/lib/Routers/UsersRouter.js +58 -155
- package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
- package/lib/SchemaMigrations/Migrations.js +2 -8
- package/lib/Security/Check.js +8 -16
- package/lib/Security/CheckGroup.js +4 -11
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
- package/lib/Security/CheckGroups/CheckGroups.js +1 -4
- package/lib/Security/CheckRunner.js +22 -41
- package/lib/StatusHandler.js +12 -69
- package/lib/TestUtils.js +1 -6
- package/lib/Utils.js +27 -66
- package/lib/batch.js +17 -28
- package/lib/cache.js +1 -3
- package/lib/cli/definitions/parse-live-query-server.js +1 -3
- package/lib/cli/definitions/parse-server.js +1 -3
- package/lib/cli/parse-live-query-server.js +1 -6
- package/lib/cli/parse-server.js +11 -21
- package/lib/cli/utils/commander.js +13 -51
- package/lib/cli/utils/runner.js +1 -14
- package/lib/cloud-code/Parse.Cloud.js +71 -92
- package/lib/cryptoUtils.js +11 -19
- package/lib/defaults.js +2 -14
- package/lib/deprecated.js +1 -2
- package/lib/index.js +16 -34
- package/lib/logger.js +6 -13
- package/lib/middlewares.js +147 -151
- package/lib/password.js +6 -10
- package/lib/request.js +173 -2
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +19 -41
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +125 -305
- package/package.json +22 -19
- package/lib/cloud-code/HTTPResponse.js +0 -73
- package/lib/cloud-code/httpRequest.js +0 -192
package/lib/StatusHandler.js
CHANGED
|
@@ -6,30 +6,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.flatten = flatten;
|
|
7
7
|
exports.jobStatusHandler = jobStatusHandler;
|
|
8
8
|
exports.pushStatusHandler = pushStatusHandler;
|
|
9
|
-
|
|
10
9
|
var _cryptoUtils = require("./cryptoUtils");
|
|
11
|
-
|
|
12
10
|
var _KeyPromiseQueue = require("./KeyPromiseQueue");
|
|
13
|
-
|
|
14
11
|
var _logger = require("./logger");
|
|
15
|
-
|
|
16
12
|
var _rest = _interopRequireDefault(require("./rest"));
|
|
17
|
-
|
|
18
13
|
var _Auth = _interopRequireDefault(require("./Auth"));
|
|
19
|
-
|
|
20
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
27
|
-
|
|
15
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
16
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
17
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
18
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
19
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
28
20
|
const PUSH_STATUS_COLLECTION = '_PushStatus';
|
|
29
21
|
const JOB_STATUS_COLLECTION = '_JobStatus';
|
|
30
22
|
const pushPromiseQueue = new _KeyPromiseQueue.KeyPromiseQueue();
|
|
31
23
|
const jobPromiseQueue = new _KeyPromiseQueue.KeyPromiseQueue();
|
|
32
|
-
|
|
33
24
|
const incrementOp = function (object = {}, key, amount = 1) {
|
|
34
25
|
if (!object[key]) {
|
|
35
26
|
object[key] = {
|
|
@@ -39,13 +30,10 @@ const incrementOp = function (object = {}, key, amount = 1) {
|
|
|
39
30
|
} else {
|
|
40
31
|
object[key].amount += amount;
|
|
41
32
|
}
|
|
42
|
-
|
|
43
33
|
return object[key];
|
|
44
34
|
};
|
|
45
|
-
|
|
46
35
|
function flatten(array) {
|
|
47
36
|
var flattened = [];
|
|
48
|
-
|
|
49
37
|
for (var i = 0; i < array.length; i++) {
|
|
50
38
|
if (Array.isArray(array[i])) {
|
|
51
39
|
flattened = flattened.concat(flatten(array[i]));
|
|
@@ -53,30 +41,24 @@ function flatten(array) {
|
|
|
53
41
|
flattened.push(array[i]);
|
|
54
42
|
}
|
|
55
43
|
}
|
|
56
|
-
|
|
57
44
|
return flattened;
|
|
58
45
|
}
|
|
59
|
-
|
|
60
46
|
function statusHandler(className, database) {
|
|
61
47
|
function create(object) {
|
|
62
48
|
return database.create(className, object).then(() => {
|
|
63
49
|
return Promise.resolve(object);
|
|
64
50
|
});
|
|
65
51
|
}
|
|
66
|
-
|
|
67
52
|
function update(where, object) {
|
|
68
53
|
return jobPromiseQueue.enqueue(where.objectId, () => database.update(className, where, object));
|
|
69
54
|
}
|
|
70
|
-
|
|
71
55
|
return Object.freeze({
|
|
72
56
|
create,
|
|
73
57
|
update
|
|
74
58
|
});
|
|
75
59
|
}
|
|
76
|
-
|
|
77
60
|
function restStatusHandler(className, config) {
|
|
78
61
|
const auth = _Auth.default.master(config);
|
|
79
|
-
|
|
80
62
|
function create(object) {
|
|
81
63
|
return _rest.default.create(config, auth, className, object).then(({
|
|
82
64
|
response
|
|
@@ -84,7 +66,6 @@ function restStatusHandler(className, config) {
|
|
|
84
66
|
return _objectSpread(_objectSpread({}, object), response);
|
|
85
67
|
});
|
|
86
68
|
}
|
|
87
|
-
|
|
88
69
|
function update(where, object) {
|
|
89
70
|
return pushPromiseQueue.enqueue(where.objectId, () => _rest.default.update(config, auth, className, {
|
|
90
71
|
objectId: where.objectId
|
|
@@ -94,19 +75,16 @@ function restStatusHandler(className, config) {
|
|
|
94
75
|
return _objectSpread(_objectSpread({}, object), response);
|
|
95
76
|
}));
|
|
96
77
|
}
|
|
97
|
-
|
|
98
78
|
return Object.freeze({
|
|
99
79
|
create,
|
|
100
80
|
update
|
|
101
81
|
});
|
|
102
82
|
}
|
|
103
|
-
|
|
104
83
|
function jobStatusHandler(config) {
|
|
105
84
|
let jobStatus;
|
|
106
85
|
const objectId = (0, _cryptoUtils.newObjectId)(config.objectIdSize);
|
|
107
86
|
const database = config.database;
|
|
108
87
|
const handler = statusHandler(JOB_STATUS_COLLECTION, database);
|
|
109
|
-
|
|
110
88
|
const setRunning = function (jobName, params) {
|
|
111
89
|
const now = new Date();
|
|
112
90
|
jobStatus = {
|
|
@@ -121,47 +99,38 @@ function jobStatusHandler(config) {
|
|
|
121
99
|
};
|
|
122
100
|
return handler.create(jobStatus);
|
|
123
101
|
};
|
|
124
|
-
|
|
125
102
|
const setMessage = function (message) {
|
|
126
103
|
if (!message || typeof message !== 'string') {
|
|
127
104
|
return Promise.resolve();
|
|
128
105
|
}
|
|
129
|
-
|
|
130
106
|
return handler.update({
|
|
131
107
|
objectId
|
|
132
108
|
}, {
|
|
133
109
|
message
|
|
134
110
|
});
|
|
135
111
|
};
|
|
136
|
-
|
|
137
112
|
const setSucceeded = function (message) {
|
|
138
113
|
return setFinalStatus('succeeded', message);
|
|
139
114
|
};
|
|
140
|
-
|
|
141
115
|
const setFailed = function (message) {
|
|
142
116
|
return setFinalStatus('failed', message);
|
|
143
117
|
};
|
|
144
|
-
|
|
145
118
|
const setFinalStatus = function (status, message = undefined) {
|
|
146
119
|
const finishedAt = new Date();
|
|
147
120
|
const update = {
|
|
148
121
|
status,
|
|
149
122
|
finishedAt
|
|
150
123
|
};
|
|
151
|
-
|
|
152
124
|
if (message && typeof message === 'string') {
|
|
153
125
|
update.message = message;
|
|
154
126
|
}
|
|
155
|
-
|
|
156
127
|
if (message instanceof Error && typeof message.message === 'string') {
|
|
157
128
|
update.message = message.message;
|
|
158
129
|
}
|
|
159
|
-
|
|
160
130
|
return handler.update({
|
|
161
131
|
objectId
|
|
162
132
|
}, update);
|
|
163
133
|
};
|
|
164
|
-
|
|
165
134
|
return Object.freeze({
|
|
166
135
|
setRunning,
|
|
167
136
|
setSucceeded,
|
|
@@ -169,35 +138,29 @@ function jobStatusHandler(config) {
|
|
|
169
138
|
setFailed
|
|
170
139
|
});
|
|
171
140
|
}
|
|
172
|
-
|
|
173
141
|
function pushStatusHandler(config, existingObjectId) {
|
|
174
142
|
let pushStatus;
|
|
175
143
|
const database = config.database;
|
|
176
144
|
const handler = restStatusHandler(PUSH_STATUS_COLLECTION, config);
|
|
177
145
|
let objectId = existingObjectId;
|
|
178
|
-
|
|
179
146
|
const setInitial = function (body = {}, where, options = {
|
|
180
147
|
source: 'rest'
|
|
181
148
|
}) {
|
|
182
149
|
const now = new Date();
|
|
183
150
|
let pushTime = now.toISOString();
|
|
184
151
|
let status = 'pending';
|
|
185
|
-
|
|
186
152
|
if (Object.prototype.hasOwnProperty.call(body, 'push_time')) {
|
|
187
153
|
if (config.hasPushScheduledSupport) {
|
|
188
154
|
pushTime = body.push_time;
|
|
189
155
|
status = 'scheduled';
|
|
190
156
|
} else {
|
|
191
157
|
_logger.logger.warn('Trying to schedule a push while server is not configured.');
|
|
192
|
-
|
|
193
158
|
_logger.logger.warn('Push will be sent immediately');
|
|
194
159
|
}
|
|
195
160
|
}
|
|
196
|
-
|
|
197
161
|
const data = body.data || {};
|
|
198
162
|
const payloadString = JSON.stringify(data);
|
|
199
163
|
let pushHash;
|
|
200
|
-
|
|
201
164
|
if (typeof data.alert === 'string') {
|
|
202
165
|
pushHash = (0, _cryptoUtils.md5Hash)(data.alert);
|
|
203
166
|
} else if (typeof data.alert === 'object') {
|
|
@@ -205,7 +168,6 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
205
168
|
} else {
|
|
206
169
|
pushHash = 'd41d8cd98f00b204e9800998ecf8427e';
|
|
207
170
|
}
|
|
208
|
-
|
|
209
171
|
const object = {
|
|
210
172
|
pushTime,
|
|
211
173
|
query: JSON.stringify(where),
|
|
@@ -228,10 +190,8 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
228
190
|
return Promise.resolve(pushStatus);
|
|
229
191
|
});
|
|
230
192
|
};
|
|
231
|
-
|
|
232
193
|
const setRunning = function (batches) {
|
|
233
194
|
_logger.logger.verbose(`_PushStatus ${objectId}: sending push to installations with %d batches`, batches);
|
|
234
|
-
|
|
235
195
|
return handler.update({
|
|
236
196
|
status: 'pending',
|
|
237
197
|
objectId: objectId
|
|
@@ -240,14 +200,12 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
240
200
|
count: batches
|
|
241
201
|
});
|
|
242
202
|
};
|
|
243
|
-
|
|
244
203
|
const trackSent = function (results, UTCOffset, cleanupInstallations = process.env.PARSE_SERVER_CLEANUP_INVALID_INSTALLATIONS) {
|
|
245
204
|
const update = {
|
|
246
205
|
numSent: 0,
|
|
247
206
|
numFailed: 0
|
|
248
207
|
};
|
|
249
208
|
const devicesToRemove = [];
|
|
250
|
-
|
|
251
209
|
if (Array.isArray(results)) {
|
|
252
210
|
results = flatten(results);
|
|
253
211
|
results.reduce((memo, result) => {
|
|
@@ -255,46 +213,37 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
255
213
|
if (!result || !result.device || !result.device.deviceType) {
|
|
256
214
|
return memo;
|
|
257
215
|
}
|
|
258
|
-
|
|
259
216
|
const deviceType = result.device.deviceType;
|
|
260
217
|
const key = result.transmitted ? `sentPerType.${deviceType}` : `failedPerType.${deviceType}`;
|
|
261
218
|
memo[key] = incrementOp(memo, key);
|
|
262
|
-
|
|
263
219
|
if (typeof UTCOffset !== 'undefined') {
|
|
264
220
|
const offsetKey = result.transmitted ? `sentPerUTCOffset.${UTCOffset}` : `failedPerUTCOffset.${UTCOffset}`;
|
|
265
221
|
memo[offsetKey] = incrementOp(memo, offsetKey);
|
|
266
222
|
}
|
|
267
|
-
|
|
268
223
|
if (result.transmitted) {
|
|
269
224
|
memo.numSent++;
|
|
270
225
|
} else {
|
|
271
226
|
if (result && result.response && result.response.error && result.device && result.device.deviceToken) {
|
|
272
227
|
const token = result.device.deviceToken;
|
|
273
|
-
const error = result.response.error;
|
|
274
|
-
|
|
228
|
+
const error = result.response.error;
|
|
229
|
+
// GCM errors
|
|
275
230
|
if (error === 'NotRegistered' || error === 'InvalidRegistration') {
|
|
276
231
|
devicesToRemove.push(token);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
232
|
+
}
|
|
233
|
+
// APNS errors
|
|
280
234
|
if (error === 'Unregistered' || error === 'BadDeviceToken') {
|
|
281
235
|
devicesToRemove.push(token);
|
|
282
236
|
}
|
|
283
237
|
}
|
|
284
|
-
|
|
285
238
|
memo.numFailed++;
|
|
286
239
|
}
|
|
287
|
-
|
|
288
240
|
return memo;
|
|
289
241
|
}, update);
|
|
290
242
|
}
|
|
291
|
-
|
|
292
243
|
_logger.logger.verbose(`_PushStatus ${objectId}: sent push! %d success, %d failures`, update.numSent, update.numFailed);
|
|
293
|
-
|
|
294
244
|
_logger.logger.verbose(`_PushStatus ${objectId}: needs cleanup`, {
|
|
295
245
|
devicesToRemove
|
|
296
246
|
});
|
|
297
|
-
|
|
298
247
|
['numSent', 'numFailed'].forEach(key => {
|
|
299
248
|
if (update[key] > 0) {
|
|
300
249
|
update[key] = {
|
|
@@ -305,10 +254,8 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
305
254
|
delete update[key];
|
|
306
255
|
}
|
|
307
256
|
});
|
|
308
|
-
|
|
309
257
|
if (devicesToRemove.length > 0 && cleanupInstallations) {
|
|
310
258
|
_logger.logger.info(`Removing device tokens on ${devicesToRemove.length} _Installations`);
|
|
311
|
-
|
|
312
259
|
database.update('_Installation', {
|
|
313
260
|
deviceToken: {
|
|
314
261
|
$in: devicesToRemove
|
|
@@ -322,7 +269,6 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
322
269
|
many: true
|
|
323
270
|
});
|
|
324
271
|
}
|
|
325
|
-
|
|
326
272
|
incrementOp(update, 'count', -1);
|
|
327
273
|
update.status = 'running';
|
|
328
274
|
return handler.update({
|
|
@@ -333,7 +279,6 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
333
279
|
}
|
|
334
280
|
});
|
|
335
281
|
};
|
|
336
|
-
|
|
337
282
|
const complete = function () {
|
|
338
283
|
return handler.update({
|
|
339
284
|
objectId
|
|
@@ -344,14 +289,12 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
344
289
|
}
|
|
345
290
|
});
|
|
346
291
|
};
|
|
347
|
-
|
|
348
292
|
const fail = function (err) {
|
|
349
293
|
if (typeof err === 'string') {
|
|
350
294
|
err = {
|
|
351
295
|
message: err
|
|
352
296
|
};
|
|
353
297
|
}
|
|
354
|
-
|
|
355
298
|
const update = {
|
|
356
299
|
errorMessage: err,
|
|
357
300
|
status: 'failed'
|
|
@@ -360,18 +303,18 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
360
303
|
objectId
|
|
361
304
|
}, update);
|
|
362
305
|
};
|
|
363
|
-
|
|
364
306
|
const rval = {
|
|
365
307
|
setInitial,
|
|
366
308
|
setRunning,
|
|
367
309
|
trackSent,
|
|
368
310
|
complete,
|
|
369
311
|
fail
|
|
370
|
-
};
|
|
312
|
+
};
|
|
371
313
|
|
|
314
|
+
// define objectId to be dynamic
|
|
372
315
|
Object.defineProperty(rval, 'objectId', {
|
|
373
316
|
get: () => objectId
|
|
374
317
|
});
|
|
375
318
|
return Object.freeze(rval);
|
|
376
319
|
}
|
|
377
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TdGF0dXNIYW5kbGVyLmpzIl0sIm5hbWVzIjpbIlBVU0hfU1RBVFVTX0NPTExFQ1RJT04iLCJKT0JfU1RBVFVTX0NPTExFQ1RJT04iLCJwdXNoUHJvbWlzZVF1ZXVlIiwiS2V5UHJvbWlzZVF1ZXVlIiwiam9iUHJvbWlzZVF1ZXVlIiwiaW5jcmVtZW50T3AiLCJvYmplY3QiLCJrZXkiLCJhbW91bnQiLCJfX29wIiwiZmxhdHRlbiIsImFycmF5IiwiZmxhdHRlbmVkIiwiaSIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsInB1c2giLCJzdGF0dXNIYW5kbGVyIiwiY2xhc3NOYW1lIiwiZGF0YWJhc2UiLCJjcmVhdGUiLCJ0aGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ3aGVyZSIsImVucXVldWUiLCJvYmplY3RJZCIsIk9iamVjdCIsImZyZWV6ZSIsInJlc3RTdGF0dXNIYW5kbGVyIiwiY29uZmlnIiwiYXV0aCIsIkF1dGgiLCJtYXN0ZXIiLCJyZXN0IiwicmVzcG9uc2UiLCJqb2JTdGF0dXNIYW5kbGVyIiwiam9iU3RhdHVzIiwib2JqZWN0SWRTaXplIiwiaGFuZGxlciIsInNldFJ1bm5pbmciLCJqb2JOYW1lIiwicGFyYW1zIiwibm93IiwiRGF0ZSIsInN0YXR1cyIsInNvdXJjZSIsImNyZWF0ZWRBdCIsIkFDTCIsInNldE1lc3NhZ2UiLCJtZXNzYWdlIiwic2V0U3VjY2VlZGVkIiwic2V0RmluYWxTdGF0dXMiLCJzZXRGYWlsZWQiLCJ1bmRlZmluZWQiLCJmaW5pc2hlZEF0IiwiRXJyb3IiLCJwdXNoU3RhdHVzSGFuZGxlciIsImV4aXN0aW5nT2JqZWN0SWQiLCJwdXNoU3RhdHVzIiwic2V0SW5pdGlhbCIsImJvZHkiLCJvcHRpb25zIiwicHVzaFRpbWUiLCJ0b0lTT1N0cmluZyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwicHVzaF90aW1lIiwibG9nZ2VyIiwid2FybiIsImRhdGEiLCJwYXlsb2FkU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2hIYXNoIiwiYWxlcnQiLCJxdWVyeSIsInBheWxvYWQiLCJ0aXRsZSIsImV4cGlyeSIsImV4cGlyYXRpb25fdGltZSIsImV4cGlyYXRpb25faW50ZXJ2YWwiLCJudW1TZW50IiwicmVzdWx0IiwiYmF0Y2hlcyIsInZlcmJvc2UiLCJjb3VudCIsInRyYWNrU2VudCIsInJlc3VsdHMiLCJVVENPZmZzZXQiLCJjbGVhbnVwSW5zdGFsbGF0aW9ucyIsInByb2Nlc3MiLCJlbnYiLCJQQVJTRV9TRVJWRVJfQ0xFQU5VUF9JTlZBTElEX0lOU1RBTExBVElPTlMiLCJudW1GYWlsZWQiLCJkZXZpY2VzVG9SZW1vdmUiLCJyZWR1Y2UiLCJtZW1vIiwiZGV2aWNlIiwiZGV2aWNlVHlwZSIsInRyYW5zbWl0dGVkIiwib2Zmc2V0S2V5IiwiZXJyb3IiLCJkZXZpY2VUb2tlbiIsInRva2VuIiwiZm9yRWFjaCIsImluZm8iLCIkaW4iLCJhY2wiLCJtYW55IiwicmVzIiwiY29tcGxldGUiLCJmYWlsIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicnZhbCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBLE1BQU1BLHNCQUFzQixHQUFHLGFBQS9CO0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsWUFBOUI7QUFFQSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxnQ0FBSixFQUF6QjtBQUNBLE1BQU1DLGVBQWUsR0FBRyxJQUFJRCxnQ0FBSixFQUF4Qjs7QUFFQSxNQUFNRSxXQUFXLEdBQUcsVUFBVUMsTUFBTSxHQUFHLEVBQW5CLEVBQXVCQyxHQUF2QixFQUE0QkMsTUFBTSxHQUFHLENBQXJDLEVBQXdDO0FBQzFELE1BQUksQ0FBQ0YsTUFBTSxDQUFDQyxHQUFELENBQVgsRUFBa0I7QUFDaEJELElBQUFBLE1B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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWQ1SGFzaCwgbmV3T2JqZWN0SWQgfSBmcm9tICcuL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IEtleVByb21pc2VRdWV1ZSB9IGZyb20gJy4vS2V5UHJvbWlzZVF1ZXVlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCByZXN0IGZyb20gJy4vcmVzdCc7XG5pbXBvcnQgQXV0aCBmcm9tICcuL0F1dGgnO1xuXG5jb25zdCBQVVNIX1NUQVRVU19DT0xMRUNUSU9OID0gJ19QdXNoU3RhdHVzJztcbmNvbnN0IEpPQl9TVEFUVVNfQ09MTEVDVElPTiA9ICdfSm9iU3RhdHVzJztcblxuY29uc3QgcHVzaFByb21pc2VRdWV1ZSA9IG5ldyBLZXlQcm9taXNlUXVldWUoKTtcbmNvbnN0IGpvYlByb21pc2VRdWV1ZSA9IG5ldyBLZXlQcm9taXNlUXVldWUoKTtcblxuY29uc3QgaW5jcmVtZW50T3AgPSBmdW5jdGlvbiAob2JqZWN0ID0ge30sIGtleSwgYW1vdW50ID0gMSkge1xuICBpZiAoIW9iamVjdFtrZXldKSB7XG4gICAgb2JqZWN0W2tleV0gPSB7IF9fb3A6ICdJbmNyZW1lbnQnLCBhbW91bnQ6IGFtb3VudCB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldLmFtb3VudCArPSBhbW91bnQ7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFtrZXldO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGZsYXR0ZW5lZCA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXlbaV0pKSB7XG4gICAgICBmbGF0dGVuZWQgPSBmbGF0dGVuZWQuY29uY2F0KGZsYXR0ZW4oYXJyYXlbaV0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxhdHRlbmVkLnB1c2goYXJyYXlbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG5mdW5jdGlvbiBzdGF0dXNIYW5kbGVyKGNsYXNzTmFtZSwgZGF0YWJhc2UpIHtcbiAgZnVuY3Rpb24gY3JlYXRlKG9iamVjdCkge1xuICAgIHJldHVybiBkYXRhYmFzZS5jcmVhdGUoY2xhc3NOYW1lLCBvYmplY3QpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShvYmplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHdoZXJlLCBvYmplY3QpIHtcbiAgICByZXR1cm4gam9iUHJvbWlzZVF1ZXVlLmVucXVldWUod2hlcmUub2JqZWN0SWQsICgpID0+IGRhdGFiYXNlLnVwZGF0ZShjbGFzc05hbWUsIHdoZXJlLCBvYmplY3QpKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBjcmVhdGUsXG4gICAgdXBkYXRlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzdFN0YXR1c0hhbmRsZXIoY2xhc3NOYW1lLCBjb25maWcpIHtcbiAgY29uc3QgYXV0aCA9IEF1dGgubWFzdGVyKGNvbmZpZyk7XG4gIGZ1bmN0aW9uIGNyZWF0ZShvYmplY3QpIHtcbiAgICByZXR1cm4gcmVzdC5jcmVhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIG9iamVjdCkudGhlbigoeyByZXNwb25zZSB9KSA9PiB7XG4gICAgICByZXR1cm4geyAuLi5vYmplY3QsIC4uLnJlc3BvbnNlIH07XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUod2hlcmUsIG9iamVjdCkge1xuICAgIHJldHVybiBwdXNoUHJvbWlzZVF1ZXVlLmVucXVldWUod2hlcmUub2JqZWN0SWQsICgpID0+XG4gICAgICByZXN0XG4gICAgICAgIC51cGRhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHsgb2JqZWN0SWQ6IHdoZXJlLm9iamVjdElkIH0sIG9iamVjdClcbiAgICAgICAgLnRoZW4oKHsgcmVzcG9uc2UgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iamVjdCwgLi4ucmVzcG9uc2UgfTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGNyZWF0ZSxcbiAgICB1cGRhdGUsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9iU3RhdHVzSGFuZGxlcihjb25maWcpIHtcbiAgbGV0IGpvYlN0YXR1cztcbiAgY29uc3Qgb2JqZWN0SWQgPSBuZXdPYmplY3RJZChjb25maWcub2JqZWN0SWRTaXplKTtcbiAgY29uc3QgZGF0YWJhc2UgPSBjb25maWcuZGF0YWJhc2U7XG4gIGNvbnN0IGhhbmRsZXIgPSBzdGF0dXNIYW5kbGVyKEpPQl9TVEFUVVNfQ09MTEVDVElPTiwgZGF0YWJhc2UpO1xuICBjb25zdCBzZXRSdW5uaW5nID0gZnVuY3Rpb24gKGpvYk5hbWUsIHBhcmFtcykge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgam9iU3RhdHVzID0ge1xuICAgICAgb2JqZWN0SWQsXG4gICAgICBqb2JOYW1lLFxuICAgICAgcGFyYW1zLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBzb3VyY2U6ICdhcGknLFxuICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAvLyBsb2NrZG93biFcbiAgICAgIEFDTDoge30sXG4gICAgfTtcblxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZShqb2JTdGF0dXMpO1xuICB9O1xuXG4gIGNvbnN0IHNldE1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIGlmICghbWVzc2FnZSB8fCB0eXBlb2YgbWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKHsgb2JqZWN0SWQgfSwgeyBtZXNzYWdlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNldFN1Y2NlZWRlZCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNldEZpbmFsU3RhdHVzKCdzdWNjZWVkZWQnLCBtZXNzYWdlKTtcbiAgfTtcblxuICBjb25zdCBzZXRGYWlsZWQgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHJldHVybiBzZXRGaW5hbFN0YXR1cygnZmFpbGVkJywgbWVzc2FnZSk7XG4gIH07XG5cbiAgY29uc3Qgc2V0RmluYWxTdGF0dXMgPSBmdW5jdGlvbiAoc3RhdHVzLCBtZXNzYWdlID0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXBkYXRlID0geyBzdGF0dXMsIGZpbmlzaGVkQXQgfTtcbiAgICBpZiAobWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVwZGF0ZS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlb2YgbWVzc2FnZS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgdXBkYXRlLm1lc3NhZ2UgPSBtZXNzYWdlLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHVwZGF0ZSk7XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHNldFJ1bm5pbmcsXG4gICAgc2V0U3VjY2VlZGVkLFxuICAgIHNldE1lc3NhZ2UsXG4gICAgc2V0RmFpbGVkLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hTdGF0dXNIYW5kbGVyKGNvbmZpZywgZXhpc3RpbmdPYmplY3RJZCkge1xuICBsZXQgcHVzaFN0YXR1cztcbiAgY29uc3QgZGF0YWJhc2UgPSBjb25maWcuZGF0YWJhc2U7XG4gIGNvbnN0IGhhbmRsZXIgPSByZXN0U3RhdHVzSGFuZGxlcihQVVNIX1NUQVRVU19DT0xMRUNUSU9OLCBjb25maWcpO1xuICBsZXQgb2JqZWN0SWQgPSBleGlzdGluZ09iamVjdElkO1xuICBjb25zdCBzZXRJbml0aWFsID0gZnVuY3Rpb24gKGJvZHkgPSB7fSwgd2hlcmUsIG9wdGlvbnMgPSB7IHNvdXJjZTogJ3Jlc3QnIH0pIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBwdXNoVGltZSA9IG5vdy50b0lTT1N0cmluZygpO1xuICAgIGxldCBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChib2R5LCAncHVzaF90aW1lJykpIHtcbiAgICAgIGlmIChjb25maWcuaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQpIHtcbiAgICAgICAgcHVzaFRpbWUgPSBib2R5LnB1c2hfdGltZTtcbiAgICAgICAgc3RhdHVzID0gJ3NjaGVkdWxlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignVHJ5aW5nIHRvIHNjaGVkdWxlIGEgcHVzaCB3aGlsZSBzZXJ2ZXIgaXMgbm90IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQdXNoIHdpbGwgYmUgc2VudCBpbW1lZGlhdGVseScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBib2R5LmRhdGEgfHwge307XG4gICAgY29uc3QgcGF5bG9hZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGxldCBwdXNoSGFzaDtcbiAgICBpZiAodHlwZW9mIGRhdGEuYWxlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwdXNoSGFzaCA9IG1kNUhhc2goZGF0YS5hbGVydCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YS5hbGVydCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHB1c2hIYXNoID0gbWQ1SGFzaChKU09OLnN0cmluZ2lmeShkYXRhLmFsZXJ0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1c2hIYXNoID0gJ2Q0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlJztcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0ID0ge1xuICAgICAgcHVzaFRpbWUsXG4gICAgICBxdWVyeTogSlNPTi5zdHJpbmdpZnkod2hlcmUpLFxuICAgICAgcGF5bG9hZDogcGF5bG9hZFN0cmluZyxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGV4cGlyeTogYm9keS5leHBpcmF0aW9uX3RpbWUsXG4gICAgICBleHBpcmF0aW9uX2ludGVydmFsOiBib2R5LmV4cGlyYXRpb25faW50ZXJ2YWwsXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgIG51bVNlbnQ6IDAsXG4gICAgICBwdXNoSGFzaCxcbiAgICAgIC8vIGxvY2tkb3duIVxuICAgICAgQUNMOiB7fSxcbiAgICB9O1xuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZShvYmplY3QpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIG9iamVjdElkID0gcmVzdWx0Lm9iamVjdElkO1xuICAgICAgcHVzaFN0YXR1cyA9IHtcbiAgICAgICAgb2JqZWN0SWQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwdXNoU3RhdHVzKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBzZXRSdW5uaW5nID0gZnVuY3Rpb24gKGJhdGNoZXMpIHtcbiAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgIGBfUHVzaFN0YXR1cyAke29iamVjdElkfTogc2VuZGluZyBwdXNoIHRvIGluc3RhbGxhdGlvbnMgd2l0aCAlZCBiYXRjaGVzYCxcbiAgICAgIGJhdGNoZXNcbiAgICApO1xuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgIG9iamVjdElkOiBvYmplY3RJZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICBjb3VudDogYmF0Y2hlcyxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHRyYWNrU2VudCA9IGZ1bmN0aW9uIChcbiAgICByZXN1bHRzLFxuICAgIFVUQ09mZnNldCxcbiAgICBjbGVhbnVwSW5zdGFsbGF0aW9ucyA9IHByb2Nlc3MuZW52LlBBUlNFX1NFUlZFUl9DTEVBTlVQX0lOVkFMSURfSU5TVEFMTEFUSU9OU1xuICApIHtcbiAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICBudW1TZW50OiAwLFxuICAgICAgbnVtRmFpbGVkOiAwLFxuICAgIH07XG4gICAgY29uc3QgZGV2aWNlc1RvUmVtb3ZlID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cykpIHtcbiAgICAgIHJlc3VsdHMgPSBmbGF0dGVuKHJlc3VsdHMpO1xuICAgICAgcmVzdWx0cy5yZWR1Y2UoKG1lbW8sIHJlc3VsdCkgPT4ge1xuICAgICAgICAvLyBDYW5ub3QgaGFuZGxlIHRoYXRcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kZXZpY2UgfHwgIXJlc3VsdC5kZXZpY2UuZGV2aWNlVHlwZSkge1xuICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRldmljZVR5cGUgPSByZXN1bHQuZGV2aWNlLmRldmljZVR5cGU7XG4gICAgICAgIGNvbnN0IGtleSA9IHJlc3VsdC50cmFuc21pdHRlZFxuICAgICAgICAgID8gYHNlbnRQZXJUeXBlLiR7ZGV2aWNlVHlwZX1gXG4gICAgICAgICAgOiBgZmFpbGVkUGVyVHlwZS4ke2RldmljZVR5cGV9YDtcbiAgICAgICAgbWVtb1trZXldID0gaW5jcmVtZW50T3AobWVtbywga2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBVVENPZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0S2V5ID0gcmVzdWx0LnRyYW5zbWl0dGVkXG4gICAgICAgICAgICA/IGBzZW50UGVyVVRDT2Zmc2V0LiR7VVRDT2Zmc2V0fWBcbiAgICAgICAgICAgIDogYGZhaWxlZFBlclVUQ09mZnNldC4ke1VUQ09mZnNldH1gO1xuICAgICAgICAgIG1lbW9bb2Zmc2V0S2V5XSA9IGluY3JlbWVudE9wKG1lbW8sIG9mZnNldEtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC50cmFuc21pdHRlZCkge1xuICAgICAgICAgIG1lbW8ubnVtU2VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlc3VsdCAmJlxuICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXG4gICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuZXJyb3IgJiZcbiAgICAgICAgICAgIHJlc3VsdC5kZXZpY2UgJiZcbiAgICAgICAgICAgIHJlc3VsdC5kZXZpY2UuZGV2aWNlVG9rZW5cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVzdWx0LmRldmljZS5kZXZpY2VUb2tlbjtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LnJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgLy8gR0NNIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSAnTm90UmVnaXN0ZXJlZCcgfHwgZXJyb3IgPT09ICdJbnZhbGlkUmVnaXN0cmF0aW9uJykge1xuICAgICAgICAgICAgICBkZXZpY2VzVG9SZW1vdmUucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBUE5TIGVycm9yc1xuICAgICAgICAgICAgaWYgKGVycm9yID09PSAnVW5yZWdpc3RlcmVkJyB8fCBlcnJvciA9PT0gJ0JhZERldmljZVRva2VuJykge1xuICAgICAgICAgICAgICBkZXZpY2VzVG9SZW1vdmUucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbW8ubnVtRmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICB9LCB1cGRhdGUpO1xuICAgIH1cblxuICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgYF9QdXNoU3RhdHVzICR7b2JqZWN0SWR9OiBzZW50IHB1c2ghICVkIHN1Y2Nlc3MsICVkIGZhaWx1cmVzYCxcbiAgICAgIHVwZGF0ZS5udW1TZW50LFxuICAgICAgdXBkYXRlLm51bUZhaWxlZFxuICAgICk7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYF9QdXNoU3RhdHVzICR7b2JqZWN0SWR9OiBuZWVkcyBjbGVhbnVwYCwge1xuICAgICAgZGV2aWNlc1RvUmVtb3ZlLFxuICAgIH0pO1xuICAgIFsnbnVtU2VudCcsICdudW1GYWlsZWQnXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAodXBkYXRlW2tleV0gPiAwKSB7XG4gICAgICAgIHVwZGF0ZVtrZXldID0ge1xuICAgICAgICAgIF9fb3A6ICdJbmNyZW1lbnQnLFxuICAgICAgICAgIGFtb3VudDogdXBkYXRlW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZGV2aWNlc1RvUmVtb3ZlLmxlbmd0aCA+IDAgJiYgY2xlYW51cEluc3RhbGxhdGlvbnMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZW1vdmluZyBkZXZpY2UgdG9rZW5zIG9uICR7ZGV2aWNlc1RvUmVtb3ZlLmxlbmd0aH0gX0luc3RhbGxhdGlvbnNgKTtcbiAgICAgIGRhdGFiYXNlLnVwZGF0ZShcbiAgICAgICAgJ19JbnN0YWxsYXRpb24nLFxuICAgICAgICB7IGRldmljZVRva2VuOiB7ICRpbjogZGV2aWNlc1RvUmVtb3ZlIH0gfSxcbiAgICAgICAgeyBkZXZpY2VUb2tlbjogeyBfX29wOiAnRGVsZXRlJyB9IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhY2w6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtYW55OiB0cnVlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBpbmNyZW1lbnRPcCh1cGRhdGUsICdjb3VudCcsIC0xKTtcbiAgICB1cGRhdGUuc3RhdHVzID0gJ3J1bm5pbmcnO1xuXG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKHsgb2JqZWN0SWQgfSwgdXBkYXRlKS50aGVuKHJlcyA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcy5jb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZShcbiAgICAgIHsgb2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICAgICAgY291bnQ6IHsgX19vcDogJ0RlbGV0ZScgfSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnIgPSB7IG1lc3NhZ2U6IGVyciB9O1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICBlcnJvck1lc3NhZ2U6IGVycixcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB1cGRhdGUpO1xuICB9O1xuXG4gIGNvbnN0IHJ2YWwgPSB7XG4gICAgc2V0SW5pdGlhbCxcbiAgICBzZXRSdW5uaW5nLFxuICAgIHRyYWNrU2VudCxcbiAgICBjb21wbGV0ZSxcbiAgICBmYWlsLFxuICB9O1xuXG4gIC8vIGRlZmluZSBvYmplY3RJZCB0byBiZSBkeW5hbWljXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShydmFsLCAnb2JqZWN0SWQnLCB7XG4gICAgZ2V0OiAoKSA9PiBvYmplY3RJZCxcbiAgfSk7XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUocnZhbCk7XG59XG4iXX0=
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQVVNIX1NUQVRVU19DT0xMRUNUSU9OIiwiSk9CX1NUQVRVU19DT0xMRUNUSU9OIiwicHVzaFByb21pc2VRdWV1ZSIsIktleVByb21pc2VRdWV1ZSIsImpvYlByb21pc2VRdWV1ZSIsImluY3JlbWVudE9wIiwib2JqZWN0Iiwia2V5IiwiYW1vdW50IiwiX19vcCIsImZsYXR0ZW4iLCJhcnJheSIsImZsYXR0ZW5lZCIsImkiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJwdXNoIiwic3RhdHVzSGFuZGxlciIsImNsYXNzTmFtZSIsImRhdGFiYXNlIiwiY3JlYXRlIiwidGhlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwidXBkYXRlIiwid2hlcmUiLCJlbnF1ZXVlIiwib2JqZWN0SWQiLCJPYmplY3QiLCJmcmVlemUiLCJyZXN0U3RhdHVzSGFuZGxlciIsImNvbmZpZyIsImF1dGgiLCJBdXRoIiwibWFzdGVyIiwicmVzdCIsInJlc3BvbnNlIiwiam9iU3RhdHVzSGFuZGxlciIsImpvYlN0YXR1cyIsIm5ld09iamVjdElkIiwib2JqZWN0SWRTaXplIiwiaGFuZGxlciIsInNldFJ1bm5pbmciLCJqb2JOYW1lIiwicGFyYW1zIiwibm93IiwiRGF0ZSIsInN0YXR1cyIsInNvdXJjZSIsImNyZWF0ZWRBdCIsIkFDTCIsInNldE1lc3NhZ2UiLCJtZXNzYWdlIiwic2V0U3VjY2VlZGVkIiwic2V0RmluYWxTdGF0dXMiLCJzZXRGYWlsZWQiLCJ1bmRlZmluZWQiLCJmaW5pc2hlZEF0IiwiRXJyb3IiLCJwdXNoU3RhdHVzSGFuZGxlciIsImV4aXN0aW5nT2JqZWN0SWQiLCJwdXNoU3RhdHVzIiwic2V0SW5pdGlhbCIsImJvZHkiLCJvcHRpb25zIiwicHVzaFRpbWUiLCJ0b0lTT1N0cmluZyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwicHVzaF90aW1lIiwibG9nZ2VyIiwid2FybiIsImRhdGEiLCJwYXlsb2FkU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2hIYXNoIiwiYWxlcnQiLCJtZDVIYXNoIiwicXVlcnkiLCJwYXlsb2FkIiwidGl0bGUiLCJleHBpcnkiLCJleHBpcmF0aW9uX3RpbWUiLCJleHBpcmF0aW9uX2ludGVydmFsIiwibnVtU2VudCIsInJlc3VsdCIsImJhdGNoZXMiLCJ2ZXJib3NlIiwiY291bnQiLCJ0cmFja1NlbnQiLCJyZXN1bHRzIiwiVVRDT2Zmc2V0IiwiY2xlYW51cEluc3RhbGxhdGlvbnMiLCJwcm9jZXNzIiwiZW52IiwiUEFSU0VfU0VSVkVSX0NMRUFOVVBfSU5WQUxJRF9JTlNUQUxMQVRJT05TIiwibnVtRmFpbGVkIiwiZGV2aWNlc1RvUmVtb3ZlIiwicmVkdWNlIiwibWVtbyIsImRldmljZSIsImRldmljZVR5cGUiLCJ0cmFuc21pdHRlZCIsIm9mZnNldEtleSIsImVycm9yIiwiZGV2aWNlVG9rZW4iLCJ0b2tlbiIsImZvckVhY2giLCJpbmZvIiwiJGluIiwiYWNsIiwibWFueSIsInJlcyIsImNvbXBsZXRlIiwiZmFpbCIsImVyciIsImVycm9yTWVzc2FnZSIsInJ2YWwiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9TdGF0dXNIYW5kbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1kNUhhc2gsIG5ld09iamVjdElkIH0gZnJvbSAnLi9jcnlwdG9VdGlscyc7XG5pbXBvcnQgeyBLZXlQcm9taXNlUXVldWUgfSBmcm9tICcuL0tleVByb21pc2VRdWV1ZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuL3Jlc3QnO1xuaW1wb3J0IEF1dGggZnJvbSAnLi9BdXRoJztcblxuY29uc3QgUFVTSF9TVEFUVVNfQ09MTEVDVElPTiA9ICdfUHVzaFN0YXR1cyc7XG5jb25zdCBKT0JfU1RBVFVTX0NPTExFQ1RJT04gPSAnX0pvYlN0YXR1cyc7XG5cbmNvbnN0IHB1c2hQcm9taXNlUXVldWUgPSBuZXcgS2V5UHJvbWlzZVF1ZXVlKCk7XG5jb25zdCBqb2JQcm9taXNlUXVldWUgPSBuZXcgS2V5UHJvbWlzZVF1ZXVlKCk7XG5cbmNvbnN0IGluY3JlbWVudE9wID0gZnVuY3Rpb24gKG9iamVjdCA9IHt9LCBrZXksIGFtb3VudCA9IDEpIHtcbiAgaWYgKCFvYmplY3Rba2V5XSkge1xuICAgIG9iamVjdFtrZXldID0geyBfX29wOiAnSW5jcmVtZW50JywgYW1vdW50OiBhbW91bnQgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XS5hbW91bnQgKz0gYW1vdW50O1xuICB9XG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBmbGF0dGVuZWQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5W2ldKSkge1xuICAgICAgZmxhdHRlbmVkID0gZmxhdHRlbmVkLmNvbmNhdChmbGF0dGVuKGFycmF5W2ldKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYXR0ZW5lZC5wdXNoKGFycmF5W2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhdHVzSGFuZGxlcihjbGFzc05hbWUsIGRhdGFiYXNlKSB7XG4gIGZ1bmN0aW9uIGNyZWF0ZShvYmplY3QpIHtcbiAgICByZXR1cm4gZGF0YWJhc2UuY3JlYXRlKGNsYXNzTmFtZSwgb2JqZWN0KS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2JqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSh3aGVyZSwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGpvYlByb21pc2VRdWV1ZS5lbnF1ZXVlKHdoZXJlLm9iamVjdElkLCAoKSA9PiBkYXRhYmFzZS51cGRhdGUoY2xhc3NOYW1lLCB3aGVyZSwgb2JqZWN0KSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY3JlYXRlLFxuICAgIHVwZGF0ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc3RTdGF0dXNIYW5kbGVyKGNsYXNzTmFtZSwgY29uZmlnKSB7XG4gIGNvbnN0IGF1dGggPSBBdXRoLm1hc3Rlcihjb25maWcpO1xuICBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgcmV0dXJuIHJlc3QuY3JlYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3QpLnRoZW4oKHsgcmVzcG9uc2UgfSkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4ub2JqZWN0LCAuLi5yZXNwb25zZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHdoZXJlLCBvYmplY3QpIHtcbiAgICByZXR1cm4gcHVzaFByb21pc2VRdWV1ZS5lbnF1ZXVlKHdoZXJlLm9iamVjdElkLCAoKSA9PlxuICAgICAgcmVzdFxuICAgICAgICAudXBkYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCB7IG9iamVjdElkOiB3aGVyZS5vYmplY3RJZCB9LCBvYmplY3QpXG4gICAgICAgIC50aGVuKCh7IHJlc3BvbnNlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmplY3QsIC4uLnJlc3BvbnNlIH07XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBjcmVhdGUsXG4gICAgdXBkYXRlLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvYlN0YXR1c0hhbmRsZXIoY29uZmlnKSB7XG4gIGxldCBqb2JTdGF0dXM7XG4gIGNvbnN0IG9iamVjdElkID0gbmV3T2JqZWN0SWQoY29uZmlnLm9iamVjdElkU2l6ZSk7XG4gIGNvbnN0IGRhdGFiYXNlID0gY29uZmlnLmRhdGFiYXNlO1xuICBjb25zdCBoYW5kbGVyID0gc3RhdHVzSGFuZGxlcihKT0JfU1RBVFVTX0NPTExFQ1RJT04sIGRhdGFiYXNlKTtcbiAgY29uc3Qgc2V0UnVubmluZyA9IGZ1bmN0aW9uIChqb2JOYW1lLCBwYXJhbXMpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGpvYlN0YXR1cyA9IHtcbiAgICAgIG9iamVjdElkLFxuICAgICAgam9iTmFtZSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgc291cmNlOiAnYXBpJyxcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgLy8gbG9ja2Rvd24hXG4gICAgICBBQ0w6IHt9LFxuICAgIH07XG5cbiAgICByZXR1cm4gaGFuZGxlci5jcmVhdGUoam9iU3RhdHVzKTtcbiAgfTtcblxuICBjb25zdCBzZXRNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHsgbWVzc2FnZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZXRTdWNjZWVkZWQgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHJldHVybiBzZXRGaW5hbFN0YXR1cygnc3VjY2VlZGVkJywgbWVzc2FnZSk7XG4gIH07XG5cbiAgY29uc3Qgc2V0RmFpbGVkID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc2V0RmluYWxTdGF0dXMoJ2ZhaWxlZCcsIG1lc3NhZ2UpO1xuICB9O1xuXG4gIGNvbnN0IHNldEZpbmFsU3RhdHVzID0gZnVuY3Rpb24gKHN0YXR1cywgbWVzc2FnZSA9IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IHsgc3RhdHVzLCBmaW5pc2hlZEF0IH07XG4gICAgaWYgKG1lc3NhZ2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB1cGRhdGUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIG1lc3NhZ2UubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHVwZGF0ZS5tZXNzYWdlID0gbWVzc2FnZS5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB1cGRhdGUpO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBzZXRSdW5uaW5nLFxuICAgIHNldFN1Y2NlZWRlZCxcbiAgICBzZXRNZXNzYWdlLFxuICAgIHNldEZhaWxlZCxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdXNoU3RhdHVzSGFuZGxlcihjb25maWcsIGV4aXN0aW5nT2JqZWN0SWQpIHtcbiAgbGV0IHB1c2hTdGF0dXM7XG4gIGNvbnN0IGRhdGFiYXNlID0gY29uZmlnLmRhdGFiYXNlO1xuICBjb25zdCBoYW5kbGVyID0gcmVzdFN0YXR1c0hhbmRsZXIoUFVTSF9TVEFUVVNfQ09MTEVDVElPTiwgY29uZmlnKTtcbiAgbGV0IG9iamVjdElkID0gZXhpc3RpbmdPYmplY3RJZDtcbiAgY29uc3Qgc2V0SW5pdGlhbCA9IGZ1bmN0aW9uIChib2R5ID0ge30sIHdoZXJlLCBvcHRpb25zID0geyBzb3VyY2U6ICdyZXN0JyB9KSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgcHVzaFRpbWUgPSBub3cudG9JU09TdHJpbmcoKTtcbiAgICBsZXQgc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYm9keSwgJ3B1c2hfdGltZScpKSB7XG4gICAgICBpZiAoY29uZmlnLmhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0KSB7XG4gICAgICAgIHB1c2hUaW1lID0gYm9keS5wdXNoX3RpbWU7XG4gICAgICAgIHN0YXR1cyA9ICdzY2hlZHVsZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RyeWluZyB0byBzY2hlZHVsZSBhIHB1c2ggd2hpbGUgc2VydmVyIGlzIG5vdCBjb25maWd1cmVkLicpO1xuICAgICAgICBsb2dnZXIud2FybignUHVzaCB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHknKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYm9keS5kYXRhIHx8IHt9O1xuICAgIGNvbnN0IHBheWxvYWRTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICBsZXQgcHVzaEhhc2g7XG4gICAgaWYgKHR5cGVvZiBkYXRhLmFsZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgcHVzaEhhc2ggPSBtZDVIYXNoKGRhdGEuYWxlcnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEuYWxlcnQgPT09ICdvYmplY3QnKSB7XG4gICAgICBwdXNoSGFzaCA9IG1kNUhhc2goSlNPTi5zdHJpbmdpZnkoZGF0YS5hbGVydCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoSGFzaCA9ICdkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSc7XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdCA9IHtcbiAgICAgIHB1c2hUaW1lLFxuICAgICAgcXVlcnk6IEpTT04uc3RyaW5naWZ5KHdoZXJlKSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWRTdHJpbmcsXG4gICAgICBzb3VyY2U6IG9wdGlvbnMuc291cmNlLFxuICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUsXG4gICAgICBleHBpcnk6IGJvZHkuZXhwaXJhdGlvbl90aW1lLFxuICAgICAgZXhwaXJhdGlvbl9pbnRlcnZhbDogYm9keS5leHBpcmF0aW9uX2ludGVydmFsLFxuICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICBudW1TZW50OiAwLFxuICAgICAgcHVzaEhhc2gsXG4gICAgICAvLyBsb2NrZG93biFcbiAgICAgIEFDTDoge30sXG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlci5jcmVhdGUob2JqZWN0KS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RJZDtcbiAgICAgIHB1c2hTdGF0dXMgPSB7XG4gICAgICAgIG9iamVjdElkLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHVzaFN0YXR1cyk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2V0UnVubmluZyA9IGZ1bmN0aW9uIChiYXRjaGVzKSB7XG4gICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICBgX1B1c2hTdGF0dXMgJHtvYmplY3RJZH06IHNlbmRpbmcgcHVzaCB0byBpbnN0YWxsYXRpb25zIHdpdGggJWQgYmF0Y2hlc2AsXG4gICAgICBiYXRjaGVzXG4gICAgKTtcbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoXG4gICAgICB7XG4gICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICBvYmplY3RJZDogb2JqZWN0SWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgY291bnQ6IGJhdGNoZXMsXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCB0cmFja1NlbnQgPSBmdW5jdGlvbiAoXG4gICAgcmVzdWx0cyxcbiAgICBVVENPZmZzZXQsXG4gICAgY2xlYW51cEluc3RhbGxhdGlvbnMgPSBwcm9jZXNzLmVudi5QQVJTRV9TRVJWRVJfQ0xFQU5VUF9JTlZBTElEX0lOU1RBTExBVElPTlNcbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgbnVtU2VudDogMCxcbiAgICAgIG51bUZhaWxlZDogMCxcbiAgICB9O1xuICAgIGNvbnN0IGRldmljZXNUb1JlbW92ZSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSB7XG4gICAgICByZXN1bHRzID0gZmxhdHRlbihyZXN1bHRzKTtcbiAgICAgIHJlc3VsdHMucmVkdWNlKChtZW1vLCByZXN1bHQpID0+IHtcbiAgICAgICAgLy8gQ2Fubm90IGhhbmRsZSB0aGF0XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGV2aWNlIHx8ICFyZXN1bHQuZGV2aWNlLmRldmljZVR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlID0gcmVzdWx0LmRldmljZS5kZXZpY2VUeXBlO1xuICAgICAgICBjb25zdCBrZXkgPSByZXN1bHQudHJhbnNtaXR0ZWRcbiAgICAgICAgICA/IGBzZW50UGVyVHlwZS4ke2RldmljZVR5cGV9YFxuICAgICAgICAgIDogYGZhaWxlZFBlclR5cGUuJHtkZXZpY2VUeXBlfWA7XG4gICAgICAgIG1lbW9ba2V5XSA9IGluY3JlbWVudE9wKG1lbW8sIGtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgVVRDT2Zmc2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnN0IG9mZnNldEtleSA9IHJlc3VsdC50cmFuc21pdHRlZFxuICAgICAgICAgICAgPyBgc2VudFBlclVUQ09mZnNldC4ke1VUQ09mZnNldH1gXG4gICAgICAgICAgICA6IGBmYWlsZWRQZXJVVENPZmZzZXQuJHtVVENPZmZzZXR9YDtcbiAgICAgICAgICBtZW1vW29mZnNldEtleV0gPSBpbmNyZW1lbnRPcChtZW1vLCBvZmZzZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQudHJhbnNtaXR0ZWQpIHtcbiAgICAgICAgICBtZW1vLm51bVNlbnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZSAmJlxuICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlLmVycm9yICYmXG4gICAgICAgICAgICByZXN1bHQuZGV2aWNlICYmXG4gICAgICAgICAgICByZXN1bHQuZGV2aWNlLmRldmljZVRva2VuXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlc3VsdC5kZXZpY2UuZGV2aWNlVG9rZW47XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5yZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgIC8vIEdDTSBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvciA9PT0gJ05vdFJlZ2lzdGVyZWQnIHx8IGVycm9yID09PSAnSW52YWxpZFJlZ2lzdHJhdGlvbicpIHtcbiAgICAgICAgICAgICAgZGV2aWNlc1RvUmVtb3ZlLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVBOUyBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvciA9PT0gJ1VucmVnaXN0ZXJlZCcgfHwgZXJyb3IgPT09ICdCYWREZXZpY2VUb2tlbicpIHtcbiAgICAgICAgICAgICAgZGV2aWNlc1RvUmVtb3ZlLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZW1vLm51bUZhaWxlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSwgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgIGBfUHVzaFN0YXR1cyAke29iamVjdElkfTogc2VudCBwdXNoISAlZCBzdWNjZXNzLCAlZCBmYWlsdXJlc2AsXG4gICAgICB1cGRhdGUubnVtU2VudCxcbiAgICAgIHVwZGF0ZS5udW1GYWlsZWRcbiAgICApO1xuICAgIGxvZ2dlci52ZXJib3NlKGBfUHVzaFN0YXR1cyAke29iamVjdElkfTogbmVlZHMgY2xlYW51cGAsIHtcbiAgICAgIGRldmljZXNUb1JlbW92ZSxcbiAgICB9KTtcbiAgICBbJ251bVNlbnQnLCAnbnVtRmFpbGVkJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZVtrZXldID4gMCkge1xuICAgICAgICB1cGRhdGVba2V5XSA9IHtcbiAgICAgICAgICBfX29wOiAnSW5jcmVtZW50JyxcbiAgICAgICAgICBhbW91bnQ6IHVwZGF0ZVtrZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRldmljZXNUb1JlbW92ZS5sZW5ndGggPiAwICYmIGNsZWFudXBJbnN0YWxsYXRpb25zKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgUmVtb3ZpbmcgZGV2aWNlIHRva2VucyBvbiAke2RldmljZXNUb1JlbW92ZS5sZW5ndGh9IF9JbnN0YWxsYXRpb25zYCk7XG4gICAgICBkYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAgeyBkZXZpY2VUb2tlbjogeyAkaW46IGRldmljZXNUb1JlbW92ZSB9IH0sXG4gICAgICAgIHsgZGV2aWNlVG9rZW46IHsgX19vcDogJ0RlbGV0ZScgfSB9LFxuICAgICAgICB7XG4gICAgICAgICAgYWNsOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWFueTogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgaW5jcmVtZW50T3AodXBkYXRlLCAnY291bnQnLCAtMSk7XG4gICAgdXBkYXRlLnN0YXR1cyA9ICdydW5uaW5nJztcblxuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHVwZGF0ZSkudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcyAmJiByZXMuY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoXG4gICAgICB7IG9iamVjdElkIH0sXG4gICAgICB7XG4gICAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIGNvdW50OiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBmYWlsID0gZnVuY3Rpb24gKGVycikge1xuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgZXJyID0geyBtZXNzYWdlOiBlcnIgfTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgZXJyb3JNZXNzYWdlOiBlcnIsXG4gICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgIH07XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKHsgb2JqZWN0SWQgfSwgdXBkYXRlKTtcbiAgfTtcblxuICBjb25zdCBydmFsID0ge1xuICAgIHNldEluaXRpYWwsXG4gICAgc2V0UnVubmluZyxcbiAgICB0cmFja1NlbnQsXG4gICAgY29tcGxldGUsXG4gICAgZmFpbCxcbiAgfTtcblxuICAvLyBkZWZpbmUgb2JqZWN0SWQgdG8gYmUgZHluYW1pY1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocnZhbCwgJ29iamVjdElkJywge1xuICAgIGdldDogKCkgPT4gb2JqZWN0SWQsXG4gIH0pO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHJ2YWwpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRTFCLE1BQU1BLHNCQUFzQixHQUFHLGFBQWE7QUFDNUMsTUFBTUMscUJBQXFCLEdBQUcsWUFBWTtBQUUxQyxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxnQ0FBZSxFQUFFO0FBQzlDLE1BQU1DLGVBQWUsR0FBRyxJQUFJRCxnQ0FBZSxFQUFFO0FBRTdDLE1BQU1FLFdBQVcsR0FBRyxVQUFVQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUVDLEdBQUcsRUFBRUMsTUFBTSxHQUFHLENBQUMsRUFBRTtF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
|
package/lib/TestUtils.js
CHANGED
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.destroyAllDataPermanently = destroyAllDataPermanently;
|
|
7
|
-
|
|
8
7
|
var _cache = _interopRequireDefault(require("./cache"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* Destroys all data in the database
|
|
14
11
|
* @param {boolean} fast set to true if it's ok to just drop objects and not indexes.
|
|
@@ -17,10 +14,8 @@ function destroyAllDataPermanently(fast) {
|
|
|
17
14
|
if (!process.env.TESTING) {
|
|
18
15
|
throw 'Only supported in test environment';
|
|
19
16
|
}
|
|
20
|
-
|
|
21
17
|
return Promise.all(Object.keys(_cache.default.cache).map(appId => {
|
|
22
18
|
const app = _cache.default.get(appId);
|
|
23
|
-
|
|
24
19
|
if (app.databaseController) {
|
|
25
20
|
return app.databaseController.deleteEverything(fast);
|
|
26
21
|
} else {
|
|
@@ -28,4 +23,4 @@ function destroyAllDataPermanently(fast) {
|
|
|
28
23
|
}
|
|
29
24
|
}));
|
|
30
25
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXN0cm95QWxsRGF0YVBlcm1hbmVudGx5IiwiZmFzdCIsInByb2Nlc3MiLCJlbnYiLCJURVNUSU5HIiwiUHJvbWlzZSIsImFsbCIsIk9iamVjdCIsImtleXMiLCJBcHBDYWNoZSIsImNhY2hlIiwibWFwIiwiYXBwSWQiLCJhcHAiLCJnZXQiLCJkYXRhYmFzZUNvbnRyb2xsZXIiLCJkZWxldGVFdmVyeXRoaW5nIiwicmVzb2x2ZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9UZXN0VXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFwcENhY2hlIGZyb20gJy4vY2FjaGUnO1xuXG4vKipcbiAqIERlc3Ryb3lzIGFsbCBkYXRhIGluIHRoZSBkYXRhYmFzZVxuICogQHBhcmFtIHtib29sZWFufSBmYXN0IHNldCB0byB0cnVlIGlmIGl0J3Mgb2sgdG8ganVzdCBkcm9wIG9iamVjdHMgYW5kIG5vdCBpbmRleGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzdHJveUFsbERhdGFQZXJtYW5lbnRseShmYXN0KSB7XG4gIGlmICghcHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIHRocm93ICdPbmx5IHN1cHBvcnRlZCBpbiB0ZXN0IGVudmlyb25tZW50JztcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgT2JqZWN0LmtleXMoQXBwQ2FjaGUuY2FjaGUpLm1hcChhcHBJZCA9PiB7XG4gICAgICBjb25zdCBhcHAgPSBBcHBDYWNoZS5nZXQoYXBwSWQpO1xuICAgICAgaWYgKGFwcC5kYXRhYmFzZUNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5kYXRhYmFzZUNvbnRyb2xsZXIuZGVsZXRlRXZlcnl0aGluZyhmYXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUErQjtBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNBLHlCQUF5QixDQUFDQyxJQUFJLEVBQUU7RUFDOUMsSUFBSSxDQUFDQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsT0FBTyxFQUFFO0lBQ3hCLE1BQU0sb0NBQW9DO0VBQzVDO0VBQ0EsT0FBT0MsT0FBTyxDQUFDQyxHQUFHLENBQ2hCQyxNQUFNLENBQUNDLElBQUksQ0FBQ0MsY0FBUSxDQUFDQyxLQUFLLENBQUMsQ0FBQ0MsR0FBRyxDQUFDQyxLQUFLLElBQUk7SUFDdkMsTUFBTUMsR0FBRyxHQUFHSixjQUFRLENBQUNLLEdBQUcsQ0FBQ0YsS0FBSyxDQUFDO0lBQy9CLElBQUlDLEdBQUcsQ0FBQ0Usa0JBQWtCLEVBQUU7TUFDMUIsT0FBT0YsR0FBRyxDQUFDRSxrQkFBa0IsQ0FBQ0MsZ0JBQWdCLENBQUNmLElBQUksQ0FBQztJQUN0RCxDQUFDLE1BQU07TUFDTCxPQUFPSSxPQUFPLENBQUNZLE9BQU8sRUFBRTtJQUMxQjtFQUNGLENBQUMsQ0FBQyxDQUNIO0FBQ0gifQ==
|