parse-server 2.8.4 → 8.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
package/lib/StatusHandler.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
@@ -6,33 +6,27 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.flatten = flatten;
|
|
7
7
|
exports.jobStatusHandler = jobStatusHandler;
|
|
8
8
|
exports.pushStatusHandler = pushStatusHandler;
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var _rest2 = _interopRequireDefault(_rest);
|
|
17
|
-
|
|
18
|
-
var _Auth = require('./Auth');
|
|
19
|
-
|
|
20
|
-
var _Auth2 = _interopRequireDefault(_Auth);
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
9
|
+
var _cryptoUtils = require("./cryptoUtils");
|
|
10
|
+
var _KeyPromiseQueue = require("./KeyPromiseQueue");
|
|
11
|
+
var _logger = require("./logger");
|
|
12
|
+
var _rest = _interopRequireDefault(require("./rest"));
|
|
13
|
+
var _Auth = _interopRequireDefault(require("./Auth"));
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
15
|
const PUSH_STATUS_COLLECTION = '_PushStatus';
|
|
25
16
|
const JOB_STATUS_COLLECTION = '_JobStatus';
|
|
26
|
-
|
|
17
|
+
const pushPromiseQueue = new _KeyPromiseQueue.KeyPromiseQueue();
|
|
18
|
+
const jobPromiseQueue = new _KeyPromiseQueue.KeyPromiseQueue();
|
|
27
19
|
const incrementOp = function (object = {}, key, amount = 1) {
|
|
28
20
|
if (!object[key]) {
|
|
29
|
-
object[key] = {
|
|
21
|
+
object[key] = {
|
|
22
|
+
__op: 'Increment',
|
|
23
|
+
amount: amount
|
|
24
|
+
};
|
|
30
25
|
} else {
|
|
31
26
|
object[key].amount += amount;
|
|
32
27
|
}
|
|
33
28
|
return object[key];
|
|
34
29
|
};
|
|
35
|
-
|
|
36
30
|
function flatten(array) {
|
|
37
31
|
var flattened = [];
|
|
38
32
|
for (var i = 0; i < array.length; i++) {
|
|
@@ -44,107 +38,99 @@ function flatten(array) {
|
|
|
44
38
|
}
|
|
45
39
|
return flattened;
|
|
46
40
|
}
|
|
47
|
-
|
|
48
41
|
function statusHandler(className, database) {
|
|
49
|
-
let lastPromise = Promise.resolve();
|
|
50
|
-
|
|
51
42
|
function create(object) {
|
|
52
|
-
|
|
53
|
-
return
|
|
54
|
-
return Promise.resolve(object);
|
|
55
|
-
});
|
|
43
|
+
return database.create(className, object).then(() => {
|
|
44
|
+
return Promise.resolve(object);
|
|
56
45
|
});
|
|
57
|
-
return lastPromise;
|
|
58
46
|
}
|
|
59
|
-
|
|
60
47
|
function update(where, object) {
|
|
61
|
-
|
|
62
|
-
return database.update(className, where, object);
|
|
63
|
-
});
|
|
64
|
-
return lastPromise;
|
|
48
|
+
return jobPromiseQueue.enqueue(where.objectId, () => database.update(className, where, object));
|
|
65
49
|
}
|
|
66
|
-
|
|
67
50
|
return Object.freeze({
|
|
68
51
|
create,
|
|
69
52
|
update
|
|
70
53
|
});
|
|
71
54
|
}
|
|
72
|
-
|
|
73
55
|
function restStatusHandler(className, config) {
|
|
74
|
-
|
|
75
|
-
const auth = _Auth2.default.master(config);
|
|
56
|
+
const auth = _Auth.default.master(config);
|
|
76
57
|
function create(object) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
58
|
+
return _rest.default.create(config, auth, className, object).then(({
|
|
59
|
+
response
|
|
60
|
+
}) => {
|
|
61
|
+
return {
|
|
62
|
+
...object,
|
|
63
|
+
...response
|
|
64
|
+
};
|
|
82
65
|
});
|
|
83
|
-
return lastPromise;
|
|
84
66
|
}
|
|
85
|
-
|
|
86
67
|
function update(where, object) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
68
|
+
return pushPromiseQueue.enqueue(where.objectId, () => _rest.default.update(config, auth, className, {
|
|
69
|
+
objectId: where.objectId
|
|
70
|
+
}, object).then(({
|
|
71
|
+
response
|
|
72
|
+
}) => {
|
|
73
|
+
return {
|
|
74
|
+
...object,
|
|
75
|
+
...response
|
|
76
|
+
};
|
|
77
|
+
}));
|
|
95
78
|
}
|
|
96
|
-
|
|
97
79
|
return Object.freeze({
|
|
98
80
|
create,
|
|
99
81
|
update
|
|
100
82
|
});
|
|
101
83
|
}
|
|
102
|
-
|
|
103
84
|
function jobStatusHandler(config) {
|
|
104
85
|
let jobStatus;
|
|
105
86
|
const objectId = (0, _cryptoUtils.newObjectId)(config.objectIdSize);
|
|
106
87
|
const database = config.database;
|
|
107
88
|
const handler = statusHandler(JOB_STATUS_COLLECTION, database);
|
|
108
|
-
const setRunning = function (jobName
|
|
89
|
+
const setRunning = function (jobName) {
|
|
109
90
|
const now = new Date();
|
|
110
91
|
jobStatus = {
|
|
111
92
|
objectId,
|
|
112
93
|
jobName,
|
|
113
|
-
params,
|
|
114
94
|
status: 'running',
|
|
115
95
|
source: 'api',
|
|
116
96
|
createdAt: now,
|
|
117
97
|
// lockdown!
|
|
118
98
|
ACL: {}
|
|
119
99
|
};
|
|
120
|
-
|
|
121
100
|
return handler.create(jobStatus);
|
|
122
101
|
};
|
|
123
|
-
|
|
124
102
|
const setMessage = function (message) {
|
|
125
103
|
if (!message || typeof message !== 'string') {
|
|
126
104
|
return Promise.resolve();
|
|
127
105
|
}
|
|
128
|
-
return handler.update({
|
|
106
|
+
return handler.update({
|
|
107
|
+
objectId
|
|
108
|
+
}, {
|
|
109
|
+
message
|
|
110
|
+
});
|
|
129
111
|
};
|
|
130
|
-
|
|
131
112
|
const setSucceeded = function (message) {
|
|
132
113
|
return setFinalStatus('succeeded', message);
|
|
133
114
|
};
|
|
134
|
-
|
|
135
115
|
const setFailed = function (message) {
|
|
136
116
|
return setFinalStatus('failed', message);
|
|
137
117
|
};
|
|
138
|
-
|
|
139
118
|
const setFinalStatus = function (status, message = undefined) {
|
|
140
119
|
const finishedAt = new Date();
|
|
141
|
-
const update = {
|
|
120
|
+
const update = {
|
|
121
|
+
status,
|
|
122
|
+
finishedAt
|
|
123
|
+
};
|
|
142
124
|
if (message && typeof message === 'string') {
|
|
143
125
|
update.message = message;
|
|
144
126
|
}
|
|
145
|
-
|
|
127
|
+
if (message instanceof Error && typeof message.message === 'string') {
|
|
128
|
+
update.message = message.message;
|
|
129
|
+
}
|
|
130
|
+
return handler.update({
|
|
131
|
+
objectId
|
|
132
|
+
}, update);
|
|
146
133
|
};
|
|
147
|
-
|
|
148
134
|
return Object.freeze({
|
|
149
135
|
setRunning,
|
|
150
136
|
setSucceeded,
|
|
@@ -152,18 +138,18 @@ function jobStatusHandler(config) {
|
|
|
152
138
|
setFailed
|
|
153
139
|
});
|
|
154
140
|
}
|
|
155
|
-
|
|
156
141
|
function pushStatusHandler(config, existingObjectId) {
|
|
157
|
-
|
|
158
142
|
let pushStatus;
|
|
159
143
|
const database = config.database;
|
|
160
144
|
const handler = restStatusHandler(PUSH_STATUS_COLLECTION, config);
|
|
161
145
|
let objectId = existingObjectId;
|
|
162
|
-
const setInitial = function (body = {}, where, options = {
|
|
146
|
+
const setInitial = function (body = {}, where, options = {
|
|
147
|
+
source: 'rest'
|
|
148
|
+
}) {
|
|
163
149
|
const now = new Date();
|
|
164
150
|
let pushTime = now.toISOString();
|
|
165
151
|
let status = 'pending';
|
|
166
|
-
if (
|
|
152
|
+
if (Object.prototype.hasOwnProperty.call(body, 'push_time')) {
|
|
167
153
|
if (config.hasPushScheduledSupport) {
|
|
168
154
|
pushTime = body.push_time;
|
|
169
155
|
status = 'scheduled';
|
|
@@ -172,7 +158,6 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
172
158
|
_logger.logger.warn('Push will be sent immediately');
|
|
173
159
|
}
|
|
174
160
|
}
|
|
175
|
-
|
|
176
161
|
const data = body.data || {};
|
|
177
162
|
const payloadString = JSON.stringify(data);
|
|
178
163
|
let pushHash;
|
|
@@ -205,18 +190,16 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
205
190
|
return Promise.resolve(pushStatus);
|
|
206
191
|
});
|
|
207
192
|
};
|
|
208
|
-
|
|
209
193
|
const setRunning = function (batches) {
|
|
210
194
|
_logger.logger.verbose(`_PushStatus ${objectId}: sending push to installations with %d batches`, batches);
|
|
211
195
|
return handler.update({
|
|
212
|
-
status:
|
|
196
|
+
status: 'pending',
|
|
213
197
|
objectId: objectId
|
|
214
198
|
}, {
|
|
215
|
-
status:
|
|
199
|
+
status: 'running',
|
|
216
200
|
count: batches
|
|
217
201
|
});
|
|
218
202
|
};
|
|
219
|
-
|
|
220
203
|
const trackSent = function (results, UTCOffset, cleanupInstallations = process.env.PARSE_SERVER_CLEANUP_INVALID_INSTALLATIONS) {
|
|
221
204
|
const update = {
|
|
222
205
|
numSent: 0,
|
|
@@ -243,11 +226,19 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
243
226
|
if (result && result.response && result.response.error && result.device && result.device.deviceToken) {
|
|
244
227
|
const token = result.device.deviceToken;
|
|
245
228
|
const error = result.response.error;
|
|
246
|
-
// GCM errors
|
|
229
|
+
// GCM / FCM HTTP v1 API errors; see:
|
|
230
|
+
// https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode
|
|
247
231
|
if (error === 'NotRegistered' || error === 'InvalidRegistration') {
|
|
248
232
|
devicesToRemove.push(token);
|
|
249
233
|
}
|
|
250
|
-
//
|
|
234
|
+
// FCM API v2 errors; see:
|
|
235
|
+
// https://firebase.google.com/docs/cloud-messaging/manage-tokens
|
|
236
|
+
// https://github.com/firebase/functions-samples/blob/703c0359eacf07a551751d1319d34f912a2cd828/Node/fcm-notifications/functions/index.js#L89-L93C16
|
|
237
|
+
if (error?.code === 'messaging/registration-token-not-registered' || error?.code === 'messaging/invalid-registration-token' || error?.code === 'messaging/invalid-argument' && error?.message === 'The registration token is not a valid FCM registration token') {
|
|
238
|
+
devicesToRemove.push(token);
|
|
239
|
+
}
|
|
240
|
+
// APNS errors; see:
|
|
241
|
+
// https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns
|
|
251
242
|
if (error === 'Unregistered' || error === 'BadDeviceToken') {
|
|
252
243
|
devicesToRemove.push(token);
|
|
253
244
|
}
|
|
@@ -257,9 +248,10 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
257
248
|
return memo;
|
|
258
249
|
}, update);
|
|
259
250
|
}
|
|
260
|
-
|
|
261
251
|
_logger.logger.verbose(`_PushStatus ${objectId}: sent push! %d success, %d failures`, update.numSent, update.numFailed);
|
|
262
|
-
_logger.logger.verbose(`_PushStatus ${objectId}: needs cleanup`, {
|
|
252
|
+
_logger.logger.verbose(`_PushStatus ${objectId}: needs cleanup`, {
|
|
253
|
+
devicesToRemove
|
|
254
|
+
});
|
|
263
255
|
['numSent', 'numFailed'].forEach(key => {
|
|
264
256
|
if (update[key] > 0) {
|
|
265
257
|
update[key] = {
|
|
@@ -270,43 +262,55 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
270
262
|
delete update[key];
|
|
271
263
|
}
|
|
272
264
|
});
|
|
273
|
-
|
|
274
265
|
if (devicesToRemove.length > 0 && cleanupInstallations) {
|
|
275
266
|
_logger.logger.info(`Removing device tokens on ${devicesToRemove.length} _Installations`);
|
|
276
|
-
database.update('_Installation', {
|
|
267
|
+
database.update('_Installation', {
|
|
268
|
+
deviceToken: {
|
|
269
|
+
$in: devicesToRemove
|
|
270
|
+
}
|
|
271
|
+
}, {
|
|
272
|
+
deviceToken: {
|
|
273
|
+
__op: 'Delete'
|
|
274
|
+
}
|
|
275
|
+
}, {
|
|
277
276
|
acl: undefined,
|
|
278
277
|
many: true
|
|
279
278
|
});
|
|
280
279
|
}
|
|
281
|
-
|
|
282
|
-
// indicate this batch is complete
|
|
283
280
|
incrementOp(update, 'count', -1);
|
|
284
|
-
|
|
285
|
-
return handler.update({
|
|
281
|
+
update.status = 'running';
|
|
282
|
+
return handler.update({
|
|
283
|
+
objectId
|
|
284
|
+
}, update).then(res => {
|
|
286
285
|
if (res && res.count === 0) {
|
|
287
286
|
return this.complete();
|
|
288
287
|
}
|
|
289
288
|
});
|
|
290
289
|
};
|
|
291
|
-
|
|
292
290
|
const complete = function () {
|
|
293
|
-
return handler.update({
|
|
291
|
+
return handler.update({
|
|
292
|
+
objectId
|
|
293
|
+
}, {
|
|
294
294
|
status: 'succeeded',
|
|
295
|
-
count: {
|
|
295
|
+
count: {
|
|
296
|
+
__op: 'Delete'
|
|
297
|
+
}
|
|
296
298
|
});
|
|
297
299
|
};
|
|
298
|
-
|
|
299
300
|
const fail = function (err) {
|
|
300
301
|
if (typeof err === 'string') {
|
|
301
|
-
err = {
|
|
302
|
+
err = {
|
|
303
|
+
message: err
|
|
304
|
+
};
|
|
302
305
|
}
|
|
303
306
|
const update = {
|
|
304
307
|
errorMessage: err,
|
|
305
308
|
status: 'failed'
|
|
306
309
|
};
|
|
307
|
-
return handler.update({
|
|
310
|
+
return handler.update({
|
|
311
|
+
objectId
|
|
312
|
+
}, update);
|
|
308
313
|
};
|
|
309
|
-
|
|
310
314
|
const rval = {
|
|
311
315
|
setInitial,
|
|
312
316
|
setRunning,
|
|
@@ -316,10 +320,9 @@ function pushStatusHandler(config, existingObjectId) {
|
|
|
316
320
|
};
|
|
317
321
|
|
|
318
322
|
// define objectId to be dynamic
|
|
319
|
-
Object.defineProperty(rval,
|
|
323
|
+
Object.defineProperty(rval, 'objectId', {
|
|
320
324
|
get: () => objectId
|
|
321
325
|
});
|
|
322
|
-
|
|
323
326
|
return Object.freeze(rval);
|
|
324
327
|
}
|
|
325
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TdGF0dXNIYW5kbGVyLmpzIl0sIm5hbWVzIjpbImZsYXR0ZW4iLCJqb2JTdGF0dXNIYW5kbGVyIiwicHVzaFN0YXR1c0hhbmRsZXIiLCJQVVNIX1NUQVRVU19DT0xMRUNUSU9OIiwiSk9CX1NUQVRVU19DT0xMRUNUSU9OIiwiaW5jcmVtZW50T3AiLCJvYmplY3QiLCJrZXkiLCJhbW91bnQiLCJfX29wIiwiYXJyYXkiLCJmbGF0dGVuZWQiLCJpIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwiY29uY2F0IiwicHVzaCIsInN0YXR1c0hhbmRsZXIiLCJjbGFzc05hbWUiLCJkYXRhYmFzZSIsImxhc3RQcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjcmVhdGUiLCJ0aGVuIiwidXBkYXRlIiwid2hlcmUiLCJPYmplY3QiLCJmcmVlemUiLCJyZXN0U3RhdHVzSGFuZGxlciIsImNvbmZpZyIsImF1dGgiLCJBdXRoIiwibWFzdGVyIiwicmVzdCIsInJlc3BvbnNlIiwiYXNzaWduIiwib2JqZWN0SWQiLCJqb2JTdGF0dXMiLCJvYmplY3RJZFNpemUiLCJoYW5kbGVyIiwic2V0UnVubmluZyIsImpvYk5hbWUiLCJwYXJhbXMiLCJub3ciLCJEYXRlIiwic3RhdHVzIiwic291cmNlIiwiY3JlYXRlZEF0IiwiQUNMIiwic2V0TWVzc2FnZSIsIm1lc3NhZ2UiLCJzZXRTdWNjZWVkZWQiLCJzZXRGaW5hbFN0YXR1cyIsInNldEZhaWxlZCIsInVuZGVmaW5lZCIsImZpbmlzaGVkQXQiLCJleGlzdGluZ09iamVjdElkIiwicHVzaFN0YXR1cyIsInNldEluaXRpYWwiLCJib2R5Iiwib3B0aW9ucyIsInB1c2hUaW1lIiwidG9JU09TdHJpbmciLCJoYXNPd25Qcm9wZXJ0eSIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwicHVzaF90aW1lIiwibG9nZ2VyIiwid2FybiIsImRhdGEiLCJwYXlsb2FkU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2hIYXNoIiwiYWxlcnQiLCJxdWVyeSIsInBheWxvYWQiLCJ0aXRsZSIsImV4cGlyeSIsImV4cGlyYXRpb25fdGltZSIsImV4cGlyYXRpb25faW50ZXJ2YWwiLCJudW1TZW50IiwicmVzdWx0IiwiYmF0Y2hlcyIsInZlcmJvc2UiLCJjb3VudCIsInRyYWNrU2VudCIsInJlc3VsdHMiLCJVVENPZmZzZXQiLCJjbGVhbnVwSW5zdGFsbGF0aW9ucyIsInByb2Nlc3MiLCJlbnYiLCJQQVJTRV9TRVJWRVJfQ0xFQU5VUF9JTlZBTElEX0lOU1RBTExBVElPTlMiLCJudW1GYWlsZWQiLCJkZXZpY2VzVG9SZW1vdmUiLCJyZWR1Y2UiLCJtZW1vIiwiZGV2aWNlIiwiZGV2aWNlVHlwZSIsInRyYW5zbWl0dGVkIiwib2Zmc2V0S2V5IiwiZXJyb3IiLCJkZXZpY2VUb2tlbiIsInRva2VuIiwiZm9yRWFjaCIsImluZm8iLCJhY2wiLCJtYW55IiwicmVzIiwiY29tcGxldGUiLCJmYWlsIiwiZXJyIiwiZXJyb3JNZXNzYWdlIiwicnZhbCIsImRlZmluZVByb3BlcnR5IiwiZ2V0Il0sIm1hcHBpbmdzIjoiOzs7OztRQWlCZ0JBLE8sR0FBQUEsTztRQXFFQUMsZ0IsR0FBQUEsZ0I7UUFxREFDLGlCLEdBQUFBLGlCOztBQTNJaEI7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsTUFBTUMseUJBQXlCLGFBQS9CO0FBQ0EsTUFBTUMsd0JBQXdCLFlBQTlCOztBQUVBLE1BQU1DLGNBQWMsVUFBU0MsU0FBUyxFQUFsQixFQUFzQkMsR0FBdEIsRUFBMkJDLFNBQVMsQ0FBcEMsRUFBdUM7QUFDekQsTUFBSSxDQUFDRixPQUFPQyxHQUFQLENBQUwsRUFBa0I7QUFDaEJELFdBQU9DLEdBQVAsSUFBYyxFQUFDRSxNQUFNLFdBQVAsRUFBb0JELFFBQVFBLE1BQTVCLEVBQWQ7QUFDRCxHQUZELE1BRU87QUFDTEYsV0FBT0MsR0FBUCxFQUFZQyxNQUFaLElBQXNCQSxNQUF0QjtBQUNEO0FBQ0QsU0FBT0YsT0FBT0MsR0FBUCxDQUFQO0FB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WSxRQUFGLEVBQWYsRUFBNkJaLE1BQTdCLENBQVA7QUFDRCxHQVREOztBQVdBLFFBQU13RixPQUFPO0FBQ1h0RCxjQURXO0FBRVhsQixjQUZXO0FBR1g2QyxhQUhXO0FBSVh1QixZQUpXO0FBS1hDO0FBTFcsR0FBYjs7QUFRQTtBQUNBbkYsU0FBT3VGLGNBQVAsQ0FBc0JELElBQXRCLEVBQTRCLFVBQTVCLEVBQXdDO0FBQ3RDRSxTQUFLLE1BQU05RTtBQUQyQixHQUF4Qzs7QUFJQSxTQUFPVixPQUFPQyxNQUFQLENBQWNxRixJQUFkLENBQVA7QUFDRCIsImZpbGUiOiJTdGF0dXNIYW5kbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWQ1SGFzaCwgbmV3T2JqZWN0SWQgfSBmcm9tICcuL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGxvZ2dlciB9ICAgICAgICAgICAgICAgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHJlc3QgICAgICAgICAgICAgICAgICAgICBmcm9tICcuL3Jlc3QnO1xuaW1wb3J0IEF1dGggICAgICAgICAgICAgICAgICAgICBmcm9tICcuL0F1dGgnO1xuXG5jb25zdCBQVVNIX1NUQVRVU19DT0xMRUNUSU9OID0gJ19QdXNoU3RhdHVzJztcbmNvbnN0IEpPQl9TVEFUVVNfQ09MTEVDVElPTiA9ICdfSm9iU3RhdHVzJztcblxuY29uc3QgaW5jcmVtZW50T3AgPSBmdW5jdGlvbihvYmplY3QgPSB7fSwga2V5LCBhbW91bnQgPSAxKSB7XG4gIGlmICghb2JqZWN0W2tleV0pIHtcbiAgICBvYmplY3Rba2V5XSA9IHtfX29wOiAnSW5jcmVtZW50JywgYW1vdW50OiBhbW91bnR9XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0uYW1vdW50ICs9IGFtb3VudDtcbiAgfVxuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBmbGF0dGVuZWQgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhcnJheVtpXSkpIHtcbiAgICAgIGZsYXR0ZW5lZCA9IGZsYXR0ZW5lZC5jb25jYXQoZmxhdHRlbihhcnJheVtpXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbGF0dGVuZWQucHVzaChhcnJheVtpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmbGF0dGVuZWQ7XG59XG5cbmZ1bmN0aW9uIHN0YXR1c0hhbmRsZXIoY2xhc3NOYW1lLCBkYXRhYmFzZSkge1xuICBsZXQgbGFzdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgbGFzdFByb21pc2UgPSBsYXN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBkYXRhYmFzZS5jcmVhdGUoY2xhc3NOYW1lLCBvYmplY3QpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9iamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbGFzdFByb21pc2U7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGUod2hlcmUsIG9iamVjdCkge1xuICAgIGxhc3RQcm9taXNlID0gbGFzdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gZGF0YWJhc2UudXBkYXRlKGNsYXNzTmFtZSwgd2hlcmUsIG9iamVjdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxhc3RQcm9taXNlO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGNyZWF0ZSxcbiAgICB1cGRhdGVcbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVzdFN0YXR1c0hhbmRsZXIoY2xhc3NOYW1lLCBjb25maWcpIHtcbiAgbGV0IGxhc3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIGNvbnN0IGF1dGggPSBBdXRoLm1hc3Rlcihjb25maWcpO1xuICBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgbGFzdFByb21pc2UgPSBsYXN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiByZXN0LmNyZWF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgb2JqZWN0KVxuICAgICAgICAudGhlbigoeyByZXNwb25zZSB9KSA9PiB7XG4gICAgICAgICAgLy8gbWVyZ2UgdGhlIG9iamVjdHNcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKE9iamVjdC5hc3NpZ24oe30sIG9iamVjdCwgcmVzcG9uc2UpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxhc3RQcm9taXNlO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHdoZXJlLCBvYmplY3QpIHtcbiAgICAvLyBUT0RPOiB3aGVuIHdlIGhhdmUgdXBkYXRlV2hlcmUsIHVzZSB0aGF0IGZvciBwcm9wZXIgaW50ZXJmYWNpbmdcbiAgICBsYXN0UHJvbWlzZSA9IGxhc3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3QudXBkYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCB7IG9iamVjdElkOiB3aGVyZS5vYmplY3RJZCB9LCBvYmplY3QpXG4gICAgICAgIC50aGVuKCh7IHJlc3BvbnNlIH0pID0+IHtcbiAgICAgICAgICAvLyBtZXJnZSB0aGUgb2JqZWN0c1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoT2JqZWN0LmFzc2lnbih7fSwgb2JqZWN0LCByZXNwb25zZSkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbGFzdFByb21pc2U7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY3JlYXRlLFxuICAgIHVwZGF0ZVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gam9iU3RhdHVzSGFuZGxlcihjb25maWcpIHtcbiAgbGV0IGpvYlN0YXR1cztcbiAgY29uc3Qgb2JqZWN0SWQgPSBuZXdPYmplY3RJZChjb25maWcub2JqZWN0SWRTaXplKTtcbiAgY29uc3QgZGF0YWJhc2UgPSBjb25maWcuZGF0YWJhc2U7XG4gIGNvbnN0IGhhbmRsZXIgPSBzdGF0dXNIYW5kbGVyKEpPQl9TVEFUVVNfQ09MTEVDVElPTiwgZGF0YWJhc2UpO1xuICBjb25zdCBzZXRSdW5uaW5nID0gZnVuY3Rpb24oam9iTmFtZSwgcGFyYW1zKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBqb2JTdGF0dXMgPSB7XG4gICAgICBvYmplY3RJZCxcbiAgICAgIGpvYk5hbWUsXG4gICAgICBwYXJhbXMsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIHNvdXJjZTogJ2FwaScsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIC8vIGxvY2tkb3duIVxuICAgICAgQUNMOiB7fVxuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZShqb2JTdGF0dXMpO1xuICB9XG5cbiAgY29uc3Qgc2V0TWVzc2FnZSA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHsgbWVzc2FnZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHNldFN1Y2NlZWRlZCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc2V0RmluYWxTdGF0dXMoJ3N1Y2NlZWRlZCcsIG1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3Qgc2V0RmFpbGVkID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICAgIHJldHVybiBzZXRGaW5hbFN0YXR1cygnZmFpbGVkJywgbWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBzZXRGaW5hbFN0YXR1cyA9IGZ1bmN0aW9uKHN0YXR1cywgbWVzc2FnZSA9IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IHsgc3RhdHVzLCBmaW5pc2hlZEF0IH07XG4gICAgaWYgKG1lc3NhZ2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB1cGRhdGUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHVwZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc2V0UnVubmluZyxcbiAgICBzZXRTdWNjZWVkZWQsXG4gICAgc2V0TWVzc2FnZSxcbiAgICBzZXRGYWlsZWRcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwdXNoU3RhdHVzSGFuZGxlcihjb25maWcsIGV4aXN0aW5nT2JqZWN0SWQpIHtcblxuICBsZXQgcHVzaFN0YXR1cztcbiAgY29uc3QgZGF0YWJhc2UgPSBjb25maWcuZGF0YWJhc2U7XG4gIGNvbnN0IGhhbmRsZXIgPSByZXN0U3RhdHVzSGFuZGxlcihQVVNIX1NUQVRVU19DT0xMRUNUSU9OLCBjb25maWcpO1xuICBsZXQgb2JqZWN0SWQgPSBleGlzdGluZ09iamVjdElkO1xuICBjb25zdCBzZXRJbml0aWFsID0gZnVuY3Rpb24oYm9keSA9IHt9LCB3aGVyZSwgb3B0aW9ucyA9IHtzb3VyY2U6ICdyZXN0J30pIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBwdXNoVGltZSA9IG5vdy50b0lTT1N0cmluZygpO1xuICAgIGxldCBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgaWYgKGJvZHkuaGFzT3duUHJvcGVydHkoJ3B1c2hfdGltZScpKSB7XG4gICAgICBpZiAoY29uZmlnLmhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0KSB7XG4gICAgICAgIHB1c2hUaW1lID0gYm9keS5wdXNoX3RpbWU7XG4gICAgICAgIHN0YXR1cyA9ICdzY2hlZHVsZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RyeWluZyB0byBzY2hlZHVsZSBhIHB1c2ggd2hpbGUgc2VydmVyIGlzIG5vdCBjb25maWd1cmVkLicpO1xuICAgICAgICBsb2dnZXIud2FybignUHVzaCB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHknKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gIGJvZHkuZGF0YSB8fCB7fTtcbiAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgbGV0IHB1c2hIYXNoO1xuICAgIGlmICh0eXBlb2YgZGF0YS5hbGVydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hIYXNoID0gbWQ1SGFzaChkYXRhLmFsZXJ0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmFsZXJ0ID09PSAnb2JqZWN0Jykge1xuICAgICAgcHVzaEhhc2ggPSBtZDVIYXNoKEpTT04uc3RyaW5naWZ5KGRhdGEuYWxlcnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaEhhc2ggPSAnZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UnO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICBwdXNoVGltZSxcbiAgICAgIHF1ZXJ5OiBKU09OLnN0cmluZ2lmeSh3aGVyZSksXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZXhwaXJ5OiBib2R5LmV4cGlyYXRpb25fdGltZSxcbiAgICAgIGV4cGlyYXRpb25faW50ZXJ2YWw6IGJvZHkuZXhwaXJhdGlvbl9pbnRlcnZhbCxcbiAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgbnVtU2VudDogMCxcbiAgICAgIHB1c2hIYXNoLFxuICAgICAgLy8gbG9ja2Rvd24hXG4gICAgICBBQ0w6IHt9XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZShvYmplY3QpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgb2JqZWN0SWQgPSByZXN1bHQub2JqZWN0SWQ7XG4gICAgICBwdXNoU3RhdHVzID0ge1xuICAgICAgICBvYmplY3RJZFxuICAgICAgfTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHVzaFN0YXR1cyk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzZXRSdW5uaW5nID0gZnVuY3Rpb24oYmF0Y2hlcykge1xuICAgIGxvZ2dlci52ZXJib3NlKGBfUHVzaFN0YXR1cyAke29iamVjdElkfTogc2VuZGluZyBwdXNoIHRvIGluc3RhbGxhdGlvbnMgd2l0aCAlZCBiYXRjaGVzYCwgYmF0Y2hlcyk7XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKFxuICAgICAge1xuICAgICAgICBzdGF0dXM6XCJwZW5kaW5nXCIsXG4gICAgICAgIG9iamVjdElkOiBvYmplY3RJZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgICAgY291bnQ6IGJhdGNoZXNcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgdHJhY2tTZW50ID0gZnVuY3Rpb24ocmVzdWx0cywgVVRDT2Zmc2V0LCBjbGVhbnVwSW5zdGFsbGF0aW9ucyA9IHByb2Nlc3MuZW52LlBBUlNFX1NFUlZFUl9DTEVBTlVQX0lOVkFMSURfSU5TVEFMTEFUSU9OUykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIG51bVNlbnQ6IDAsXG4gICAgICBudW1GYWlsZWQ6IDBcbiAgICB9O1xuICAgIGNvbnN0IGRldmljZXNUb1JlbW92ZSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSB7XG4gICAgICByZXN1bHRzID0gZmxhdHRlbihyZXN1bHRzKTtcbiAgICAgIHJlc3VsdHMucmVkdWNlKChtZW1vLCByZXN1bHQpID0+IHtcbiAgICAgICAgLy8gQ2Fubm90IGhhbmRsZSB0aGF0XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGV2aWNlIHx8ICFyZXN1bHQuZGV2aWNlLmRldmljZVR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlID0gcmVzdWx0LmRldmljZS5kZXZpY2VUeXBlO1xuICAgICAgICBjb25zdCBrZXkgPSByZXN1bHQudHJhbnNtaXR0ZWQgPyBgc2VudFBlclR5cGUuJHtkZXZpY2VUeXBlfWAgOiBgZmFpbGVkUGVyVHlwZS4ke2RldmljZVR5cGV9YDtcbiAgICAgICAgbWVtb1trZXldID0gaW5jcmVtZW50T3AobWVtbywga2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBVVENPZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0S2V5ID0gcmVzdWx0LnRyYW5zbWl0dGVkID8gYHNlbnRQZXJVVENPZmZzZXQuJHtVVENPZmZzZXR9YCA6IGBmYWlsZWRQZXJVVENPZmZzZXQuJHtVVENPZmZzZXR9YDtcbiAgICAgICAgICBtZW1vW29mZnNldEtleV0gPSBpbmNyZW1lbnRPcChtZW1vLCBvZmZzZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQudHJhbnNtaXR0ZWQpIHtcbiAgICAgICAgICBtZW1vLm51bVNlbnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZXNwb25zZSAmJiByZXN1bHQucmVzcG9uc2UuZXJyb3IgJiYgcmVzdWx0LmRldmljZSAmJiByZXN1bHQuZGV2aWNlLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlc3VsdC5kZXZpY2UuZGV2aWNlVG9rZW47XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5yZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgIC8vIEdDTSBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvciA9PT0gJ05vdFJlZ2lzdGVyZWQnIHx8IGVycm9yID09PSAnSW52YWxpZFJlZ2lzdHJhdGlvbicpIHtcbiAgICAgICAgICAgICAgZGV2aWNlc1RvUmVtb3ZlLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVBOUyBlcnJvcnNcbiAgICAgICAgICAgIGlmIChlcnJvciA9PT0gJ1VucmVnaXN0ZXJlZCcgfHwgZXJyb3IgPT09ICdCYWREZXZpY2VUb2tlbicpIHtcbiAgICAgICAgICAgICAgZGV2aWNlc1RvUmVtb3ZlLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZW1vLm51bUZhaWxlZCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSwgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBsb2dnZXIudmVyYm9zZShgX1B1c2hTdGF0dXMgJHtvYmplY3RJZH06IHNlbnQgcHVzaCEgJWQgc3VjY2VzcywgJWQgZmFpbHVyZXNgLCB1cGRhdGUubnVtU2VudCwgdXBkYXRlLm51bUZhaWxlZCk7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYF9QdXNoU3RhdHVzICR7b2JqZWN0SWR9OiBuZWVkcyBjbGVhbnVwYCwgeyBkZXZpY2VzVG9SZW1vdmUgfSk7XG4gICAgWydudW1TZW50JywgJ251bUZhaWxlZCddLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZVtrZXldID4gMCkge1xuICAgICAgICB1cGRhdGVba2V5XSA9IHtcbiAgICAgICAgICBfX29wOiAnSW5jcmVtZW50JyxcbiAgICAgICAgICBhbW91bnQ6IHVwZGF0ZVtrZXldXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZGV2aWNlc1RvUmVtb3ZlLmxlbmd0aCA+IDAgJiYgY2xlYW51cEluc3RhbGxhdGlvbnMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZW1vdmluZyBkZXZpY2UgdG9rZW5zIG9uICR7ZGV2aWNlc1RvUmVtb3ZlLmxlbmd0aH0gX0luc3RhbGxhdGlvbnNgKTtcbiAgICAgIGRhdGFiYXNlLnVwZGF0ZSgnX0luc3RhbGxhdGlvbicsIHsgZGV2aWNlVG9rZW46IHsgJyRpbic6IGRldmljZXNUb1JlbW92ZSB9fSwgeyBkZXZpY2VUb2tlbjoge1wiX19vcFwiOiBcIkRlbGV0ZVwifSB9LCB7XG4gICAgICAgIGFjbDogdW5kZWZpbmVkLFxuICAgICAgICBtYW55OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBpbmRpY2F0ZSB0aGlzIGJhdGNoIGlzIGNvbXBsZXRlXG4gICAgaW5jcmVtZW50T3AodXBkYXRlLCAnY291bnQnLCAtMSk7XG5cbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB1cGRhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgaWYgKHJlcyAmJiByZXMuY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY29uc3QgY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB7XG4gICAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICAgICAgY291bnQ6IHtfX29wOiAnRGVsZXRlJ31cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZhaWwgPSBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVyciA9IHsgbWVzc2FnZTogZXJyIH07XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyLFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJ1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB1cGRhdGUpO1xuICB9XG5cbiAgY29uc3QgcnZhbCA9IHtcbiAgICBzZXRJbml0aWFsLFxuICAgIHNldFJ1bm5pbmcsXG4gICAgdHJhY2tTZW50LFxuICAgIGNvbXBsZXRlLFxuICAgIGZhaWxcbiAgfTtcblxuICAvLyBkZWZpbmUgb2JqZWN0SWQgdG8gYmUgZHluYW1pY1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocnZhbCwgXCJvYmplY3RJZFwiLCB7XG4gICAgZ2V0OiAoKSA9PiBvYmplY3RJZFxuICB9KTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShydmFsKTtcbn1cbiJdfQ==
|
|
328
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvVXRpbHMiLCJyZXF1aXJlIiwiX0tleVByb21pc2VRdWV1ZSIsIl9sb2dnZXIiLCJfcmVzdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfQXV0aCIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIlBVU0hfU1RBVFVTX0NPTExFQ1RJT04iLCJKT0JfU1RBVFVTX0NPTExFQ1RJT04iLCJwdXNoUHJvbWlzZVF1ZXVlIiwiS2V5UHJvbWlzZVF1ZXVlIiwiam9iUHJvbWlzZVF1ZXVlIiwiaW5jcmVtZW50T3AiLCJvYmplY3QiLCJrZXkiLCJhbW91bnQiLCJfX29wIiwiZmxhdHRlbiIsImFycmF5IiwiZmxhdHRlbmVkIiwiaSIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsInB1c2giLCJzdGF0dXNIYW5kbGVyIiwiY2xhc3NOYW1lIiwiZGF0YWJhc2UiLCJjcmVhdGUiLCJ0aGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ3aGVyZSIsImVucXVldWUiLCJvYmplY3RJZCIsIk9iamVjdCIsImZyZWV6ZSIsInJlc3RTdGF0dXNIYW5kbGVyIiwiY29uZmlnIiwiYXV0aCIsIkF1dGgiLCJtYXN0ZXIiLCJyZXN0IiwicmVzcG9uc2UiLCJqb2JTdGF0dXNIYW5kbGVyIiwiam9iU3RhdHVzIiwibmV3T2JqZWN0SWQiLCJvYmplY3RJZFNpemUiLCJoYW5kbGVyIiwic2V0UnVubmluZyIsImpvYk5hbWUiLCJub3ciLCJEYXRlIiwic3RhdHVzIiwic291cmNlIiwiY3JlYXRlZEF0IiwiQUNMIiwic2V0TWVzc2FnZSIsIm1lc3NhZ2UiLCJzZXRTdWNjZWVkZWQiLCJzZXRGaW5hbFN0YXR1cyIsInNldEZhaWxlZCIsInVuZGVmaW5lZCIsImZpbmlzaGVkQXQiLCJFcnJvciIsInB1c2hTdGF0dXNIYW5kbGVyIiwiZXhpc3RpbmdPYmplY3RJZCIsInB1c2hTdGF0dXMiLCJzZXRJbml0aWFsIiwiYm9keSIsIm9wdGlvbnMiLCJwdXNoVGltZSIsInRvSVNPU3RyaW5nIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQiLCJwdXNoX3RpbWUiLCJsb2dnZXIiLCJ3YXJuIiwiZGF0YSIsInBheWxvYWRTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaEhhc2giLCJhbGVydCIsIm1kNUhhc2giLCJxdWVyeSIsInBheWxvYWQiLCJ0aXRsZSIsImV4cGlyeSIsImV4cGlyYXRpb25fdGltZSIsImV4cGlyYXRpb25faW50ZXJ2YWwiLCJudW1TZW50IiwicmVzdWx0IiwiYmF0Y2hlcyIsInZlcmJvc2UiLCJjb3VudCIsInRyYWNrU2VudCIsInJlc3VsdHMiLCJVVENPZmZzZXQiLCJjbGVhbnVwSW5zdGFsbGF0aW9ucyIsInByb2Nlc3MiLCJlbnYiLCJQQVJTRV9TRVJWRVJfQ0xFQU5VUF9JTlZBTElEX0lOU1RBTExBVElPTlMiLCJudW1GYWlsZWQiLCJkZXZpY2VzVG9SZW1vdmUiLCJyZWR1Y2UiLCJtZW1vIiwiZGV2aWNlIiwiZGV2aWNlVHlwZSIsInRyYW5zbWl0dGVkIiwib2Zmc2V0S2V5IiwiZXJyb3IiLCJkZXZpY2VUb2tlbiIsInRva2VuIiwiY29kZSIsImZvckVhY2giLCJpbmZvIiwiJGluIiwiYWNsIiwibWFueSIsInJlcyIsImNvbXBsZXRlIiwiZmFpbCIsImVyciIsImVycm9yTWVzc2FnZSIsInJ2YWwiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9TdGF0dXNIYW5kbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1kNUhhc2gsIG5ld09iamVjdElkIH0gZnJvbSAnLi9jcnlwdG9VdGlscyc7XG5pbXBvcnQgeyBLZXlQcm9taXNlUXVldWUgfSBmcm9tICcuL0tleVByb21pc2VRdWV1ZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuL3Jlc3QnO1xuaW1wb3J0IEF1dGggZnJvbSAnLi9BdXRoJztcblxuY29uc3QgUFVTSF9TVEFUVVNfQ09MTEVDVElPTiA9ICdfUHVzaFN0YXR1cyc7XG5jb25zdCBKT0JfU1RBVFVTX0NPTExFQ1RJT04gPSAnX0pvYlN0YXR1cyc7XG5cbmNvbnN0IHB1c2hQcm9taXNlUXVldWUgPSBuZXcgS2V5UHJvbWlzZVF1ZXVlKCk7XG5jb25zdCBqb2JQcm9taXNlUXVldWUgPSBuZXcgS2V5UHJvbWlzZVF1ZXVlKCk7XG5cbmNvbnN0IGluY3JlbWVudE9wID0gZnVuY3Rpb24gKG9iamVjdCA9IHt9LCBrZXksIGFtb3VudCA9IDEpIHtcbiAgaWYgKCFvYmplY3Rba2V5XSkge1xuICAgIG9iamVjdFtrZXldID0geyBfX29wOiAnSW5jcmVtZW50JywgYW1vdW50OiBhbW91bnQgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XS5hbW91bnQgKz0gYW1vdW50O1xuICB9XG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBmbGF0dGVuZWQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5W2ldKSkge1xuICAgICAgZmxhdHRlbmVkID0gZmxhdHRlbmVkLmNvbmNhdChmbGF0dGVuKGFycmF5W2ldKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYXR0ZW5lZC5wdXNoKGFycmF5W2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhdHVzSGFuZGxlcihjbGFzc05hbWUsIGRhdGFiYXNlKSB7XG4gIGZ1bmN0aW9uIGNyZWF0ZShvYmplY3QpIHtcbiAgICByZXR1cm4gZGF0YWJhc2UuY3JlYXRlKGNsYXNzTmFtZSwgb2JqZWN0KS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob2JqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZSh3aGVyZSwgb2JqZWN0KSB7XG4gICAgcmV0dXJuIGpvYlByb21pc2VRdWV1ZS5lbnF1ZXVlKHdoZXJlLm9iamVjdElkLCAoKSA9PiBkYXRhYmFzZS51cGRhdGUoY2xhc3NOYW1lLCB3aGVyZSwgb2JqZWN0KSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY3JlYXRlLFxuICAgIHVwZGF0ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc3RTdGF0dXNIYW5kbGVyKGNsYXNzTmFtZSwgY29uZmlnKSB7XG4gIGNvbnN0IGF1dGggPSBBdXRoLm1hc3Rlcihjb25maWcpO1xuICBmdW5jdGlvbiBjcmVhdGUob2JqZWN0KSB7XG4gICAgcmV0dXJuIHJlc3QuY3JlYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCBvYmplY3QpLnRoZW4oKHsgcmVzcG9uc2UgfSkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4ub2JqZWN0LCAuLi5yZXNwb25zZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHdoZXJlLCBvYmplY3QpIHtcbiAgICByZXR1cm4gcHVzaFByb21pc2VRdWV1ZS5lbnF1ZXVlKHdoZXJlLm9iamVjdElkLCAoKSA9PlxuICAgICAgcmVzdFxuICAgICAgICAudXBkYXRlKGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCB7IG9iamVjdElkOiB3aGVyZS5vYmplY3RJZCB9LCBvYmplY3QpXG4gICAgICAgIC50aGVuKCh7IHJlc3BvbnNlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmplY3QsIC4uLnJlc3BvbnNlIH07XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBjcmVhdGUsXG4gICAgdXBkYXRlLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvYlN0YXR1c0hhbmRsZXIoY29uZmlnKSB7XG4gIGxldCBqb2JTdGF0dXM7XG4gIGNvbnN0IG9iamVjdElkID0gbmV3T2JqZWN0SWQoY29uZmlnLm9iamVjdElkU2l6ZSk7XG4gIGNvbnN0IGRhdGFiYXNlID0gY29uZmlnLmRhdGFiYXNlO1xuICBjb25zdCBoYW5kbGVyID0gc3RhdHVzSGFuZGxlcihKT0JfU1RBVFVTX0NPTExFQ1RJT04sIGRhdGFiYXNlKTtcbiAgY29uc3Qgc2V0UnVubmluZyA9IGZ1bmN0aW9uIChqb2JOYW1lKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBqb2JTdGF0dXMgPSB7XG4gICAgICBvYmplY3RJZCxcbiAgICAgIGpvYk5hbWUsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIHNvdXJjZTogJ2FwaScsXG4gICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgIC8vIGxvY2tkb3duIVxuICAgICAgQUNMOiB7fSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlKGpvYlN0YXR1cyk7XG4gIH07XG5cbiAgY29uc3Qgc2V0TWVzc2FnZSA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB7IG1lc3NhZ2UgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2V0U3VjY2VlZGVkID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc2V0RmluYWxTdGF0dXMoJ3N1Y2NlZWRlZCcsIG1lc3NhZ2UpO1xuICB9O1xuXG4gIGNvbnN0IHNldEZhaWxlZCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNldEZpbmFsU3RhdHVzKCdmYWlsZWQnLCBtZXNzYWdlKTtcbiAgfTtcblxuICBjb25zdCBzZXRGaW5hbFN0YXR1cyA9IGZ1bmN0aW9uIChzdGF0dXMsIG1lc3NhZ2UgPSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1cGRhdGUgPSB7IHN0YXR1cywgZmluaXNoZWRBdCB9O1xuICAgIGlmIChtZXNzYWdlICYmIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgdXBkYXRlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGVvZiBtZXNzYWdlLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB1cGRhdGUubWVzc2FnZSA9IG1lc3NhZ2UubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKHsgb2JqZWN0SWQgfSwgdXBkYXRlKTtcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc2V0UnVubmluZyxcbiAgICBzZXRTdWNjZWVkZWQsXG4gICAgc2V0TWVzc2FnZSxcbiAgICBzZXRGYWlsZWQsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVzaFN0YXR1c0hhbmRsZXIoY29uZmlnLCBleGlzdGluZ09iamVjdElkKSB7XG4gIGxldCBwdXNoU3RhdHVzO1xuICBjb25zdCBkYXRhYmFzZSA9IGNvbmZpZy5kYXRhYmFzZTtcbiAgY29uc3QgaGFuZGxlciA9IHJlc3RTdGF0dXNIYW5kbGVyKFBVU0hfU1RBVFVTX0NPTExFQ1RJT04sIGNvbmZpZyk7XG4gIGxldCBvYmplY3RJZCA9IGV4aXN0aW5nT2JqZWN0SWQ7XG4gIGNvbnN0IHNldEluaXRpYWwgPSBmdW5jdGlvbiAoYm9keSA9IHt9LCB3aGVyZSwgb3B0aW9ucyA9IHsgc291cmNlOiAncmVzdCcgfSkge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHB1c2hUaW1lID0gbm93LnRvSVNPU3RyaW5nKCk7XG4gICAgbGV0IHN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGJvZHksICdwdXNoX3RpbWUnKSkge1xuICAgICAgaWYgKGNvbmZpZy5oYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCkge1xuICAgICAgICBwdXNoVGltZSA9IGJvZHkucHVzaF90aW1lO1xuICAgICAgICBzdGF0dXMgPSAnc2NoZWR1bGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdUcnlpbmcgdG8gc2NoZWR1bGUgYSBwdXNoIHdoaWxlIHNlcnZlciBpcyBub3QgY29uZmlndXJlZC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1B1c2ggd2lsbCBiZSBzZW50IGltbWVkaWF0ZWx5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGJvZHkuZGF0YSB8fCB7fTtcbiAgICBjb25zdCBwYXlsb2FkU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgbGV0IHB1c2hIYXNoO1xuICAgIGlmICh0eXBlb2YgZGF0YS5hbGVydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hIYXNoID0gbWQ1SGFzaChkYXRhLmFsZXJ0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmFsZXJ0ID09PSAnb2JqZWN0Jykge1xuICAgICAgcHVzaEhhc2ggPSBtZDVIYXNoKEpTT04uc3RyaW5naWZ5KGRhdGEuYWxlcnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaEhhc2ggPSAnZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UnO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICBwdXNoVGltZSxcbiAgICAgIHF1ZXJ5OiBKU09OLnN0cmluZ2lmeSh3aGVyZSksXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkU3RyaW5nLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZXhwaXJ5OiBib2R5LmV4cGlyYXRpb25fdGltZSxcbiAgICAgIGV4cGlyYXRpb25faW50ZXJ2YWw6IGJvZHkuZXhwaXJhdGlvbl9pbnRlcnZhbCxcbiAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgbnVtU2VudDogMCxcbiAgICAgIHB1c2hIYXNoLFxuICAgICAgLy8gbG9ja2Rvd24hXG4gICAgICBBQ0w6IHt9LFxuICAgIH07XG4gICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlKG9iamVjdCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgb2JqZWN0SWQgPSByZXN1bHQub2JqZWN0SWQ7XG4gICAgICBwdXNoU3RhdHVzID0ge1xuICAgICAgICBvYmplY3RJZCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHB1c2hTdGF0dXMpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNldFJ1bm5pbmcgPSBmdW5jdGlvbiAoYmF0Y2hlcykge1xuICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgYF9QdXNoU3RhdHVzICR7b2JqZWN0SWR9OiBzZW5kaW5nIHB1c2ggdG8gaW5zdGFsbGF0aW9ucyB3aXRoICVkIGJhdGNoZXNgLFxuICAgICAgYmF0Y2hlc1xuICAgICk7XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKFxuICAgICAge1xuICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgb2JqZWN0SWQ6IG9iamVjdElkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgIGNvdW50OiBiYXRjaGVzLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgdHJhY2tTZW50ID0gZnVuY3Rpb24gKFxuICAgIHJlc3VsdHMsXG4gICAgVVRDT2Zmc2V0LFxuICAgIGNsZWFudXBJbnN0YWxsYXRpb25zID0gcHJvY2Vzcy5lbnYuUEFSU0VfU0VSVkVSX0NMRUFOVVBfSU5WQUxJRF9JTlNUQUxMQVRJT05TXG4gICkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIG51bVNlbnQ6IDAsXG4gICAgICBudW1GYWlsZWQ6IDAsXG4gICAgfTtcbiAgICBjb25zdCBkZXZpY2VzVG9SZW1vdmUgPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkge1xuICAgICAgcmVzdWx0cyA9IGZsYXR0ZW4ocmVzdWx0cyk7XG4gICAgICByZXN1bHRzLnJlZHVjZSgobWVtbywgcmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIENhbm5vdCBoYW5kbGUgdGhhdFxuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRldmljZSB8fCAhcmVzdWx0LmRldmljZS5kZXZpY2VUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHJlc3VsdC5kZXZpY2UuZGV2aWNlVHlwZTtcbiAgICAgICAgY29uc3Qga2V5ID0gcmVzdWx0LnRyYW5zbWl0dGVkXG4gICAgICAgICAgPyBgc2VudFBlclR5cGUuJHtkZXZpY2VUeXBlfWBcbiAgICAgICAgICA6IGBmYWlsZWRQZXJUeXBlLiR7ZGV2aWNlVHlwZX1gO1xuICAgICAgICBtZW1vW2tleV0gPSBpbmNyZW1lbnRPcChtZW1vLCBrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIFVUQ09mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRLZXkgPSByZXN1bHQudHJhbnNtaXR0ZWRcbiAgICAgICAgICAgID8gYHNlbnRQZXJVVENPZmZzZXQuJHtVVENPZmZzZXR9YFxuICAgICAgICAgICAgOiBgZmFpbGVkUGVyVVRDT2Zmc2V0LiR7VVRDT2Zmc2V0fWA7XG4gICAgICAgICAgbWVtb1tvZmZzZXRLZXldID0gaW5jcmVtZW50T3AobWVtbywgb2Zmc2V0S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnRyYW5zbWl0dGVkKSB7XG4gICAgICAgICAgbWVtby5udW1TZW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgICAgICByZXN1bHQucmVzcG9uc2UgJiZcbiAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZS5lcnJvciAmJlxuICAgICAgICAgICAgcmVzdWx0LmRldmljZSAmJlxuICAgICAgICAgICAgcmVzdWx0LmRldmljZS5kZXZpY2VUb2tlblxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSByZXN1bHQuZGV2aWNlLmRldmljZVRva2VuO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQucmVzcG9uc2UuZXJyb3I7XG4gICAgICAgICAgICAvLyBHQ00gLyBGQ00gSFRUUCB2MSBBUEkgZXJyb3JzOyBzZWU6XG4gICAgICAgICAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9yZWZlcmVuY2UvZmNtL3Jlc3QvdjEvRXJyb3JDb2RlXG4gICAgICAgICAgICBpZiAoZXJyb3IgPT09ICdOb3RSZWdpc3RlcmVkJyB8fCBlcnJvciA9PT0gJ0ludmFsaWRSZWdpc3RyYXRpb24nKSB7XG4gICAgICAgICAgICAgIGRldmljZXNUb1JlbW92ZS5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZDTSBBUEkgdjIgZXJyb3JzOyBzZWU6XG4gICAgICAgICAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9jbG91ZC1tZXNzYWdpbmcvbWFuYWdlLXRva2Vuc1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2Z1bmN0aW9ucy1zYW1wbGVzL2Jsb2IvNzAzYzAzNTllYWNmMDdhNTUxNzUxZDEzMTlkMzRmOTEyYTJjZDgyOC9Ob2RlL2ZjbS1ub3RpZmljYXRpb25zL2Z1bmN0aW9ucy9pbmRleC5qcyNMODktTDkzQzE2XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGVycm9yPy5jb2RlID09PSAnbWVzc2FnaW5nL3JlZ2lzdHJhdGlvbi10b2tlbi1ub3QtcmVnaXN0ZXJlZCcgfHxcbiAgICAgICAgICAgICAgZXJyb3I/LmNvZGUgPT09ICdtZXNzYWdpbmcvaW52YWxpZC1yZWdpc3RyYXRpb24tdG9rZW4nIHx8XG4gICAgICAgICAgICAgIChlcnJvcj8uY29kZSA9PT0gJ21lc3NhZ2luZy9pbnZhbGlkLWFyZ3VtZW50JyAmJiBlcnJvcj8ubWVzc2FnZSA9PT0gJ1RoZSByZWdpc3RyYXRpb24gdG9rZW4gaXMgbm90IGEgdmFsaWQgRkNNIHJlZ2lzdHJhdGlvbiB0b2tlbicpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZGV2aWNlc1RvUmVtb3ZlLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVBOUyBlcnJvcnM7IHNlZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3VzZXJub3RpZmljYXRpb25zL2hhbmRsaW5nLW5vdGlmaWNhdGlvbi1yZXNwb25zZXMtZnJvbS1hcG5zXG4gICAgICAgICAgICBpZiAoZXJyb3IgPT09ICdVbnJlZ2lzdGVyZWQnIHx8IGVycm9yID09PSAnQmFkRGV2aWNlVG9rZW4nKSB7XG4gICAgICAgICAgICAgIGRldmljZXNUb1JlbW92ZS5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWVtby5udW1GYWlsZWQrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgIH0sIHVwZGF0ZSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICBgX1B1c2hTdGF0dXMgJHtvYmplY3RJZH06IHNlbnQgcHVzaCEgJWQgc3VjY2VzcywgJWQgZmFpbHVyZXNgLFxuICAgICAgdXBkYXRlLm51bVNlbnQsXG4gICAgICB1cGRhdGUubnVtRmFpbGVkXG4gICAgKTtcbiAgICBsb2dnZXIudmVyYm9zZShgX1B1c2hTdGF0dXMgJHtvYmplY3RJZH06IG5lZWRzIGNsZWFudXBgLCB7XG4gICAgICBkZXZpY2VzVG9SZW1vdmUsXG4gICAgfSk7XG4gICAgWydudW1TZW50JywgJ251bUZhaWxlZCddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh1cGRhdGVba2V5XSA+IDApIHtcbiAgICAgICAgdXBkYXRlW2tleV0gPSB7XG4gICAgICAgICAgX19vcDogJ0luY3JlbWVudCcsXG4gICAgICAgICAgYW1vdW50OiB1cGRhdGVba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChkZXZpY2VzVG9SZW1vdmUubGVuZ3RoID4gMCAmJiBjbGVhbnVwSW5zdGFsbGF0aW9ucykge1xuICAgICAgbG9nZ2VyLmluZm8oYFJlbW92aW5nIGRldmljZSB0b2tlbnMgb24gJHtkZXZpY2VzVG9SZW1vdmUubGVuZ3RofSBfSW5zdGFsbGF0aW9uc2ApO1xuICAgICAgZGF0YWJhc2UudXBkYXRlKFxuICAgICAgICAnX0luc3RhbGxhdGlvbicsXG4gICAgICAgIHsgZGV2aWNlVG9rZW46IHsgJGluOiBkZXZpY2VzVG9SZW1vdmUgfSB9LFxuICAgICAgICB7IGRldmljZVRva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0gfSxcbiAgICAgICAge1xuICAgICAgICAgIGFjbDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1hbnk6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGluY3JlbWVudE9wKHVwZGF0ZSwgJ2NvdW50JywgLTEpO1xuICAgIHVwZGF0ZS5zdGF0dXMgPSAncnVubmluZyc7XG5cbiAgICByZXR1cm4gaGFuZGxlci51cGRhdGUoeyBvYmplY3RJZCB9LCB1cGRhdGUpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLmNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIudXBkYXRlKFxuICAgICAgeyBvYmplY3RJZCB9LFxuICAgICAge1xuICAgICAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICAgICAgICBjb3VudDogeyBfX29wOiAnRGVsZXRlJyB9LFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgZmFpbCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVyciA9IHsgbWVzc2FnZTogZXJyIH07XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyLFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICB9O1xuICAgIHJldHVybiBoYW5kbGVyLnVwZGF0ZSh7IG9iamVjdElkIH0sIHVwZGF0ZSk7XG4gIH07XG5cbiAgY29uc3QgcnZhbCA9IHtcbiAgICBzZXRJbml0aWFsLFxuICAgIHNldFJ1bm5pbmcsXG4gICAgdHJhY2tTZW50LFxuICAgIGNvbXBsZXRlLFxuICAgIGZhaWwsXG4gIH07XG5cbiAgLy8gZGVmaW5lIG9iamVjdElkIHRvIGJlIGR5bmFtaWNcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJ2YWwsICdvYmplY3RJZCcsIHtcbiAgICBnZXQ6ICgpID0+IG9iamVjdElkLFxuICB9KTtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShydmFsKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssS0FBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQTBCLFNBQUFJLHVCQUFBRSxD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
|
package/lib/TestUtils.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.Connections = void 0;
|
|
6
7
|
exports.destroyAllDataPermanently = destroyAllDataPermanently;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(
|
|
13
|
-
|
|
8
|
+
exports.getConnectionsCount = getConnectionsCount;
|
|
9
|
+
exports.resolvingPromise = resolvingPromise;
|
|
10
|
+
exports.sleep = sleep;
|
|
11
|
+
var _cache = _interopRequireDefault(require("./cache"));
|
|
12
|
+
var _SchemaCache = _interopRequireDefault(require("./Adapters/Cache/SchemaCache"));
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
14
|
/**
|
|
15
15
|
* Destroys all data in the database
|
|
16
16
|
* @param {boolean} fast set to true if it's ok to just drop objects and not indexes.
|
|
@@ -19,13 +19,69 @@ function destroyAllDataPermanently(fast) {
|
|
|
19
19
|
if (!process.env.TESTING) {
|
|
20
20
|
throw 'Only supported in test environment';
|
|
21
21
|
}
|
|
22
|
-
return Promise.all(Object.keys(
|
|
23
|
-
const app =
|
|
22
|
+
return Promise.all(Object.keys(_cache.default.cache).map(appId => {
|
|
23
|
+
const app = _cache.default.get(appId);
|
|
24
|
+
const deletePromises = [];
|
|
25
|
+
if (app.cacheAdapter && app.cacheAdapter.clear) {
|
|
26
|
+
deletePromises.push(app.cacheAdapter.clear());
|
|
27
|
+
}
|
|
24
28
|
if (app.databaseController) {
|
|
25
|
-
|
|
26
|
-
} else {
|
|
27
|
-
|
|
29
|
+
deletePromises.push(app.databaseController.deleteEverything(fast));
|
|
30
|
+
} else if (app.databaseAdapter) {
|
|
31
|
+
_SchemaCache.default.clear();
|
|
32
|
+
deletePromises.push(app.databaseAdapter.deleteAllClasses(fast));
|
|
28
33
|
}
|
|
34
|
+
return Promise.all(deletePromises);
|
|
29
35
|
}));
|
|
30
36
|
}
|
|
31
|
-
|
|
37
|
+
function resolvingPromise() {
|
|
38
|
+
let res;
|
|
39
|
+
let rej;
|
|
40
|
+
const promise = new Promise((resolve, reject) => {
|
|
41
|
+
res = resolve;
|
|
42
|
+
rej = reject;
|
|
43
|
+
});
|
|
44
|
+
promise.resolve = res;
|
|
45
|
+
promise.reject = rej;
|
|
46
|
+
return promise;
|
|
47
|
+
}
|
|
48
|
+
function sleep(ms) {
|
|
49
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
50
|
+
}
|
|
51
|
+
function getConnectionsCount(server) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
server.getConnections((err, count) => {
|
|
54
|
+
/* istanbul ignore next */
|
|
55
|
+
if (err) {
|
|
56
|
+
reject(err);
|
|
57
|
+
} else {
|
|
58
|
+
resolve(count);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
;
|
|
64
|
+
class Connections {
|
|
65
|
+
constructor() {
|
|
66
|
+
this.sockets = new Set();
|
|
67
|
+
}
|
|
68
|
+
track(server) {
|
|
69
|
+
server.on('connection', socket => {
|
|
70
|
+
this.sockets.add(socket);
|
|
71
|
+
socket.on('close', () => {
|
|
72
|
+
this.sockets.delete(socket);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
destroyAll() {
|
|
77
|
+
for (const socket of this.sockets.values()) {
|
|
78
|
+
socket.destroy();
|
|
79
|
+
}
|
|
80
|
+
this.sockets.clear();
|
|
81
|
+
}
|
|
82
|
+
count() {
|
|
83
|
+
return this.sockets.size;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.Connections = Connections;
|
|
87
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2FjaGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9TY2hlbWFDYWNoZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlc3Ryb3lBbGxEYXRhUGVybWFuZW50bHkiLCJmYXN0IiwicHJvY2VzcyIsImVudiIsIlRFU1RJTkciLCJQcm9taXNlIiwiYWxsIiwiT2JqZWN0Iiwia2V5cyIsIkFwcENhY2hlIiwiY2FjaGUiLCJtYXAiLCJhcHBJZCIsImFwcCIsImdldCIsImRlbGV0ZVByb21pc2VzIiwiY2FjaGVBZGFwdGVyIiwiY2xlYXIiLCJwdXNoIiwiZGF0YWJhc2VDb250cm9sbGVyIiwiZGVsZXRlRXZlcnl0aGluZyIsImRhdGFiYXNlQWRhcHRlciIsIlNjaGVtYUNhY2hlIiwiZGVsZXRlQWxsQ2xhc3NlcyIsInJlc29sdmluZ1Byb21pc2UiLCJyZXMiLCJyZWoiLCJwcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNsZWVwIiwibXMiLCJzZXRUaW1lb3V0IiwiZ2V0Q29ubmVjdGlvbnNDb3VudCIsInNlcnZlciIsImdldENvbm5lY3Rpb25zIiwiZXJyIiwiY291bnQiLCJDb25uZWN0aW9ucyIsImNvbnN0cnVjdG9yIiwic29ja2V0cyIsIlNldCIsInRyYWNrIiwib24iLCJzb2NrZXQiLCJhZGQiLCJkZWxldGUiLCJkZXN0cm95QWxsIiwidmFsdWVzIiwiZGVzdHJveSIsInNpemUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL1Rlc3RVdGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXBwQ2FjaGUgZnJvbSAnLi9jYWNoZSc7XG5pbXBvcnQgU2NoZW1hQ2FjaGUgZnJvbSAnLi9BZGFwdGVycy9DYWNoZS9TY2hlbWFDYWNoZSc7XG5cbi8qKlxuICogRGVzdHJveXMgYWxsIGRhdGEgaW4gdGhlIGRhdGFiYXNlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZhc3Qgc2V0IHRvIHRydWUgaWYgaXQncyBvayB0byBqdXN0IGRyb3Agb2JqZWN0cyBhbmQgbm90IGluZGV4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95QWxsRGF0YVBlcm1hbmVudGx5KGZhc3QpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgdGhyb3cgJ09ubHkgc3VwcG9ydGVkIGluIHRlc3QgZW52aXJvbm1lbnQnO1xuICB9XG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICBPYmplY3Qua2V5cyhBcHBDYWNoZS5jYWNoZSkubWFwKGFwcElkID0+IHtcbiAgICAgIGNvbnN0IGFwcCA9IEFwcENhY2hlLmdldChhcHBJZCk7XG4gICAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IFtdO1xuICAgICAgaWYgKGFwcC5jYWNoZUFkYXB0ZXIgJiYgYXBwLmNhY2hlQWRhcHRlci5jbGVhcikge1xuICAgICAgICBkZWxldGVQcm9taXNlcy5wdXNoKGFwcC5jYWNoZUFkYXB0ZXIuY2xlYXIoKSk7XG4gICAgICB9XG4gICAgICBpZiAoYXBwLmRhdGFiYXNlQ29udHJvbGxlcikge1xuICAgICAgICBkZWxldGVQcm9taXNlcy5wdXNoKGFwcC5kYXRhYmFzZUNvbnRyb2xsZXIuZGVsZXRlRXZlcnl0aGluZyhmYXN0KSk7XG4gICAgICB9IGVsc2UgaWYgKGFwcC5kYXRhYmFzZUFkYXB0ZXIpIHtcbiAgICAgICAgU2NoZW1hQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChhcHAuZGF0YWJhc2VBZGFwdGVyLmRlbGV0ZUFsbENsYXNzZXMoZmFzdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGRlbGV0ZVByb21pc2VzKTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2aW5nUHJvbWlzZSgpIHtcbiAgbGV0IHJlcztcbiAgbGV0IHJlajtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlO1xuICAgIHJlaiA9IHJlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlcztcbiAgcHJvbWlzZS5yZWplY3QgPSByZWo7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25uZWN0aW9uc0NvdW50KHNlcnZlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5nZXRDb25uZWN0aW9ucygoZXJyLCBjb3VudCkgPT4ge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGNvdW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbnMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNvY2tldHMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cmFjayhzZXJ2ZXIpIHtcbiAgICBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCBzb2NrZXQgPT4ge1xuICAgICAgdGhpcy5zb2NrZXRzLmFkZChzb2NrZXQpO1xuICAgICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXRzLmRlbGV0ZShzb2NrZXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkZXN0cm95QWxsKCkge1xuICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIHRoaXMuc29ja2V0cy52YWx1ZXMoKSkge1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXRzLmNsZWFyKCk7XG4gIH1c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
|