@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,341 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FunctionsRouter = void 0;
7
+ var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
8
+ var _middlewares = require("../middlewares");
9
+ var _StatusHandler = require("../StatusHandler");
10
+ var _lodash = _interopRequireDefault(require("lodash"));
11
+ var _logger = require("../logger");
12
+ var _Error = require("../Error");
13
+ var _busboy = _interopRequireDefault(require("@fastify/busboy"));
14
+ var _Utils = _interopRequireDefault(require("../Utils"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ // FunctionsRouter.js
17
+
18
+ var Parse = require('parse/node').Parse,
19
+ triggers = require('../triggers');
20
+ function redactBuffers(obj) {
21
+ if (Buffer.isBuffer(obj)) {
22
+ return `[Buffer: ${obj.length} bytes]`;
23
+ }
24
+ if (Array.isArray(obj)) {
25
+ return obj.map(redactBuffers);
26
+ }
27
+ if (obj && typeof obj === 'object') {
28
+ const result = {};
29
+ for (const key of Object.keys(obj)) {
30
+ result[key] = redactBuffers(obj[key]);
31
+ }
32
+ return result;
33
+ }
34
+ return obj;
35
+ }
36
+ function parseObject(obj, config) {
37
+ if (Array.isArray(obj)) {
38
+ return obj.map(item => {
39
+ return parseObject(item, config);
40
+ });
41
+ } else if (obj && obj.__type == 'Date') {
42
+ return Object.assign(new Date(obj.iso), obj);
43
+ } else if (obj && obj.__type == 'File') {
44
+ if (obj.url) {
45
+ const {
46
+ validateFileUrl
47
+ } = require('../FileUrlValidator');
48
+ validateFileUrl(obj.url, config);
49
+ }
50
+ return Parse.File.fromJSON(obj);
51
+ } else if (obj && obj.__type == 'Pointer') {
52
+ return Parse.Object.fromJSON({
53
+ __type: 'Pointer',
54
+ className: obj.className,
55
+ objectId: obj.objectId
56
+ });
57
+ } else if (Buffer.isBuffer(obj)) {
58
+ return obj;
59
+ } else if (obj && typeof obj === 'object') {
60
+ return parseParams(obj, config);
61
+ } else {
62
+ return obj;
63
+ }
64
+ }
65
+ function parseParams(params, config) {
66
+ return _lodash.default.mapValues(params, item => parseObject(item, config));
67
+ }
68
+ class FunctionsRouter extends _PromiseRouter.default {
69
+ mountRoutes() {
70
+ this.route('POST', '/functions/:functionName', _middlewares.promiseEnsureIdempotency, FunctionsRouter.multipartMiddleware, FunctionsRouter.handleCloudFunction);
71
+ this.route('POST', '/jobs/:jobName', _middlewares.promiseEnsureIdempotency, _middlewares.promiseEnforceMasterKeyAccess, function (req) {
72
+ return FunctionsRouter.handleCloudJob(req);
73
+ });
74
+ this.route('POST', '/jobs', _middlewares.promiseEnforceMasterKeyAccess, function (req) {
75
+ return FunctionsRouter.handleCloudJob(req);
76
+ });
77
+ }
78
+ static handleCloudJob(req) {
79
+ if (req.auth.isReadOnly) {
80
+ throw (0, _Error.createSanitizedError)(Parse.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to run a job.", req.config);
81
+ }
82
+ const jobName = req.params.jobName || req.body?.jobName;
83
+ const applicationId = req.config.applicationId;
84
+ const jobHandler = (0, _StatusHandler.jobStatusHandler)(req.config);
85
+ const jobFunction = triggers.getJob(jobName, applicationId);
86
+ if (!jobFunction) {
87
+ throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Invalid job.');
88
+ }
89
+ let params = Object.assign({}, req.body, req.query);
90
+ params = parseParams(params, req.config);
91
+ const request = {
92
+ params: params,
93
+ log: req.config.loggerController,
94
+ headers: req.config.headers,
95
+ ip: req.config.ip,
96
+ jobName,
97
+ config: req.config,
98
+ message: jobHandler.setMessage.bind(jobHandler)
99
+ };
100
+ return jobHandler.setRunning(jobName).then(jobStatus => {
101
+ request.jobId = jobStatus.objectId;
102
+ // run the function async
103
+ process.nextTick(() => {
104
+ Promise.resolve().then(() => {
105
+ return jobFunction(request);
106
+ }).then(result => {
107
+ jobHandler.setSucceeded(result);
108
+ }, error => {
109
+ jobHandler.setFailed(error);
110
+ });
111
+ });
112
+ return {
113
+ headers: {
114
+ 'X-Parse-Job-Status-Id': jobStatus.objectId
115
+ },
116
+ response: {}
117
+ };
118
+ });
119
+ }
120
+ static createResponseObject(resolve, reject, statusCode = null) {
121
+ let httpStatusCode = statusCode;
122
+ const customHeaders = {};
123
+ let responseSent = false;
124
+ const responseObject = {
125
+ success: function (result) {
126
+ if (responseSent) {
127
+ throw new Error('Cannot call success() after response has already been sent. Make sure to call success() or error() only once per cloud function execution.');
128
+ }
129
+ responseSent = true;
130
+ const response = {
131
+ response: {
132
+ result: Parse._encode(result)
133
+ }
134
+ };
135
+ if (httpStatusCode !== null) {
136
+ response.status = httpStatusCode;
137
+ }
138
+ if (Object.keys(customHeaders).length > 0) {
139
+ response.headers = customHeaders;
140
+ }
141
+ resolve(response);
142
+ },
143
+ error: function (message) {
144
+ if (responseSent) {
145
+ throw new Error('Cannot call error() after response has already been sent. Make sure to call success() or error() only once per cloud function execution.');
146
+ }
147
+ responseSent = true;
148
+ const error = triggers.resolveError(message);
149
+ // If a custom status code was set, attach it to the error
150
+ if (httpStatusCode !== null) {
151
+ error.status = httpStatusCode;
152
+ }
153
+ reject(error);
154
+ },
155
+ status: function (code) {
156
+ httpStatusCode = code;
157
+ return responseObject;
158
+ },
159
+ header: function (key, value) {
160
+ customHeaders[key] = value;
161
+ return responseObject;
162
+ },
163
+ _isResponseSent: () => responseSent
164
+ };
165
+ return responseObject;
166
+ }
167
+
168
+ /**
169
+ * Parses multipart/form-data requests for Cloud Function invocation.
170
+ * For non-multipart requests, this is a no-op.
171
+ *
172
+ * Text fields are set as strings in `req.body`. File fields are set as
173
+ * objects with the shape `{ filename: string, contentType: string, data: Buffer }`.
174
+ * All fields are merged flat into `req.body`; the caller is responsible for
175
+ * avoiding name collisions between text and file fields.
176
+ *
177
+ * The total request size is limited by the server's `maxUploadSize` option.
178
+ */
179
+ static multipartMiddleware(req) {
180
+ if (!req.is || !req.is('multipart/form-data')) {
181
+ return Promise.resolve();
182
+ }
183
+ const maxBytes = _Utils.default.parseSizeToBytes(req.config.maxUploadSize);
184
+ return new Promise((resolve, reject) => {
185
+ const fields = Object.create(null);
186
+ let totalBytes = 0;
187
+ let settled = false;
188
+ let busboy;
189
+ try {
190
+ busboy = (0, _busboy.default)({
191
+ headers: req.headers,
192
+ limits: {
193
+ fieldSize: maxBytes
194
+ }
195
+ });
196
+ } catch (err) {
197
+ return reject(new Parse.Error(Parse.Error.INVALID_JSON, `Invalid multipart request: ${err.message}`));
198
+ }
199
+ const safeReject = err => {
200
+ if (settled) {
201
+ return;
202
+ }
203
+ settled = true;
204
+ busboy.destroy();
205
+ reject(err);
206
+ };
207
+ busboy.on('field', (name, value, fieldnameTruncated, valueTruncated) => {
208
+ if (valueTruncated) {
209
+ return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
210
+ }
211
+ totalBytes += Buffer.byteLength(value);
212
+ if (totalBytes > maxBytes) {
213
+ return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
214
+ }
215
+ fields[name] = value;
216
+ });
217
+ busboy.on('file', (name, stream, filename, transferEncoding, mimeType) => {
218
+ const chunks = [];
219
+ stream.on('data', chunk => {
220
+ totalBytes += chunk.length;
221
+ if (totalBytes > maxBytes) {
222
+ stream.destroy();
223
+ return safeReject(new Parse.Error(Parse.Error.OBJECT_TOO_LARGE, 'Multipart request exceeds maximum upload size.'));
224
+ }
225
+ chunks.push(chunk);
226
+ });
227
+ stream.on('end', () => {
228
+ if (settled) {
229
+ return;
230
+ }
231
+ fields[name] = {
232
+ filename,
233
+ contentType: mimeType || 'application/octet-stream',
234
+ data: Buffer.concat(chunks)
235
+ };
236
+ });
237
+ });
238
+ busboy.on('finish', () => {
239
+ if (settled) {
240
+ return;
241
+ }
242
+ settled = true;
243
+ req.body = fields;
244
+ resolve();
245
+ });
246
+ busboy.on('error', err => {
247
+ safeReject(new Parse.Error(Parse.Error.INVALID_JSON, `Invalid multipart request: ${err.message}`));
248
+ });
249
+ req.pipe(busboy);
250
+ });
251
+ }
252
+ static handleCloudFunction(req) {
253
+ const functionName = req.params.functionName;
254
+ const applicationId = req.config.applicationId;
255
+ const theFunction = triggers.getFunction(functionName, applicationId);
256
+ if (!theFunction) {
257
+ throw new Parse.Error(Parse.Error.SCRIPT_FAILED, `Invalid function: "${functionName}"`);
258
+ }
259
+ let params = Object.assign({}, req.body, req.query);
260
+ params = parseParams(params, req.config);
261
+ const request = {
262
+ params: params,
263
+ config: req.config,
264
+ master: req.auth && req.auth.isMaster,
265
+ isReadOnly: !!(req.auth && req.auth.isReadOnly),
266
+ user: req.auth && req.auth.user,
267
+ installationId: req.info.installationId,
268
+ log: req.config.loggerController,
269
+ headers: req.config.headers,
270
+ ip: req.config.ip,
271
+ functionName,
272
+ context: req.info.context
273
+ };
274
+ return new Promise(function (resolve, reject) {
275
+ const userString = req.auth && req.auth.user ? req.auth.user.id : undefined;
276
+ const responseObject = FunctionsRouter.createResponseObject(result => {
277
+ try {
278
+ if (req.config.logLevels.cloudFunctionSuccess !== 'silent') {
279
+ const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(redactBuffers(params)));
280
+ const cleanResult = _logger.logger.truncateLogMessage(JSON.stringify(result.response.result));
281
+ _logger.logger[req.config.logLevels.cloudFunctionSuccess](`Ran cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Result: ${cleanResult}`, {
282
+ functionName,
283
+ params,
284
+ user: userString
285
+ });
286
+ }
287
+ resolve(result);
288
+ } catch (e) {
289
+ reject(e);
290
+ }
291
+ }, error => {
292
+ try {
293
+ if (req.config.logLevels.cloudFunctionError !== 'silent') {
294
+ const cleanInput = _logger.logger.truncateLogMessage(JSON.stringify(redactBuffers(params)));
295
+ _logger.logger[req.config.logLevels.cloudFunctionError](`Failed running cloud function ${functionName} for user ${userString} with:\n Input: ${cleanInput}\n Error: ` + JSON.stringify(error), {
296
+ functionName,
297
+ error,
298
+ params,
299
+ user: userString
300
+ });
301
+ }
302
+ reject(error);
303
+ } catch (e) {
304
+ reject(e);
305
+ }
306
+ });
307
+ const {
308
+ success,
309
+ error
310
+ } = responseObject;
311
+ return Promise.resolve().then(() => {
312
+ return triggers.maybeRunValidator(request, functionName, req.auth);
313
+ }).then(() => {
314
+ // Check if function expects 2 parameters (req, res) - Express style
315
+ if (theFunction.length >= 2) {
316
+ return theFunction(request, responseObject);
317
+ } else {
318
+ // Traditional style - single parameter
319
+ return theFunction(request);
320
+ }
321
+ }).then(result => {
322
+ // For Express-style functions, only send response if not already sent
323
+ if (theFunction.length >= 2) {
324
+ if (!responseObject._isResponseSent()) {
325
+ // If Express-style function returns a value without calling res.success/error
326
+ if (result !== undefined) {
327
+ success(result);
328
+ }
329
+ // If no response sent and no value returned, this is an error in user code
330
+ // but we don't handle it here to maintain backward compatibility
331
+ }
332
+ } else {
333
+ // For traditional functions, always call success with the result (even if undefined)
334
+ success(result);
335
+ }
336
+ }, error);
337
+ });
338
+ }
339
+ }
340
+ exports.FunctionsRouter = FunctionsRouter;
341
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUHJvbWlzZVJvdXRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX21pZGRsZXdhcmVzIiwiX1N0YXR1c0hhbmRsZXIiLCJfbG9kYXNoIiwiX2xvZ2dlciIsIl9FcnJvciIsIl9idXNib3kiLCJfVXRpbHMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZSIsInRyaWdnZXJzIiwicmVkYWN0QnVmZmVycyIsIm9iaiIsIkJ1ZmZlciIsImlzQnVmZmVyIiwibGVuZ3RoIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwicmVzdWx0Iiwia2V5IiwiT2JqZWN0Iiwia2V5cyIsInBhcnNlT2JqZWN0IiwiY29uZmlnIiwiaXRlbSIsIl9fdHlwZSIsImFzc2lnbiIsIkRhdGUiLCJpc28iLCJ1cmwiLCJ2YWxpZGF0ZUZpbGVVcmwiLCJGaWxlIiwiZnJvbUpTT04iLCJjbGFzc05hbWUiLCJvYmplY3RJZCIsInBhcnNlUGFyYW1zIiwicGFyYW1zIiwiXyIsIm1hcFZhbHVlcyIsIkZ1bmN0aW9uc1JvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJtb3VudFJvdXRlcyIsInJvdXRlIiwicHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IiwibXVsdGlwYXJ0TWlkZGxld2FyZSIsImhhbmRsZUNsb3VkRnVuY3Rpb24iLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsInJlcSIsImhhbmRsZUNsb3VkSm9iIiwiYXV0aCIsImlzUmVhZE9ubHkiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsIkVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImpvYk5hbWUiLCJib2R5IiwiYXBwbGljYXRpb25JZCIsImpvYkhhbmRsZXIiLCJqb2JTdGF0dXNIYW5kbGVyIiwiam9iRnVuY3Rpb24iLCJnZXRKb2IiLCJTQ1JJUFRfRkFJTEVEIiwicXVlcnkiLCJyZXF1ZXN0IiwibG9nIiwibG9nZ2VyQ29udHJvbGxlciIsImhlYWRlcnMiLCJpcCIsIm1lc3NhZ2UiLCJzZXRNZXNzYWdlIiwiYmluZCIsInNldFJ1bm5pbmciLCJ0aGVuIiwiam9iU3RhdHVzIiwiam9iSWQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFN1Y2NlZWRlZCIsImVycm9yIiwic2V0RmFpbGVkIiwicmVzcG9uc2UiLCJjcmVhdGVSZXNwb25zZU9iamVjdCIsInJlamVjdCIsInN0YXR1c0NvZGUiLCJodHRwU3RhdHVzQ29kZSIsImN1c3RvbUhlYWRlcnMiLCJyZXNwb25zZVNlbnQiLCJyZXNwb25zZU9iamVjdCIsInN1Y2Nlc3MiLCJfZW5jb2RlIiwic3RhdHVzIiwicmVzb2x2ZUVycm9yIiwiY29kZSIsImhlYWRlciIsInZhbHVlIiwiX2lzUmVzcG9uc2VTZW50IiwiaXMiLCJtYXhCeXRlcyIsIlV0aWxzIiwicGFyc2VTaXplVG9CeXRlcyIsIm1heFVwbG9hZFNpemUiLCJmaWVsZHMiLCJjcmVhdGUiLCJ0b3RhbEJ5dGVzIiwic2V0dGxlZCIsImJ1c2JveSIsIkJ1c2JveSIsImxpbWl0cyIsImZpZWxkU2l6ZSIsImVyciIsIklOVkFMSURfSlNPTiIsInNhZmVSZWplY3QiLCJkZXN0cm95Iiwib24iLCJuYW1lIiwiZmllbGRuYW1lVHJ1bmNhdGVkIiwidmFsdWVUcnVuY2F0ZWQiLCJPQkpFQ1RfVE9PX0xBUkdFIiwiYnl0ZUxlbmd0aCIsInN0cmVhbSIsImZpbGVuYW1lIiwidHJhbnNmZXJFbmNvZGluZyIsIm1pbWVUeXBlIiwiY2h1bmtzIiwiY2h1bmsiLCJwdXNoIiwiY29udGVudFR5cGUiLCJkYXRhIiwiY29uY2F0IiwicGlwZSIsImZ1bmN0aW9uTmFtZSIsInRoZUZ1bmN0aW9uIiwiZ2V0RnVuY3Rpb24iLCJtYXN0ZXIiLCJpc01hc3RlciIsInVzZXIiLCJpbnN0YWxsYXRpb25JZCIsImluZm8iLCJjb250ZXh0IiwidXNlclN0cmluZyIsImlkIiwidW5kZWZpbmVkIiwibG9nTGV2ZWxzIiwiY2xvdWRGdW5jdGlvblN1Y2Nlc3MiLCJjbGVhbklucHV0IiwibG9nZ2VyIiwidHJ1bmNhdGVMb2dNZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFuUmVzdWx0IiwiY2xvdWRGdW5jdGlvbkVycm9yIiwibWF5YmVSdW5WYWxpZGF0b3IiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL1JvdXRlcnMvRnVuY3Rpb25zUm91dGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZ1bmN0aW9uc1JvdXRlci5qc1xuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2UsXG4gIHRyaWdnZXJzID0gcmVxdWlyZSgnLi4vdHJpZ2dlcnMnKTtcblxuaW1wb3J0IFByb21pc2VSb3V0ZXIgZnJvbSAnLi4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgeyBwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcHJvbWlzZUVuc3VyZUlkZW1wb3RlbmN5IH0gZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0IHsgam9iU3RhdHVzSGFuZGxlciB9IGZyb20gJy4uL1N0YXR1c0hhbmRsZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZWRFcnJvciB9IGZyb20gJy4uL0Vycm9yJztcbmltcG9ydCBCdXNib3kgZnJvbSAnQGZhc3RpZnkvYnVzYm95JztcbmltcG9ydCBVdGlscyBmcm9tICcuLi9VdGlscyc7XG5cbmZ1bmN0aW9uIHJlZGFjdEJ1ZmZlcnMob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHJldHVybiBgW0J1ZmZlcjogJHtvYmoubGVuZ3RofSBieXRlc11gO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcChyZWRhY3RCdWZmZXJzKTtcbiAgfVxuICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSByZWRhY3RCdWZmZXJzKG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdChvYmosIGNvbmZpZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VPYmplY3QoaXRlbSwgY29uZmlnKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChvYmogJiYgb2JqLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRGF0ZShvYmouaXNvKSwgb2JqKTtcbiAgfSBlbHNlIGlmIChvYmogJiYgb2JqLl9fdHlwZSA9PSAnRmlsZScpIHtcbiAgICBpZiAob2JqLnVybCkge1xuICAgICAgY29uc3QgeyB2YWxpZGF0ZUZpbGVVcmwgfSA9IHJlcXVpcmUoJy4uL0ZpbGVVcmxWYWxpZGF0b3InKTtcbiAgICAgIHZhbGlkYXRlRmlsZVVybChvYmoudXJsLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2UuRmlsZS5mcm9tSlNPTihvYmopO1xuICB9IGVsc2UgaWYgKG9iaiAmJiBvYmouX190eXBlID09ICdQb2ludGVyJykge1xuICAgIHJldHVybiBQYXJzZS5PYmplY3QuZnJvbUpTT04oe1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IG9iai5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gcGFyc2VQYXJhbXMob2JqLCBjb25maWcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJhbXMocGFyYW1zLCBjb25maWcpIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHBhcmFtcywgaXRlbSA9PiBwYXJzZU9iamVjdChpdGVtLCBjb25maWcpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc1JvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9mdW5jdGlvbnMvOmZ1bmN0aW9uTmFtZScsXG4gICAgICBwcm9taXNlRW5zdXJlSWRlbXBvdGVuY3ksXG4gICAgICBGdW5jdGlvbnNSb3V0ZXIubXVsdGlwYXJ0TWlkZGxld2FyZSxcbiAgICAgIEZ1bmN0aW9uc1JvdXRlci5oYW5kbGVDbG91ZEZ1bmN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9qb2JzLzpqb2JOYW1lJyxcbiAgICAgIHByb21pc2VFbnN1cmVJZGVtcG90ZW5jeSxcbiAgICAgIHByb21pc2VFbmZvcmNlTWFzdGVyS2V5QWNjZXNzLFxuICAgICAgZnVuY3Rpb24gKHJlcSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25zUm91dGVyLmhhbmRsZUNsb3VkSm9iKHJlcSk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJvdXRlKCdQT1NUJywgJy9qb2JzJywgcHJvbWlzZUVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsIGZ1bmN0aW9uIChyZXEpIHtcbiAgICAgIHJldHVybiBGdW5jdGlvbnNSb3V0ZXIuaGFuZGxlQ2xvdWRKb2IocmVxKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVDbG91ZEpvYihyZXEpIHtcbiAgICBpZiAocmVxLmF1dGguaXNSZWFkT25seSkge1xuICAgICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgIFwicmVhZC1vbmx5IG1hc3RlcktleSBpc24ndCBhbGxvd2VkIHRvIHJ1biBhIGpvYi5cIixcbiAgICAgICAgcmVxLmNvbmZpZ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgam9iTmFtZSA9IHJlcS5wYXJhbXMuam9iTmFtZSB8fCByZXEuYm9keT8uam9iTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gcmVxLmNvbmZpZy5hcHBsaWNhdGlvbklkO1xuICAgIGNvbnN0IGpvYkhhbmRsZXIgPSBqb2JTdGF0dXNIYW5kbGVyKHJlcS5jb25maWcpO1xuICAgIGNvbnN0IGpvYkZ1bmN0aW9uID0gdHJpZ2dlcnMuZ2V0Sm9iKGpvYk5hbWUsIGFwcGxpY2F0aW9uSWQpO1xuICAgIGlmICgham9iRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TQ1JJUFRfRkFJTEVELCAnSW52YWxpZCBqb2IuJyk7XG4gICAgfVxuICAgIGxldCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCByZXEuYm9keSwgcmVxLnF1ZXJ5KTtcbiAgICBwYXJhbXMgPSBwYXJzZVBhcmFtcyhwYXJhbXMsIHJlcS5jb25maWcpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgIGxvZzogcmVxLmNvbmZpZy5sb2dnZXJDb250cm9sbGVyLFxuICAgICAgaGVhZGVyczogcmVxLmNvbmZpZy5oZWFkZXJzLFxuICAgICAgaXA6IHJlcS5jb25maWcuaXAsXG4gICAgICBqb2JOYW1lLFxuICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgbWVzc2FnZTogam9iSGFuZGxlci5zZXRNZXNzYWdlLmJpbmQoam9iSGFuZGxlciksXG4gICAgfTtcblxuICAgIHJldHVybiBqb2JIYW5kbGVyLnNldFJ1bm5pbmcoam9iTmFtZSkudGhlbihqb2JTdGF0dXMgPT4ge1xuICAgICAgcmVxdWVzdC5qb2JJZCA9IGpvYlN0YXR1cy5vYmplY3RJZDtcbiAgICAgIC8vIHJ1biB0aGUgZnVuY3Rpb24gYXN5bmNcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBqb2JGdW5jdGlvbihyZXF1ZXN0KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgam9iSGFuZGxlci5zZXRTdWNjZWVkZWQocmVzdWx0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGpvYkhhbmRsZXIuc2V0RmFpbGVkKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1gtUGFyc2UtSm9iLVN0YXR1cy1JZCc6IGpvYlN0YXR1cy5vYmplY3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzcG9uc2U6IHt9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSZXNwb25zZU9iamVjdChyZXNvbHZlLCByZWplY3QsIHN0YXR1c0NvZGUgPSBudWxsKSB7XG4gICAgbGV0IGh0dHBTdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0ge307XG4gICAgbGV0IHJlc3BvbnNlU2VudCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3BvbnNlT2JqZWN0ID0ge1xuICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzcG9uc2VTZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBzdWNjZXNzKCkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBNYWtlIHN1cmUgdG8gY2FsbCBzdWNjZXNzKCkgb3IgZXJyb3IoKSBvbmx5IG9uY2UgcGVyIGNsb3VkIGZ1bmN0aW9uIGV4ZWN1dGlvbi4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZVNlbnQgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcmVzdWx0OiBQYXJzZS5fZW5jb2RlKHJlc3VsdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGh0dHBTdGF0dXNDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gaHR0cFN0YXR1c0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN1c3RvbUhlYWRlcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gY3VzdG9tSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlU2VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNhbGwgZXJyb3IoKSBhZnRlciByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuIE1ha2Ugc3VyZSB0byBjYWxsIHN1Y2Nlc3MoKSBvciBlcnJvcigpIG9ubHkgb25jZSBwZXIgY2xvdWQgZnVuY3Rpb24gZXhlY3V0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlU2VudCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdHJpZ2dlcnMucmVzb2x2ZUVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAvLyBJZiBhIGN1c3RvbSBzdGF0dXMgY29kZSB3YXMgc2V0LCBhdHRhY2ggaXQgdG8gdGhlIGVycm9yXG4gICAgICAgIGlmIChodHRwU3RhdHVzQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9yLnN0YXR1cyA9IGh0dHBTdGF0dXNDb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICAgc3RhdHVzOiBmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICBodHRwU3RhdHVzQ29kZSA9IGNvZGU7XG4gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDtcbiAgICAgIH0sXG4gICAgICBoZWFkZXI6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGN1c3RvbUhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7XG4gICAgICB9LFxuICAgICAgX2lzUmVzcG9uc2VTZW50OiAoKSA9PiByZXNwb25zZVNlbnQsXG4gICAgfTtcbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdHMgZm9yIENsb3VkIEZ1bmN0aW9uIGludm9jYXRpb24uXG4gICAqIEZvciBub24tbXVsdGlwYXJ0IHJlcXVlc3RzLCB0aGlzIGlzIGEgbm8tb3AuXG4gICAqXG4gICAqIFRleHQgZmllbGRzIGFyZSBzZXQgYXMgc3RyaW5ncyBpbiBgcmVxLmJvZHlgLiBGaWxlIGZpZWxkcyBhcmUgc2V0IGFzXG4gICAqIG9iamVjdHMgd2l0aCB0aGUgc2hhcGUgYHsgZmlsZW5hbWU6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZywgZGF0YTogQnVmZmVyIH1gLlxuICAgKiBBbGwgZmllbGRzIGFyZSBtZXJnZWQgZmxhdCBpbnRvIGByZXEuYm9keWA7IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gICAqIGF2b2lkaW5nIG5hbWUgY29sbGlzaW9ucyBiZXR3ZWVuIHRleHQgYW5kIGZpbGUgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgdG90YWwgcmVxdWVzdCBzaXplIGlzIGxpbWl0ZWQgYnkgdGhlIHNlcnZlcidzIGBtYXhVcGxvYWRTaXplYCBvcHRpb24uXG4gICAqL1xuICBzdGF0aWMgbXVsdGlwYXJ0TWlkZGxld2FyZShyZXEpIHtcbiAgICBpZiAoIXJlcS5pcyB8fCAhcmVxLmlzKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBVdGlscy5wYXJzZVNpemVUb0J5dGVzKHJlcS5jb25maWcubWF4VXBsb2FkU2l6ZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGJ1c2JveTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1c2JveSA9IEJ1c2JveSh7IGhlYWRlcnM6IHJlcS5oZWFkZXJzLCBsaW1pdHM6IHsgZmllbGRTaXplOiBtYXhCeXRlcyB9IH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgYEludmFsaWQgbXVsdGlwYXJ0IHJlcXVlc3Q6ICR7ZXJyLm1lc3NhZ2V9YClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhZmVSZWplY3QgPSAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBidXNib3kuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG4gICAgICBidXNib3kub24oJ2ZpZWxkJywgKG5hbWUsIHZhbHVlLCBmaWVsZG5hbWVUcnVuY2F0ZWQsIHZhbHVlVHJ1bmNhdGVkKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZVRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiBzYWZlUmVqZWN0KFxuICAgICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfVE9PX0xBUkdFLFxuICAgICAgICAgICAgICAnTXVsdGlwYXJ0IHJlcXVlc3QgZXhjZWVkcyBtYXhpbXVtIHVwbG9hZCBzaXplLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRvdGFsQnl0ZXMgKz0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICAgICAgICBpZiAodG90YWxCeXRlcyA+IG1heEJ5dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHNhZmVSZWplY3QoXG4gICAgICAgICAgICBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9UT09fTEFSR0UsXG4gICAgICAgICAgICAgICdNdWx0aXBhcnQgcmVxdWVzdCBleGNlZWRzIG1heGltdW0gdXBsb2FkIHNpemUuJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzW25hbWVdID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGJ1c2JveS5vbignZmlsZScsIChuYW1lLCBzdHJlYW0sIGZpbGVuYW1lLCB0cmFuc2ZlckVuY29kaW5nLCBtaW1lVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgc3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgIGlmICh0b3RhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgICAgIHN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICByZXR1cm4gc2FmZVJlamVjdChcbiAgICAgICAgICAgICAgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9UT09fTEFSR0UsXG4gICAgICAgICAgICAgICAgJ011bHRpcGFydCByZXF1ZXN0IGV4Y2VlZHMgbWF4aW11bSB1cGxvYWQgc2l6ZS4nXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgY29udGVudFR5cGU6IG1pbWVUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICAgICAgZGF0YTogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBidXNib3kub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlcS5ib2R5ID0gZmllbGRzO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIGJ1c2JveS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICBzYWZlUmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sIGBJbnZhbGlkIG11bHRpcGFydCByZXF1ZXN0OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5waXBlKGJ1c2JveSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlQ2xvdWRGdW5jdGlvbihyZXEpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSByZXEucGFyYW1zLmZ1bmN0aW9uTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gcmVxLmNvbmZpZy5hcHBsaWNhdGlvbklkO1xuICAgIGNvbnN0IHRoZUZ1bmN0aW9uID0gdHJpZ2dlcnMuZ2V0RnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBhcHBsaWNhdGlvbklkKTtcblxuICAgIGlmICghdGhlRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5TQ1JJUFRfRkFJTEVELCBgSW52YWxpZCBmdW5jdGlvbjogXCIke2Z1bmN0aW9uTmFtZX1cImApO1xuICAgIH1cbiAgICBsZXQgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgcmVxLmJvZHksIHJlcS5xdWVyeSk7XG4gICAgcGFyYW1zID0gcGFyc2VQYXJhbXMocGFyYW1zLCByZXEuY29uZmlnKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICBtYXN0ZXI6IHJlcS5hdXRoICYmIHJlcS5hdXRoLmlzTWFzdGVyLFxuICAgICAgaXNSZWFkT25seTogISEocmVxLmF1dGggJiYgcmVxLmF1dGguaXNSZWFkT25seSksXG4gICAgICB1c2VyOiByZXEuYXV0aCAmJiByZXEuYXV0aC51c2VyLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHJlcS5pbmZvLmluc3RhbGxhdGlvbklkLFxuICAgICAgbG9nOiByZXEuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIsXG4gICAgICBoZWFkZXJzOiByZXEuY29uZmlnLmhlYWRlcnMsXG4gICAgICBpcDogcmVxLmNvbmZpZy5pcCxcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGNvbnRleHQ6IHJlcS5pbmZvLmNvbnRleHQsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBjb25zdCB1c2VyU3RyaW5nID0gcmVxLmF1dGggJiYgcmVxLmF1dGgudXNlciA/IHJlcS5hdXRoLnVzZXIuaWQgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IEZ1bmN0aW9uc1JvdXRlci5jcmVhdGVSZXNwb25zZU9iamVjdChcbiAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25TdWNjZXNzICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBjbGVhbklucHV0ID0gbG9nZ2VyLnRydW5jYXRlTG9nTWVzc2FnZShKU09OLnN0cmluZ2lmeShyZWRhY3RCdWZmZXJzKHBhcmFtcykpKTtcbiAgICAgICAgICAgICAgY29uc3QgY2xlYW5SZXN1bHQgPSBsb2dnZXIudHJ1bmNhdGVMb2dNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHJlc3VsdC5yZXNwb25zZS5yZXN1bHQpKTtcbiAgICAgICAgICAgICAgbG9nZ2VyW3JlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25TdWNjZXNzXShcbiAgICAgICAgICAgICAgICBgUmFuIGNsb3VkIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSBmb3IgdXNlciAke3VzZXJTdHJpbmd9IHdpdGg6XFxuICBJbnB1dDogJHtjbGVhbklucHV0fVxcbiAgUmVzdWx0OiAke2NsZWFuUmVzdWx0fWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclN0cmluZyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocmVxLmNvbmZpZy5sb2dMZXZlbHMuY2xvdWRGdW5jdGlvbkVycm9yICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgICBjb25zdCBjbGVhbklucHV0ID0gbG9nZ2VyLnRydW5jYXRlTG9nTWVzc2FnZShKU09OLnN0cmluZ2lmeShyZWRhY3RCdWZmZXJzKHBhcmFtcykpKTtcbiAgICAgICAgICAgICAgbG9nZ2VyW3JlcS5jb25maWcubG9nTGV2ZWxzLmNsb3VkRnVuY3Rpb25FcnJvcl0oXG4gICAgICAgICAgICAgICAgYEZhaWxlZCBydW5uaW5nIGNsb3VkIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfSBmb3IgdXNlciAke3VzZXJTdHJpbmd9IHdpdGg6XFxuICBJbnB1dDogJHtjbGVhbklucHV0fVxcbiAgRXJyb3I6IGAgK1xuICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXJyb3IpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclN0cmluZyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IHN1Y2Nlc3MsIGVycm9yIH0gPSByZXNwb25zZU9iamVjdDtcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdHJpZ2dlcnMubWF5YmVSdW5WYWxpZGF0b3IocmVxdWVzdCwgZnVuY3Rpb25OYW1lLCByZXEuYXV0aCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiBmdW5jdGlvbiBleHBlY3RzIDIgcGFyYW1ldGVycyAocmVxLCByZXMpIC0gRXhwcmVzcyBzdHlsZVxuICAgICAgICAgIGlmICh0aGVGdW5jdGlvbi5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHRoZUZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgc3R5bGUgLSBzaW5nbGUgcGFyYW1ldGVyXG4gICAgICAgICAgICByZXR1cm4gdGhlRnVuY3Rpb24ocmVxdWVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIC8vIEZvciBFeHByZXNzLXN0eWxlIGZ1bmN0aW9ucywgb25seSBzZW5kIHJlc3BvbnNlIGlmIG5vdCBhbHJlYWR5IHNlbnRcbiAgICAgICAgICBpZiAodGhlRnVuY3Rpb24ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2VPYmplY3QuX2lzUmVzcG9uc2VTZW50KCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgRXhwcmVzcy1zdHlsZSBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgd2l0aG91dCBjYWxsaW5nIHJlcy5zdWNjZXNzL2Vycm9yXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3MocmVzdWx0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBJZiBubyByZXNwb25zZSBzZW50IGFuZCBubyB2YWx1ZSByZXR1cm5lZCwgdGhpcyBpcyBhbiBlcnJvciBpbiB1c2VyIGNvZGVcbiAgICAgICAgICAgICAgLy8gYnV0IHdlIGRvbid0IGhhbmRsZSBpdCBoZXJlIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucywgYWx3YXlzIGNhbGwgc3VjY2VzcyB3aXRoIHRoZSByZXN1bHQgKGV2ZW4gaWYgdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3VjY2VzcyhyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUtBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGNBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLE1BQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUE2QixTQUFBRCx1QkFBQVMsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQVo3Qjs7QUFFQSxJQUFJRyxLQUFLLEdBQUdYLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ1csS0FBSztFQUNyQ0MsUUFBUSxH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
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.GlobalConfigRouter = void 0;
7
+ var _node = _interopRequireDefault(require("parse/node"));
8
+ var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
9
+ var middleware = _interopRequireWildcard(require("../middlewares"));
10
+ var triggers = _interopRequireWildcard(require("../triggers"));
11
+ var _Error = require("../Error");
12
+ 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); }
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ // global_config.js
15
+
16
+ const getConfigFromParams = params => {
17
+ const config = new _node.default.Config();
18
+ for (const attr in params) {
19
+ config.attributes[attr] = _node.default._decode(undefined, params[attr]);
20
+ }
21
+ return config;
22
+ };
23
+ class GlobalConfigRouter extends _PromiseRouter.default {
24
+ getGlobalConfig(req) {
25
+ return req.config.database.find('_GlobalConfig', {
26
+ objectId: '1'
27
+ }, {
28
+ limit: 1
29
+ }).then(results => {
30
+ if (results.length != 1) {
31
+ // If there is no config in the database - return empty config.
32
+ return {
33
+ response: {
34
+ params: {}
35
+ }
36
+ };
37
+ }
38
+ const globalConfig = results[0];
39
+ if (!req.auth.isMaster && globalConfig.masterKeyOnly !== undefined) {
40
+ for (const param in globalConfig.params) {
41
+ if (globalConfig.masterKeyOnly[param]) {
42
+ delete globalConfig.params[param];
43
+ delete globalConfig.masterKeyOnly[param];
44
+ }
45
+ }
46
+ }
47
+ return {
48
+ response: {
49
+ params: globalConfig.params,
50
+ masterKeyOnly: globalConfig.masterKeyOnly
51
+ }
52
+ };
53
+ });
54
+ }
55
+ async updateGlobalConfig(req) {
56
+ if (req.auth.isReadOnly) {
57
+ throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update the config.", req.config);
58
+ }
59
+ const params = req.body.params || {};
60
+ const masterKeyOnly = req.body?.masterKeyOnly || {};
61
+ // Transform in dot notation to make sure it works
62
+ const update = Object.keys(params).reduce((acc, key) => {
63
+ acc[`params.${key}`] = params[key];
64
+ acc[`masterKeyOnly.${key}`] = masterKeyOnly[key] || false;
65
+ return acc;
66
+ }, {});
67
+ const className = triggers.getClassName(_node.default.Config);
68
+ const hasBeforeSaveHook = triggers.triggerExists(className, triggers.Types.beforeSave, req.config.applicationId);
69
+ const hasAfterSaveHook = triggers.triggerExists(className, triggers.Types.afterSave, req.config.applicationId);
70
+ let originalConfigObject;
71
+ let updatedConfigObject;
72
+ const configObject = new _node.default.Config();
73
+ configObject.attributes = params;
74
+ const results = await req.config.database.find('_GlobalConfig', {
75
+ objectId: '1'
76
+ }, {
77
+ limit: 1
78
+ });
79
+ const isNew = results.length !== 1;
80
+ if (!isNew && (hasBeforeSaveHook || hasAfterSaveHook)) {
81
+ originalConfigObject = getConfigFromParams(results[0].params);
82
+ }
83
+ try {
84
+ await triggers.maybeRunGlobalConfigTrigger(triggers.Types.beforeSave, req.auth, configObject, originalConfigObject, req.config, req.context);
85
+ if (isNew) {
86
+ await req.config.database.update('_GlobalConfig', {
87
+ objectId: '1'
88
+ }, update, {
89
+ upsert: true
90
+ }, true);
91
+ updatedConfigObject = configObject;
92
+ } else {
93
+ const result = await req.config.database.update('_GlobalConfig', {
94
+ objectId: '1'
95
+ }, update, {}, true);
96
+ updatedConfigObject = getConfigFromParams(result.params);
97
+ }
98
+ await triggers.maybeRunGlobalConfigTrigger(triggers.Types.afterSave, req.auth, updatedConfigObject, originalConfigObject, req.config, req.context);
99
+ return {
100
+ response: {
101
+ result: true
102
+ }
103
+ };
104
+ } catch (err) {
105
+ const error = triggers.resolveError(err, {
106
+ code: _node.default.Error.SCRIPT_FAILED,
107
+ message: 'Script failed. Unknown error.'
108
+ });
109
+ throw error;
110
+ }
111
+ }
112
+ mountRoutes() {
113
+ this.route('GET', '/config', req => {
114
+ return this.getGlobalConfig(req);
115
+ });
116
+ this.route('PUT', '/config', middleware.promiseEnforceMasterKeyAccess, req => {
117
+ return this.updateGlobalConfig(req);
118
+ });
119
+ }
120
+ }
121
+ exports.GlobalConfigRouter = GlobalConfigRouter;
122
+ var _default = exports.default = GlobalConfigRouter;
123
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1Byb21pc2VSb3V0ZXIiLCJtaWRkbGV3YXJlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJ0cmlnZ2VycyIsIl9FcnJvciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldENvbmZpZ0Zyb21QYXJhbXMiLCJwYXJhbXMiLCJjb25maWciLCJQYXJzZSIsIkNvbmZpZyIsImF0dHIiLCJhdHRyaWJ1dGVzIiwiX2RlY29kZSIsInVuZGVmaW5lZCIsIkdsb2JhbENvbmZpZ1JvdXRlciIsIlByb21pc2VSb3V0ZXIiLCJnZXRHbG9iYWxDb25maWciLCJyZXEiLCJkYXRhYmFzZSIsImZpbmQiLCJvYmplY3RJZCIsImxpbWl0IiwidGhlbiIsInJlc3VsdHMiLCJsZW5ndGgiLCJyZXNwb25zZSIsImdsb2JhbENvbmZpZyIsImF1dGgiLCJpc01hc3RlciIsIm1hc3RlcktleU9ubHkiLCJwYXJhbSIsInVwZGF0ZUdsb2JhbENvbmZpZyIsImlzUmVhZE9ubHkiLCJjcmVhdGVTYW5pdGl6ZWRFcnJvciIsIkVycm9yIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsImJvZHkiLCJ1cGRhdGUiLCJrZXlzIiwicmVkdWNlIiwiYWNjIiwia2V5IiwiY2xhc3NOYW1lIiwiZ2V0Q2xhc3NOYW1lIiwiaGFzQmVmb3JlU2F2ZUhvb2siLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJiZWZvcmVTYXZlIiwiYXBwbGljYXRpb25JZCIsImhhc0FmdGVyU2F2ZUhvb2siLCJhZnRlclNhdmUiLCJvcmlnaW5hbENvbmZpZ09iamVjdCIsInVwZGF0ZWRDb25maWdPYmplY3QiLCJjb25maWdPYmplY3QiLCJpc05ldyIsIm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlciIsImNvbnRleHQiLCJ1cHNlcnQiLCJyZXN1bHQiLCJlcnIiLCJlcnJvciIsInJlc29sdmVFcnJvciIsImNvZGUiLCJTQ1JJUFRfRkFJTEVEIiwibWVzc2FnZSIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0dsb2JhbENvbmZpZ1JvdXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnbG9iYWxfY29uZmlnLmpzXG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5pbXBvcnQgUHJvbWlzZVJvdXRlciBmcm9tICcuLi9Qcm9taXNlUm91dGVyJztcbmltcG9ydCAqIGFzIG1pZGRsZXdhcmUgZnJvbSAnLi4vbWlkZGxld2FyZXMnO1xuaW1wb3J0ICogYXMgdHJpZ2dlcnMgZnJvbSAnLi4vdHJpZ2dlcnMnO1xuaW1wb3J0IHsgY3JlYXRlU2FuaXRpemVkRXJyb3IgfSBmcm9tICcuLi9FcnJvcic7XG5cbmNvbnN0IGdldENvbmZpZ0Zyb21QYXJhbXMgPSBwYXJhbXMgPT4ge1xuICBjb25zdCBjb25maWcgPSBuZXcgUGFyc2UuQ29uZmlnKCk7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBwYXJhbXMpIHtcbiAgICBjb25maWcuYXR0cmlidXRlc1thdHRyXSA9IFBhcnNlLl9kZWNvZGUodW5kZWZpbmVkLCBwYXJhbXNbYXR0cl0pO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59O1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsQ29uZmlnUm91dGVyIGV4dGVuZHMgUHJvbWlzZVJvdXRlciB7XG4gIGdldEdsb2JhbENvbmZpZyhyZXEpIHtcbiAgICByZXR1cm4gcmVxLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoJ19HbG9iYWxDb25maWcnLCB7IG9iamVjdElkOiAnMScgfSwgeyBsaW1pdDogMSB9KVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gY29uZmlnIGluIHRoZSBkYXRhYmFzZSAtIHJldHVybiBlbXB0eSBjb25maWcuXG4gICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHsgcGFyYW1zOiB7fSB9IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsQ29uZmlnID0gcmVzdWx0c1swXTtcbiAgICAgICAgaWYgKCFyZXEuYXV0aC5pc01hc3RlciAmJiBnbG9iYWxDb25maWcubWFzdGVyS2V5T25seSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJhbSBpbiBnbG9iYWxDb25maWcucGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsQ29uZmlnLm1hc3RlcktleU9ubHlbcGFyYW1dKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxDb25maWcucGFyYW1zW3BhcmFtXTtcbiAgICAgICAgICAgICAgZGVsZXRlIGdsb2JhbENvbmZpZy5tYXN0ZXJLZXlPbmx5W3BhcmFtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgcGFyYW1zOiBnbG9iYWxDb25maWcucGFyYW1zLFxuICAgICAgICAgICAgbWFzdGVyS2V5T25seTogZ2xvYmFsQ29uZmlnLm1hc3RlcktleU9ubHksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlR2xvYmFsQ29uZmlnKHJlcSkge1xuICAgIGlmIChyZXEuYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgXCJyZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gdXBkYXRlIHRoZSBjb25maWcuXCIsXG4gICAgICAgIHJlcS5jb25maWdcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IHJlcS5ib2R5LnBhcmFtcyB8fCB7fTtcbiAgICBjb25zdCBtYXN0ZXJLZXlPbmx5ID0gcmVxLmJvZHk/Lm1hc3RlcktleU9ubHkgfHwge307XG4gICAgLy8gVHJhbnNmb3JtIGluIGRvdCBub3RhdGlvbiB0byBtYWtlIHN1cmUgaXQgd29ya3NcbiAgICBjb25zdCB1cGRhdGUgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGFjY1tgcGFyYW1zLiR7a2V5fWBdID0gcGFyYW1zW2tleV07XG4gICAgICBhY2NbYG1hc3RlcktleU9ubHkuJHtrZXl9YF0gPSBtYXN0ZXJLZXlPbmx5W2tleV0gfHwgZmFsc2U7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0cmlnZ2Vycy5nZXRDbGFzc05hbWUoUGFyc2UuQ29uZmlnKTtcbiAgICBjb25zdCBoYXNCZWZvcmVTYXZlSG9vayA9IHRyaWdnZXJzLnRyaWdnZXJFeGlzdHMoY2xhc3NOYW1lLCB0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLCByZXEuY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICAgIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKGNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJTYXZlLCByZXEuY29uZmlnLmFwcGxpY2F0aW9uSWQpO1xuICAgIGxldCBvcmlnaW5hbENvbmZpZ09iamVjdDtcbiAgICBsZXQgdXBkYXRlZENvbmZpZ09iamVjdDtcbiAgICBjb25zdCBjb25maWdPYmplY3QgPSBuZXcgUGFyc2UuQ29uZmlnKCk7XG4gICAgY29uZmlnT2JqZWN0LmF0dHJpYnV0ZXMgPSBwYXJhbXM7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVxLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHsgbGltaXQ6IDEgfSk7XG4gICAgY29uc3QgaXNOZXcgPSByZXN1bHRzLmxlbmd0aCAhPT0gMTtcbiAgICBpZiAoIWlzTmV3ICYmIChoYXNCZWZvcmVTYXZlSG9vayB8fCBoYXNBZnRlclNhdmVIb29rKSkge1xuICAgICAgb3JpZ2luYWxDb25maWdPYmplY3QgPSBnZXRDb25maWdGcm9tUGFyYW1zKHJlc3VsdHNbMF0ucGFyYW1zKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5iZWZvcmVTYXZlLCByZXEuYXV0aCwgY29uZmlnT2JqZWN0LCBvcmlnaW5hbENvbmZpZ09iamVjdCwgcmVxLmNvbmZpZywgcmVxLmNvbnRleHQpO1xuICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgIGF3YWl0IHJlcS5jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHVwZGF0ZSwgeyB1cHNlcnQ6IHRydWUgfSwgdHJ1ZSlcbiAgICAgICAgdXBkYXRlZENvbmZpZ09iamVjdCA9IGNvbmZpZ09iamVjdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfR2xvYmFsQ29uZmlnJywgeyBvYmplY3RJZDogJzEnIH0sIHVwZGF0ZSwge30sIHRydWUpO1xuICAgICAgICB1cGRhdGVkQ29uZmlnT2JqZWN0ID0gZ2V0Q29uZmlnRnJvbVBhcmFtcyhyZXN1bHQucGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRyaWdnZXJzLm1heWJlUnVuR2xvYmFsQ29uZmlnVHJpZ2dlcih0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIHJlcS5hdXRoLCB1cGRhdGVkQ29uZmlnT2JqZWN0LCBvcmlnaW5hbENvbmZpZ09iamVjdCwgcmVxLmNvbmZpZywgcmVxLmNvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHsgcmVzdWx0OiB0cnVlIH0gfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSB0cmlnZ2Vycy5yZXNvbHZlRXJyb3IoZXJyLCB7XG4gICAgICAgIGNvZGU6IFBhcnNlLkVycm9yLlNDUklQVF9GQUlMRUQsXG4gICAgICAgIG1lc3NhZ2U6ICdTY3JpcHQgZmFpbGVkLiBVbmtub3duIGVycm9yLicsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIG1vdW50Um91dGVzKCkge1xuICAgIHRoaXMucm91dGUoJ0dFVCcsICcvY29uZmlnJywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdsb2JhbENvbmZpZyhyZXEpO1xuICAgIH0pO1xuICAgIHRoaXMucm91dGUoJ1BVVCcsICcvY29uZmlnJywgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUdsb2JhbENvbmZpZyhyZXEpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdsb2JhbENvbmZpZ1JvdXRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsY0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBRCx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQWdELFNBQUFHLHdCQUFBRyxDQUFBLEVBQUFD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RTtRQUFJLENBQUMsRUFBRWlCLE1BQU0sRUFBRTtVQUFFb0IsTUFBTSxFQUFFO1FBQUssQ0FBQyxFQUFFLElBQUksQ0FBQztRQUNwR0wsbUJBQW1CLEdBQUdDLFlBQVk7TUFDcEMsQ0FBQyxNQUFNO1FBQ0wsTUFBTUssTUFBTSxHQUFHLE1BQU16QyxHQUFHLENBQUNWLE1BQU0sQ0FBQ1csUUFBUSxDQUFDbUIsTUFBTSxDQUFDLGVBQWUsRUFBRTtVQUFFakIsUUFBUSxFQUFFO1FBQUksQ0FBQyxFQUFFaUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUNyR2UsbUJBQW1CLEdBQUcvQyxtQkFBbUIsQ0FBQ3FELE1BQU0sQ0FBQ3BELE1BQU0sQ0FBQztNQUMxRDtNQUNBLE1BQU10QixRQUFRLENBQUN1RSwyQkFBMkIsQ0FBQ3ZFLFFBQVEsQ0FBQzhELEtBQUssQ0FBQ0ksU0FBUyxFQUFFakMsR0FBRyxDQUFDVSxJQUFJLEVBQUV5QixtQkFBbUIsRUFBRUQsb0JBQW9CLEVBQUVsQyxHQUFHLENBQUNWLE1BQU0sRUFBRVUsR0FBRyxDQUFDdUMsT0FBTyxDQUFDO01BQ2xKLE9BQU87UUFBRS9CLFFBQVEsRUFBRTtVQUFFaUMsTUFBTSxFQUFFO1FBQUs7TUFBRSxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxPQUFPQyxHQUFHLEVBQUU7TUFDWixNQUFNQyxLQUFLLEdBQUc1RSxRQUFRLENBQUM2RSxZQUFZLENBQUNGLEdBQUcsRUFBRTtRQUN2Q0csSUFBSSxFQUFFdEQsYUFBSyxDQUFDMEIsS0FBSyxDQUFDNkIsYUFBYTtRQUMvQkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0YsTUFBTUosS0FBSztJQUNiO0VBQ0Y7RUFFQUssV0FBV0EsQ0FBQSxFQUFHO0lBQ1osSUFBSSxDQUFDQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRWpELEdBQUcsSUFBSTtNQUNsQyxPQUFPLElBQUksQ0FBQ0QsZUFBZSxDQUFDQyxHQUFHLENBQUM7SUFDbEMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDaUQsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUVwRixVQUFVLENBQUNxRiw2QkFBNkIsRUFBRWxELEdBQUcsSUFBSTtNQUM1RSxPQUFPLElBQUksQ0FBQ2Msa0JBQWtCLENBQUNkLEdBQUcsQ0FBQztJQUNyQyxDQUFDLENBQUM7RUFDSjtBQUNGO0FBQUNtRCxPQUFBLENBQUF0RCxrQkFBQSxHQUFBQSxrQkFBQTtBQUFBLElBQUF1RCxRQUFBLEdBQUFELE9BQUEsQ0FBQXhFLE9BQUEsR0FFY2tCLGtCQUFrQiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.GraphQLRouter = void 0;
7
+ var _node = _interopRequireDefault(require("parse/node"));
8
+ var _PromiseRouter = _interopRequireDefault(require("../PromiseRouter"));
9
+ var middleware = _interopRequireWildcard(require("../middlewares"));
10
+ var _Error = require("../Error");
11
+ 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); }
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const GraphQLConfigPath = '/graphql-config';
14
+ class GraphQLRouter extends _PromiseRouter.default {
15
+ async getGraphQLConfig(req) {
16
+ const result = await req.config.parseGraphQLController.getGraphQLConfig();
17
+ return {
18
+ response: result
19
+ };
20
+ }
21
+ async updateGraphQLConfig(req) {
22
+ if (req.auth.isReadOnly) {
23
+ throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update the GraphQL config.", req.config);
24
+ }
25
+ const data = await req.config.parseGraphQLController.updateGraphQLConfig(req.body?.params || {});
26
+ return {
27
+ response: data
28
+ };
29
+ }
30
+ mountRoutes() {
31
+ this.route('GET', GraphQLConfigPath, middleware.promiseEnforceMasterKeyAccess, req => {
32
+ return this.getGraphQLConfig(req);
33
+ });
34
+ this.route('PUT', GraphQLConfigPath, middleware.promiseEnforceMasterKeyAccess, req => {
35
+ return this.updateGraphQLConfig(req);
36
+ });
37
+ }
38
+ }
39
+ exports.GraphQLRouter = GraphQLRouter;
40
+ var _default = exports.default = GraphQLRouter;
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1Byb21pc2VSb3V0ZXIiLCJtaWRkbGV3YXJlIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfRXJyb3IiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJHcmFwaFFMQ29uZmlnUGF0aCIsIkdyYXBoUUxSb3V0ZXIiLCJQcm9taXNlUm91dGVyIiwiZ2V0R3JhcGhRTENvbmZpZyIsInJlcSIsInJlc3VsdCIsImNvbmZpZyIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJyZXNwb25zZSIsInVwZGF0ZUdyYXBoUUxDb25maWciLCJhdXRoIiwiaXNSZWFkT25seSIsImNyZWF0ZVNhbml0aXplZEVycm9yIiwiUGFyc2UiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJkYXRhIiwiYm9keSIsInBhcmFtcyIsIm1vdW50Um91dGVzIiwicm91dGUiLCJwcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Sb3V0ZXJzL0dyYXBoUUxSb3V0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IFByb21pc2VSb3V0ZXIgZnJvbSAnLi4vUHJvbWlzZVJvdXRlcic7XG5pbXBvcnQgKiBhcyBtaWRkbGV3YXJlIGZyb20gJy4uL21pZGRsZXdhcmVzJztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi4vRXJyb3InO1xuXG5jb25zdCBHcmFwaFFMQ29uZmlnUGF0aCA9ICcvZ3JhcGhxbC1jb25maWcnO1xuXG5leHBvcnQgY2xhc3MgR3JhcGhRTFJvdXRlciBleHRlbmRzIFByb21pc2VSb3V0ZXIge1xuICBhc3luYyBnZXRHcmFwaFFMQ29uZmlnKHJlcSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcS5jb25maWcucGFyc2VHcmFwaFFMQ29udHJvbGxlci5nZXRHcmFwaFFMQ29uZmlnKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlOiByZXN1bHQsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUdyYXBoUUxDb25maWcocmVxKSB7XG4gICAgaWYgKHJlcS5hdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBcInJlYWQtb25seSBtYXN0ZXJLZXkgaXNuJ3QgYWxsb3dlZCB0byB1cGRhdGUgdGhlIEdyYXBoUUwgY29uZmlnLlwiLFxuICAgICAgICByZXEuY29uZmlnXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxLmNvbmZpZy5wYXJzZUdyYXBoUUxDb250cm9sbGVyLnVwZGF0ZUdyYXBoUUxDb25maWcocmVxLmJvZHk/LnBhcmFtcyB8fCB7fSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3BvbnNlOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICBtb3VudFJvdXRlcygpIHtcbiAgICB0aGlzLnJvdXRlKCdHRVQnLCBHcmFwaFFMQ29uZmlnUGF0aCwgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYXBoUUxDb25maWcocmVxKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKCdQVVQnLCBHcmFwaFFMQ29uZmlnUGF0aCwgbWlkZGxld2FyZS5wcm9taXNlRW5mb3JjZU1hc3RlcktleUFjY2VzcywgcmVxID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUdyYXBoUUxDb25maWcocmVxKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHcmFwaFFMUm91dGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxjQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFBZ0QsU0FBQUcsd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFKLHVCQUFBLFlBQUFBLENBQUFFLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUssR0FBQSxJQUFBTCxDQUFBLENBQUFNLEdBQUEsSUFBQVAsQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBQUEsU0FBQVAsdUJBQUFNLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsR0FBQUwsQ0FBQSxLQUFBVSxPQUFBLEVBQUFWLENBQUE7QUFFaEQsTUFBTW1CLGlCQUFpQixHQUFHLGlCQUFpQjtBQUVwQyxNQUFNQyxhQUFhLFNBQVNDLHNCQUFhLENBQUM7RUFDL0MsTUFBTUMsZ0JBQWdCQSxDQUFDQyxHQUFHLEVBQUU7SUFDMUIsTUFBTUMsTUFBTSxHQUFHLE1BQU1ELEdBQUcsQ0FBQ0UsTUFBTSxDQUFDQyxzQkFBc0IsQ0FBQ0osZ0JBQWdCLENBQUMsQ0FBQztJQUN6RSxPQUFPO01BQ0xLLFFBQVEsRUFBRUg7SUFDWixDQUFDO0VBQ0g7RUFFQSxNQUFNSSxtQkFBbUJBLENBQUNMLEdBQUcsRUFBRTtJQUM3QixJQUFJQSxHQUFHLENBQUNNLElBQUksQ0FBQ0MsVUFBVSxFQUFFO01BQ3ZCLE1BQU0sSUFBQUMsMkJBQW9CLEVBQ3hCQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsbUJBQW1CLEVBQy9CLGlFQUFpRSxFQUNqRVgsR0FBRyxDQUFDRSxNQUNOLENBQUM7SUFDSDtJQUNBLE1BQU1VLElBQUksR0FBRyxNQUFNWixHQUFHLENBQUNFLE1BQU0sQ0FBQ0Msc0JBQXNCLENBQUNFLG1CQUFtQixDQUFDTCxHQUFHLENBQUNhLElBQUksRUFBRUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE9BQU87TUFDTFYsUUFBUSxFQUFFUTtJQUNaLENBQUM7RUFDSDtFQUVBRyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssQ0FBQyxLQUFLLEVBQUVwQixpQkFBaUIsRUFBRXRCLFVBQVUsQ0FBQzJDLDZCQUE2QixFQUFFakIsR0FBRyxJQUFJO01BQ3BGLE9BQU8sSUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0MsR0FBRyxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ2dCLEtBQUssQ0FBQyxLQUFLLEVBQUVwQixpQkFBaUIsRUFBRXRCLFVBQVUsQ0FBQzJDLDZCQUE2QixFQUFFakIsR0FBRyxJQUFJO01BQ3BGLE9BQU8sSUFBSSxDQUFDSyxtQkFBbUIsQ0FBQ0wsR0FBRyxDQUFDO0lBQ3RDLENBQUMsQ0FBQztFQUNKO0FBQ0Y7QUFBQ2tCLE9BQUEsQ0FBQXJCLGFBQUEsR0FBQUEsYUFBQTtBQUFBLElBQUFzQixRQUFBLEdBQUFELE9BQUEsQ0FBQS9CLE9BQUEsR0FFY1UsYUFBYSIsImlnbm9yZUxpc3QiOltdfQ==