@beiguancyc/parse-server 9.9.0-ruixiang.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,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==