@beiguancyc/parse-server 9.9.0-ruixiang.1

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