@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,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.MailAdapter = void 0;
|
|
7
|
+
/* eslint-disable unused-imports/no-unused-vars */
|
|
8
|
+
/**
|
|
9
|
+
* @interface
|
|
10
|
+
* @memberof module:Adapters
|
|
11
|
+
* Mail Adapter prototype
|
|
12
|
+
* A MailAdapter should implement at least sendMail()
|
|
13
|
+
*/
|
|
14
|
+
class MailAdapter {
|
|
15
|
+
/**
|
|
16
|
+
* A method for sending mail
|
|
17
|
+
* @param options would have the parameters
|
|
18
|
+
* - to: the recipient
|
|
19
|
+
* - text: the raw text of the message
|
|
20
|
+
* - subject: the subject of the email
|
|
21
|
+
*/
|
|
22
|
+
sendMail(options) {}
|
|
23
|
+
|
|
24
|
+
/* You can implement those methods if you want
|
|
25
|
+
* to provide HTML templates etc...
|
|
26
|
+
*/
|
|
27
|
+
// sendVerificationEmail({ link, appName, user }) {}
|
|
28
|
+
// sendPasswordResetEmail({ link, appName, user }) {}
|
|
29
|
+
}
|
|
30
|
+
exports.MailAdapter = MailAdapter;
|
|
31
|
+
var _default = exports.default = MailAdapter;
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYWlsQWRhcHRlciIsInNlbmRNYWlsIiwib3B0aW9ucyIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRW1haWwvTWFpbEFkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQGludGVyZmFjZVxuICogQG1lbWJlcm9mIG1vZHVsZTpBZGFwdGVyc1xuICogTWFpbCBBZGFwdGVyIHByb3RvdHlwZVxuICogQSBNYWlsQWRhcHRlciBzaG91bGQgaW1wbGVtZW50IGF0IGxlYXN0IHNlbmRNYWlsKClcbiAqL1xuZXhwb3J0IGNsYXNzIE1haWxBZGFwdGVyIHtcbiAgLyoqXG4gICAqIEEgbWV0aG9kIGZvciBzZW5kaW5nIG1haWxcbiAgICogQHBhcmFtIG9wdGlvbnMgd291bGQgaGF2ZSB0aGUgcGFyYW1ldGVyc1xuICAgKiAtIHRvOiB0aGUgcmVjaXBpZW50XG4gICAqIC0gdGV4dDogdGhlIHJhdyB0ZXh0IG9mIHRoZSBtZXNzYWdlXG4gICAqIC0gc3ViamVjdDogdGhlIHN1YmplY3Qgb2YgdGhlIGVtYWlsXG4gICAqL1xuICBzZW5kTWFpbChvcHRpb25zKSB7fVxuXG4gIC8qIFlvdSBjYW4gaW1wbGVtZW50IHRob3NlIG1ldGhvZHMgaWYgeW91IHdhbnRcbiAgICogdG8gcHJvdmlkZSBIVE1MIHRlbXBsYXRlcyBldGMuLi5cbiAgICovXG4gIC8vIHNlbmRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIGFwcE5hbWUsIHVzZXIgfSkge31cbiAgLy8gc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCh7IGxpbmssIGFwcE5hbWUsIHVzZXIgfSkge31cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFpbEFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUEsV0FBVyxDQUFDO0VBQ3ZCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFFBQVFBLENBQUNDLE9BQU8sRUFBRSxDQUFDOztFQUVuQjtBQUNGO0FBQ0E7RUFDRTtFQUNBO0FBQ0Y7QUFBQ0MsT0FBQSxDQUFBSCxXQUFBLEdBQUFBLFdBQUE7QUFBQSxJQUFBSSxRQUFBLEdBQUFELE9BQUEsQ0FBQUUsT0FBQSxHQUVjTCxXQUFXIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.FilesAdapter = void 0;
|
|
7
|
+
exports.validateFilename = validateFilename;
|
|
8
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/* eslint-disable unused-imports/no-unused-vars */
|
|
11
|
+
// Files Adapter
|
|
12
|
+
//
|
|
13
|
+
// Allows you to change the file storage mechanism.
|
|
14
|
+
//
|
|
15
|
+
// Adapter classes must implement the following functions:
|
|
16
|
+
// * createFile(filename, data, contentType)
|
|
17
|
+
// * deleteFile(filename)
|
|
18
|
+
// * getFileData(filename)
|
|
19
|
+
// * getFileLocation(config, filename)
|
|
20
|
+
// Adapter classes should implement the following functions:
|
|
21
|
+
// * validateFilename(filename)
|
|
22
|
+
// * handleFileStream(filename, req, res, contentType)
|
|
23
|
+
//
|
|
24
|
+
// Default is GridFSBucketAdapter, which requires mongo
|
|
25
|
+
// and for the API server to be using the DatabaseController with Mongo
|
|
26
|
+
// database adapter.
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @interface
|
|
30
|
+
* @memberof module:Adapters
|
|
31
|
+
*/
|
|
32
|
+
class FilesAdapter {
|
|
33
|
+
/** Responsible for storing the file in order to be retrieved later by its filename
|
|
34
|
+
*
|
|
35
|
+
* @param {string} filename - the filename to save
|
|
36
|
+
* @param {Buffer|Readable} data - the file data as a Buffer, or a Readable stream if the adapter supports streaming (see supportsStreaming)
|
|
37
|
+
* @param {string} contentType - the supposed contentType
|
|
38
|
+
* @discussion the contentType can be undefined if the controller was not able to determine it
|
|
39
|
+
* @param {object} options - (Optional) options to be passed to file adapter (S3 File Adapter Only)
|
|
40
|
+
* - tags: object containing key value pairs that will be stored with file
|
|
41
|
+
* - metadata: object containing key value pairs that will be sotred with file (https://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-object-metadata.html)
|
|
42
|
+
* @discussion options are not supported by all file adapters. Check the your adapter's documentation for compatibility
|
|
43
|
+
*
|
|
44
|
+
* @return {Promise} a promise that should fail if the storage didn't succeed
|
|
45
|
+
*/
|
|
46
|
+
createFile(filename, data, contentType, options) {}
|
|
47
|
+
|
|
48
|
+
/** Whether this adapter supports receiving Readable streams in createFile().
|
|
49
|
+
* If false (default), streams are buffered to a Buffer before being passed.
|
|
50
|
+
* Override and return true to receive Readable streams directly.
|
|
51
|
+
*
|
|
52
|
+
* @return {boolean}
|
|
53
|
+
*/
|
|
54
|
+
get supportsStreaming() {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Responsible for deleting the specified file
|
|
59
|
+
*
|
|
60
|
+
* @param {string} filename - the filename to delete
|
|
61
|
+
*
|
|
62
|
+
* @return {Promise} a promise that should fail if the deletion didn't succeed
|
|
63
|
+
*/
|
|
64
|
+
deleteFile(filename) {}
|
|
65
|
+
|
|
66
|
+
/** Responsible for retrieving the data of the specified file
|
|
67
|
+
*
|
|
68
|
+
* @param {string} filename - the name of file to retrieve
|
|
69
|
+
*
|
|
70
|
+
* @return {Promise} a promise that should pass with the file data or fail on error
|
|
71
|
+
*/
|
|
72
|
+
getFileData(filename) {}
|
|
73
|
+
|
|
74
|
+
/** Returns an absolute URL where the file can be accessed
|
|
75
|
+
*
|
|
76
|
+
* @param {Config} config - server configuration
|
|
77
|
+
* @param {string} filename
|
|
78
|
+
*
|
|
79
|
+
* @return {string | Promise<string>} Absolute URL
|
|
80
|
+
*/
|
|
81
|
+
getFileLocation(config, filename) {}
|
|
82
|
+
|
|
83
|
+
/** Validate a filename for this adapter type
|
|
84
|
+
*
|
|
85
|
+
* @param {string} filename
|
|
86
|
+
*
|
|
87
|
+
* @returns {null|Parse.Error} null if there are no errors
|
|
88
|
+
*/
|
|
89
|
+
// validateFilename(filename: string): ?Parse.Error {}
|
|
90
|
+
|
|
91
|
+
/** Handles Byte-Range Requests for Streaming
|
|
92
|
+
*
|
|
93
|
+
* @param {string} filename
|
|
94
|
+
* @param {object} req
|
|
95
|
+
* @param {object} res
|
|
96
|
+
* @param {string} contentType
|
|
97
|
+
*
|
|
98
|
+
* @returns {Promise} Data for byte range
|
|
99
|
+
*/
|
|
100
|
+
// handleFileStream(filename: string, res: any, req: any, contentType: string): Promise
|
|
101
|
+
|
|
102
|
+
/** Responsible for retrieving metadata and tags
|
|
103
|
+
*
|
|
104
|
+
* @param {string} filename - the filename to retrieve metadata
|
|
105
|
+
*
|
|
106
|
+
* @return {Promise} a promise that should pass with metadata
|
|
107
|
+
*/
|
|
108
|
+
// getMetadata(filename: string): Promise<any> {}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Simple filename validation
|
|
113
|
+
*
|
|
114
|
+
* @param filename
|
|
115
|
+
* @returns {null|Parse.Error}
|
|
116
|
+
*/
|
|
117
|
+
exports.FilesAdapter = FilesAdapter;
|
|
118
|
+
function validateFilename(filename) {
|
|
119
|
+
if (filename.length > 128) {
|
|
120
|
+
return new _node.default.Error(_node.default.Error.INVALID_FILE_NAME, 'Filename too long.');
|
|
121
|
+
}
|
|
122
|
+
const regx = /^[_a-zA-Z0-9][a-zA-Z0-9@. ~_-]*$/;
|
|
123
|
+
if (!filename.match(regx)) {
|
|
124
|
+
return new _node.default.Error(_node.default.Error.INVALID_FILE_NAME, 'Filename contains invalid characters.');
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
var _default = exports.default = FilesAdapter;
|
|
129
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRmlsZXNBZGFwdGVyIiwiY3JlYXRlRmlsZSIsImZpbGVuYW1lIiwiZGF0YSIsImNvbnRlbnRUeXBlIiwib3B0aW9ucyIsInN1cHBvcnRzU3RyZWFtaW5nIiwiZGVsZXRlRmlsZSIsImdldEZpbGVEYXRhIiwiZ2V0RmlsZUxvY2F0aW9uIiwiY29uZmlnIiwiZXhwb3J0cyIsInZhbGlkYXRlRmlsZW5hbWUiLCJsZW5ndGgiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9GSUxFX05BTUUiLCJyZWd4IiwibWF0Y2giLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9GaWxlcy9GaWxlc0FkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEZpbGVzIEFkYXB0ZXJcbi8vXG4vLyBBbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgZmlsZSBzdG9yYWdlIG1lY2hhbmlzbS5cbi8vXG4vLyBBZGFwdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4vLyAqIGNyZWF0ZUZpbGUoZmlsZW5hbWUsIGRhdGEsIGNvbnRlbnRUeXBlKVxuLy8gKiBkZWxldGVGaWxlKGZpbGVuYW1lKVxuLy8gKiBnZXRGaWxlRGF0YShmaWxlbmFtZSlcbi8vICogZ2V0RmlsZUxvY2F0aW9uKGNvbmZpZywgZmlsZW5hbWUpXG4vLyBBZGFwdGVyIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbi8vICogdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSlcbi8vICogaGFuZGxlRmlsZVN0cmVhbShmaWxlbmFtZSwgcmVxLCByZXMsIGNvbnRlbnRUeXBlKVxuLy9cbi8vIERlZmF1bHQgaXMgR3JpZEZTQnVja2V0QWRhcHRlciwgd2hpY2ggcmVxdWlyZXMgbW9uZ29cbi8vIGFuZCBmb3IgdGhlIEFQSSBzZXJ2ZXIgdG8gYmUgdXNpbmcgdGhlIERhdGFiYXNlQ29udHJvbGxlciB3aXRoIE1vbmdvXG4vLyBkYXRhYmFzZSBhZGFwdGVyLlxuXG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gJy4uLy4uL0NvbmZpZyc7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG4vKipcbiAqIEBpbnRlcmZhY2VcbiAqIEBtZW1iZXJvZiBtb2R1bGU6QWRhcHRlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVzQWRhcHRlciB7XG4gIC8qKiBSZXNwb25zaWJsZSBmb3Igc3RvcmluZyB0aGUgZmlsZSBpbiBvcmRlciB0byBiZSByZXRyaWV2ZWQgbGF0ZXIgYnkgaXRzIGZpbGVuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIHRoZSBmaWxlbmFtZSB0byBzYXZlXG4gICAqIEBwYXJhbSB7QnVmZmVyfFJlYWRhYmxlfSBkYXRhIC0gdGhlIGZpbGUgZGF0YSBhcyBhIEJ1ZmZlciwgb3IgYSBSZWFkYWJsZSBzdHJlYW0gaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgc3RyZWFtaW5nIChzZWUgc3VwcG9ydHNTdHJlYW1pbmcpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZSAtIHRoZSBzdXBwb3NlZCBjb250ZW50VHlwZVxuICAgKiBAZGlzY3Vzc2lvbiB0aGUgY29udGVudFR5cGUgY2FuIGJlIHVuZGVmaW5lZCBpZiB0aGUgY29udHJvbGxlciB3YXMgbm90IGFibGUgdG8gZGV0ZXJtaW5lIGl0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gKE9wdGlvbmFsKSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBmaWxlIGFkYXB0ZXIgKFMzIEZpbGUgQWRhcHRlciBPbmx5KVxuICAgKiAtIHRhZ3M6IG9iamVjdCBjb250YWluaW5nIGtleSB2YWx1ZSBwYWlycyB0aGF0IHdpbGwgYmUgc3RvcmVkIHdpdGggZmlsZVxuICAgKiAtIG1ldGFkYXRhOiBvYmplY3QgY29udGFpbmluZyBrZXkgdmFsdWUgcGFpcnMgdGhhdCB3aWxsIGJlIHNvdHJlZCB3aXRoIGZpbGUgKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlci1ndWlkZS9hZGQtb2JqZWN0LW1ldGFkYXRhLmh0bWwpXG4gICAqIEBkaXNjdXNzaW9uIG9wdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGZpbGUgYWRhcHRlcnMuIENoZWNrIHRoZSB5b3VyIGFkYXB0ZXIncyBkb2N1bWVudGF0aW9uIGZvciBjb21wYXRpYmlsaXR5XG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHNob3VsZCBmYWlsIGlmIHRoZSBzdG9yYWdlIGRpZG4ndCBzdWNjZWVkXG4gICAqL1xuICBjcmVhdGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGEsIGNvbnRlbnRUeXBlOiBzdHJpbmcsIG9wdGlvbnM6IE9iamVjdCk6IFByb21pc2Uge31cblxuICAvKiogV2hldGhlciB0aGlzIGFkYXB0ZXIgc3VwcG9ydHMgcmVjZWl2aW5nIFJlYWRhYmxlIHN0cmVhbXMgaW4gY3JlYXRlRmlsZSgpLlxuICAgKiBJZiBmYWxzZSAoZGVmYXVsdCksIHN0cmVhbXMgYXJlIGJ1ZmZlcmVkIHRvIGEgQnVmZmVyIGJlZm9yZSBiZWluZyBwYXNzZWQuXG4gICAqIE92ZXJyaWRlIGFuZCByZXR1cm4gdHJ1ZSB0byByZWNlaXZlIFJlYWRhYmxlIHN0cmVhbXMgZGlyZWN0bHkuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgc3VwcG9ydHNTdHJlYW1pbmcoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIFJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgc3BlY2lmaWVkIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIGZpbGVuYW1lIHRvIGRlbGV0ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBzaG91bGQgZmFpbCBpZiB0aGUgZGVsZXRpb24gZGlkbid0IHN1Y2NlZWRcbiAgICovXG4gIGRlbGV0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2Uge31cblxuICAvKiogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBmaWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIHRoZSBuYW1lIG9mIGZpbGUgdG8gcmV0cmlldmVcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgc2hvdWxkIHBhc3Mgd2l0aCB0aGUgZmlsZSBkYXRhIG9yIGZhaWwgb24gZXJyb3JcbiAgICovXG4gIGdldEZpbGVEYXRhKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge31cblxuICAvKiogUmV0dXJucyBhbiBhYnNvbHV0ZSBVUkwgd2hlcmUgdGhlIGZpbGUgY2FuIGJlIGFjY2Vzc2VkXG4gICAqXG4gICAqIEBwYXJhbSB7Q29uZmlnfSBjb25maWcgLSBzZXJ2ZXIgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBBYnNvbHV0ZSBVUkxcbiAgICovXG4gIGdldEZpbGVMb2NhdGlvbihjb25maWc6IENvbmZpZywgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB7fVxuXG4gIC8qKiBWYWxpZGF0ZSBhIGZpbGVuYW1lIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICpcbiAgICogQHJldHVybnMge251bGx8UGFyc2UuRXJyb3J9IG51bGwgaWYgdGhlcmUgYXJlIG5vIGVycm9yc1xuICAgKi9cbiAgLy8gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogP1BhcnNlLkVycm9yIHt9XG5cbiAgLyoqIEhhbmRsZXMgQnl0ZS1SYW5nZSBSZXF1ZXN0cyBmb3IgU3RyZWFtaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBEYXRhIGZvciBieXRlIHJhbmdlXG4gICAqL1xuICAvLyBoYW5kbGVGaWxlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHJlczogYW55LCByZXE6IGFueSwgY29udGVudFR5cGU6IHN0cmluZyk6IFByb21pc2VcblxuICAvKiogUmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgbWV0YWRhdGEgYW5kIHRhZ3NcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gdGhlIGZpbGVuYW1lIHRvIHJldHJpZXZlIG1ldGFkYXRhXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHNob3VsZCBwYXNzIHdpdGggbWV0YWRhdGFcbiAgICovXG4gIC8vIGdldE1ldGFkYXRhKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge31cbn1cblxuLyoqXG4gKiBTaW1wbGUgZmlsZW5hbWUgdmFsaWRhdGlvblxuICpcbiAqIEBwYXJhbSBmaWxlbmFtZVxuICogQHJldHVybnMge251bGx8UGFyc2UuRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTogP1BhcnNlLkVycm9yIHtcbiAgaWYgKGZpbGVuYW1lLmxlbmd0aCA+IDEyOCkge1xuICAgIHJldHVybiBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9GSUxFX05BTUUsICdGaWxlbmFtZSB0b28gbG9uZy4nKTtcbiAgfVxuXG4gIGNvbnN0IHJlZ3ggPSAvXltfYS16QS1aMC05XVthLXpBLVowLTlALiB+Xy1dKiQvO1xuICBpZiAoIWZpbGVuYW1lLm1hdGNoKHJlZ3gpKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0ZJTEVfTkFNRSwgJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4nKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZXNBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBbUJBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUErQixTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQW5CL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1HLFlBQVksQ0FBQztFQUN4QjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxVQUFVQSxDQUFDQyxRQUFnQixFQUFFQyxJQUFJLEVBQUVDLFdBQW1CLEVBQUVDLE9BQWUsRUFBVyxDQUFDOztFQUVuRjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFJQyxpQkFBaUJBLENBQUEsRUFBRztJQUN0QixPQUFPLEtBQUs7RUFDZDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsVUFBVUEsQ0FBQ0wsUUFBZ0IsRUFBVyxDQUFDOztFQUV2QztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRU0sV0FBV0EsQ0FBQ04sUUFBZ0IsRUFBZ0IsQ0FBQzs7RUFFN0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRU8sZUFBZUEsQ0FBQ0MsTUFBYyxFQUFFUixRQUFnQixFQUE0QixDQUFDOztFQUU3RTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBUyxPQUFBLENBQUFYLFlBQUEsR0FBQUEsWUFBQTtBQU1PLFNBQVNZLGdCQUFnQkEsQ0FBQ1YsUUFBUSxFQUFnQjtFQUN2RCxJQUFJQSxRQUFRLENBQUNXLE1BQU0sR0FBRyxHQUFHLEVBQUU7SUFDekIsT0FBTyxJQUFJQyxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUNDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDO0VBQzdFO0VBRUEsTUFBTUMsSUFBSSxHQUFHLGtDQUFrQztFQUMvQyxJQUFJLENBQUNmLFFBQVEsQ0FBQ2dCLEtBQUssQ0FBQ0QsSUFBSSxDQUFDLEVBQUU7SUFDekIsT0FBTyxJQUFJSCxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUNDLGlCQUFpQixFQUFFLHVDQUF1QyxDQUFDO0VBQ2hHO0VBQ0EsT0FBTyxJQUFJO0FBQ2I7QUFBQyxJQUFBRyxRQUFBLEdBQUFSLE9BQUEsQ0FBQVosT0FBQSxHQUVjQyxZQUFZIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.GridFSBucketAdapter = void 0;
|
|
7
|
+
var _mongodb = require("mongodb");
|
|
8
|
+
var _FilesAdapter = require("./FilesAdapter");
|
|
9
|
+
var _defaults = _interopRequireWildcard(require("../../defaults"));
|
|
10
|
+
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); }
|
|
11
|
+
/**
|
|
12
|
+
GridFSBucketAdapter
|
|
13
|
+
Stores files in Mongo using GridFS
|
|
14
|
+
Requires the database adapter to be based on mongoclient
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// -disable-next
|
|
20
|
+
|
|
21
|
+
const crypto = require('crypto');
|
|
22
|
+
class GridFSBucketAdapter extends _FilesAdapter.FilesAdapter {
|
|
23
|
+
constructor(mongoDatabaseURI = _defaults.default.DefaultMongoURI, mongoOptions = {}, encryptionKey = undefined) {
|
|
24
|
+
super();
|
|
25
|
+
this._databaseURI = mongoDatabaseURI;
|
|
26
|
+
this._algorithm = 'aes-256-gcm';
|
|
27
|
+
this._encryptionKey = encryptionKey !== undefined ? crypto.createHash('sha256').update(String(encryptionKey)).digest('base64').substring(0, 32) : null;
|
|
28
|
+
const defaultMongoOptions = {};
|
|
29
|
+
const _mongoOptions = Object.assign(defaultMongoOptions, mongoOptions);
|
|
30
|
+
this._clientMetadata = mongoOptions.clientMetadata;
|
|
31
|
+
this._batchSize = mongoOptions.batchSize;
|
|
32
|
+
// Remove Parse Server-specific options that should not be passed to MongoDB client
|
|
33
|
+
for (const key of _defaults.ParseServerDatabaseOptions) {
|
|
34
|
+
delete _mongoOptions[key];
|
|
35
|
+
}
|
|
36
|
+
this._mongoOptions = _mongoOptions;
|
|
37
|
+
}
|
|
38
|
+
get supportsStreaming() {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
_connect() {
|
|
42
|
+
if (!this._connectionPromise) {
|
|
43
|
+
// Only use driverInfo if clientMetadata option is set
|
|
44
|
+
const options = {
|
|
45
|
+
...this._mongoOptions
|
|
46
|
+
};
|
|
47
|
+
if (this._clientMetadata) {
|
|
48
|
+
options.driverInfo = {
|
|
49
|
+
name: this._clientMetadata.name,
|
|
50
|
+
version: this._clientMetadata.version
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
this._connectionPromise = _mongodb.MongoClient.connect(this._databaseURI, options).then(client => {
|
|
54
|
+
this._client = client;
|
|
55
|
+
return client.db(client.s.options.dbName);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return this._connectionPromise;
|
|
59
|
+
}
|
|
60
|
+
_getBucket() {
|
|
61
|
+
return this._connect().then(database => new _mongodb.GridFSBucket(database));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// For a given config object, filename, and data, store a file
|
|
65
|
+
// Returns a promise
|
|
66
|
+
async createFile(filename, data, contentType, options = {}) {
|
|
67
|
+
const bucket = await this._getBucket();
|
|
68
|
+
const stream = await bucket.openUploadStream(filename, {
|
|
69
|
+
metadata: options.metadata
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// If data is a stream and encryption is enabled, buffer first
|
|
73
|
+
// (AES-256-GCM needs complete data for format: [encrypted][IV][authTag])
|
|
74
|
+
if (typeof data?.pipe === 'function' && this._encryptionKey !== null) {
|
|
75
|
+
data = await new Promise((resolve, reject) => {
|
|
76
|
+
const chunks = [];
|
|
77
|
+
data.on('data', chunk => chunks.push(chunk));
|
|
78
|
+
data.on('end', () => resolve(Buffer.concat(chunks)));
|
|
79
|
+
data.on('error', reject);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (typeof data?.pipe === 'function') {
|
|
83
|
+
// Pipe readable stream directly into GridFS upload stream
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
data.pipe(stream);
|
|
86
|
+
stream.on('finish', resolve);
|
|
87
|
+
stream.on('error', reject);
|
|
88
|
+
data.on('error', err => {
|
|
89
|
+
stream.destroy(err);
|
|
90
|
+
reject(err);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Buffer path (existing behavior)
|
|
96
|
+
if (this._encryptionKey !== null) {
|
|
97
|
+
try {
|
|
98
|
+
const iv = crypto.randomBytes(16);
|
|
99
|
+
const cipher = crypto.createCipheriv(this._algorithm, this._encryptionKey, iv);
|
|
100
|
+
const encryptedResult = Buffer.concat([cipher.update(data), cipher.final(), iv, cipher.getAuthTag()]);
|
|
101
|
+
await stream.write(encryptedResult);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
return reject(err);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
await stream.write(data);
|
|
109
|
+
}
|
|
110
|
+
stream.end();
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
stream.on('finish', resolve);
|
|
113
|
+
stream.on('error', reject);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async deleteFile(filename) {
|
|
117
|
+
const bucket = await this._getBucket();
|
|
118
|
+
const documents = await bucket.find({
|
|
119
|
+
filename
|
|
120
|
+
}, {
|
|
121
|
+
batchSize: this._batchSize
|
|
122
|
+
}).toArray();
|
|
123
|
+
if (documents.length === 0) {
|
|
124
|
+
throw new Error('FileNotFound');
|
|
125
|
+
}
|
|
126
|
+
return Promise.all(documents.map(doc => {
|
|
127
|
+
return bucket.delete(doc._id);
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
async getFileData(filename) {
|
|
131
|
+
const bucket = await this._getBucket();
|
|
132
|
+
const stream = bucket.openDownloadStreamByName(filename);
|
|
133
|
+
stream.read();
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
const chunks = [];
|
|
136
|
+
stream.on('data', data => {
|
|
137
|
+
chunks.push(data);
|
|
138
|
+
});
|
|
139
|
+
stream.on('end', () => {
|
|
140
|
+
const data = Buffer.concat(chunks);
|
|
141
|
+
if (this._encryptionKey !== null) {
|
|
142
|
+
try {
|
|
143
|
+
const authTagLocation = data.length - 16;
|
|
144
|
+
const ivLocation = data.length - 32;
|
|
145
|
+
const authTag = data.slice(authTagLocation);
|
|
146
|
+
const iv = data.slice(ivLocation, authTagLocation);
|
|
147
|
+
const encrypted = data.slice(0, ivLocation);
|
|
148
|
+
const decipher = crypto.createDecipheriv(this._algorithm, this._encryptionKey, iv);
|
|
149
|
+
decipher.setAuthTag(authTag);
|
|
150
|
+
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
|
|
151
|
+
return resolve(decrypted);
|
|
152
|
+
} catch (err) {
|
|
153
|
+
return reject(err);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
resolve(data);
|
|
157
|
+
});
|
|
158
|
+
stream.on('error', err => {
|
|
159
|
+
reject(err);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
async rotateEncryptionKey(options = {}) {
|
|
164
|
+
let fileNames = [];
|
|
165
|
+
let oldKeyFileAdapter = {};
|
|
166
|
+
const bucket = await this._getBucket();
|
|
167
|
+
if (options.oldKey !== undefined) {
|
|
168
|
+
oldKeyFileAdapter = new GridFSBucketAdapter(this._databaseURI, this._mongoOptions, options.oldKey);
|
|
169
|
+
} else {
|
|
170
|
+
oldKeyFileAdapter = new GridFSBucketAdapter(this._databaseURI, this._mongoOptions);
|
|
171
|
+
}
|
|
172
|
+
if (options.fileNames !== undefined) {
|
|
173
|
+
fileNames = options.fileNames;
|
|
174
|
+
} else {
|
|
175
|
+
const fileNamesIterator = await bucket.find({}, {
|
|
176
|
+
batchSize: this._batchSize
|
|
177
|
+
}).toArray();
|
|
178
|
+
fileNamesIterator.forEach(file => {
|
|
179
|
+
fileNames.push(file.filename);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
let fileNamesNotRotated = fileNames;
|
|
183
|
+
const fileNamesRotated = [];
|
|
184
|
+
for (const fileName of fileNames) {
|
|
185
|
+
try {
|
|
186
|
+
const plainTextData = await oldKeyFileAdapter.getFileData(fileName);
|
|
187
|
+
// Overwrite file with data encrypted with new key
|
|
188
|
+
await this.createFile(fileName, plainTextData);
|
|
189
|
+
fileNamesRotated.push(fileName);
|
|
190
|
+
fileNamesNotRotated = fileNamesNotRotated.filter(function (value) {
|
|
191
|
+
return value !== fileName;
|
|
192
|
+
});
|
|
193
|
+
} catch {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
rotated: fileNamesRotated,
|
|
199
|
+
notRotated: fileNamesNotRotated
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
getFileLocation(config, filename) {
|
|
203
|
+
const encodedFilename = filename.split('/').map(encodeURIComponent).join('/');
|
|
204
|
+
return config.mount + '/files/' + config.applicationId + '/' + encodedFilename;
|
|
205
|
+
}
|
|
206
|
+
async getMetadata(filename) {
|
|
207
|
+
const bucket = await this._getBucket();
|
|
208
|
+
const files = await bucket.find({
|
|
209
|
+
filename
|
|
210
|
+
}, {
|
|
211
|
+
batchSize: this._batchSize
|
|
212
|
+
}).toArray();
|
|
213
|
+
if (files.length === 0) {
|
|
214
|
+
return {};
|
|
215
|
+
}
|
|
216
|
+
const {
|
|
217
|
+
metadata
|
|
218
|
+
} = files[0];
|
|
219
|
+
return {
|
|
220
|
+
metadata
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
async handleFileStream(filename, req, res, contentType) {
|
|
224
|
+
const bucket = await this._getBucket();
|
|
225
|
+
const files = await bucket.find({
|
|
226
|
+
filename
|
|
227
|
+
}, {
|
|
228
|
+
batchSize: this._batchSize
|
|
229
|
+
}).toArray();
|
|
230
|
+
if (files.length === 0) {
|
|
231
|
+
throw new Error('FileNotFound');
|
|
232
|
+
}
|
|
233
|
+
const parts = req.get('Range').replace(/bytes=/, '').split('-');
|
|
234
|
+
const partialstart = parts[0];
|
|
235
|
+
const partialend = parts[1];
|
|
236
|
+
const fileLength = files[0].length;
|
|
237
|
+
const fileStart = parseInt(partialstart, 10);
|
|
238
|
+
const fileEnd = partialend ? parseInt(partialend, 10) : fileLength;
|
|
239
|
+
let start = Math.min(fileStart || 0, fileEnd, fileLength);
|
|
240
|
+
let end = Math.max(fileStart || 0, fileEnd) + 1 || fileLength;
|
|
241
|
+
if (isNaN(fileStart)) {
|
|
242
|
+
start = fileLength - end + 1;
|
|
243
|
+
end = fileLength;
|
|
244
|
+
}
|
|
245
|
+
end = Math.min(end, fileLength);
|
|
246
|
+
start = Math.max(start, 0);
|
|
247
|
+
res.status(206);
|
|
248
|
+
res.header('Accept-Ranges', 'bytes');
|
|
249
|
+
res.header('Content-Length', end - start);
|
|
250
|
+
res.header('Content-Range', 'bytes ' + start + '-' + end + '/' + fileLength);
|
|
251
|
+
res.header('Content-Type', contentType);
|
|
252
|
+
const stream = bucket.openDownloadStreamByName(filename);
|
|
253
|
+
stream.start(start);
|
|
254
|
+
if (end) {
|
|
255
|
+
stream.end(end);
|
|
256
|
+
}
|
|
257
|
+
stream.on('data', chunk => {
|
|
258
|
+
res.write(chunk);
|
|
259
|
+
});
|
|
260
|
+
stream.on('error', e => {
|
|
261
|
+
res.status(404);
|
|
262
|
+
res.send(e.message);
|
|
263
|
+
});
|
|
264
|
+
stream.on('end', () => {
|
|
265
|
+
res.end();
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
handleShutdown() {
|
|
269
|
+
if (!this._client) {
|
|
270
|
+
return Promise.resolve();
|
|
271
|
+
}
|
|
272
|
+
return this._client.close(false);
|
|
273
|
+
}
|
|
274
|
+
validateFilename(filename) {
|
|
275
|
+
return (0, _FilesAdapter.validateFilename)(filename);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
exports.GridFSBucketAdapter = GridFSBucketAdapter;
|
|
279
|
+
var _default = exports.default = GridFSBucketAdapter;
|
|
280
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9uZ29kYiIsInJlcXVpcmUiLCJfRmlsZXNBZGFwdGVyIiwiX2RlZmF1bHRzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjcnlwdG8iLCJHcmlkRlNCdWNrZXRBZGFwdGVyIiwiRmlsZXNBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJtb25nb0RhdGFiYXNlVVJJIiwiZGVmYXVsdHMiLCJEZWZhdWx0TW9uZ29VUkkiLCJtb25nb09wdGlvbnMiLCJlbmNyeXB0aW9uS2V5IiwidW5kZWZpbmVkIiwiX2RhdGFiYXNlVVJJIiwiX2FsZ29yaXRobSIsIl9lbmNyeXB0aW9uS2V5IiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIlN0cmluZyIsImRpZ2VzdCIsInN1YnN0cmluZyIsImRlZmF1bHRNb25nb09wdGlvbnMiLCJfbW9uZ29PcHRpb25zIiwiYXNzaWduIiwiX2NsaWVudE1ldGFkYXRhIiwiY2xpZW50TWV0YWRhdGEiLCJfYmF0Y2hTaXplIiwiYmF0Y2hTaXplIiwia2V5IiwiUGFyc2VTZXJ2ZXJEYXRhYmFzZU9wdGlvbnMiLCJzdXBwb3J0c1N0cmVhbWluZyIsIl9jb25uZWN0IiwiX2Nvbm5lY3Rpb25Qcm9taXNlIiwib3B0aW9ucyIsImRyaXZlckluZm8iLCJuYW1lIiwidmVyc2lvbiIsIk1vbmdvQ2xpZW50IiwiY29ubmVjdCIsInRoZW4iLCJjbGllbnQiLCJfY2xpZW50IiwiZGIiLCJzIiwiZGJOYW1lIiwiX2dldEJ1Y2tldCIsImRhdGFiYXNlIiwiR3JpZEZTQnVja2V0IiwiY3JlYXRlRmlsZSIsImZpbGVuYW1lIiwiZGF0YSIsImNvbnRlbnRUeXBlIiwiYnVja2V0Iiwic3RyZWFtIiwib3BlblVwbG9hZFN0cmVhbSIsIm1ldGFkYXRhIiwicGlwZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2h1bmtzIiwib24iLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJlcnIiLCJkZXN0cm95IiwiaXYiLCJyYW5kb21CeXRlcyIsImNpcGhlciIsImNyZWF0ZUNpcGhlcml2IiwiZW5jcnlwdGVkUmVzdWx0IiwiZmluYWwiLCJnZXRBdXRoVGFnIiwid3JpdGUiLCJlbmQiLCJkZWxldGVGaWxlIiwiZG9jdW1lbnRzIiwiZmluZCIsInRvQXJyYXkiLCJsZW5ndGgiLCJFcnJvciIsImFsbCIsIm1hcCIsImRvYyIsImRlbGV0ZSIsIl9pZCIsImdldEZpbGVEYXRhIiwib3BlbkRvd25sb2FkU3RyZWFtQnlOYW1lIiwicmVhZCIsImF1dGhUYWdMb2NhdGlvbiIsIml2TG9jYXRpb24iLCJhdXRoVGFnIiwic2xpY2UiLCJlbmNyeXB0ZWQiLCJkZWNpcGhlciIsImNyZWF0ZURlY2lwaGVyaXYiLCJzZXRBdXRoVGFnIiwiZGVjcnlwdGVkIiwicm90YXRlRW5jcnlwdGlvbktleSIsImZpbGVOYW1lcyIsIm9sZEtleUZpbGVBZGFwdGVyIiwib2xkS2V5IiwiZmlsZU5hbWVzSXRlcmF0b3IiLCJmb3JFYWNoIiwiZmlsZSIsImZpbGVOYW1lc05vdFJvdGF0ZWQiLCJmaWxlTmFtZXNSb3RhdGVkIiwiZmlsZU5hbWUiLCJwbGFpblRleHREYXRhIiwiZmlsdGVyIiwidmFsdWUiLCJyb3RhdGVkIiwibm90Um90YXRlZCIsImdldEZpbGVMb2NhdGlvbiIsImNvbmZpZyIsImVuY29kZWRGaWxlbmFtZSIsInNwbGl0IiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwiam9pbiIsIm1vdW50IiwiYXBwbGljYXRpb25JZCIsImdldE1ldGFkYXRhIiwiZmlsZXMiLCJoYW5kbGVGaWxlU3RyZWFtIiwicmVxIiwicmVzIiwicGFydHMiLCJyZXBsYWNlIiwicGFydGlhbHN0YXJ0IiwicGFydGlhbGVuZCIsImZpbGVMZW5ndGgiLCJmaWxlU3RhcnQiLCJwYXJzZUludCIsImZpbGVFbmQiLCJzdGFydCIsIk1hdGgiLCJtaW4iLCJtYXgiLCJpc05hTiIsInN0YXR1cyIsImhlYWRlciIsInNlbmQiLCJtZXNzYWdlIiwiaGFuZGxlU2h1dGRvd24iLCJjbG9zZSIsInZhbGlkYXRlRmlsZW5hbWUiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvRmlsZXMvR3JpZEZTQnVja2V0QWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiBHcmlkRlNCdWNrZXRBZGFwdGVyXG4gU3RvcmVzIGZpbGVzIGluIE1vbmdvIHVzaW5nIEdyaWRGU1xuIFJlcXVpcmVzIHRoZSBkYXRhYmFzZSBhZGFwdGVyIHRvIGJlIGJhc2VkIG9uIG1vbmdvY2xpZW50XG5cbiBAZmxvdyB3ZWFrXG4gKi9cblxuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgeyBNb25nb0NsaWVudCwgR3JpZEZTQnVja2V0LCBEYiB9IGZyb20gJ21vbmdvZGInO1xuaW1wb3J0IHsgRmlsZXNBZGFwdGVyLCB2YWxpZGF0ZUZpbGVuYW1lIH0gZnJvbSAnLi9GaWxlc0FkYXB0ZXInO1xuaW1wb3J0IGRlZmF1bHRzLCB7IFBhcnNlU2VydmVyRGF0YWJhc2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGVmYXVsdHMnO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBHcmlkRlNCdWNrZXRBZGFwdGVyIGV4dGVuZHMgRmlsZXNBZGFwdGVyIHtcbiAgX2RhdGFiYXNlVVJJOiBzdHJpbmc7XG4gIF9jb25uZWN0aW9uUHJvbWlzZTogUHJvbWlzZTxEYj47XG4gIF9tb25nb09wdGlvbnM6IE9iamVjdDtcbiAgX2FsZ29yaXRobTogc3RyaW5nO1xuICBfY2xpZW50TWV0YWRhdGE6ID97IG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbW9uZ29EYXRhYmFzZVVSSSA9IGRlZmF1bHRzLkRlZmF1bHRNb25nb1VSSSxcbiAgICBtb25nb09wdGlvbnMgPSB7fSxcbiAgICBlbmNyeXB0aW9uS2V5ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZGF0YWJhc2VVUkkgPSBtb25nb0RhdGFiYXNlVVJJO1xuICAgIHRoaXMuX2FsZ29yaXRobSA9ICdhZXMtMjU2LWdjbSc7XG4gICAgdGhpcy5fZW5jcnlwdGlvbktleSA9XG4gICAgICBlbmNyeXB0aW9uS2V5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBjcnlwdG9cbiAgICAgICAgICAuY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgICAudXBkYXRlKFN0cmluZyhlbmNyeXB0aW9uS2V5KSlcbiAgICAgICAgICAuZGlnZXN0KCdiYXNlNjQnKVxuICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMzIpXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBkZWZhdWx0TW9uZ29PcHRpb25zID0ge307XG4gICAgY29uc3QgX21vbmdvT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdE1vbmdvT3B0aW9ucywgbW9uZ29PcHRpb25zKTtcbiAgICB0aGlzLl9jbGllbnRNZXRhZGF0YSA9IG1vbmdvT3B0aW9ucy5jbGllbnRNZXRhZGF0YTtcbiAgICB0aGlzLl9iYXRjaFNpemUgPSBtb25nb09wdGlvbnMuYmF0Y2hTaXplO1xuICAgIC8vIFJlbW92ZSBQYXJzZSBTZXJ2ZXItc3BlY2lmaWMgb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgcGFzc2VkIHRvIE1vbmdvREIgY2xpZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgUGFyc2VTZXJ2ZXJEYXRhYmFzZU9wdGlvbnMpIHtcbiAgICAgIGRlbGV0ZSBfbW9uZ29PcHRpb25zW2tleV07XG4gICAgfVxuICAgIHRoaXMuX21vbmdvT3B0aW9ucyA9IF9tb25nb09wdGlvbnM7XG4gIH1cblxuICBnZXQgc3VwcG9ydHNTdHJlYW1pbmcoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBfY29ubmVjdCgpIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25Qcm9taXNlKSB7XG4gICAgICAvLyBPbmx5IHVzZSBkcml2ZXJJbmZvIGlmIGNsaWVudE1ldGFkYXRhIG9wdGlvbiBpcyBzZXRcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX21vbmdvT3B0aW9ucyB9O1xuICAgICAgaWYgKHRoaXMuX2NsaWVudE1ldGFkYXRhKSB7XG4gICAgICAgIG9wdGlvbnMuZHJpdmVySW5mbyA9IHtcbiAgICAgICAgICBuYW1lOiB0aGlzLl9jbGllbnRNZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IHRoaXMuX2NsaWVudE1ldGFkYXRhLnZlcnNpb25cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29ubmVjdGlvblByb21pc2UgPSBNb25nb0NsaWVudC5jb25uZWN0KHRoaXMuX2RhdGFiYXNlVVJJLCBvcHRpb25zKS50aGVuKFxuICAgICAgICBjbGllbnQgPT4ge1xuICAgICAgICAgIHRoaXMuX2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgICByZXR1cm4gY2xpZW50LmRiKGNsaWVudC5zLm9wdGlvbnMuZGJOYW1lKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Qcm9taXNlO1xuICB9XG5cbiAgX2dldEJ1Y2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdCgpLnRoZW4oZGF0YWJhc2UgPT4gbmV3IEdyaWRGU0J1Y2tldChkYXRhYmFzZSkpO1xuICB9XG5cbiAgLy8gRm9yIGEgZ2l2ZW4gY29uZmlnIG9iamVjdCwgZmlsZW5hbWUsIGFuZCBkYXRhLCBzdG9yZSBhIGZpbGVcbiAgLy8gUmV0dXJucyBhIHByb21pc2VcbiAgYXN5bmMgY3JlYXRlRmlsZShmaWxlbmFtZTogc3RyaW5nLCBkYXRhLCBjb250ZW50VHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgYnVja2V0Lm9wZW5VcGxvYWRTdHJlYW0oZmlsZW5hbWUsIHtcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgIH0pO1xuXG4gICAgLy8gSWYgZGF0YSBpcyBhIHN0cmVhbSBhbmQgZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBidWZmZXIgZmlyc3RcbiAgICAvLyAoQUVTLTI1Ni1HQ00gbmVlZHMgY29tcGxldGUgZGF0YSBmb3IgZm9ybWF0OiBbZW5jcnlwdGVkXVtJVl1bYXV0aFRhZ10pXG4gICAgaWYgKHR5cGVvZiBkYXRhPy5waXBlID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX2VuY3J5cHRpb25LZXkgIT09IG51bGwpIHtcbiAgICAgIGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgICAgICBkYXRhLm9uKCdkYXRhJywgY2h1bmsgPT4gY2h1bmtzLnB1c2goY2h1bmspKTtcbiAgICAgICAgZGF0YS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpKTtcbiAgICAgICAgZGF0YS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhPy5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBQaXBlIHJlYWRhYmxlIHN0cmVhbSBkaXJlY3RseSBpbnRvIEdyaWRGUyB1cGxvYWQgc3RyZWFtXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBkYXRhLnBpcGUoc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIGRhdGEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQnVmZmVyIHBhdGggKGV4aXN0aW5nIGJlaGF2aW9yKVxuICAgIGlmICh0aGlzLl9lbmNyeXB0aW9uS2V5ICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpdiA9IGNyeXB0by5yYW5kb21CeXRlcygxNik7XG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdih0aGlzLl9hbGdvcml0aG0sIHRoaXMuX2VuY3J5cHRpb25LZXksIGl2KTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUmVzdWx0ID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgY2lwaGVyLnVwZGF0ZShkYXRhKSxcbiAgICAgICAgICBjaXBoZXIuZmluYWwoKSxcbiAgICAgICAgICBpdixcbiAgICAgICAgICBjaXBoZXIuZ2V0QXV0aFRhZygpLFxuICAgICAgICBdKTtcbiAgICAgICAgYXdhaXQgc3RyZWFtLndyaXRlKGVuY3J5cHRlZFJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzdHJlYW0ud3JpdGUoZGF0YSk7XG4gICAgfVxuICAgIHN0cmVhbS5lbmQoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRmlsZShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3QgZG9jdW1lbnRzID0gYXdhaXQgYnVja2V0LmZpbmQoeyBmaWxlbmFtZSB9LCB7IGJhdGNoU2l6ZTogdGhpcy5fYmF0Y2hTaXplIH0pLnRvQXJyYXkoKTtcbiAgICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlTm90Rm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgZG9jdW1lbnRzLm1hcChkb2MgPT4ge1xuICAgICAgICByZXR1cm4gYnVja2V0LmRlbGV0ZShkb2MuX2lkKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZpbGVEYXRhKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLl9nZXRCdWNrZXQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBidWNrZXQub3BlbkRvd25sb2FkU3RyZWFtQnlOYW1lKGZpbGVuYW1lKTtcbiAgICBzdHJlYW0ucmVhZCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIGRhdGEgPT4ge1xuICAgICAgICBjaHVua3MucHVzaChkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KGNodW5rcyk7XG4gICAgICAgIGlmICh0aGlzLl9lbmNyeXB0aW9uS2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhUYWdMb2NhdGlvbiA9IGRhdGEubGVuZ3RoIC0gMTY7XG4gICAgICAgICAgICBjb25zdCBpdkxvY2F0aW9uID0gZGF0YS5sZW5ndGggLSAzMjtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhUYWcgPSBkYXRhLnNsaWNlKGF1dGhUYWdMb2NhdGlvbik7XG4gICAgICAgICAgICBjb25zdCBpdiA9IGRhdGEuc2xpY2UoaXZMb2NhdGlvbiwgYXV0aFRhZ0xvY2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGRhdGEuc2xpY2UoMCwgaXZMb2NhdGlvbik7XG4gICAgICAgICAgICBjb25zdCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KHRoaXMuX2FsZ29yaXRobSwgdGhpcy5fZW5jcnlwdGlvbktleSwgaXYpO1xuICAgICAgICAgICAgZGVjaXBoZXIuc2V0QXV0aFRhZyhhdXRoVGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQpLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWNyeXB0ZWQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJvdGF0ZUVuY3J5cHRpb25LZXkob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGZpbGVOYW1lcyA9IFtdO1xuICAgIGxldCBvbGRLZXlGaWxlQWRhcHRlciA9IHt9O1xuICAgIGNvbnN0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuX2dldEJ1Y2tldCgpO1xuICAgIGlmIChvcHRpb25zLm9sZEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvbGRLZXlGaWxlQWRhcHRlciA9IG5ldyBHcmlkRlNCdWNrZXRBZGFwdGVyKFxuICAgICAgICB0aGlzLl9kYXRhYmFzZVVSSSxcbiAgICAgICAgdGhpcy5fbW9uZ29PcHRpb25zLFxuICAgICAgICBvcHRpb25zLm9sZEtleVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2xkS2V5RmlsZUFkYXB0ZXIgPSBuZXcgR3JpZEZTQnVja2V0QWRhcHRlcih0aGlzLl9kYXRhYmFzZVVSSSwgdGhpcy5fbW9uZ29PcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsZU5hbWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbGVOYW1lcyA9IG9wdGlvbnMuZmlsZU5hbWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlTmFtZXNJdGVyYXRvciA9IGF3YWl0IGJ1Y2tldC5maW5kKHt9LCB7IGJhdGNoU2l6ZTogdGhpcy5fYmF0Y2hTaXplIH0pLnRvQXJyYXkoKTtcbiAgICAgIGZpbGVOYW1lc0l0ZXJhdG9yLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgIGZpbGVOYW1lcy5wdXNoKGZpbGUuZmlsZW5hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBmaWxlTmFtZXNOb3RSb3RhdGVkID0gZmlsZU5hbWVzO1xuICAgIGNvbnN0IGZpbGVOYW1lc1JvdGF0ZWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGxhaW5UZXh0RGF0YSA9IGF3YWl0IG9sZEtleUZpbGVBZGFwdGVyLmdldEZpbGVEYXRhKGZpbGVOYW1lKTtcbiAgICAgICAgLy8gT3ZlcndyaXRlIGZpbGUgd2l0aCBkYXRhIGVuY3J5cHRlZCB3aXRoIG5ldyBrZXlcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVGaWxlKGZpbGVOYW1lLCBwbGFpblRleHREYXRhKTtcbiAgICAgICAgZmlsZU5hbWVzUm90YXRlZC5wdXNoKGZpbGVOYW1lKTtcbiAgICAgICAgZmlsZU5hbWVzTm90Um90YXRlZCA9IGZpbGVOYW1lc05vdFJvdGF0ZWQuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gZmlsZU5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByb3RhdGVkOiBmaWxlTmFtZXNSb3RhdGVkLCBub3RSb3RhdGVkOiBmaWxlTmFtZXNOb3RSb3RhdGVkIH07XG4gIH1cblxuICBnZXRGaWxlTG9jYXRpb24oY29uZmlnLCBmaWxlbmFtZSkge1xuICAgIGNvbnN0IGVuY29kZWRGaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcvJykubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLycpO1xuICAgIHJldHVybiBjb25maWcubW91bnQgKyAnL2ZpbGVzLycgKyBjb25maWcuYXBwbGljYXRpb25JZCArICcvJyArIGVuY29kZWRGaWxlbmFtZTtcbiAgfVxuXG4gIGFzeW5jIGdldE1ldGFkYXRhKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBidWNrZXQuZmluZCh7IGZpbGVuYW1lIH0sIHsgYmF0Y2hTaXplOiB0aGlzLl9iYXRjaFNpemUgfSkudG9BcnJheSgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgeyBtZXRhZGF0YSB9ID0gZmlsZXNbMF07XG4gICAgcmV0dXJuIHsgbWV0YWRhdGEgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUZpbGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgcmVxLCByZXMsIGNvbnRlbnRUeXBlKSB7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5fZ2V0QnVja2V0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBidWNrZXQuZmluZCh7IGZpbGVuYW1lIH0sIHsgYmF0Y2hTaXplOiB0aGlzLl9iYXRjaFNpemUgfSkudG9BcnJheSgpO1xuICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZU5vdEZvdW5kJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gcmVxXG4gICAgICAuZ2V0KCdSYW5nZScpXG4gICAgICAucmVwbGFjZSgvYnl0ZXM9LywgJycpXG4gICAgICAuc3BsaXQoJy0nKTtcbiAgICBjb25zdCBwYXJ0aWFsc3RhcnQgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwYXJ0aWFsZW5kID0gcGFydHNbMV07XG5cbiAgICBjb25zdCBmaWxlTGVuZ3RoID0gZmlsZXNbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGZpbGVTdGFydCA9IHBhcnNlSW50KHBhcnRpYWxzdGFydCwgMTApO1xuICAgIGNvbnN0IGZpbGVFbmQgPSBwYXJ0aWFsZW5kID8gcGFyc2VJbnQocGFydGlhbGVuZCwgMTApIDogZmlsZUxlbmd0aDtcblxuICAgIGxldCBzdGFydCA9IE1hdGgubWluKGZpbGVTdGFydCB8fCAwLCBmaWxlRW5kLCBmaWxlTGVuZ3RoKTtcbiAgICBsZXQgZW5kID0gTWF0aC5tYXgoZmlsZVN0YXJ0IHx8IDAsIGZpbGVFbmQpICsgMSB8fCBmaWxlTGVuZ3RoO1xuICAgIGlmIChpc05hTihmaWxlU3RhcnQpKSB7XG4gICAgICBzdGFydCA9IGZpbGVMZW5ndGggLSBlbmQgKyAxO1xuICAgICAgZW5kID0gZmlsZUxlbmd0aDtcbiAgICB9XG4gICAgZW5kID0gTWF0aC5taW4oZW5kLCBmaWxlTGVuZ3RoKTtcbiAgICBzdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcblxuICAgIHJlcy5zdGF0dXMoMjA2KTtcbiAgICByZXMuaGVhZGVyKCdBY2NlcHQtUmFuZ2VzJywgJ2J5dGVzJyk7XG4gICAgcmVzLmhlYWRlcignQ29udGVudC1MZW5ndGgnLCBlbmQgLSBzdGFydCk7XG4gICAgcmVzLmhlYWRlcignQ29udGVudC1SYW5nZScsICdieXRlcyAnICsgc3RhcnQgKyAnLScgKyBlbmQgKyAnLycgKyBmaWxlTGVuZ3RoKTtcbiAgICByZXMuaGVhZGVyKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG4gICAgY29uc3Qgc3RyZWFtID0gYnVja2V0Lm9wZW5Eb3dubG9hZFN0cmVhbUJ5TmFtZShmaWxlbmFtZSk7XG4gICAgc3RyZWFtLnN0YXJ0KHN0YXJ0KTtcbiAgICBpZiAoZW5kKSB7XG4gICAgICBzdHJlYW0uZW5kKGVuZCk7XG4gICAgfVxuICAgIHN0cmVhbS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIHJlcy53cml0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIGUgPT4ge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpO1xuICAgICAgcmVzLnNlbmQoZS5tZXNzYWdlKTtcbiAgICB9KTtcbiAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVNodXRkb3duKCkge1xuICAgIGlmICghdGhpcy5fY2xpZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuY2xvc2UoZmFsc2UpO1xuICB9XG5cbiAgdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSkge1xuICAgIHJldHVybiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHcmlkRlNCdWNrZXRBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFTQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxhQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFDLHVCQUFB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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Note: GridStore was replaced by GridFSBucketAdapter by default in 2018 by @flovilmart
|
|
4
|
+
throw new Error('GridStoreAdapter: GridStore is no longer supported by parse server and mongodb, use GridFSBucketAdapter instead.');
|
|
5
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9GaWxlcy9HcmlkU3RvcmVBZGFwdGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIE5vdGU6IEdyaWRTdG9yZSB3YXMgcmVwbGFjZWQgYnkgR3JpZEZTQnVja2V0QWRhcHRlciBieSBkZWZhdWx0IGluIDIwMTggYnkgQGZsb3ZpbG1hcnRcbnRocm93IG5ldyBFcnJvcihcbiAgJ0dyaWRTdG9yZUFkYXB0ZXI6IEdyaWRTdG9yZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHBhcnNlIHNlcnZlciBhbmQgbW9uZ29kYiwgdXNlIEdyaWRGU0J1Y2tldEFkYXB0ZXIgaW5zdGVhZC4nXG4pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0EsTUFBTSxJQUFJQSxLQUFLLENBQ2Isa0hBQ0YsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.LoggerAdapter = void 0;
|
|
7
|
+
/* eslint-disable unused-imports/no-unused-vars */
|
|
8
|
+
/**
|
|
9
|
+
* @interface
|
|
10
|
+
* @memberof module:Adapters
|
|
11
|
+
* Logger Adapter
|
|
12
|
+
* Allows you to change the logger mechanism
|
|
13
|
+
* Default is WinstonLoggerAdapter.js
|
|
14
|
+
*/
|
|
15
|
+
class LoggerAdapter {
|
|
16
|
+
constructor(options) {}
|
|
17
|
+
/**
|
|
18
|
+
* log
|
|
19
|
+
* @param {String} level
|
|
20
|
+
* @param {String} message
|
|
21
|
+
* @param {Object} metadata
|
|
22
|
+
*/
|
|
23
|
+
log(level, message /* meta */) {}
|
|
24
|
+
}
|
|
25
|
+
exports.LoggerAdapter = LoggerAdapter;
|
|
26
|
+
var _default = exports.default = LoggerAdapter;
|
|
27
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2dnZXJBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwibG9nIiwibGV2ZWwiLCJtZXNzYWdlIiwiZXhwb3J0cyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9Mb2dnZXIvTG9nZ2VyQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB1bnVzZWQtaW1wb3J0cy9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOkFkYXB0ZXJzXG4gKiBMb2dnZXIgQWRhcHRlclxuICogQWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIGxvZ2dlciBtZWNoYW5pc21cbiAqIERlZmF1bHQgaXMgV2luc3RvbkxvZ2dlckFkYXB0ZXIuanNcbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlckFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7fVxuICAvKipcbiAgICogbG9nXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsZXZlbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWV0YWRhdGFcbiAgICovXG4gIGxvZyhsZXZlbCwgbWVzc2FnZSAvKiBtZXRhICovKSB7fVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2dnZXJBZGFwdGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUEsYUFBYSxDQUFDO0VBQ3pCQyxXQUFXQSxDQUFDQyxPQUFPLEVBQUUsQ0FBQztFQUN0QjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsR0FBR0EsQ0FBQ0MsS0FBSyxFQUFFQyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ2xDO0FBQUNDLE9BQUEsQ0FBQU4sYUFBQSxHQUFBQSxhQUFBO0FBQUEsSUFBQU8sUUFBQSxHQUFBRCxPQUFBLENBQUFFLE9BQUEsR0FFY1IsYUFBYSIsImlnbm9yZUxpc3QiOltdfQ==
|