@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.
- package/LICENSE +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -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 +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -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 +71 -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 +280 -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/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- 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 +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- 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 +320 -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/views/choose_password +215 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ParseServerRESTController = ParseServerRESTController;
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _RESTController = _interopRequireDefault(require("parse/lib/node/RESTController"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
const Config = require('./Config');
|
|
11
|
+
const Auth = require('./Auth');
|
|
12
|
+
const Parse = require('parse/node');
|
|
13
|
+
function getSessionToken(options) {
|
|
14
|
+
if (options && typeof options.sessionToken === 'string') {
|
|
15
|
+
return Promise.resolve(options.sessionToken);
|
|
16
|
+
}
|
|
17
|
+
return Promise.resolve(null);
|
|
18
|
+
}
|
|
19
|
+
function getAuth(options = {}, config) {
|
|
20
|
+
const installationId = options.installationId || 'cloud';
|
|
21
|
+
if (options.useMasterKey) {
|
|
22
|
+
return Promise.resolve(new Auth.Auth({
|
|
23
|
+
config,
|
|
24
|
+
isMaster: true,
|
|
25
|
+
installationId
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
return getSessionToken(options).then(sessionToken => {
|
|
29
|
+
if (sessionToken) {
|
|
30
|
+
options.sessionToken = sessionToken;
|
|
31
|
+
return Auth.getAuthForSessionToken({
|
|
32
|
+
config,
|
|
33
|
+
sessionToken: sessionToken,
|
|
34
|
+
installationId
|
|
35
|
+
});
|
|
36
|
+
} else {
|
|
37
|
+
return Promise.resolve(new Auth.Auth({
|
|
38
|
+
config,
|
|
39
|
+
installationId
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function ParseServerRESTController(applicationId, router) {
|
|
45
|
+
function handleRequest(method, path, data = {}, options = {}, config) {
|
|
46
|
+
// Store the arguments, for later use if internal fails
|
|
47
|
+
const args = arguments;
|
|
48
|
+
if (!config) {
|
|
49
|
+
config = Config.get(applicationId);
|
|
50
|
+
}
|
|
51
|
+
const serverURL = new URL(config.serverURL);
|
|
52
|
+
if (path.indexOf(serverURL.pathname) === 0) {
|
|
53
|
+
path = path.slice(serverURL.pathname.length, path.length);
|
|
54
|
+
}
|
|
55
|
+
if (path[0] !== '/') {
|
|
56
|
+
path = '/' + path;
|
|
57
|
+
}
|
|
58
|
+
if (path === '/batch') {
|
|
59
|
+
const batch = transactionRetries => {
|
|
60
|
+
let initialPromise = Promise.resolve();
|
|
61
|
+
if (data.transaction === true) {
|
|
62
|
+
initialPromise = config.database.createTransactionalSession();
|
|
63
|
+
}
|
|
64
|
+
return initialPromise.then(() => {
|
|
65
|
+
const promises = data.requests.map(request => {
|
|
66
|
+
return handleRequest(request.method, request.path, request.body, options, config).then(response => {
|
|
67
|
+
if (options.returnStatus) {
|
|
68
|
+
const status = response._status;
|
|
69
|
+
const headers = response._headers;
|
|
70
|
+
delete response._status;
|
|
71
|
+
delete response._headers;
|
|
72
|
+
return {
|
|
73
|
+
success: response,
|
|
74
|
+
_status: status,
|
|
75
|
+
_headers: headers
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
success: response
|
|
80
|
+
};
|
|
81
|
+
}, error => {
|
|
82
|
+
return {
|
|
83
|
+
error: {
|
|
84
|
+
code: error.code,
|
|
85
|
+
error: error.message
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
return Promise.all(promises).then(result => {
|
|
91
|
+
if (data.transaction === true) {
|
|
92
|
+
if (result.find(resultItem => typeof resultItem.error === 'object')) {
|
|
93
|
+
return config.database.abortTransactionalSession().then(() => {
|
|
94
|
+
return Promise.reject(result);
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
return config.database.commitTransactionalSession().then(() => {
|
|
98
|
+
return result;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
}).catch(error => {
|
|
105
|
+
if (error && error.find(errorItem => typeof errorItem.error === 'object' && errorItem.error.code === 251) && transactionRetries > 0) {
|
|
106
|
+
return batch(transactionRetries - 1);
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
return batch(5);
|
|
113
|
+
}
|
|
114
|
+
let query;
|
|
115
|
+
if (method === 'GET') {
|
|
116
|
+
query = data;
|
|
117
|
+
}
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
let requestContext;
|
|
120
|
+
try {
|
|
121
|
+
requestContext = structuredClone(options.context || {});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
reject(new Parse.Error(Parse.Error.INVALID_VALUE, `Context contains non-cloneable values: ${error.message}`));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
getAuth(options, config).then(auth => {
|
|
127
|
+
const request = {
|
|
128
|
+
body: data,
|
|
129
|
+
config,
|
|
130
|
+
auth,
|
|
131
|
+
info: {
|
|
132
|
+
applicationId: applicationId,
|
|
133
|
+
sessionToken: options.sessionToken,
|
|
134
|
+
installationId: options.installationId,
|
|
135
|
+
context: requestContext
|
|
136
|
+
},
|
|
137
|
+
query
|
|
138
|
+
};
|
|
139
|
+
return Promise.resolve().then(() => {
|
|
140
|
+
return router.tryRouteRequest(method, path, request);
|
|
141
|
+
}).then(resp => {
|
|
142
|
+
const {
|
|
143
|
+
response,
|
|
144
|
+
status,
|
|
145
|
+
headers = {}
|
|
146
|
+
} = resp;
|
|
147
|
+
if (options.returnStatus) {
|
|
148
|
+
resolve({
|
|
149
|
+
...response,
|
|
150
|
+
_status: status,
|
|
151
|
+
_headers: headers
|
|
152
|
+
});
|
|
153
|
+
} else {
|
|
154
|
+
resolve(response);
|
|
155
|
+
}
|
|
156
|
+
}, err => {
|
|
157
|
+
if (err instanceof Parse.Error && err.code == Parse.Error.INVALID_JSON && err.message == `cannot route ${method} ${path}`) {
|
|
158
|
+
_RESTController.default.request.apply(null, args).then(resolve, reject);
|
|
159
|
+
} else {
|
|
160
|
+
reject(err);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}, reject);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
request: handleRequest,
|
|
168
|
+
ajax: _RESTController.default.ajax,
|
|
169
|
+
handleError: _RESTController.default.handleError
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
var _default = exports.default = ParseServerRESTController;
|
|
173
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUkVTVENvbnRyb2xsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkNvbmZpZyIsIkF1dGgiLCJQYXJzZSIsImdldFNlc3Npb25Ub2tlbiIsIm9wdGlvbnMiLCJzZXNzaW9uVG9rZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsImdldEF1dGgiLCJjb25maWciLCJpbnN0YWxsYXRpb25JZCIsInVzZU1hc3RlcktleSIsImlzTWFzdGVyIiwidGhlbiIsImdldEF1dGhGb3JTZXNzaW9uVG9rZW4iLCJQYXJzZVNlcnZlclJFU1RDb250cm9sbGVyIiwiYXBwbGljYXRpb25JZCIsInJvdXRlciIsImhhbmRsZVJlcXVlc3QiLCJtZXRob2QiLCJwYXRoIiwiZGF0YSIsImFyZ3MiLCJhcmd1bWVudHMiLCJnZXQiLCJzZXJ2ZXJVUkwiLCJVUkwiLCJpbmRleE9mIiwicGF0aG5hbWUiLCJzbGljZSIsImxlbmd0aCIsImJhdGNoIiwidHJhbnNhY3Rpb25SZXRyaWVzIiwiaW5pdGlhbFByb21pc2UiLCJ0cmFuc2FjdGlvbiIsImRhdGFiYXNlIiwiY3JlYXRlVHJhbnNhY3Rpb25hbFNlc3Npb24iLCJwcm9taXNlcyIsInJlcXVlc3RzIiwibWFwIiwicmVxdWVzdCIsImJvZHkiLCJyZXNwb25zZSIsInJldHVyblN0YXR1cyIsInN0YXR1cyIsIl9zdGF0dXMiLCJoZWFkZXJzIiwiX2hlYWRlcnMiLCJzdWNjZXNzIiwiZXJyb3IiLCJjb2RlIiwibWVzc2FnZSIsImFsbCIsInJlc3VsdCIsImZpbmQiLCJyZXN1bHRJdGVtIiwiYWJvcnRUcmFuc2FjdGlvbmFsU2Vzc2lvbiIsInJlamVjdCIsImNvbW1pdFRyYW5zYWN0aW9uYWxTZXNzaW9uIiwiY2F0Y2giLCJlcnJvckl0ZW0iLCJxdWVyeSIsInJlcXVlc3RDb250ZXh0Iiwic3RydWN0dXJlZENsb25lIiwiY29udGV4dCIsIkVycm9yIiwiSU5WQUxJRF9WQUxVRSIsImF1dGgiLCJpbmZvIiwidHJ5Um91dGVSZXF1ZXN0IiwicmVzcCIsImVyciIsIklOVkFMSURfSlNPTiIsIlJFU1RDb250cm9sbGVyIiwiYXBwbHkiLCJhamF4IiwiaGFuZGxlRXJyb3IiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvUGFyc2VTZXJ2ZXJSRVNUQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDb25maWcgPSByZXF1aXJlKCcuL0NvbmZpZycpO1xuY29uc3QgQXV0aCA9IHJlcXVpcmUoJy4vQXV0aCcpO1xuaW1wb3J0IFJFU1RDb250cm9sbGVyIGZyb20gJ3BhcnNlL2xpYi9ub2RlL1JFU1RDb250cm9sbGVyJztcbmNvbnN0IFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuXG5mdW5jdGlvbiBnZXRTZXNzaW9uVG9rZW4ob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5zZXNzaW9uVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShvcHRpb25zLnNlc3Npb25Ub2tlbik7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXV0aChvcHRpb25zID0ge30sIGNvbmZpZykge1xuICBjb25zdCBpbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgfHwgJ2Nsb3VkJztcbiAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQXV0aC5BdXRoKHsgY29uZmlnLCBpc01hc3RlcjogdHJ1ZSwgaW5zdGFsbGF0aW9uSWQgfSkpO1xuICB9XG4gIHJldHVybiBnZXRTZXNzaW9uVG9rZW4ob3B0aW9ucykudGhlbihzZXNzaW9uVG9rZW4gPT4ge1xuICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcbiAgICAgIG9wdGlvbnMuc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgICAgcmV0dXJuIEF1dGguZ2V0QXV0aEZvclNlc3Npb25Ub2tlbih7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBzZXNzaW9uVG9rZW4sXG4gICAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEF1dGguQXV0aCh7IGNvbmZpZywgaW5zdGFsbGF0aW9uSWQgfSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFBhcnNlU2VydmVyUkVTVENvbnRyb2xsZXIoYXBwbGljYXRpb25JZCwgcm91dGVyKSB7XG4gIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QobWV0aG9kLCBwYXRoLCBkYXRhID0ge30sIG9wdGlvbnMgPSB7fSwgY29uZmlnKSB7XG4gICAgLy8gU3RvcmUgdGhlIGFyZ3VtZW50cywgZm9yIGxhdGVyIHVzZSBpZiBpbnRlcm5hbCBmYWlsc1xuICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgY29uZmlnID0gQ29uZmlnLmdldChhcHBsaWNhdGlvbklkKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmVyVVJMID0gbmV3IFVSTChjb25maWcuc2VydmVyVVJMKTtcbiAgICBpZiAocGF0aC5pbmRleE9mKHNlcnZlclVSTC5wYXRobmFtZSkgPT09IDApIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKHNlcnZlclVSTC5wYXRobmFtZS5sZW5ndGgsIHBhdGgubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aFswXSAhPT0gJy8nKSB7XG4gICAgICBwYXRoID0gJy8nICsgcGF0aDtcbiAgICB9XG5cbiAgICBpZiAocGF0aCA9PT0gJy9iYXRjaCcpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gdHJhbnNhY3Rpb25SZXRyaWVzID0+IHtcbiAgICAgICAgbGV0IGluaXRpYWxQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIGlmIChkYXRhLnRyYW5zYWN0aW9uID09PSB0cnVlKSB7XG4gICAgICAgICAgaW5pdGlhbFByb21pc2UgPSBjb25maWcuZGF0YWJhc2UuY3JlYXRlVHJhbnNhY3Rpb25hbFNlc3Npb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5pdGlhbFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBkYXRhLnJlcXVlc3RzLm1hcChyZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KHJlcXVlc3QubWV0aG9kLCByZXF1ZXN0LnBhdGgsIHJlcXVlc3QuYm9keSwgb3B0aW9ucywgY29uZmlnKS50aGVuKFxuICAgICAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuU3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5fc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlLl9oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLl9zdGF0dXM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX2hlYWRlcnM7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiByZXNwb25zZSwgX3N0YXR1czogc3RhdHVzLCBfaGVhZGVyczogaGVhZGVycyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiByZXNwb25zZSB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiB7IGNvZGU6IGVycm9yLmNvZGUsIGVycm9yOiBlcnJvci5tZXNzYWdlIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YS50cmFuc2FjdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZmluZChyZXN1bHRJdGVtID0+IHR5cGVvZiByZXN1bHRJdGVtLmVycm9yID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuZGF0YWJhc2UuYWJvcnRUcmFuc2FjdGlvbmFsU2Vzc2lvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLmRhdGFiYXNlLmNvbW1pdFRyYW5zYWN0aW9uYWxTZXNzaW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnJvciAmJlxuICAgICAgICAgICAgICAgIGVycm9yLmZpbmQoXG4gICAgICAgICAgICAgICAgICBlcnJvckl0ZW0gPT4gdHlwZW9mIGVycm9ySXRlbS5lcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3JJdGVtLmVycm9yLmNvZGUgPT09IDI1MVxuICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblJldHJpZXMgPiAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXRjaCh0cmFuc2FjdGlvblJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gYmF0Y2goNSk7XG4gICAgfVxuXG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChtZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICBxdWVyeSA9IGRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCByZXF1ZXN0Q29udGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3RDb250ZXh0ID0gc3RydWN0dXJlZENsb25lKG9wdGlvbnMuY29udGV4dCB8fCB7fSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9WQUxVRSxcbiAgICAgICAgICAgIGBDb250ZXh0IGNvbnRhaW5zIG5vbi1jbG9uZWFibGUgdmFsdWVzOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ2V0QXV0aChvcHRpb25zLCBjb25maWcpLnRoZW4oYXV0aCA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBpbmZvOiB7XG4gICAgICAgICAgICBhcHBsaWNhdGlvbklkOiBhcHBsaWNhdGlvbklkLFxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBvcHRpb25zLnNlc3Npb25Ub2tlbixcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBvcHRpb25zLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgICAgY29udGV4dDogcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJvdXRlci50cnlSb3V0ZVJlcXVlc3QobWV0aG9kLCBwYXRoLCByZXF1ZXN0KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0YXR1cywgaGVhZGVycyA9IHt9IH0gPSByZXNwO1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5TdGF0dXMpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgLi4ucmVzcG9uc2UsIF9zdGF0dXM6IHN0YXR1cywgX2hlYWRlcnM6IGhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgUGFyc2UuRXJyb3IgJiZcbiAgICAgICAgICAgICAgICBlcnIuY29kZSA9PSBQYXJzZS5FcnJvci5JTlZBTElEX0pTT04gJiZcbiAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9PSBgY2Fubm90IHJvdXRlICR7bWV0aG9kfSAke3BhdGh9YFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBSRVNUQ29udHJvbGxlci5yZXF1ZXN0LmFwcGx5KG51bGwsIGFyZ3MpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICB9LCByZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0OiBoYW5kbGVSZXF1ZXN0LFxuICAgIGFqYXg6IFJFU1RDb250cm9sbGVyLmFqYXgsXG4gICAgaGFuZGxlRXJyb3I6IFJFU1RDb250cm9sbGVyLmhhbmRsZUVycm9yLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzZVNlcnZlclJFU1RDb250cm9sbGVyO1xuZXhwb3J0IHsgUGFyc2VTZXJ2ZXJSRVNUQ29udHJvbGxlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQTJELFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRjNELE1BQU1HLE1BQU0sR0FBR0osT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNsQyxNQUFNSyxJQUFJLEdBQUdMLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFFOUIsTUFBTU0sS0FBSyxHQUFHTixPQUFPLENBQUMsWUFBWSxDQUFDO0FBRW5DLFNBQVNPLGVBQWVBLENBQUNDLE9BQU8sRUFBRTtFQUNoQyxJQUFJQSxPQUFPLElBQUksT0FBT0EsT0FBTyxDQUFDQyxZQUFZLEtBQUssUUFBUSxFQUFFO0lBQ3ZELE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDSCxPQUFPLENBQUNDLFlBQVksQ0FBQztFQUM5QztFQUNBLE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxDQUFD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QUVELE9BQU8sQ0FBQ0MsWUFBWTtZQUNsQ0ssY0FBYyxFQUFFTixPQUFPLENBQUNNLGNBQWM7WUFDdENzRCxPQUFPLEVBQUVGO1VBQ1gsQ0FBQztVQUNERDtRQUNGLENBQUM7UUFDRCxPQUFPdkQsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUNyQk0sSUFBSSxDQUFDLE1BQU07VUFDVixPQUFPSSxNQUFNLENBQUNvRCxlQUFlLENBQUNsRCxNQUFNLEVBQUVDLElBQUksRUFBRW9CLE9BQU8sQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FDRDNCLElBQUksQ0FDSHlELElBQUksSUFBSTtVQUNOLE1BQU07WUFBRTVCLFFBQVE7WUFBRUUsTUFBTTtZQUFFRSxPQUFPLEdBQUcsQ0FBQztVQUFFLENBQUMsR0FBR3dCLElBQUk7VUFDL0MsSUFBSWxFLE9BQU8sQ0FBQ3VDLFlBQVksRUFBRTtZQUN4QnBDLE9BQU8sQ0FBQztjQUFFLEdBQUdtQyxRQUFRO2NBQUVHLE9BQU8sRUFBRUQsTUFBTTtjQUFFRyxRQUFRLEVBQUVEO1lBQVEsQ0FBQyxDQUFDO1VBQzlELENBQUMsTUFBTTtZQUNMdkMsT0FBTyxDQUFDbUMsUUFBUSxDQUFDO1VBQ25CO1FBQ0YsQ0FBQyxFQUNENkIsR0FBRyxJQUFJO1VBQ0wsSUFDRUEsR0FBRyxZQUFZckUsS0FBSyxDQUFDK0QsS0FBSyxJQUMxQk0sR0FBRyxDQUFDckIsSUFBSSxJQUFJaEQsS0FBSyxDQUFDK0QsS0FBSyxDQUFDTyxZQUFZLElBQ3BDRCxHQUFHLENBQUNwQixPQUFPLElBQUksZ0JBQWdCaEMsTUFBTSxJQUFJQyxJQUFJLEVBQUUsRUFDL0M7WUFDQXFELHVCQUFjLENBQUNqQyxPQUFPLENBQUNrQyxLQUFLLENBQUMsSUFBSSxFQUFFcEQsSUFBSSxDQUFDLENBQUNULElBQUksQ0FBQ04sT0FBTyxFQUFFa0QsTUFBTSxDQUFDO1VBQ2hFLENBQUMsTUFBTTtZQUNMQSxNQUFNLENBQUNjLEdBQUcsQ0FBQztVQUNiO1FBQ0YsQ0FDRixDQUFDO01BQ0wsQ0FBQyxFQUFFZCxNQUFNLENBQUM7SUFDWixDQUFDLENBQUM7RUFDSjtFQUVBLE9BQU87SUFDTGpCLE9BQU8sRUFBRXRCLGFBQWE7SUFDdEJ5RCxJQUFJLEVBQUVGLHVCQUFjLENBQUNFLElBQUk7SUFDekJDLFdBQVcsRUFBRUgsdUJBQWMsQ0FBQ0c7RUFDOUIsQ0FBQztBQUNIO0FBQUMsSUFBQUMsUUFBQSxHQUFBQyxPQUFBLENBQUEvRSxPQUFBLEdBRWNnQix5QkFBeUIiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _express = _interopRequireDefault(require("express"));
|
|
9
|
+
var _logger = _interopRequireDefault(require("./logger"));
|
|
10
|
+
var _util = require("util");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
// A router that is based on promises rather than req/res/next.
|
|
13
|
+
// This is intended to replace the use of express.Router to handle
|
|
14
|
+
// subsections of the API surface.
|
|
15
|
+
// This will make it easier to have methods like 'batch' that
|
|
16
|
+
// themselves use our routing information, without disturbing express
|
|
17
|
+
// components that external developers may be modifying.
|
|
18
|
+
|
|
19
|
+
const Layer = require('router/lib/layer');
|
|
20
|
+
function validateParameter(key, value) {
|
|
21
|
+
if (key == 'className') {
|
|
22
|
+
if (value.match(/_?[A-Za-z][A-Za-z_0-9]*/)) {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
} else if (key == 'objectId') {
|
|
26
|
+
if (value.match(/[A-Za-z0-9]+/)) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class PromiseRouter {
|
|
34
|
+
// Each entry should be an object with:
|
|
35
|
+
// path: the path to route, in express format
|
|
36
|
+
// method: the HTTP method that this route handles.
|
|
37
|
+
// Must be one of: POST, GET, PUT, DELETE
|
|
38
|
+
// handler: a function that takes request, and returns a promise.
|
|
39
|
+
// Successful handlers should resolve to an object with fields:
|
|
40
|
+
// status: optional. the http status code. defaults to 200
|
|
41
|
+
// response: a json object with the content of the response
|
|
42
|
+
// location: optional. a location header
|
|
43
|
+
constructor(routes = [], appId) {
|
|
44
|
+
this.routes = routes;
|
|
45
|
+
this.appId = appId;
|
|
46
|
+
this.mountRoutes();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Leave the opportunity to
|
|
50
|
+
// subclasses to mount their routes by overriding
|
|
51
|
+
mountRoutes() {}
|
|
52
|
+
|
|
53
|
+
// Merge the routes into this one
|
|
54
|
+
merge(router) {
|
|
55
|
+
for (var route of router.routes) {
|
|
56
|
+
this.routes.push(route);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
route(method, path, ...handlers) {
|
|
60
|
+
switch (method) {
|
|
61
|
+
case 'POST':
|
|
62
|
+
case 'GET':
|
|
63
|
+
case 'PUT':
|
|
64
|
+
case 'DELETE':
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
throw 'cannot route method: ' + method;
|
|
68
|
+
}
|
|
69
|
+
let handler = handlers[0];
|
|
70
|
+
if (handlers.length > 1) {
|
|
71
|
+
handler = function (req) {
|
|
72
|
+
return handlers.reduce((promise, handler) => {
|
|
73
|
+
return promise.then(() => {
|
|
74
|
+
return handler(req);
|
|
75
|
+
});
|
|
76
|
+
}, Promise.resolve());
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
this.routes.push({
|
|
80
|
+
path: path,
|
|
81
|
+
method: method,
|
|
82
|
+
handler: handler,
|
|
83
|
+
layer: new Layer(path, null, handler)
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Returns an object with:
|
|
88
|
+
// handler: the handler that should deal with this request
|
|
89
|
+
// params: any :-params that got parsed from the path
|
|
90
|
+
// Returns undefined if there is no match.
|
|
91
|
+
match(method, path) {
|
|
92
|
+
for (var route of this.routes) {
|
|
93
|
+
if (route.method != method) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const layer = route.layer || new Layer(route.path, null, route.handler);
|
|
97
|
+
const match = layer.match(path);
|
|
98
|
+
if (match) {
|
|
99
|
+
const params = layer.params;
|
|
100
|
+
Object.keys(params).forEach(key => {
|
|
101
|
+
params[key] = validateParameter(key, params[key]);
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
params: params,
|
|
105
|
+
handler: route.handler
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Mount the routes on this router onto an express app (or express router)
|
|
112
|
+
mountOnto(expressApp) {
|
|
113
|
+
this.routes.forEach(route => {
|
|
114
|
+
const method = route.method.toLowerCase();
|
|
115
|
+
const handler = makeExpressHandler(this.appId, route.handler);
|
|
116
|
+
expressApp[method].call(expressApp, route.path, handler);
|
|
117
|
+
});
|
|
118
|
+
return expressApp;
|
|
119
|
+
}
|
|
120
|
+
expressRouter() {
|
|
121
|
+
return this.mountOnto(_express.default.Router());
|
|
122
|
+
}
|
|
123
|
+
tryRouteRequest(method, path, request) {
|
|
124
|
+
var match = this.match(method, path);
|
|
125
|
+
if (!match) {
|
|
126
|
+
throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'cannot route ' + method + ' ' + path);
|
|
127
|
+
}
|
|
128
|
+
request.params = match.params;
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
match.handler(request).then(resolve, reject);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// A helper function to make an express handler out of a a promise
|
|
136
|
+
// handler.
|
|
137
|
+
// Express handlers should never throw; if a promise handler throws we
|
|
138
|
+
// just treat it like it resolved to an error.
|
|
139
|
+
exports.default = PromiseRouter;
|
|
140
|
+
function makeExpressHandler(appId, promiseHandler) {
|
|
141
|
+
return function (req, res, next) {
|
|
142
|
+
try {
|
|
143
|
+
const url = maskSensitiveUrl(req);
|
|
144
|
+
const body = Object.assign({}, req.body);
|
|
145
|
+
const method = req.method;
|
|
146
|
+
const headers = req.headers;
|
|
147
|
+
_logger.default.logRequest({
|
|
148
|
+
method,
|
|
149
|
+
url,
|
|
150
|
+
headers,
|
|
151
|
+
body
|
|
152
|
+
});
|
|
153
|
+
promiseHandler(req).then(result => {
|
|
154
|
+
if (!result.response && !result.location && !result.text) {
|
|
155
|
+
_logger.default.error('the handler did not include a "response" or a "location" field');
|
|
156
|
+
throw 'control should not get here';
|
|
157
|
+
}
|
|
158
|
+
_logger.default.logResponse({
|
|
159
|
+
method,
|
|
160
|
+
url,
|
|
161
|
+
result
|
|
162
|
+
});
|
|
163
|
+
var status = result.status || 200;
|
|
164
|
+
res.status(status);
|
|
165
|
+
if (result.headers) {
|
|
166
|
+
Object.keys(result.headers).forEach(header => {
|
|
167
|
+
res.set(header, result.headers[header]);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (result.text) {
|
|
171
|
+
res.send(result.text);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (result.location) {
|
|
175
|
+
res.set('Location', result.location);
|
|
176
|
+
// Override the default expressjs response
|
|
177
|
+
// as it double encodes %encoded chars in URL
|
|
178
|
+
if (!result.response) {
|
|
179
|
+
res.send('Found. Redirecting to ' + result.location);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
res.json(result.response);
|
|
184
|
+
}, error => {
|
|
185
|
+
next(error);
|
|
186
|
+
}).catch(e => {
|
|
187
|
+
_logger.default.error(`Error generating response. ${(0, _util.inspect)(e)}`, {
|
|
188
|
+
error: e
|
|
189
|
+
});
|
|
190
|
+
next(e);
|
|
191
|
+
});
|
|
192
|
+
} catch (e) {
|
|
193
|
+
_logger.default.error(`Error handling request: ${(0, _util.inspect)(e)}`, {
|
|
194
|
+
error: e
|
|
195
|
+
});
|
|
196
|
+
next(e);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function maskSensitiveUrl(req) {
|
|
201
|
+
let maskUrl = req.originalUrl.toString();
|
|
202
|
+
const shouldMaskUrl = req.method === 'GET' && req.originalUrl.includes('/login') && !req.originalUrl.includes('classes');
|
|
203
|
+
if (shouldMaskUrl) {
|
|
204
|
+
maskUrl = _logger.default.maskSensitiveUrl(maskUrl);
|
|
205
|
+
}
|
|
206
|
+
return maskUrl;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2V4cHJlc3MiLCJfbG9nZ2VyIiwiX3V0aWwiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJMYXllciIsInZhbGlkYXRlUGFyYW1ldGVyIiwia2V5IiwidmFsdWUiLCJtYXRjaCIsIlByb21pc2VSb3V0ZXIiLCJjb25zdHJ1Y3RvciIsInJvdXRlcyIsImFwcElkIiwibW91bnRSb3V0ZXMiLCJtZXJnZSIsInJvdXRlciIsInJvdXRlIiwicHVzaCIsIm1ldGhvZCIsInBhdGgiLCJoYW5kbGVycyIsImhhbmRsZXIiLCJsZW5ndGgiLCJyZXEiLCJyZWR1Y2UiLCJwcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJyZXNvbHZlIiwibGF5ZXIiLCJwYXJhbXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsIm1vdW50T250byIsImV4cHJlc3NBcHAiLCJ0b0xvd2VyQ2FzZSIsIm1ha2VFeHByZXNzSGFuZGxlciIsImNhbGwiLCJleHByZXNzUm91dGVyIiwiZXhwcmVzcyIsIlJvdXRlciIsInRyeVJvdXRlUmVxdWVzdCIsInJlcXVlc3QiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9KU09OIiwicmVqZWN0IiwiZXhwb3J0cyIsInByb21pc2VIYW5kbGVyIiwicmVzIiwibmV4dCIsInVybCIsIm1hc2tTZW5zaXRpdmVVcmwiLCJib2R5IiwiYXNzaWduIiwiaGVhZGVycyIsImxvZyIsImxvZ1JlcXVlc3QiLCJyZXN1bHQiLCJyZXNwb25zZSIsImxvY2F0aW9uIiwidGV4dCIsImVycm9yIiwibG9nUmVzcG9uc2UiLCJzdGF0dXMiLCJoZWFkZXIiLCJzZXQiLCJzZW5kIiwianNvbiIsImNhdGNoIiwiaW5zcGVjdCIsIm1hc2tVcmwiLCJvcmlnaW5hbFVybCIsInRvU3RyaW5nIiwic2hvdWxkTWFza1VybCIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsiLi4vc3JjL1Byb21pc2VSb3V0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSByb3V0ZXIgdGhhdCBpcyBiYXNlZCBvbiBwcm9taXNlcyByYXRoZXIgdGhhbiByZXEvcmVzL25leHQuXG4vLyBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgdGhlIHVzZSBvZiBleHByZXNzLlJvdXRlciB0byBoYW5kbGVcbi8vIHN1YnNlY3Rpb25zIG9mIHRoZSBBUEkgc3VyZmFjZS5cbi8vIFRoaXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byBoYXZlIG1ldGhvZHMgbGlrZSAnYmF0Y2gnIHRoYXRcbi8vIHRoZW1zZWx2ZXMgdXNlIG91ciByb3V0aW5nIGluZm9ybWF0aW9uLCB3aXRob3V0IGRpc3R1cmJpbmcgZXhwcmVzc1xuLy8gY29tcG9uZW50cyB0aGF0IGV4dGVybmFsIGRldmVsb3BlcnMgbWF5IGJlIG1vZGlmeWluZy5cblxuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJztcbmNvbnN0IExheWVyID0gcmVxdWlyZSgncm91dGVyL2xpYi9sYXllcicpO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtZXRlcihrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ2NsYXNzTmFtZScpIHtcbiAgICBpZiAodmFsdWUubWF0Y2goL18/W0EtWmEtel1bQS1aYS16XzAtOV0qLykpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoa2V5ID09ICdvYmplY3RJZCcpIHtcbiAgICBpZiAodmFsdWUubWF0Y2goL1tBLVphLXowLTldKy8pKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9taXNlUm91dGVyIHtcbiAgLy8gRWFjaCBlbnRyeSBzaG91bGQgYmUgYW4gb2JqZWN0IHdpdGg6XG4gIC8vIHBhdGg6IHRoZSBwYXRoIHRvIHJvdXRlLCBpbiBleHByZXNzIGZvcm1hdFxuICAvLyBtZXRob2Q6IHRoZSBIVFRQIG1ldGhvZCB0aGF0IHRoaXMgcm91dGUgaGFuZGxlcy5cbiAgLy8gICBNdXN0IGJlIG9uZSBvZjogUE9TVCwgR0VULCBQVVQsIERFTEVURVxuICAvLyBoYW5kbGVyOiBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgcmVxdWVzdCwgYW5kIHJldHVybnMgYSBwcm9taXNlLlxuICAvLyAgIFN1Y2Nlc3NmdWwgaGFuZGxlcnMgc2hvdWxkIHJlc29sdmUgdG8gYW4gb2JqZWN0IHdpdGggZmllbGRzOlxuICAvLyAgICAgc3RhdHVzOiBvcHRpb25hbC4gdGhlIGh0dHAgc3RhdHVzIGNvZGUuIGRlZmF1bHRzIHRvIDIwMFxuICAvLyAgICAgcmVzcG9uc2U6IGEganNvbiBvYmplY3Qgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgcmVzcG9uc2VcbiAgLy8gICAgIGxvY2F0aW9uOiBvcHRpb25hbC4gYSBsb2NhdGlvbiBoZWFkZXJcbiAgY29uc3RydWN0b3Iocm91dGVzID0gW10sIGFwcElkKSB7XG4gICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXM7XG4gICAgdGhpcy5hcHBJZCA9IGFwcElkO1xuICAgIHRoaXMubW91bnRSb3V0ZXMoKTtcbiAgfVxuXG4gIC8vIExlYXZlIHRoZSBvcHBvcnR1bml0eSB0b1xuICAvLyBzdWJjbGFzc2VzIHRvIG1vdW50IHRoZWlyIHJvdXRlcyBieSBvdmVycmlkaW5nXG4gIG1vdW50Um91dGVzKCkge31cblxuICAvLyBNZXJnZSB0aGUgcm91dGVzIGludG8gdGhpcyBvbmVcbiAgbWVyZ2Uocm91dGVyKSB7XG4gICAgZm9yICh2YXIgcm91dGUgb2Ygcm91dGVyLnJvdXRlcykge1xuICAgICAgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSk7XG4gICAgfVxuICB9XG5cbiAgcm91dGUobWV0aG9kLCBwYXRoLCAuLi5oYW5kbGVycykge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdQT1NUJzpcbiAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICBjYXNlICdQVVQnOlxuICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyAnY2Fubm90IHJvdXRlIG1ldGhvZDogJyArIG1ldGhvZDtcbiAgICB9XG5cbiAgICBsZXQgaGFuZGxlciA9IGhhbmRsZXJzWzBdO1xuXG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAocmVxKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVycy5yZWR1Y2UoKHByb21pc2UsIGhhbmRsZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5yb3V0ZXMucHVzaCh7XG4gICAgICBwYXRoOiBwYXRoLFxuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgbGF5ZXI6IG5ldyBMYXllcihwYXRoLCBudWxsLCBoYW5kbGVyKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGg6XG4gIC8vICAgaGFuZGxlcjogdGhlIGhhbmRsZXIgdGhhdCBzaG91bGQgZGVhbCB3aXRoIHRoaXMgcmVxdWVzdFxuICAvLyAgIHBhcmFtczogYW55IDotcGFyYW1zIHRoYXQgZ290IHBhcnNlZCBmcm9tIHRoZSBwYXRoXG4gIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vIG1hdGNoLlxuICBtYXRjaChtZXRob2QsIHBhdGgpIHtcbiAgICBmb3IgKHZhciByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgaWYgKHJvdXRlLm1ldGhvZCAhPSBtZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXllciA9IHJvdXRlLmxheWVyIHx8IG5ldyBMYXllcihyb3V0ZS5wYXRoLCBudWxsLCByb3V0ZS5oYW5kbGVyKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGF5ZXIubWF0Y2gocGF0aCk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbGF5ZXIucGFyYW1zO1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBwYXJhbXNba2V5XSA9IHZhbGlkYXRlUGFyYW1ldGVyKGtleSwgcGFyYW1zW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGhhbmRsZXI6IHJvdXRlLmhhbmRsZXIgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBNb3VudCB0aGUgcm91dGVzIG9uIHRoaXMgcm91dGVyIG9udG8gYW4gZXhwcmVzcyBhcHAgKG9yIGV4cHJlc3Mgcm91dGVyKVxuICBtb3VudE9udG8oZXhwcmVzc0FwcCkge1xuICAgIHRoaXMucm91dGVzLmZvckVhY2gocm91dGUgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gcm91dGUubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gbWFrZUV4cHJlc3NIYW5kbGVyKHRoaXMuYXBwSWQsIHJvdXRlLmhhbmRsZXIpO1xuICAgICAgZXhwcmVzc0FwcFttZXRob2RdLmNhbGwoZXhwcmVzc0FwcCwgcm91dGUucGF0aCwgaGFuZGxlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cHJlc3NBcHA7XG4gIH1cblxuICBleHByZXNzUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLm1vdW50T250byhleHByZXNzLlJvdXRlcigpKTtcbiAgfVxuXG4gIHRyeVJvdXRlUmVxdWVzdChtZXRob2QsIHBhdGgsIHJlcXVlc3QpIHtcbiAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoKG1ldGhvZCwgcGF0aCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2Nhbm5vdCByb3V0ZSAnICsgbWV0aG9kICsgJyAnICsgcGF0aCk7XG4gICAgfVxuICAgIHJlcXVlc3QucGFyYW1zID0gbWF0Y2gucGFyYW1zO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBtYXRjaC5oYW5kbGVyKHJlcXVlc3QpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBBIGhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGFuIGV4cHJlc3MgaGFuZGxlciBvdXQgb2YgYSBhIHByb21pc2Vcbi8vIGhhbmRsZXIuXG4vLyBFeHByZXNzIGhhbmRsZXJzIHNob3VsZCBuZXZlciB0aHJvdzsgaWYgYSBwcm9taXNlIGhhbmRsZXIgdGhyb3dzIHdlXG4vLyBqdXN0IHRyZWF0IGl0IGxpa2UgaXQgcmVzb2x2ZWQgdG8gYW4gZXJyb3IuXG5mdW5jdGlvbiBtYWtlRXhwcmVzc0hhbmRsZXIoYXBwSWQsIHByb21pc2VIYW5kbGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbWFza1NlbnNpdGl2ZVVybChyZXEpO1xuICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oe30sIHJlcS5ib2R5KTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gICAgICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gICAgICBsb2cubG9nUmVxdWVzdCh7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgICBwcm9taXNlSGFuZGxlcihyZXEpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5yZXNwb25zZSAmJiAhcmVzdWx0LmxvY2F0aW9uICYmICFyZXN1bHQudGV4dCkge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ3RoZSBoYW5kbGVyIGRpZCBub3QgaW5jbHVkZSBhIFwicmVzcG9uc2VcIiBvciBhIFwibG9jYXRpb25cIiBmaWVsZCcpO1xuICAgICAgICAgICAgICB0aHJvdyAnY29udHJvbCBzaG91bGQgbm90IGdldCBoZXJlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9nLmxvZ1Jlc3BvbnNlKHsgbWV0aG9kLCB1cmwsIHJlc3VsdCB9KTtcblxuICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlc3VsdC5zdGF0dXMgfHwgMjAwO1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhzdGF0dXMpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goaGVhZGVyID0+IHtcbiAgICAgICAgICAgICAgICByZXMuc2V0KGhlYWRlciwgcmVzdWx0LmhlYWRlcnNbaGVhZGVyXSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0LnRleHQpIHtcbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LnRleHQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQubG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgcmVzLnNldCgnTG9jYXRpb24nLCByZXN1bHQubG9jYXRpb24pO1xuICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBleHByZXNzanMgcmVzcG9uc2VcbiAgICAgICAgICAgICAgLy8gYXMgaXQgZG91YmxlIGVuY29kZXMgJWVuY29kZWQgY2hhcnMgaW4gVVJMXG4gICAgICAgICAgICAgIGlmICghcmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnNlbmQoJ0ZvdW5kLiBSZWRpcmVjdGluZyB0byAnICsgcmVzdWx0LmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdC5yZXNwb25zZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcihgRXJyb3IgZ2VuZXJhdGluZyByZXNwb25zZS4gJHtpbnNwZWN0KGUpfWAsIHsgZXJyb3I6IGUgfSk7XG4gICAgICAgICAgbmV4dChlKTtcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yKGBFcnJvciBoYW5kbGluZyByZXF1ZXN0OiAke2luc3BlY3QoZSl9YCwgeyBlcnJvcjogZSB9KTtcbiAgICAgIG5leHQoZSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXNrU2Vuc2l0aXZlVXJsKHJlcSkge1xuICBsZXQgbWFza1VybCA9IHJlcS5vcmlnaW5hbFVybC50b1N0cmluZygpO1xuICBjb25zdCBzaG91bGRNYXNrVXJsID1cbiAgICByZXEubWV0aG9kID09PSAnR0VUJyAmJlxuICAgIHJlcS5vcmlnaW5hbFVybC5pbmNsdWRlcygnL2xvZ2luJykgJiZcbiAgICAhcmVxLm9yaWdpbmFsVXJsLmluY2x1ZGVzKCdjbGFzc2VzJyk7XG4gIGlmIChzaG91bGRNYXNrVXJsKSB7XG4gICAgbWFza1VybCA9IGxvZy5tYXNrU2Vuc2l0aXZlVXJsKG1hc2tVcmwpO1xuICB9XG4gIHJldHVybiBtYXNrVXJsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFPQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFILE9BQUE7QUFBK0IsU0FBQUQsdUJBQUFLLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFWL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU1BLE1BQU1HLEtBQUssR0FBR1AsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBRXpDLFNBQVNRLGlCQUFpQkEsQ0FBQ0MsR0FBRyxFQUFFQyxLQUFLLEVBQUU7RUFDckMsSUFBSUQsR0FBRyxJQUFJLFdBQVcsRUFBRTtJQUN0QixJQUFJQyxLQUFLLENBQUNDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO01BQzFDLE9BQU9ELEtBQUs7SUFDZDtFQUNGLENBQUMsTUFBTSxJQUFJRCxHQUFHLElBQUksVUFBVSxFQUFFO0lBQzVCLElBQUlDLEtBQUssQ0FBQ0MsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFO01BQy9CLE9BQU9ELEtBQUs7SUFDZDtFQUNGLENBQUMsTUFBTTtJQUNMLE9BQU9BLEtBQUs7RUFDZDtBQUNGO0FBRWUsTUFBTUUsYUFBYSxDQUFDO0VBQ2pDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBQyxXQUFXQSxDQUFDQyxNQUFNLEdBQUcsRUFBRSxFQUFFQyxLQUFLLEVBQUU7SUFDOUIsSUFBSSxDQUFDRCxNQUFNLEdBQUdBLE1BQU07SUFDcEIsSUFBSSxDQUFDQyxLQUFLLEdBQUdBLEtBQUs7SUFDbEIsSUFBSSxDQUFDQyxXQUFXLENBQUMsQ0FBQztFQUNwQjs7RUFFQTtFQUNBO0VBQ0FBLFdBQVdBLENBQUEsRUFBRyxDQUFDOztFQUVmO0VBQ0FDLEtBQUtBLENBQUNDLE1BQU0sRUFBRTtJQUNaLEtBQUssSUFBSUMsS0FBSyxJQUFJRCxNQUFNLENBQUNKLE1BQU0sRUFBRTtNQUMvQixJQUFJLENBQUNBLE1BQU0sQ0FBQ00sSUFBSSxDQUFDRCxLQUFLLENBQUM7SUFDekI7RUFDRjtFQUVBQSxLQUFLQSxDQUFDRSxNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHQyxRQUFRLEVBQUU7SUFDL0IsUUFBUUYsTUFBTTtNQUNaLEtBQUssTUFBTTtNQUNYLEtBQUssS0FBSztNQUNWLEtBQUssS0FBSztNQUNWLEtBQUssUUFBUTtRQUNYO01BQ0Y7UUFDRSxNQUFNLHVCQUF1QixHQUFHQSxNQUFNO0lBQzFDO0lBRUEsSUFBSUcsT0FBTyxHQUFHRCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRXpCLElBQUlBLFFBQVEsQ0FBQ0UsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUN2QkQsT0FBTyxHQUFHLFNBQUFBLENBQVVFLEdBQUcsRUFBRTtRQUN2QixPQUFPSCxRQUFRLENBQUNJLE1BQU0sQ0FBQyxDQUFDQyxPQUFPLEVBQUVKLE9BQU8sS0FBSztVQUMzQyxPQUFPSSxPQUFPLENBQUNDLElBQUksQ0FBQyxNQUFNO1lBQ3hCLE9BQU9MLE9BQU8sQ0FBQ0UsR0FBRyxDQUFDO1VBQ3JCLENBQUMsQ0FBQztRQUNKLENBQUMsRUFBRUksT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ3ZCLENBQUM7SUFDSDtJQUVBLElBQUksQ0FBQ2pCLE1BQU0sQ0FBQ00sSUFBSSxDQUFDO01BQ2ZFLElBQUksRUFBRUEsSUFBSTtNQUNWRCxNQUFNLEVBQUVBLE1BQU07TUFDZEcsT0FBTyxFQUFFQSxPQUFPO01BQ2hCUSxLQUFLLEVBQUUsSUFBSXpCLEtBQUssQ0FBQ2UsSUFBSSxFQUFFLElBQUksRUFBRUUsT0FBTztJQUN0QyxDQUFDLENBQUM7RUFDSjs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBYixLQUFLQSxDQUFDVSxNQUFNLEVBQUVDLElBQUksRUFBRTtJQUNsQixLQUFLLElBQUlILEtBQUssSUFBSSxJQUFJLENBQUNMLE1BQU0sRUFBRTtNQUM3QixJQUFJSyxLQUFLLENBQUNFLE1BQU0sSUFBSUEsTUFBTSxFQUFFO1FBQzFCO01BQ0Y7TUFDQSxNQUFNVyxLQUFLLEdBQUdiLEtBQUssQ0FBQ2EsS0FBSyxJQUFJLElBQUl6QixLQUFLLENBQUNZLEtBQUssQ0FBQ0csSUFBSSxFQUFFLElBQUksRUFBRUgsS0FBSyxDQUFDSyxPQUFPLENBQUM7TUFDdkUsTUFBTWIsS0FBSyxHQUFHcUIsS0FBSyxDQUFDckIsS0FBSyxDQUFDVyxJQUFJLENBQUM7TUFDL0IsSUFBSVgsS0FBSyxFQUFFO1FBQ1QsTUFBTXNCLE1BQU0sR0FBR0QsS0FBSyxDQUFDQyxNQUFNO1FBQzNCQyxNQUFNLENBQUNDLElBQUksQ0FBQ0YsTUFBTSxDQUFDLENBQUNHLE9BQU8sQ0FBQzNCLEdBQUcsSUFBSTtVQUNqQ3dCLE1BQU0sQ0FBQ3hCLEdBQUcsQ0FBQyxHQUFHRCxpQkFBaUIsQ0FBQ0MsR0FBRyxFQUFFd0IsTUFBTSxDQUFDeEIsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDO1FBQ0YsT0FBTztVQUFFd0IsTUFBTSxFQUFFQSxNQUFNO1VBQUVULE9BQU8sRUFBRUwsS0FBSyxDQUFDSztRQUFRLENBQUM7TUFDbkQ7SUFDRjtFQUNGOztFQUVBO0VBQ0FhLFNBQVNBLENBQUNDLFVBQVUsRUFBRTtJQUNwQixJQUFJLENBQUN4QixNQUFNLENBQUNzQixPQUFPLENBQUNqQixLQUFLLElBQUk7TUFDM0IsTUFBTUUsTUFBTSxHQUFHRixLQUFLLENBQUNFLE1BQU0sQ0FBQ2tCLFdBQVcsQ0FBQyxDQUFDO01BQ3pDLE1BQU1mLE9BQU8sR0FBR2dCLGtCQUFrQixDQUFDLElBQUksQ0FBQ3pCLEtBQUssRUFBRUksS0FBSyxDQUFDSyxPQUFPLENBQUM7TUFDN0RjLFVBQVUsQ0FBQ2pCLE1BQU0sQ0FBQyxDQUFDb0IsSUFBSSxDQUFDSCxVQUFVLEVBQUVuQixLQUFLLENBQUNHLElBQUksRUFBRUUsT0FBTyxDQUFDO0lBQzFELENBQUMsQ0FBQztJQUNGLE9BQU9jLFVBQVU7RUFDbkI7RUFFQUksYUFBYUEsQ0FBQSxFQUFHO0lBQ2QsT0FBTyxJQUFJLENBQUNMLFNBQVMsQ0FBQ00sZ0JBQU8sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUN6QztFQUVBQyxlQUFlQSxDQUFDeEIsTUFBTSxFQUFFQyxJQUFJLEVBQUV3QixPQUFPLEVBQUU7SUFDckMsSUFBSW5DLEtBQUssR0FBRyxJQUFJLENBQUNBLEtBQUssQ0FBQ1UsTUFBTSxFQUFFQyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDWCxLQUFLLEVBQUU7TUFDVixNQUFNLElBQUlvQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUNDLFlBQVksRUFBRSxlQUFlLEdBQUc1QixNQUFNLEdBQUcsR0FBRyxHQUFHQyxJQUFJLENBQUM7SUFDeEY7SUFDQXdCLE9BQU8sQ0FBQ2IsTUFBTSxHQUFHdEIsS0FBSyxDQUFDc0IsTUFBTTtJQUM3QixPQUFPLElBQUlILE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVtQixNQUFNLEtBQUs7TUFDdEN2QyxLQUFLLENBQUNhLE9BQU8sQ0FBQ3NCLE9BQU8sQ0FBQyxDQUFDakIsSUFBSSxDQUFDRSxPQUFPLEVBQUVtQixNQUFNLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0VBQ0o7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBQyxPQUFBLENBQUE3QyxPQUFBLEdBQUFNLGFBQUE7QUFDQSxTQUFTNEIsa0JBQWtCQSxDQUFDekIsS0FBSyxFQUFFcUMsY0FBYyxFQUFFO0VBQ2pELE9BQU8sVUFBVTFCLEdBQUcsRUFBRTJCLEdBQUcsRUFBRUMsSUFBSSxFQUFFO0lBQy9CLElBQUk7TUFDRixNQUFNQyxHQUFHLEdBQUdDLGdCQUFnQixDQUFDOUIsR0FBRyxDQUFDO01BQ2pDLE1BQU0rQixJQUFJLEdBQUd2QixNQUFNLENBQUN3QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVoQyxHQUFHLENBQUMrQixJQUFJLENBQUM7TUFDeEMsTUFBTXBDLE1BQU0sR0FBR0ssR0FBRyxDQUFDTCxNQUFNO01BQ3pCLE1BQU1zQyxPQUFPLEdBQUdqQyxHQUFHLENBQUNpQyxPQUFPO01BQzNCQyxlQUFHLENBQUNDLFVBQVUsQ0FBQztRQUNieEMsTUFBTTtRQUNOa0MsR0FBRztRQUNISSxPQUFPO1FBQ1BGO01BQ0YsQ0FBQyxDQUFDO01BQ0ZMLGNBQWMsQ0FBQzFCLEdBQUcsQ0FBQyxDQUNoQkcsSUFBSSxDQUNIaUMsTUFBTSxJQUFJO1FBQ1IsSUFBSSxDQUFDQSxNQUFNLENBQUNDLFFBQVEsSUFBSSxDQUFDRCxNQUFNLENBQUNFLFFBQVEsSUFBSSxDQUFDRixNQUFNLENBQUNHLElBQUksRUFBRTtVQUN4REwsZUFBRyxDQUFDTSxLQUFLLENBQUMsZ0VBQWdFLENBQUM7VUFDM0UsTUFBTSw2QkFBNkI7UUFDckM7UUFFQU4sZUFBRyxDQUFDTyxXQUFXLENBQUM7VUFBRTlDLE1BQU07VUFBRWtDLEdBQUc7VUFBRU87UUFBTyxDQUFDLENBQUM7UUFFeEMsSUFBSU0sTUFBTSxHQUFHTixNQUFNLENBQUNNLE1BQU0sSUFBSSxHQUFHO1FBQ2pDZixHQUFHLENBQUNlLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDO1FBRWxCLElBQUlOLE1BQU0sQ0FBQ0gsT0FBTyxFQUFFO1VBQ2xCekIsTUFBTSxDQUFDQyxJQUFJLENBQUMyQixNQUFNLENBQUNILE9BQU8sQ0FBQyxDQUFDdkIsT0FBTyxDQUFDaUMsTUFBTSxJQUFJO1lBQzVDaEIsR0FBRyxDQUFDaUIsR0FBRyxDQUFDRCxNQUFNLEVBQUVQLE1BQU0sQ0FBQ0gsT0FBTyxDQUFDVSxNQUFNLENBQUMsQ0FBQztVQUN6QyxDQUFDLENBQUM7UUFDSjtRQUVBLElBQUlQLE1BQU0sQ0FBQ0csSUFBSSxFQUFFO1VBQ2ZaLEdBQUcsQ0FBQ2tCLElBQUksQ0FBQ1QsTUFBTSxDQUFDRyxJQUFJLENBQUM7VUFDckI7UUFDRjtRQUVBLElBQUlILE1BQU0sQ0FBQ0UsUUFBUSxFQUFFO1VBQ25CWCxHQUFHLENBQUNpQixHQUFHLENBQUMsVUFBVSxFQUFFUixNQUFNLENBQUNFLFFBQVEsQ0FBQztVQUNwQztVQUNBO1VBQ0EsSUFBSSxDQUFDRixNQUFNLENBQUNDLFFBQVEsRUFBRTtZQUNwQlYsR0FBRyxDQUFDa0IsSUFBSSxDQUFDLHdCQUF3QixHQUFHVCxNQUFNLENBQUNFLFFBQVEsQ0FBQztZQUNwRDtVQUNGO1FBQ0Y7UUFDQVgsR0FBRyxDQUFDbUIsSUFBSSxDQUFDVixNQUFNLENBQUNDLFFBQVEsQ0FBQztNQUMzQixDQUFDLEVBQ0RHLEtBQUssSUFBSTtRQUNQWixJQUFJLENBQUNZLEtBQUssQ0FBQztNQUNiLENBQ0YsQ0FBQyxDQUNBTyxLQUFLLENBQUNyRSxDQUFDLElBQUk7UUFDVndELGVBQUcsQ0FBQ00sS0FBSyxDQUFDLDhCQUE4QixJQUFBUSxhQUFPLEVBQUN0RSxDQUFDLENBQUMsRUFBRSxFQUFFO1VBQUU4RCxLQUFLLEVBQUU5RDtRQUFFLENBQUMsQ0FBQztRQUNuRWtELElBQUksQ0FBQ2xELENBQUMsQ0FBQztNQUNULENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxPQUFPQSxDQUFDLEVBQUU7TUFDVndELGVBQUcsQ0FBQ00sS0FBSyxDQUFDLDJCQUEyQixJQUFBUSxhQUFPLEVBQUN0RSxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQUU4RCxLQUFLLEVBQUU5RDtNQUFFLENBQUMsQ0FBQztNQUNoRWtELElBQUksQ0FBQ2xELENBQUMsQ0FBQztJQUNUO0VBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBU29ELGdCQUFnQkEsQ0FBQzlCLEdBQUcsRUFBRTtFQUM3QixJQUFJaUQsT0FBTyxHQUFHakQsR0FBRyxDQUFDa0QsV0FBVyxDQUFDQyxRQUFRLENBQUMsQ0FBQztFQUN4QyxNQUFNQyxhQUFhLEdBQ2pCcEQsR0FBRyxDQUFDTCxNQUFNLEtBQUssS0FBSyxJQUNwQkssR0FBRyxDQUFDa0QsV0FBVyxDQUFDRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQ2xDLENBQUNyRCxHQUFHLENBQUNrRCxXQUFXLENBQUNHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDdEMsSUFBSUQsYUFBYSxFQUFFO0lBQ2pCSCxPQUFPLEdBQUdmLGVBQUcsQ0FBQ0osZ0JBQWdCLENBQUNtQixPQUFPLENBQUM7RUFDekM7RUFDQSxPQUFPQSxPQUFPO0FBQ2hCIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PushQueue = void 0;
|
|
7
|
+
var _ParseMessageQueue = require("../ParseMessageQueue");
|
|
8
|
+
var _rest = _interopRequireDefault(require("../rest"));
|
|
9
|
+
var _utils = require("./utils");
|
|
10
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const PUSH_CHANNEL = 'parse-server-push';
|
|
13
|
+
const DEFAULT_BATCH_SIZE = 100;
|
|
14
|
+
class PushQueue {
|
|
15
|
+
// config object of the publisher, right now it only contains the redisURL,
|
|
16
|
+
// but we may extend it later.
|
|
17
|
+
constructor(config = {}) {
|
|
18
|
+
this.channel = config.channel || PushQueue.defaultPushChannel();
|
|
19
|
+
this.batchSize = config.batchSize || DEFAULT_BATCH_SIZE;
|
|
20
|
+
this.parsePublisher = _ParseMessageQueue.ParseMessageQueue.createPublisher(config);
|
|
21
|
+
}
|
|
22
|
+
static defaultPushChannel() {
|
|
23
|
+
return `${_node.default.applicationId}-${PUSH_CHANNEL}`;
|
|
24
|
+
}
|
|
25
|
+
enqueue(body, where, config, auth, pushStatus) {
|
|
26
|
+
const limit = this.batchSize;
|
|
27
|
+
where = (0, _utils.applyDeviceTokenExists)(where);
|
|
28
|
+
|
|
29
|
+
// Order by objectId so no impact on the DB
|
|
30
|
+
const order = 'objectId';
|
|
31
|
+
return Promise.resolve().then(() => {
|
|
32
|
+
return _rest.default.find(config, auth, '_Installation', where, {
|
|
33
|
+
limit: 0,
|
|
34
|
+
count: true
|
|
35
|
+
});
|
|
36
|
+
}).then(({
|
|
37
|
+
results,
|
|
38
|
+
count
|
|
39
|
+
}) => {
|
|
40
|
+
if (!results || count == 0) {
|
|
41
|
+
return pushStatus.complete();
|
|
42
|
+
}
|
|
43
|
+
pushStatus.setRunning(Math.ceil(count / limit));
|
|
44
|
+
let skip = 0;
|
|
45
|
+
while (skip < count) {
|
|
46
|
+
const query = {
|
|
47
|
+
where,
|
|
48
|
+
limit,
|
|
49
|
+
skip,
|
|
50
|
+
order
|
|
51
|
+
};
|
|
52
|
+
const pushWorkItem = {
|
|
53
|
+
body,
|
|
54
|
+
query,
|
|
55
|
+
pushStatus: {
|
|
56
|
+
objectId: pushStatus.objectId
|
|
57
|
+
},
|
|
58
|
+
applicationId: config.applicationId
|
|
59
|
+
};
|
|
60
|
+
this.parsePublisher.publish(this.channel, JSON.stringify(pushWorkItem));
|
|
61
|
+
skip += limit;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.PushQueue = PushQueue;
|
|
67
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUGFyc2VNZXNzYWdlUXVldWUiLCJyZXF1aXJlIiwiX3Jlc3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3V0aWxzIiwiX25vZGUiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQVVNIX0NIQU5ORUwiLCJERUZBVUxUX0JBVENIX1NJWkUiLCJQdXNoUXVldWUiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImNoYW5uZWwiLCJkZWZhdWx0UHVzaENoYW5uZWwiLCJiYXRjaFNpemUiLCJwYXJzZVB1Ymxpc2hlciIsIlBhcnNlTWVzc2FnZVF1ZXVlIiwiY3JlYXRlUHVibGlzaGVyIiwiUGFyc2UiLCJhcHBsaWNhdGlvbklkIiwiZW5xdWV1ZSIsImJvZHkiLCJ3aGVyZSIsImF1dGgiLCJwdXNoU3RhdHVzIiwibGltaXQiLCJhcHBseURldmljZVRva2VuRXhpc3RzIiwib3JkZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJyZXN0IiwiZmluZCIsImNvdW50IiwicmVzdWx0cyIsImNvbXBsZXRlIiwic2V0UnVubmluZyIsIk1hdGgiLCJjZWlsIiwic2tpcCIsInF1ZXJ5IiwicHVzaFdvcmtJdGVtIiwib2JqZWN0SWQiLCJwdWJsaXNoIiwiSlNPTiIsInN0cmluZ2lmeSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUHVzaC9QdXNoUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VNZXNzYWdlUXVldWUgfSBmcm9tICcuLi9QYXJzZU1lc3NhZ2VRdWV1ZSc7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcbmltcG9ydCB7IGFwcGx5RGV2aWNlVG9rZW5FeGlzdHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcblxuY29uc3QgUFVTSF9DSEFOTkVMID0gJ3BhcnNlLXNlcnZlci1wdXNoJztcbmNvbnN0IERFRkFVTFRfQkFUQ0hfU0laRSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIFB1c2hRdWV1ZSB7XG4gIHBhcnNlUHVibGlzaGVyOiBPYmplY3Q7XG4gIGNoYW5uZWw6IFN0cmluZztcbiAgYmF0Y2hTaXplOiBOdW1iZXI7XG5cbiAgLy8gY29uZmlnIG9iamVjdCBvZiB0aGUgcHVibGlzaGVyLCByaWdodCBub3cgaXQgb25seSBjb250YWlucyB0aGUgcmVkaXNVUkwsXG4gIC8vIGJ1dCB3ZSBtYXkgZXh0ZW5kIGl0IGxhdGVyLlxuICBjb25zdHJ1Y3Rvcihjb25maWc6IGFueSA9IHt9KSB7XG4gICAgdGhpcy5jaGFubmVsID0gY29uZmlnLmNoYW5uZWwgfHwgUHVzaFF1ZXVlLmRlZmF1bHRQdXNoQ2hhbm5lbCgpO1xuICAgIHRoaXMuYmF0Y2hTaXplID0gY29uZmlnLmJhdGNoU2l6ZSB8fCBERUZBVUxUX0JBVENIX1NJWkU7XG4gICAgdGhpcy5wYXJzZVB1Ymxpc2hlciA9IFBhcnNlTWVzc2FnZVF1ZXVlLmNyZWF0ZVB1Ymxpc2hlcihjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHRQdXNoQ2hhbm5lbCgpIHtcbiAgICByZXR1cm4gYCR7UGFyc2UuYXBwbGljYXRpb25JZH0tJHtQVVNIX0NIQU5ORUx9YDtcbiAgfVxuXG4gIGVucXVldWUoYm9keSwgd2hlcmUsIGNvbmZpZywgYXV0aCwgcHVzaFN0YXR1cykge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5iYXRjaFNpemU7XG5cbiAgICB3aGVyZSA9IGFwcGx5RGV2aWNlVG9rZW5FeGlzdHMod2hlcmUpO1xuXG4gICAgLy8gT3JkZXIgYnkgb2JqZWN0SWQgc28gbm8gaW1wYWN0IG9uIHRoZSBEQlxuICAgIGNvbnN0IG9yZGVyID0gJ29iamVjdElkJztcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc3QuZmluZChjb25maWcsIGF1dGgsICdfSW5zdGFsbGF0aW9uJywgd2hlcmUsIHtcbiAgICAgICAgICBsaW1pdDogMCxcbiAgICAgICAgICBjb3VudDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oKHsgcmVzdWx0cywgY291bnQgfSkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdHMgfHwgY291bnQgPT0gMCkge1xuICAgICAgICAgIHJldHVybiBwdXNoU3RhdHVzLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFN0YXR1cy5zZXRSdW5uaW5nKE1hdGguY2VpbChjb3VudCAvIGxpbWl0KSk7XG4gICAgICAgIGxldCBza2lwID0gMDtcbiAgICAgICAgd2hpbGUgKHNraXAgPCBjb3VudCkge1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICBvcmRlcixcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgcHVzaFdvcmtJdGVtID0ge1xuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgcHVzaFN0YXR1czogeyBvYmplY3RJZDogcHVzaFN0YXR1cy5vYmplY3RJZCB9LFxuICAgICAgICAgICAgYXBwbGljYXRpb25JZDogY29uZmlnLmFwcGxpY2F0aW9uSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnBhcnNlUHVibGlzaGVyLnB1Ymxpc2godGhpcy5jaGFubmVsLCBKU09OLnN0cmluZ2lmeShwdXNoV29ya0l0ZW0pKTtcbiAgICAgICAgICBza2lwICs9IGxpbWl0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksS0FBQSxHQUFBRixzQkFBQSxDQUFBRixP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
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.PushWorker = void 0;
|
|
7
|
+
var _AdaptableController = _interopRequireDefault(require("../Controllers/AdaptableController"));
|
|
8
|
+
var _Auth = require("../Auth");
|
|
9
|
+
var _Config = _interopRequireDefault(require("../Config"));
|
|
10
|
+
var _PushAdapter = require("../Adapters/Push/PushAdapter");
|
|
11
|
+
var _rest = _interopRequireDefault(require("../rest"));
|
|
12
|
+
var _StatusHandler = require("../StatusHandler");
|
|
13
|
+
var utils = _interopRequireWildcard(require("./utils"));
|
|
14
|
+
var _ParseMessageQueue = require("../ParseMessageQueue");
|
|
15
|
+
var _PushQueue = require("./PushQueue");
|
|
16
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
17
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
+
function groupByBadge(installations) {
|
|
20
|
+
return installations.reduce((map, installation) => {
|
|
21
|
+
const badge = installation.badge + '';
|
|
22
|
+
map[badge] = map[badge] || [];
|
|
23
|
+
map[badge].push(installation);
|
|
24
|
+
return map;
|
|
25
|
+
}, {});
|
|
26
|
+
}
|
|
27
|
+
class PushWorker {
|
|
28
|
+
constructor(pushAdapter, subscriberConfig = {}) {
|
|
29
|
+
_AdaptableController.default.validateAdapter(pushAdapter, this, _PushAdapter.PushAdapter);
|
|
30
|
+
this.adapter = pushAdapter;
|
|
31
|
+
this.channel = subscriberConfig.channel || _PushQueue.PushQueue.defaultPushChannel();
|
|
32
|
+
this.subscriber = _ParseMessageQueue.ParseMessageQueue.createSubscriber(subscriberConfig);
|
|
33
|
+
if (this.subscriber) {
|
|
34
|
+
const subscriber = this.subscriber;
|
|
35
|
+
subscriber.subscribe(this.channel);
|
|
36
|
+
subscriber.on('message', (channel, messageStr) => {
|
|
37
|
+
const workItem = JSON.parse(messageStr);
|
|
38
|
+
this.run(workItem);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
run({
|
|
43
|
+
body,
|
|
44
|
+
query,
|
|
45
|
+
pushStatus,
|
|
46
|
+
applicationId,
|
|
47
|
+
UTCOffset
|
|
48
|
+
}) {
|
|
49
|
+
const config = _Config.default.get(applicationId);
|
|
50
|
+
const auth = (0, _Auth.master)(config);
|
|
51
|
+
const where = utils.applyDeviceTokenExists(query.where);
|
|
52
|
+
delete query.where;
|
|
53
|
+
pushStatus = (0, _StatusHandler.pushStatusHandler)(config, pushStatus.objectId);
|
|
54
|
+
return _rest.default.find(config, auth, '_Installation', where, query).then(({
|
|
55
|
+
results
|
|
56
|
+
}) => {
|
|
57
|
+
if (results.length == 0) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
return this.sendToAdapter(body, results, pushStatus, config, UTCOffset);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
sendToAdapter(body, installations, pushStatus, config, UTCOffset) {
|
|
64
|
+
// Check if we have locales in the push body
|
|
65
|
+
const locales = utils.getLocalesFromPush(body);
|
|
66
|
+
if (locales.length > 0) {
|
|
67
|
+
// Get all tranformed bodies for each locale
|
|
68
|
+
const bodiesPerLocales = utils.bodiesPerLocales(body, locales);
|
|
69
|
+
|
|
70
|
+
// Group installations on the specified locales (en, fr, default etc...)
|
|
71
|
+
const grouppedInstallations = utils.groupByLocaleIdentifier(installations, locales);
|
|
72
|
+
const promises = Object.keys(grouppedInstallations).map(locale => {
|
|
73
|
+
const installations = grouppedInstallations[locale];
|
|
74
|
+
const body = bodiesPerLocales[locale];
|
|
75
|
+
return this.sendToAdapter(body, installations, pushStatus, config, UTCOffset);
|
|
76
|
+
});
|
|
77
|
+
return Promise.all(promises);
|
|
78
|
+
}
|
|
79
|
+
if (!utils.isPushIncrementing(body)) {
|
|
80
|
+
_logger.default.verbose(`Sending push to ${installations.length}`);
|
|
81
|
+
return this.adapter.send(body, installations, pushStatus.objectId).then(results => {
|
|
82
|
+
return pushStatus.trackSent(results, UTCOffset).then(() => results);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Collect the badges to reduce the # of calls
|
|
87
|
+
const badgeInstallationsMap = groupByBadge(installations);
|
|
88
|
+
|
|
89
|
+
// Map the on the badges count and return the send result
|
|
90
|
+
const promises = Object.keys(badgeInstallationsMap).map(badge => {
|
|
91
|
+
const payload = structuredClone(body);
|
|
92
|
+
payload.data.badge = parseInt(badge);
|
|
93
|
+
const installations = badgeInstallationsMap[badge];
|
|
94
|
+
return this.sendToAdapter(payload, installations, pushStatus, config, UTCOffset);
|
|
95
|
+
});
|
|
96
|
+
return Promise.all(promises);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.PushWorker = PushWorker;
|
|
100
|
+
var _default = exports.default = PushWorker;
|
|
101
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQWRhcHRhYmxlQ29udHJvbGxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX0F1dGgiLCJfQ29uZmlnIiwiX1B1c2hBZGFwdGVyIiwiX3Jlc3QiLCJfU3RhdHVzSGFuZGxlciIsInV0aWxzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfUGFyc2VNZXNzYWdlUXVldWUiLCJfUHVzaFF1ZXVlIiwiX2xvZ2dlciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdyb3VwQnlCYWRnZSIsImluc3RhbGxhdGlvbnMiLCJyZWR1Y2UiLCJtYXAiLCJpbnN0YWxsYXRpb24iLCJiYWRnZSIsInB1c2giLCJQdXNoV29ya2VyIiwiY29uc3RydWN0b3IiLCJwdXNoQWRhcHRlciIsInN1YnNjcmliZXJDb25maWciLCJBZGFwdGFibGVDb250cm9sbGVyIiwidmFsaWRhdGVBZGFwdGVyIiwiUHVzaEFkYXB0ZXIiLCJhZGFwdGVyIiwiY2hhbm5lbCIsIlB1c2hRdWV1ZSIsImRlZmF1bHRQdXNoQ2hhbm5lbCIsInN1YnNjcmliZXIiLCJQYXJzZU1lc3NhZ2VRdWV1ZSIsImNyZWF0ZVN1YnNjcmliZXIiLCJzdWJzY3JpYmUiLCJvbiIsIm1lc3NhZ2VTdHIiLCJ3b3JrSXRlbSIsIkpTT04iLCJwYXJzZSIsInJ1biIsImJvZHkiLCJxdWVyeSIsInB1c2hTdGF0dXMiLCJhcHBsaWNhdGlvbklkIiwiVVRDT2Zmc2V0IiwiY29uZmlnIiwiQ29uZmlnIiwiYXV0aCIsIm1hc3RlciIsIndoZXJlIiwiYXBwbHlEZXZpY2VUb2tlbkV4aXN0cyIsInB1c2hTdGF0dXNIYW5kbGVyIiwib2JqZWN0SWQiLCJyZXN0IiwiZmluZCIsInRoZW4iLCJyZXN1bHRzIiwibGVuZ3RoIiwic2VuZFRvQWRhcHRlciIsImxvY2FsZXMiLCJnZXRMb2NhbGVzRnJvbVB1c2giLCJib2RpZXNQZXJMb2NhbGVzIiwiZ3JvdXBwZWRJbnN0YWxsYXRpb25zIiwiZ3JvdXBCeUxvY2FsZUlkZW50aWZpZXIiLCJwcm9taXNlcyIsImtleXMiLCJsb2NhbGUiLCJQcm9taXNlIiwiYWxsIiwiaXNQdXNoSW5jcmVtZW50aW5nIiwibG9nZ2VyIiwidmVyYm9zZSIsInNlbmQiLCJ0cmFja1NlbnQiLCJiYWRnZUluc3RhbGxhdGlvbnNNYXAiLCJwYXlsb2FkIiwic3RydWN0dXJlZENsb25lIiwiZGF0YSIsInBhcnNlSW50IiwiZXhwb3J0cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1B1c2gvUHVzaFdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IEFkYXB0YWJsZUNvbnRyb2xsZXIgZnJvbSAnLi4vQ29udHJvbGxlcnMvQWRhcHRhYmxlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBtYXN0ZXIgfSBmcm9tICcuLi9BdXRoJztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcbmltcG9ydCB7IFB1c2hBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvUHVzaC9QdXNoQWRhcHRlcic7XG5pbXBvcnQgcmVzdCBmcm9tICcuLi9yZXN0JztcbmltcG9ydCB7IHB1c2hTdGF0dXNIYW5kbGVyIH0gZnJvbSAnLi4vU3RhdHVzSGFuZGxlcic7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFBhcnNlTWVzc2FnZVF1ZXVlIH0gZnJvbSAnLi4vUGFyc2VNZXNzYWdlUXVldWUnO1xuaW1wb3J0IHsgUHVzaFF1ZXVlIH0gZnJvbSAnLi9QdXNoUXVldWUnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuXG5mdW5jdGlvbiBncm91cEJ5QmFkZ2UoaW5zdGFsbGF0aW9ucykge1xuICByZXR1cm4gaW5zdGFsbGF0aW9ucy5yZWR1Y2UoKG1hcCwgaW5zdGFsbGF0aW9uKSA9PiB7XG4gICAgY29uc3QgYmFkZ2UgPSBpbnN0YWxsYXRpb24uYmFkZ2UgKyAnJztcbiAgICBtYXBbYmFkZ2VdID0gbWFwW2JhZGdlXSB8fCBbXTtcbiAgICBtYXBbYmFkZ2VdLnB1c2goaW5zdGFsbGF0aW9uKTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQdXNoV29ya2VyIHtcbiAgc3Vic2NyaWJlcjogP2FueTtcbiAgYWRhcHRlcjogYW55O1xuICBjaGFubmVsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHVzaEFkYXB0ZXI6IFB1c2hBZGFwdGVyLCBzdWJzY3JpYmVyQ29uZmlnOiBhbnkgPSB7fSkge1xuICAgIEFkYXB0YWJsZUNvbnRyb2xsZXIudmFsaWRhdGVBZGFwdGVyKHB1c2hBZGFwdGVyLCB0aGlzLCBQdXNoQWRhcHRlcik7XG4gICAgdGhpcy5hZGFwdGVyID0gcHVzaEFkYXB0ZXI7XG5cbiAgICB0aGlzLmNoYW5uZWwgPSBzdWJzY3JpYmVyQ29uZmlnLmNoYW5uZWwgfHwgUHVzaFF1ZXVlLmRlZmF1bHRQdXNoQ2hhbm5lbCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IFBhcnNlTWVzc2FnZVF1ZXVlLmNyZWF0ZVN1YnNjcmliZXIoc3Vic2NyaWJlckNvbmZpZyk7XG4gICAgaWYgKHRoaXMuc3Vic2NyaWJlcikge1xuICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IHRoaXMuc3Vic2NyaWJlcjtcbiAgICAgIHN1YnNjcmliZXIuc3Vic2NyaWJlKHRoaXMuY2hhbm5lbCk7XG4gICAgICBzdWJzY3JpYmVyLm9uKCdtZXNzYWdlJywgKGNoYW5uZWwsIG1lc3NhZ2VTdHIpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya0l0ZW0gPSBKU09OLnBhcnNlKG1lc3NhZ2VTdHIpO1xuICAgICAgICB0aGlzLnJ1bih3b3JrSXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBydW4oeyBib2R5LCBxdWVyeSwgcHVzaFN0YXR1cywgYXBwbGljYXRpb25JZCwgVVRDT2Zmc2V0IH06IGFueSk6IFByb21pc2U8Kj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IENvbmZpZy5nZXQoYXBwbGljYXRpb25JZCk7XG4gICAgY29uc3QgYXV0aCA9IG1hc3Rlcihjb25maWcpO1xuICAgIGNvbnN0IHdoZXJlID0gdXRpbHMuYXBwbHlEZXZpY2VUb2tlbkV4aXN0cyhxdWVyeS53aGVyZSk7XG4gICAgZGVsZXRlIHF1ZXJ5LndoZXJlO1xuICAgIHB1c2hTdGF0dXMgPSBwdXNoU3RhdHVzSGFuZGxlcihjb25maWcsIHB1c2hTdGF0dXMub2JqZWN0SWQpO1xuICAgIHJldHVybiByZXN0LmZpbmQoY29uZmlnLCBhdXRoLCAnX0luc3RhbGxhdGlvbicsIHdoZXJlLCBxdWVyeSkudGhlbigoeyByZXN1bHRzIH0pID0+IHtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNlbmRUb0FkYXB0ZXIoYm9keSwgcmVzdWx0cywgcHVzaFN0YXR1cywgY29uZmlnLCBVVENPZmZzZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFRvQWRhcHRlcihcbiAgICBib2R5OiBhbnksXG4gICAgaW5zdGFsbGF0aW9uczogYW55W10sXG4gICAgcHVzaFN0YXR1czogYW55LFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIFVUQ09mZnNldDogP2FueVxuICApOiBQcm9taXNlPCo+IHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGxvY2FsZXMgaW4gdGhlIHB1c2ggYm9keVxuICAgIGNvbnN0IGxvY2FsZXMgPSB1dGlscy5nZXRMb2NhbGVzRnJvbVB1c2goYm9keSk7XG4gICAgaWYgKGxvY2FsZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IGFsbCB0cmFuZm9ybWVkIGJvZGllcyBmb3IgZWFjaCBsb2NhbGVcbiAgICAgIGNvbnN0IGJvZGllc1BlckxvY2FsZXMgPSB1dGlscy5ib2RpZXNQZXJMb2NhbGVzKGJvZHksIGxvY2FsZXMpO1xuXG4gICAgICAvLyBHcm91cCBpbnN0YWxsYXRpb25zIG9uIHRoZSBzcGVjaWZpZWQgbG9jYWxlcyAoZW4sIGZyLCBkZWZhdWx0IGV0Yy4uLilcbiAgICAgIGNvbnN0IGdyb3VwcGVkSW5zdGFsbGF0aW9ucyA9IHV0aWxzLmdyb3VwQnlMb2NhbGVJZGVudGlmaWVyKGluc3RhbGxhdGlvbnMsIGxvY2FsZXMpO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3Qua2V5cyhncm91cHBlZEluc3RhbGxhdGlvbnMpLm1hcChsb2NhbGUgPT4ge1xuICAgICAgICBjb25zdCBpbnN0YWxsYXRpb25zID0gZ3JvdXBwZWRJbnN0YWxsYXRpb25zW2xvY2FsZV07XG4gICAgICAgIGNvbnN0IGJvZHkgPSBib2RpZXNQZXJMb2NhbGVzW2xvY2FsZV07XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRUb0FkYXB0ZXIoYm9keSwgaW5zdGFsbGF0aW9ucywgcHVzaFN0YXR1cywgY29uZmlnLCBVVENPZmZzZXQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cblxuICAgIGlmICghdXRpbHMuaXNQdXNoSW5jcmVtZW50aW5nKGJvZHkpKSB7XG4gICAgICBsb2dnZXIudmVyYm9zZShgU2VuZGluZyBwdXNoIHRvICR7aW5zdGFsbGF0aW9ucy5sZW5ndGh9YCk7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnNlbmQoYm9keSwgaW5zdGFsbGF0aW9ucywgcHVzaFN0YXR1cy5vYmplY3RJZCkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgcmV0dXJuIHB1c2hTdGF0dXMudHJhY2tTZW50KHJlc3VsdHMsIFVUQ09mZnNldCkudGhlbigoKSA9PiByZXN1bHRzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgdGhlIGJhZGdlcyB0byByZWR1Y2UgdGhlICMgb2YgY2FsbHNcbiAgICBjb25zdCBiYWRnZUluc3RhbGxhdGlvbnNNYXAgPSBncm91cEJ5QmFkZ2UoaW5zdGFsbGF0aW9ucyk7XG5cbiAgICAvLyBNYXAgdGhlIG9uIHRoZSBiYWRnZXMgY291bnQgYW5kIHJldHVybiB0aGUgc2VuZCByZXN1bHRcbiAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5rZXlzKGJhZGdlSW5zdGFsbGF0aW9uc01hcCkubWFwKGJhZGdlID0+IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBzdHJ1Y3R1cmVkQ2xvbmUoYm9keSk7XG4gICAgICBwYXlsb2FkLmRhdGEuYmFkZ2UgPSBwYXJzZUludChiYWRnZSk7XG4gICAgICBjb25zdCBpbnN0YWxsYXRpb25zID0gYmFkZ2VJbnN0YWxsYXRpb25zTWFwW2JhZGdlXTtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRUb0FkYXB0ZXIocGF5bG9hZCwgaW5zdGFsbGF0aW9ucywgcHVzaFN0YXR1cywgY29uZmlnLCBVVENPZmZzZXQpO1xuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVzaFdvcmtlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsb0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGNBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQVAsT0FBQTtBQUNBLElBQUFRLGtCQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxVQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxPQUFBLEdBQUFYLHNCQUFB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
|