@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,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.FilesController = void 0;
|
|
7
|
+
var _cryptoUtils = require("../cryptoUtils");
|
|
8
|
+
var _AdaptableController = _interopRequireDefault(require("./AdaptableController"));
|
|
9
|
+
var _FilesAdapter = require("../Adapters/Files/FilesAdapter");
|
|
10
|
+
var _path = _interopRequireDefault(require("path"));
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
// FilesController.js
|
|
13
|
+
|
|
14
|
+
const Parse = require('parse/node').Parse;
|
|
15
|
+
const legacyFilesRegex = new RegExp('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}-.*');
|
|
16
|
+
class FilesController extends _AdaptableController.default {
|
|
17
|
+
getFileData(config, filename) {
|
|
18
|
+
return this.adapter.getFileData(filename);
|
|
19
|
+
}
|
|
20
|
+
async createFile(config, filename, data, contentType, options) {
|
|
21
|
+
const extname = _path.default.extname(filename);
|
|
22
|
+
const hasExtension = extname.length > 0;
|
|
23
|
+
const mime = (await import('mime')).default;
|
|
24
|
+
if (!hasExtension && contentType && mime.getExtension(contentType)) {
|
|
25
|
+
filename = filename + '.' + mime.getExtension(contentType);
|
|
26
|
+
} else if (hasExtension) {
|
|
27
|
+
contentType = mime.getType(filename) || contentType;
|
|
28
|
+
}
|
|
29
|
+
if (!this.options.preserveFileName) {
|
|
30
|
+
filename = (0, _cryptoUtils.randomHexString)(32) + '_' + filename;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Prepend directory if provided
|
|
34
|
+
if (options && options.directory) {
|
|
35
|
+
filename = options.directory + '/' + filename;
|
|
36
|
+
delete options.directory;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Fallback: buffer stream for adapters that don't support streaming
|
|
40
|
+
if (typeof data?.pipe === 'function' && !this.adapter.supportsStreaming) {
|
|
41
|
+
data = await new Promise((resolve, reject) => {
|
|
42
|
+
const chunks = [];
|
|
43
|
+
data.on('data', chunk => chunks.push(chunk));
|
|
44
|
+
data.on('end', () => resolve(Buffer.concat(chunks)));
|
|
45
|
+
data.on('error', reject);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const location = await this.adapter.getFileLocation(config, filename);
|
|
49
|
+
await this.adapter.createFile(filename, data, contentType, options);
|
|
50
|
+
return {
|
|
51
|
+
url: location,
|
|
52
|
+
name: filename
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
deleteFile(config, filename) {
|
|
56
|
+
return this.adapter.deleteFile(filename);
|
|
57
|
+
}
|
|
58
|
+
getMetadata(filename) {
|
|
59
|
+
if (typeof this.adapter.getMetadata === 'function') {
|
|
60
|
+
return this.adapter.getMetadata(filename);
|
|
61
|
+
}
|
|
62
|
+
return Promise.resolve({});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Find file references in REST-format object and adds the url key
|
|
67
|
+
* with the current mount point and app id.
|
|
68
|
+
* Object may be a single object or list of REST-format objects.
|
|
69
|
+
*/
|
|
70
|
+
async expandFilesInObject(config, object) {
|
|
71
|
+
if (Array.isArray(object)) {
|
|
72
|
+
const promises = object.map(obj => this.expandFilesInObject(config, obj));
|
|
73
|
+
await Promise.all(promises);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (typeof object !== 'object') {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
for (const key in object) {
|
|
80
|
+
const fileObject = object[key];
|
|
81
|
+
if (fileObject && fileObject['__type'] === 'File') {
|
|
82
|
+
if (fileObject['url']) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const filename = fileObject['name'];
|
|
86
|
+
// all filenames starting with "tfss-" should be from files.parsetfss.com
|
|
87
|
+
// all filenames starting with a "-" seperated UUID should be from files.parse.com
|
|
88
|
+
// all other filenames have been migrated or created from Parse Server
|
|
89
|
+
if (config.fileKey === undefined) {
|
|
90
|
+
fileObject['url'] = await this.adapter.getFileLocation(config, filename);
|
|
91
|
+
} else {
|
|
92
|
+
if (filename.indexOf('tfss-') === 0) {
|
|
93
|
+
fileObject['url'] = 'http://files.parsetfss.com/' + config.fileKey + '/' + encodeURIComponent(filename);
|
|
94
|
+
} else if (legacyFilesRegex.test(filename)) {
|
|
95
|
+
fileObject['url'] = 'http://files.parse.com/' + config.fileKey + '/' + encodeURIComponent(filename);
|
|
96
|
+
} else {
|
|
97
|
+
fileObject['url'] = await this.adapter.getFileLocation(config, filename);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
expectedAdapterType() {
|
|
104
|
+
return _FilesAdapter.FilesAdapter;
|
|
105
|
+
}
|
|
106
|
+
handleFileStream(config, filename, req, res, contentType) {
|
|
107
|
+
return this.adapter.handleFileStream(filename, req, res, contentType);
|
|
108
|
+
}
|
|
109
|
+
validateFilename(filename) {
|
|
110
|
+
if (typeof this.adapter.validateFilename === 'function') {
|
|
111
|
+
const error = this.adapter.validateFilename(filename);
|
|
112
|
+
if (typeof error !== 'string') {
|
|
113
|
+
return error;
|
|
114
|
+
}
|
|
115
|
+
return new Parse.Error(Parse.Error.INVALID_FILE_NAME, error);
|
|
116
|
+
}
|
|
117
|
+
return (0, _FilesAdapter.validateFilename)(filename);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.FilesController = FilesController;
|
|
121
|
+
var _default = exports.default = FilesController;
|
|
122
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvVXRpbHMiLCJyZXF1aXJlIiwiX0FkYXB0YWJsZUNvbnRyb2xsZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0ZpbGVzQWRhcHRlciIsIl9wYXRoIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiUGFyc2UiLCJsZWdhY3lGaWxlc1JlZ2V4IiwiUmVnRXhwIiwiRmlsZXNDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImdldEZpbGVEYXRhIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJhZGFwdGVyIiwiY3JlYXRlRmlsZSIsImRhdGEiLCJjb250ZW50VHlwZSIsIm9wdGlvbnMiLCJleHRuYW1lIiwicGF0aCIsImhhc0V4dGVuc2lvbiIsImxlbmd0aCIsIm1pbWUiLCJnZXRFeHRlbnNpb24iLCJnZXRUeXBlIiwicHJlc2VydmVGaWxlTmFtZSIsInJhbmRvbUhleFN0cmluZyIsImRpcmVjdG9yeSIsInBpcGUiLCJzdXBwb3J0c1N0cmVhbWluZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2h1bmtzIiwib24iLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJsb2NhdGlvbiIsImdldEZpbGVMb2NhdGlvbiIsInVybCIsIm5hbWUiLCJkZWxldGVGaWxlIiwiZ2V0TWV0YWRhdGEiLCJleHBhbmRGaWxlc0luT2JqZWN0Iiwib2JqZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwicHJvbWlzZXMiLCJtYXAiLCJvYmoiLCJhbGwiLCJrZXkiLCJmaWxlT2JqZWN0IiwiZmlsZUtleSIsInVuZGVmaW5lZCIsImluZGV4T2YiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ0ZXN0IiwiZXhwZWN0ZWRBZGFwdGVyVHlwZSIsIkZpbGVzQWRhcHRlciIsImhhbmRsZUZpbGVTdHJlYW0iLCJyZXEiLCJyZXMiLCJ2YWxpZGF0ZUZpbGVuYW1lIiwiZXJyb3IiLCJFcnJvciIsIklOVkFMSURfRklMRV9OQU1FIiwiZXhwb3J0cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL0ZpbGVzQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlc0NvbnRyb2xsZXIuanNcbmltcG9ydCB7IHJhbmRvbUhleFN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCBBZGFwdGFibGVDb250cm9sbGVyIGZyb20gJy4vQWRhcHRhYmxlQ29udHJvbGxlcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbGVuYW1lLCBGaWxlc0FkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9GaWxlcy9GaWxlc0FkYXB0ZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5jb25zdCBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcblxuY29uc3QgbGVnYWN5RmlsZXNSZWdleCA9IG5ldyBSZWdFeHAoXG4gICdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9LS4qJ1xuKTtcblxuZXhwb3J0IGNsYXNzIEZpbGVzQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBnZXRGaWxlRGF0YShjb25maWcsIGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRGaWxlRGF0YShmaWxlbmFtZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaWxlKGNvbmZpZywgZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRUeXBlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZXh0bmFtZSA9IHBhdGguZXh0bmFtZShmaWxlbmFtZSk7XG5cbiAgICBjb25zdCBoYXNFeHRlbnNpb24gPSBleHRuYW1lLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgbWltZSA9IChhd2FpdCBpbXBvcnQoJ21pbWUnKSkuZGVmYXVsdFxuICAgIGlmICghaGFzRXh0ZW5zaW9uICYmIGNvbnRlbnRUeXBlICYmIG1pbWUuZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKSkge1xuICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSArICcuJyArIG1pbWUuZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0V4dGVuc2lvbikge1xuICAgICAgY29udGVudFR5cGUgPSBtaW1lLmdldFR5cGUoZmlsZW5hbWUpIHx8IGNvbnRlbnRUeXBlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLnByZXNlcnZlRmlsZU5hbWUpIHtcbiAgICAgIGZpbGVuYW1lID0gcmFuZG9tSGV4U3RyaW5nKDMyKSArICdfJyArIGZpbGVuYW1lO1xuICAgIH1cblxuICAgIC8vIFByZXBlbmQgZGlyZWN0b3J5IGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kaXJlY3RvcnkpIHtcbiAgICAgIGZpbGVuYW1lID0gb3B0aW9ucy5kaXJlY3RvcnkgKyAnLycgKyBmaWxlbmFtZTtcbiAgICAgIGRlbGV0ZSBvcHRpb25zLmRpcmVjdG9yeTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogYnVmZmVyIHN0cmVhbSBmb3IgYWRhcHRlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHN0cmVhbWluZ1xuICAgIGlmICh0eXBlb2YgZGF0YT8ucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5hZGFwdGVyLnN1cHBvcnRzU3RyZWFtaW5nKSB7XG4gICAgICBkYXRhID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgZGF0YS5vbignZGF0YScsIGNodW5rID0+IGNodW5rcy5wdXNoKGNodW5rKSk7XG4gICAgICAgIGRhdGEub24oJ2VuZCcsICgpID0+IHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKSk7XG4gICAgICAgIGRhdGEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgdGhpcy5hZGFwdGVyLmdldEZpbGVMb2NhdGlvbihjb25maWcsIGZpbGVuYW1lKTtcbiAgICBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlRmlsZShmaWxlbmFtZSwgZGF0YSwgY29udGVudFR5cGUsIG9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICB1cmw6IGxvY2F0aW9uLFxuICAgICAgbmFtZTogZmlsZW5hbWUsXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlRmlsZShjb25maWcsIGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5kZWxldGVGaWxlKGZpbGVuYW1lKTtcbiAgfVxuXG4gIGdldE1ldGFkYXRhKGZpbGVuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmFkYXB0ZXIuZ2V0TWV0YWRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0TWV0YWRhdGEoZmlsZW5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGZpbGUgcmVmZXJlbmNlcyBpbiBSRVNULWZvcm1hdCBvYmplY3QgYW5kIGFkZHMgdGhlIHVybCBrZXlcbiAgICogd2l0aCB0aGUgY3VycmVudCBtb3VudCBwb2ludCBhbmQgYXBwIGlkLlxuICAgKiBPYmplY3QgbWF5IGJlIGEgc2luZ2xlIG9iamVjdCBvciBsaXN0IG9mIFJFU1QtZm9ybWF0IG9iamVjdHMuXG4gICAqL1xuICBhc3luYyBleHBhbmRGaWxlc0luT2JqZWN0KGNvbmZpZywgb2JqZWN0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSBvYmplY3QubWFwKG9iaiA9PiB0aGlzLmV4cGFuZEZpbGVzSW5PYmplY3QoY29uZmlnLCBvYmopKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgY29uc3QgZmlsZU9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKGZpbGVPYmplY3QgJiYgZmlsZU9iamVjdFsnX190eXBlJ10gPT09ICdGaWxlJykge1xuICAgICAgICBpZiAoZmlsZU9iamVjdFsndXJsJ10pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVPYmplY3RbJ25hbWUnXTtcbiAgICAgICAgLy8gYWxsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIFwidGZzcy1cIiBzaG91bGQgYmUgZnJvbSBmaWxlcy5wYXJzZXRmc3MuY29tXG4gICAgICAgIC8vIGFsbCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhIFwiLVwiIHNlcGVyYXRlZCBVVUlEIHNob3VsZCBiZSBmcm9tIGZpbGVzLnBhcnNlLmNvbVxuICAgICAgICAvLyBhbGwgb3RoZXIgZmlsZW5hbWVzIGhhdmUgYmVlbiBtaWdyYXRlZCBvciBjcmVhdGVkIGZyb20gUGFyc2UgU2VydmVyXG4gICAgICAgIGlmIChjb25maWcuZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKCd0ZnNzLScpID09PSAwKSB7XG4gICAgICAgICAgICBmaWxlT2JqZWN0Wyd1cmwnXSA9XG4gICAgICAgICAgICAgICdodHRwOi8vZmlsZXMucGFyc2V0ZnNzLmNvbS8nICsgY29uZmlnLmZpbGVLZXkgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobGVnYWN5RmlsZXNSZWdleC50ZXN0KGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgZmlsZU9iamVjdFsndXJsJ10gPVxuICAgICAgICAgICAgICAnaHR0cDovL2ZpbGVzLnBhcnNlLmNvbS8nICsgY29uZmlnLmZpbGVLZXkgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWxlT2JqZWN0Wyd1cmwnXSA9IGF3YWl0IHRoaXMuYWRhcHRlci5nZXRGaWxlTG9jYXRpb24oY29uZmlnLCBmaWxlbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gRmlsZXNBZGFwdGVyO1xuICB9XG5cbiAgaGFuZGxlRmlsZVN0cmVhbShjb25maWcsIGZpbGVuYW1lLCByZXEsIHJlcywgY29udGVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWUsIHJlcSwgcmVzLCBjb250ZW50VHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmFkYXB0ZXIudmFsaWRhdGVGaWxlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmFkYXB0ZXIudmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSk7XG4gICAgICBpZiAodHlwZW9mIGVycm9yICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfRklMRV9OQU1FLCBlcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgfVxufVxu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
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.HooksController = void 0;
|
|
7
|
+
var triggers = _interopRequireWildcard(require("../triggers"));
|
|
8
|
+
var Parse = _interopRequireWildcard(require("parse/node"));
|
|
9
|
+
var _request = _interopRequireDefault(require("../request"));
|
|
10
|
+
var _logger = require("../logger");
|
|
11
|
+
var _http = _interopRequireDefault(require("http"));
|
|
12
|
+
var _https = _interopRequireDefault(require("https"));
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
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); }
|
|
15
|
+
// -disable-next
|
|
16
|
+
// -disable-next
|
|
17
|
+
const DefaultHooksCollectionName = '_Hooks';
|
|
18
|
+
const HTTPAgents = {
|
|
19
|
+
http: new _http.default.Agent({
|
|
20
|
+
keepAlive: true
|
|
21
|
+
}),
|
|
22
|
+
https: new _https.default.Agent({
|
|
23
|
+
keepAlive: true
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
class HooksController {
|
|
27
|
+
constructor(applicationId, databaseController, webhookKey) {
|
|
28
|
+
this._applicationId = applicationId;
|
|
29
|
+
this._webhookKey = webhookKey;
|
|
30
|
+
this.database = databaseController;
|
|
31
|
+
}
|
|
32
|
+
load() {
|
|
33
|
+
return this._getHooks().then(hooks => {
|
|
34
|
+
hooks = hooks || [];
|
|
35
|
+
hooks.forEach(hook => {
|
|
36
|
+
this.addHookToTriggers(hook);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
getFunction(functionName) {
|
|
41
|
+
return this._getHooks({
|
|
42
|
+
functionName: functionName
|
|
43
|
+
}).then(results => results[0]);
|
|
44
|
+
}
|
|
45
|
+
getFunctions() {
|
|
46
|
+
return this._getHooks({
|
|
47
|
+
functionName: {
|
|
48
|
+
$exists: true
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
getTrigger(className, triggerName) {
|
|
53
|
+
return this._getHooks({
|
|
54
|
+
className: className,
|
|
55
|
+
triggerName: triggerName
|
|
56
|
+
}).then(results => results[0]);
|
|
57
|
+
}
|
|
58
|
+
getTriggers() {
|
|
59
|
+
return this._getHooks({
|
|
60
|
+
className: {
|
|
61
|
+
$exists: true
|
|
62
|
+
},
|
|
63
|
+
triggerName: {
|
|
64
|
+
$exists: true
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
deleteFunction(functionName) {
|
|
69
|
+
triggers.removeFunction(functionName, this._applicationId);
|
|
70
|
+
return this._removeHooks({
|
|
71
|
+
functionName: functionName
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
deleteTrigger(className, triggerName) {
|
|
75
|
+
triggers.removeTrigger(triggerName, className, this._applicationId);
|
|
76
|
+
return this._removeHooks({
|
|
77
|
+
className: className,
|
|
78
|
+
triggerName: triggerName
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
_getHooks(query = {}) {
|
|
82
|
+
return this.database.find(DefaultHooksCollectionName, query).then(results => {
|
|
83
|
+
return results.map(result => {
|
|
84
|
+
delete result.objectId;
|
|
85
|
+
return result;
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
_removeHooks(query) {
|
|
90
|
+
return this.database.destroy(DefaultHooksCollectionName, query).then(() => {
|
|
91
|
+
return Promise.resolve({});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
saveHook(hook) {
|
|
95
|
+
var query;
|
|
96
|
+
if (hook.functionName && hook.url) {
|
|
97
|
+
query = {
|
|
98
|
+
functionName: hook.functionName
|
|
99
|
+
};
|
|
100
|
+
} else if (hook.triggerName && hook.className && hook.url) {
|
|
101
|
+
query = {
|
|
102
|
+
className: hook.className,
|
|
103
|
+
triggerName: hook.triggerName
|
|
104
|
+
};
|
|
105
|
+
} else {
|
|
106
|
+
throw new Parse.Error(143, 'invalid hook declaration');
|
|
107
|
+
}
|
|
108
|
+
return this.database.update(DefaultHooksCollectionName, query, hook, {
|
|
109
|
+
upsert: true
|
|
110
|
+
}).then(() => {
|
|
111
|
+
return Promise.resolve(hook);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
addHookToTriggers(hook) {
|
|
115
|
+
var wrappedFunction = wrapToHTTPRequest(hook, this._webhookKey);
|
|
116
|
+
wrappedFunction.url = hook.url;
|
|
117
|
+
if (hook.className) {
|
|
118
|
+
triggers.addTrigger(hook.triggerName, hook.className, wrappedFunction, this._applicationId);
|
|
119
|
+
} else {
|
|
120
|
+
triggers.addFunction(hook.functionName, wrappedFunction, null, this._applicationId);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
addHook(hook) {
|
|
124
|
+
this.addHookToTriggers(hook);
|
|
125
|
+
return this.saveHook(hook);
|
|
126
|
+
}
|
|
127
|
+
createOrUpdateHook(aHook) {
|
|
128
|
+
var hook;
|
|
129
|
+
if (aHook && aHook.functionName && aHook.url) {
|
|
130
|
+
hook = {};
|
|
131
|
+
hook.functionName = aHook.functionName;
|
|
132
|
+
hook.url = aHook.url;
|
|
133
|
+
} else if (aHook && aHook.className && aHook.url && aHook.triggerName && triggers.Types[aHook.triggerName]) {
|
|
134
|
+
hook = {};
|
|
135
|
+
hook.className = aHook.className;
|
|
136
|
+
hook.url = aHook.url;
|
|
137
|
+
hook.triggerName = aHook.triggerName;
|
|
138
|
+
} else {
|
|
139
|
+
throw new Parse.Error(143, 'invalid hook declaration');
|
|
140
|
+
}
|
|
141
|
+
return this.addHook(hook);
|
|
142
|
+
}
|
|
143
|
+
createHook(aHook) {
|
|
144
|
+
if (aHook.functionName) {
|
|
145
|
+
return this.getFunction(aHook.functionName).then(result => {
|
|
146
|
+
if (result) {
|
|
147
|
+
throw new Parse.Error(143, `function name: ${aHook.functionName} already exists`);
|
|
148
|
+
} else {
|
|
149
|
+
return this.createOrUpdateHook(aHook);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
} else if (aHook.className && aHook.triggerName) {
|
|
153
|
+
return this.getTrigger(aHook.className, aHook.triggerName).then(result => {
|
|
154
|
+
if (result) {
|
|
155
|
+
throw new Parse.Error(143, `class ${aHook.className} already has trigger ${aHook.triggerName}`);
|
|
156
|
+
}
|
|
157
|
+
return this.createOrUpdateHook(aHook);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
throw new Parse.Error(143, 'invalid hook declaration');
|
|
161
|
+
}
|
|
162
|
+
updateHook(aHook) {
|
|
163
|
+
if (aHook.functionName) {
|
|
164
|
+
return this.getFunction(aHook.functionName).then(result => {
|
|
165
|
+
if (result) {
|
|
166
|
+
return this.createOrUpdateHook(aHook);
|
|
167
|
+
}
|
|
168
|
+
throw new Parse.Error(143, `no function named: ${aHook.functionName} is defined`);
|
|
169
|
+
});
|
|
170
|
+
} else if (aHook.className && aHook.triggerName) {
|
|
171
|
+
return this.getTrigger(aHook.className, aHook.triggerName).then(result => {
|
|
172
|
+
if (result) {
|
|
173
|
+
return this.createOrUpdateHook(aHook);
|
|
174
|
+
}
|
|
175
|
+
throw new Parse.Error(143, `class ${aHook.className} does not exist`);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
throw new Parse.Error(143, 'invalid hook declaration');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.HooksController = HooksController;
|
|
182
|
+
function wrapToHTTPRequest(hook, key) {
|
|
183
|
+
return req => {
|
|
184
|
+
const jsonBody = {};
|
|
185
|
+
for (var i in req) {
|
|
186
|
+
// Parse Server config is not serializable
|
|
187
|
+
if (i === 'config') {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
jsonBody[i] = req[i];
|
|
191
|
+
}
|
|
192
|
+
if (req.object) {
|
|
193
|
+
jsonBody.object = req.object.toJSON();
|
|
194
|
+
jsonBody.object.className = req.object.className;
|
|
195
|
+
}
|
|
196
|
+
if (req.original) {
|
|
197
|
+
jsonBody.original = req.original.toJSON();
|
|
198
|
+
jsonBody.original.className = req.original.className;
|
|
199
|
+
}
|
|
200
|
+
const jsonRequest = {
|
|
201
|
+
url: hook.url,
|
|
202
|
+
headers: {
|
|
203
|
+
'Content-Type': 'application/json'
|
|
204
|
+
},
|
|
205
|
+
body: jsonBody,
|
|
206
|
+
method: 'POST'
|
|
207
|
+
};
|
|
208
|
+
const agent = hook.url.startsWith('https') ? HTTPAgents['https'] : HTTPAgents['http'];
|
|
209
|
+
jsonRequest.agent = agent;
|
|
210
|
+
if (key) {
|
|
211
|
+
jsonRequest.headers['X-Parse-Webhook-Key'] = key;
|
|
212
|
+
} else {
|
|
213
|
+
_logger.logger.warn('Making outgoing webhook request without webhookKey being set!');
|
|
214
|
+
}
|
|
215
|
+
return (0, _request.default)(jsonRequest).then(response => {
|
|
216
|
+
let err;
|
|
217
|
+
let result;
|
|
218
|
+
let body = response.data;
|
|
219
|
+
if (body) {
|
|
220
|
+
if (typeof body === 'string') {
|
|
221
|
+
try {
|
|
222
|
+
body = JSON.parse(body);
|
|
223
|
+
} catch {
|
|
224
|
+
err = {
|
|
225
|
+
error: 'Malformed response',
|
|
226
|
+
code: -1,
|
|
227
|
+
partialResponse: body.substring(0, 100)
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (!err) {
|
|
232
|
+
result = body.success;
|
|
233
|
+
err = body.error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (err) {
|
|
237
|
+
throw err;
|
|
238
|
+
} else if (hook.triggerName === 'beforeSave') {
|
|
239
|
+
if (typeof result === 'object') {
|
|
240
|
+
delete result.createdAt;
|
|
241
|
+
delete result.updatedAt;
|
|
242
|
+
delete result.className;
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
object: result
|
|
246
|
+
};
|
|
247
|
+
} else {
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
var _default = exports.default = HooksController;
|
|
254
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0cmlnZ2VycyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIlBhcnNlIiwiX3JlcXVlc3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xvZ2dlciIsIl9odHRwIiwiX2h0dHBzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidCIsIldlYWtNYXAiLCJyIiwibiIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiRGVmYXVsdEhvb2tzQ29sbGVjdGlvbk5hbWUiLCJIVFRQQWdlbnRzIiwiaHR0cCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiaHR0cHMiLCJIb29rc0NvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImFwcGxpY2F0aW9uSWQiLCJkYXRhYmFzZUNvbnRyb2xsZXIiLCJ3ZWJob29rS2V5IiwiX2FwcGxpY2F0aW9uSWQiLCJfd2ViaG9va0tleSIsImRhdGFiYXNlIiwibG9hZCIsIl9nZXRIb29rcyIsInRoZW4iLCJob29rcyIsImZvckVhY2giLCJob29rIiwiYWRkSG9va1RvVHJpZ2dlcnMiLCJnZXRGdW5jdGlvbiIsImZ1bmN0aW9uTmFtZSIsInJlc3VsdHMiLCJnZXRGdW5jdGlvbnMiLCIkZXhpc3RzIiwiZ2V0VHJpZ2dlciIsImNsYXNzTmFtZSIsInRyaWdnZXJOYW1lIiwiZ2V0VHJpZ2dlcnMiLCJkZWxldGVGdW5jdGlvbiIsInJlbW92ZUZ1bmN0aW9uIiwiX3JlbW92ZUhvb2tzIiwiZGVsZXRlVHJpZ2dlciIsInJlbW92ZVRyaWdnZXIiLCJxdWVyeSIsImZpbmQiLCJtYXAiLCJyZXN1bHQiLCJvYmplY3RJZCIsImRlc3Ryb3kiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNhdmVIb29rIiwidXJsIiwiRXJyb3IiLCJ1cGRhdGUiLCJ1cHNlcnQiLCJ3cmFwcGVkRnVuY3Rpb24iLCJ3cmFwVG9IVFRQUmVxdWVzdCIsImFkZFRyaWdnZXIiLCJhZGRGdW5jdGlvbiIsImFkZEhvb2siLCJjcmVhdGVPclVwZGF0ZUhvb2siLCJhSG9vayIsIlR5cGVzIiwiY3JlYXRlSG9vayIsInVwZGF0ZUhvb2siLCJleHBvcnRzIiwia2V5IiwicmVxIiwianNvbkJvZHkiLCJvYmplY3QiLCJ0b0pTT04iLCJvcmlnaW5hbCIsImpzb25SZXF1ZXN0IiwiaGVhZGVycyIsImJvZHkiLCJtZXRob2QiLCJhZ2VudCIsInN0YXJ0c1dpdGgiLCJsb2dnZXIiLCJ3YXJuIiwicmVxdWVzdCIsInJlc3BvbnNlIiwiZXJyIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsImVycm9yIiwiY29kZSIsInBhcnRpYWxSZXNwb25zZSIsInN1YnN0cmluZyIsInN1Y2Nlc3MiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Ib29rc0NvbnRyb2xsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBmbG93IHdlYWsgKi9cblxuaW1wb3J0ICogYXMgdHJpZ2dlcnMgZnJvbSAnLi4vdHJpZ2dlcnMnO1xuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgKiBhcyBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuXG5jb25zdCBEZWZhdWx0SG9va3NDb2xsZWN0aW9uTmFtZSA9ICdfSG9va3MnO1xuY29uc3QgSFRUUEFnZW50cyA9IHtcbiAgaHR0cDogbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSksXG4gIGh0dHBzOiBuZXcgaHR0cHMuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSksXG59O1xuXG5leHBvcnQgY2xhc3MgSG9va3NDb250cm9sbGVyIHtcbiAgX2FwcGxpY2F0aW9uSWQ6IHN0cmluZztcbiAgX3dlYmhvb2tLZXk6IHN0cmluZztcbiAgZGF0YWJhc2U6IGFueTtcblxuICBjb25zdHJ1Y3RvcihhcHBsaWNhdGlvbklkOiBzdHJpbmcsIGRhdGFiYXNlQ29udHJvbGxlciwgd2ViaG9va0tleSkge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xuICAgIHRoaXMuX3dlYmhvb2tLZXkgPSB3ZWJob29rS2V5O1xuICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZUNvbnRyb2xsZXI7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcygpLnRoZW4oaG9va3MgPT4ge1xuICAgICAgaG9va3MgPSBob29rcyB8fCBbXTtcbiAgICAgIGhvb2tzLmZvckVhY2goaG9vayA9PiB7XG4gICAgICAgIHRoaXMuYWRkSG9va1RvVHJpZ2dlcnMoaG9vayk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcyh7IGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lIH0pLnRoZW4ocmVzdWx0cyA9PiByZXN1bHRzWzBdKTtcbiAgfVxuXG4gIGdldEZ1bmN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SG9va3MoeyBmdW5jdGlvbk5hbWU6IHsgJGV4aXN0czogdHJ1ZSB9IH0pO1xuICB9XG5cbiAgZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEhvb2tzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIH0pLnRoZW4ocmVzdWx0cyA9PiByZXN1bHRzWzBdKTtcbiAgfVxuXG4gIGdldFRyaWdnZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcyh7XG4gICAgICBjbGFzc05hbWU6IHsgJGV4aXN0czogdHJ1ZSB9LFxuICAgICAgdHJpZ2dlck5hbWU6IHsgJGV4aXN0czogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG4gICAgdHJpZ2dlcnMucmVtb3ZlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB0aGlzLl9hcHBsaWNhdGlvbklkKTtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlSG9va3MoeyBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgfVxuXG4gIGRlbGV0ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICAgIHRyaWdnZXJzLnJlbW92ZVRyaWdnZXIodHJpZ2dlck5hbWUsIGNsYXNzTmFtZSwgdGhpcy5fYXBwbGljYXRpb25JZCk7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUhvb2tzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgX2dldEhvb2tzKHF1ZXJ5ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5maW5kKERlZmF1bHRIb29rc0NvbGxlY3Rpb25OYW1lLCBxdWVyeSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcChyZXN1bHQgPT4ge1xuICAgICAgICBkZWxldGUgcmVzdWx0Lm9iamVjdElkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVtb3ZlSG9va3MocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5kZXN0cm95KERlZmF1bHRIb29rc0NvbGxlY3Rpb25OYW1lLCBxdWVyeSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVIb29rKGhvb2spIHtcbiAgICB2YXIgcXVlcnk7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICBxdWVyeSA9IHsgZnVuY3Rpb25OYW1lOiBob29rLmZ1bmN0aW9uTmFtZSB9O1xuICAgIH0gZWxzZSBpZiAoaG9vay50cmlnZ2VyTmFtZSAmJiBob29rLmNsYXNzTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgcXVlcnkgPSB7IGNsYXNzTmFtZTogaG9vay5jbGFzc05hbWUsIHRyaWdnZXJOYW1lOiBob29rLnRyaWdnZXJOYW1lIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VcbiAgICAgIC51cGRhdGUoRGVmYXVsdEhvb2tzQ29sbGVjdGlvbk5hbWUsIHF1ZXJ5LCBob29rLCB7IHVwc2VydDogdHJ1ZSB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhvb2spO1xuICAgICAgfSk7XG4gIH1cblxuICBhZGRIb29rVG9UcmlnZ2Vycyhob29rKSB7XG4gICAgdmFyIHdyYXBwZWRGdW5jdGlvbiA9IHdyYXBUb0hUVFBSZXF1ZXN0KGhvb2ssIHRoaXMuX3dlYmhvb2tLZXkpO1xuICAgIHdyYXBwZWRGdW5jdGlvbi51cmwgPSBob29rLnVybDtcbiAgICBpZiAoaG9vay5jbGFzc05hbWUpIHtcbiAgICAgIHRyaWdnZXJzLmFkZFRyaWdnZXIoaG9vay50cmlnZ2VyTmFtZSwgaG9vay5jbGFzc05hbWUsIHdyYXBwZWRGdW5jdGlvbiwgdGhpcy5fYXBwbGljYXRpb25JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJzLmFkZEZ1bmN0aW9uKGhvb2suZnVuY3Rpb25OYW1lLCB3cmFwcGVkRnVuY3Rpb24sIG51bGwsIHRoaXMuX2FwcGxpY2F0aW9uSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEhvb2soaG9vaykge1xuICAgIHRoaXMuYWRkSG9va1RvVHJpZ2dlcnMoaG9vayk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZUhvb2soaG9vayk7XG4gIH1cblxuICBjcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spIHtcbiAgICB2YXIgaG9vaztcbiAgICBpZiAoYUhvb2sgJiYgYUhvb2suZnVuY3Rpb25OYW1lICYmIGFIb29rLnVybCkge1xuICAgICAgaG9vayA9IHt9O1xuICAgICAgaG9vay5mdW5jdGlvbk5hbWUgPSBhSG9vay5mdW5jdGlvbk5hbWU7XG4gICAgICBob29rLnVybCA9IGFIb29rLnVybDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYUhvb2sgJiZcbiAgICAgIGFIb29rLmNsYXNzTmFtZSAmJlxuICAgICAgYUhvb2sudXJsICYmXG4gICAgICBhSG9vay50cmlnZ2VyTmFtZSAmJlxuICAgICAgdHJpZ2dlcnMuVHlwZXNbYUhvb2sudHJpZ2dlck5hbWVdXG4gICAgKSB7XG4gICAgICBob29rID0ge307XG4gICAgICBob29rLmNsYXNzTmFtZSA9IGFIb29rLmNsYXNzTmFtZTtcbiAgICAgIGhvb2sudXJsID0gYUhvb2sudXJsO1xuICAgICAgaG9vay50cmlnZ2VyTmFtZSA9IGFIb29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkSG9vayhob29rKTtcbiAgfVxuXG4gIGNyZWF0ZUhvb2soYUhvb2spIHtcbiAgICBpZiAoYUhvb2suZnVuY3Rpb25OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGdW5jdGlvbihhSG9vay5mdW5jdGlvbk5hbWUpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsIGBmdW5jdGlvbiBuYW1lOiAke2FIb29rLmZ1bmN0aW9uTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGFIb29rLmNsYXNzTmFtZSAmJiBhSG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJpZ2dlcihhSG9vay5jbGFzc05hbWUsIGFIb29rLnRyaWdnZXJOYW1lKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxNDMsXG4gICAgICAgICAgICBgY2xhc3MgJHthSG9vay5jbGFzc05hbWV9IGFscmVhZHkgaGFzIHRyaWdnZXIgJHthSG9vay50cmlnZ2VyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDE0MywgJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicpO1xuICB9XG5cbiAgdXBkYXRlSG9vayhhSG9vaykge1xuICAgIGlmIChhSG9vay5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZ1bmN0aW9uKGFIb29rLmZ1bmN0aW9uTmFtZSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3JVcGRhdGVIb29rKGFIb29rKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCBgbm8gZnVuY3Rpb24gbmFtZWQ6ICR7YUhvb2suZnVuY3Rpb25OYW1lfSBpcyBkZWZpbmVkYCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGFIb29rLmNsYXNzTmFtZSAmJiBhSG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJpZ2dlcihhSG9vay5jbGFzc05hbWUsIGFIb29rLnRyaWdnZXJOYW1lKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsIGBjbGFzcyAke2FIb29rLmNsYXNzTmFtZX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcFRvSFRUUFJlcXVlc3QoaG9vaywga2V5KSB7XG4gIHJldHVybiByZXEgPT4ge1xuICAgIGNvbnN0IGpzb25Cb2R5ID0ge307XG4gICAgZm9yICh2YXIgaSBpbiByZXEpIHtcbiAgICAgIC8vIFBhcnNlIFNlcnZlciBjb25maWcgaXMgbm90IHNlcmlhbGl6YWJsZVxuICAgICAgaWYgKGkgPT09ICdjb25maWcnKSB7IGNvbnRpbnVlOyB9XG4gICAgICBqc29uQm9keVtpXSA9IHJlcVtpXTtcbiAgICB9XG4gICAgaWYgKHJlcS5vYmplY3QpIHtcbiAgICAgIGpzb25Cb2R5Lm9iamVjdCA9IHJlcS5vYmplY3QudG9KU09OKCk7XG4gICAgICBqc29uQm9keS5vYmplY3QuY2xhc3NOYW1lID0gcmVxLm9iamVjdC5jbGFzc05hbWU7XG4gICAgfVxuICAgIGlmIChyZXEub3JpZ2luYWwpIHtcbiAgICAgIGpzb25Cb2R5Lm9yaWdpbmFsID0gcmVxLm9yaWdpbmFsLnRvSlNPTigpO1xuICAgICAganNvbkJvZHkub3JpZ2luYWwuY2xhc3NOYW1lID0gcmVxLm9yaWdpbmFsLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgY29uc3QganNvblJlcXVlc3Q6IGFueSA9IHtcbiAgICAgIHVybDogaG9vay51cmwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgYm9keToganNvbkJvZHksXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYWdlbnQgPSBob29rLnVybC5zdGFydHNXaXRoKCdodHRwcycpID8gSFRUUEFnZW50c1snaHR0cHMnXSA6IEhUVFBBZ2VudHNbJ2h0dHAnXTtcbiAgICBqc29uUmVxdWVzdC5hZ2VudCA9IGFnZW50O1xuXG4gICAgaWYgKGtleSkge1xuICAgICAganNvblJlcXVlc3QuaGVhZGVyc1snWC1QYXJzZS1XZWJob29rLUtleSddID0ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybignTWFraW5nIG91dGdvaW5nIHdlYmhvb2sgcmVxdWVzdCB3aXRob3V0IHdlYmhvb2tLZXkgYmVpbmcgc2V0IScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWVzdChqc29uUmVxdWVzdCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZXJyO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGxldCBib2R5ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgIGlmIChib2R5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYm9keSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBlcnIgPSB7XG4gICAgICAgICAgICAgIGVycm9yOiAnTWFsZm9ybWVkIHJlc3BvbnNlJyxcbiAgICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICAgIHBhcnRpYWxSZXNwb25zZTogYm9keS5zdWJzdHJpbmcoMCwgMTAwKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYm9keS5zdWNjZXNzO1xuICAgICAgICAgIGVyciA9IGJvZHkuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSBlbHNlIGlmIChob29rLnRyaWdnZXJOYW1lID09PSAnYmVmb3JlU2F2ZScpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC5jcmVhdGVkQXQ7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC51cGRhdGVkQXQ7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC5jbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgb2JqZWN0OiByZXN1bHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvb2tzQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsSUFBQUEsUUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsS0FBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssS0FBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBSCxzQkFBQSxDQUFBSCxPQUFBO0FBQTBCLFNBQUFHLHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxF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
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.LiveQueryController = void 0;
|
|
7
|
+
var _ParseCloudCodePublisher = require("../LiveQuery/ParseCloudCodePublisher");
|
|
8
|
+
var _Options = require("../Options");
|
|
9
|
+
var _triggers = require("./../triggers");
|
|
10
|
+
class LiveQueryController {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
// If config is empty, we just assume no classs needs to be registered as LiveQuery
|
|
13
|
+
if (!config || !config.classNames) {
|
|
14
|
+
this.classNames = new Set();
|
|
15
|
+
} else if (Array.isArray(config.classNames)) {
|
|
16
|
+
const classNames = config.classNames.map(name => {
|
|
17
|
+
const _name = (0, _triggers.getClassName)(name);
|
|
18
|
+
return new RegExp(`^${_name}$`);
|
|
19
|
+
});
|
|
20
|
+
this.classNames = new Set(classNames);
|
|
21
|
+
} else {
|
|
22
|
+
throw 'liveQuery.classes should be an array of string';
|
|
23
|
+
}
|
|
24
|
+
this.liveQueryPublisher = new _ParseCloudCodePublisher.ParseCloudCodePublisher(config);
|
|
25
|
+
}
|
|
26
|
+
connect() {
|
|
27
|
+
return this.liveQueryPublisher.connect();
|
|
28
|
+
}
|
|
29
|
+
onAfterSave(className, currentObject, originalObject, classLevelPermissions) {
|
|
30
|
+
if (!this.hasLiveQuery(className)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const req = this._makePublisherRequest(currentObject, originalObject, classLevelPermissions);
|
|
34
|
+
this.liveQueryPublisher.onCloudCodeAfterSave(req);
|
|
35
|
+
}
|
|
36
|
+
onAfterDelete(className, currentObject, originalObject, classLevelPermissions) {
|
|
37
|
+
if (!this.hasLiveQuery(className)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const req = this._makePublisherRequest(currentObject, originalObject, classLevelPermissions);
|
|
41
|
+
this.liveQueryPublisher.onCloudCodeAfterDelete(req);
|
|
42
|
+
}
|
|
43
|
+
hasLiveQuery(className) {
|
|
44
|
+
for (const name of this.classNames) {
|
|
45
|
+
if (name.test(className)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
clearCachedRoles(user) {
|
|
52
|
+
if (!user) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
return this.liveQueryPublisher.onClearCachedRoles(user);
|
|
56
|
+
}
|
|
57
|
+
_makePublisherRequest(currentObject, originalObject, classLevelPermissions) {
|
|
58
|
+
const req = {
|
|
59
|
+
object: currentObject
|
|
60
|
+
};
|
|
61
|
+
if (currentObject) {
|
|
62
|
+
req.original = originalObject;
|
|
63
|
+
}
|
|
64
|
+
if (classLevelPermissions) {
|
|
65
|
+
req.classLevelPermissions = classLevelPermissions;
|
|
66
|
+
}
|
|
67
|
+
return req;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.LiveQueryController = LiveQueryController;
|
|
71
|
+
var _default = exports.default = LiveQueryController;
|
|
72
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUGFyc2VDbG91ZENvZGVQdWJsaXNoZXIiLCJyZXF1aXJlIiwiX09wdGlvbnMiLCJfdHJpZ2dlcnMiLCJMaXZlUXVlcnlDb250cm9sbGVyIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJjbGFzc05hbWVzIiwiU2V0IiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwibmFtZSIsIl9uYW1lIiwiZ2V0Q2xhc3NOYW1lIiwiUmVnRXhwIiwibGl2ZVF1ZXJ5UHVibGlzaGVyIiwiUGFyc2VDbG91ZENvZGVQdWJsaXNoZXIiLCJjb25uZWN0Iiwib25BZnRlclNhdmUiLCJjbGFzc05hbWUiLCJjdXJyZW50T2JqZWN0Iiwib3JpZ2luYWxPYmplY3QiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJoYXNMaXZlUXVlcnkiLCJyZXEiLCJfbWFrZVB1Ymxpc2hlclJlcXVlc3QiLCJvbkNsb3VkQ29kZUFmdGVyU2F2ZSIsIm9uQWZ0ZXJEZWxldGUiLCJvbkNsb3VkQ29kZUFmdGVyRGVsZXRlIiwidGVzdCIsImNsZWFyQ2FjaGVkUm9sZXMiLCJ1c2VyIiwib25DbGVhckNhY2hlZFJvbGVzIiwib2JqZWN0Iiwib3JpZ2luYWwiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL0xpdmVRdWVyeUNvbnRyb2xsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VDbG91ZENvZGVQdWJsaXNoZXIgfSBmcm9tICcuLi9MaXZlUXVlcnkvUGFyc2VDbG91ZENvZGVQdWJsaXNoZXInO1xuaW1wb3J0IHsgTGl2ZVF1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uL09wdGlvbnMnO1xuaW1wb3J0IHsgZ2V0Q2xhc3NOYW1lIH0gZnJvbSAnLi8uLi90cmlnZ2Vycyc7XG5leHBvcnQgY2xhc3MgTGl2ZVF1ZXJ5Q29udHJvbGxlciB7XG4gIGNsYXNzTmFtZXM6IGFueTtcbiAgbGl2ZVF1ZXJ5UHVibGlzaGVyOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiA/TGl2ZVF1ZXJ5T3B0aW9ucykge1xuICAgIC8vIElmIGNvbmZpZyBpcyBlbXB0eSwgd2UganVzdCBhc3N1bWUgbm8gY2xhc3NzIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgYXMgTGl2ZVF1ZXJ5XG4gICAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5jbGFzc05hbWVzKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5jbGFzc05hbWVzKSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNvbmZpZy5jbGFzc05hbWVzLm1hcChuYW1lID0+IHtcbiAgICAgICAgY29uc3QgX25hbWUgPSBnZXRDbGFzc05hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtfbmFtZX0kYCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IG5ldyBTZXQoY2xhc3NOYW1lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93ICdsaXZlUXVlcnkuY2xhc3NlcyBzaG91bGQgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nJztcbiAgICB9XG4gICAgdGhpcy5saXZlUXVlcnlQdWJsaXNoZXIgPSBuZXcgUGFyc2VDbG91ZENvZGVQdWJsaXNoZXIoY29uZmlnKTtcbiAgfVxuXG4gIGNvbm5lY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMubGl2ZVF1ZXJ5UHVibGlzaGVyLmNvbm5lY3QoKTtcbiAgfVxuXG4gIG9uQWZ0ZXJTYXZlKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIGN1cnJlbnRPYmplY3Q6IGFueSxcbiAgICBvcmlnaW5hbE9iamVjdDogYW55LFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogP2FueVxuICApIHtcbiAgICBpZiAoIXRoaXMuaGFzTGl2ZVF1ZXJ5KGNsYXNzTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVxID0gdGhpcy5fbWFrZVB1Ymxpc2hlclJlcXVlc3QoY3VycmVudE9iamVjdCwgb3JpZ2luYWxPYmplY3QsIGNsYXNzTGV2ZWxQZXJtaXNzaW9ucyk7XG4gICAgdGhpcy5saXZlUXVlcnlQdWJsaXNoZXIub25DbG91ZENvZGVBZnRlclNhdmUocmVxKTtcbiAgfVxuXG4gIG9uQWZ0ZXJEZWxldGUoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgY3VycmVudE9iamVjdDogYW55LFxuICAgIG9yaWdpbmFsT2JqZWN0OiBhbnksXG4gICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmhhc0xpdmVRdWVyeShjbGFzc05hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IHRoaXMuX21ha2VQdWJsaXNoZXJSZXF1ZXN0KGN1cnJlbnRPYmplY3QsIG9yaWdpbmFsT2JqZWN0LCBjbGFzc0xldmVsUGVybWlzc2lvbnMpO1xuICAgIHRoaXMubGl2ZVF1ZXJ5UHVibGlzaGVyLm9uQ2xvdWRDb2RlQWZ0ZXJEZWxldGUocmVxKTtcbiAgfVxuXG4gIGhhc0xpdmVRdWVyeShjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmNsYXNzTmFtZXMpIHtcbiAgICAgIGlmIChuYW1lLnRlc3QoY2xhc3NOYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2xlYXJDYWNoZWRSb2xlcyh1c2VyOiBhbnkpIHtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGl2ZVF1ZXJ5UHVibGlzaGVyLm9uQ2xlYXJDYWNoZWRSb2xlcyh1c2VyKTtcbiAgfVxuXG4gIF9tYWtlUHVibGlzaGVyUmVxdWVzdChjdXJyZW50T2JqZWN0OiBhbnksIG9yaWdpbmFsT2JqZWN0OiBhbnksIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogP2FueSk6IGFueSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgb2JqZWN0OiBjdXJyZW50T2JqZWN0LFxuICAgIH07XG4gICAgaWYgKGN1cnJlbnRPYmplY3QpIHtcbiAgICAgIHJlcS5vcmlnaW5hbCA9IG9yaWdpbmFsT2JqZWN0O1xuICAgIH1cbiAgICBpZiAoY2xhc3NMZXZlbFBlcm1pc3Npb25zKSB7XG4gICAgICByZXEuY2xhc3NMZXZlbFBlcm1pc3Npb25zID0gY2xhc3NMZXZlbFBlcm1pc3Npb25zO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdmVRdWVyeUNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLHdCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFDTyxNQUFNRyxtQkFBbUIsQ0FBQztFQUkvQkMsV0FBV0EsQ0FBQ0MsTUFBeUIsRUFBRTtJQUNyQztJQUNBLElBQUksQ0FBQ0EsTUFBTSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0MsVUFBVSxFQUFFO01BQ2pDLElBQUksQ0FBQ0EsVUFBVSxHQUFHLElBQUlDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsTUFBTSxJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0osTUFBTSxDQUFDQyxVQUFVLENBQUMsRUFBRTtNQUMzQyxNQUFNQSxVQUFVLEdBQUdELE1BQU0sQ0FBQ0MsVUFBVSxDQUFDSSxHQUFHLENBQUNDLElBQUksSUFBSTtRQUMvQyxNQUFNQyxLQUFLLEdBQUcsSUFBQUMsc0JBQVksRUFBQ0YsSUFBSSxDQUFDO1FBQ2hDLE9BQU8sSUFBSUcsTUFBTSxDQUFDLElBQUlGLEtBQUssR0FBRyxDQUFDO01BQ2pDLENBQUMsQ0FBQztNQUNGLElBQUksQ0FBQ04sVUFBVSxHQUFHLElBQUlDLEdBQUcsQ0FBQ0QsVUFBVSxDQUFDO0lBQ3ZDLENBQUMsTUFBTTtNQUNMLE1BQU0sZ0RBQWdEO0lBQ3hEO0lBQ0EsSUFBSSxDQUFDUyxrQkFBa0IsR0FBRyxJQUFJQyxnREFBdUIsQ0FBQ1gsTUFBTSxDQUFDO0VBQy9EO0VBRUFZLE9BQU9BLENBQUEsRUFBRztJQUNSLE9BQU8sSUFBSSxDQUFDRixrQkFBa0IsQ0FBQ0UsT0FBTyxDQUFDLENBQUM7RUFDMUM7RUFFQUMsV0FBV0EsQ0FDVEMsU0FBaUIsRUFDakJDLGFBQWtCLEVBQ2xCQyxjQUFtQixFQUNuQkMscUJBQTJCLEVBQzNCO0lBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ0MsWUFBWSxDQUFDSixTQUFTLENBQUMsRUFBRTtNQUNqQztJQUNGO0lBQ0EsTUFBTUssR0FBRyxHQUFHLElBQUksQ0FBQ0MscUJBQXFCLENBQUNMLGFBQWEsRUFBRUMsY0FBYyxFQUFFQyxxQkFBcUIsQ0FBQztJQUM1RixJQUFJLENBQUNQLGtCQUFrQixDQUFDVyxvQkFBb0IsQ0FBQ0YsR0FBRyxDQUFDO0VBQ25EO0VBRUFHLGFBQWFBLENBQ1hSLFNBQWlCLEVBQ2pCQyxhQUFrQixFQUNsQkMsY0FBbUIsRUFDbkJDLHFCQUEwQixFQUMxQjtJQUNBLElBQUksQ0FBQyxJQUFJLENBQUNDLFlBQVksQ0FBQ0osU0FBUyxDQUFDLEVBQUU7TUFDakM7SUFDRjtJQUNBLE1BQU1LLEdBQUcsR0FBRyxJQUFJLENBQUNDLHFCQUFxQixDQUFDTCxhQUFhLEVBQUVDLGNBQWMsRUFBRUMscUJBQXFCLENBQUM7SUFDNUYsSUFBSSxDQUFDUCxrQkFBa0IsQ0FBQ2Esc0JBQXNCLENBQUNKLEdBQUcsQ0FBQztFQUNyRDtFQUVBRCxZQUFZQSxDQUFDSixTQUFpQixFQUFXO0lBQ3ZDLEtBQUssTUFBTVIsSUFBSSxJQUFJLElBQUksQ0FBQ0wsVUFBVSxFQUFFO01BQ2xDLElBQUlLLElBQUksQ0FBQ2tCLElBQUksQ0FBQ1YsU0FBUyxDQUFDLEVBQUU7UUFDeEIsT0FBTyxJQUFJO01BQ2I7SUFDRjtJQUNBLE9BQU8sS0FBSztFQUNkO0VBRUFXLGdCQUFnQkEsQ0FBQ0MsSUFBUyxFQUFFO0lBQzFCLElBQUksQ0FBQ0EsSUFBSSxFQUFFO01BQ1Q7SUFDRjtJQUNBLE9BQU8sSUFBSSxDQUFDaEIsa0JBQWtCLENBQUNpQixrQkFBa0IsQ0FBQ0QsSUFBSSxDQUFDO0VBQ3pEO0VBRUFOLHFCQUFxQkEsQ0FBQ0wsYUFBa0IsRUFBRUMsY0FBbUIsRUFBRUMscUJBQTJCLEVBQU87SUFDL0YsTUFBTUUsR0FBRyxHQUFHO01BQ1ZTLE1BQU0sRUFBRWI7SUFDVixDQUFDO0lBQ0QsSUFBSUEsYUFBYSxFQUFFO01BQ2pCSSxHQUFHLENBQUNVLFFBQVEsR0FBR2IsY0FBYztJQUMvQjtJQUNBLElBQUlDLHFCQUFxQixFQUFFO01BQ3pCRSxHQUFHLENBQUNGLHFCQUFxQixHQUFHQSxxQkFBcUI7SUFDbkQ7SUFDQSxPQUFPRSxHQUFHO0VBQ1o7QUFDRjtBQUFDVyxPQUFBLENBQUFoQyxtQkFBQSxHQUFBQSxtQkFBQTtBQUFBLElBQUFpQyxRQUFBLEdBQUFELE9BQUEsQ0FBQUUsT0FBQSxHQUVjbEMsbUJBQW1CIiwiaWdub3JlTGlzdCI6W119
|