parse-server 2.8.4 → 8.6.2

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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -1,63 +1,115 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- // Helper functions for accessing the Spotify API.
4
- var https = require('https');
5
- var Parse = require('parse/node').Parse;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _BaseCodeAuthAdapter = _interopRequireDefault(require("./BaseCodeAuthAdapter"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ /**
10
+ * Parse Server authentication adapter for Spotify.
11
+ *
12
+ * @class SpotifyAdapter
13
+ * @param {Object} options - The adapter configuration options.
14
+ * @param {string} options.clientId - Your Spotify application's Client ID. Required for secure authentication.
15
+ * @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
16
+ *
17
+ * @description
18
+ * ## Parse Server Configuration
19
+ * To configure Parse Server for Spotify authentication, use the following structure:
20
+ * ### Secure Configuration
21
+ * ```json
22
+ * {
23
+ * "auth": {
24
+ * "spotify": {
25
+ * "clientId": "your-client-id"
26
+ * }
27
+ * }
28
+ * }
29
+ * ```
30
+ * ### Insecure Configuration (Not Recommended)
31
+ * ```json
32
+ * {
33
+ * "auth": {
34
+ * "spotify": {
35
+ * "enableInsecureAuth": true
36
+ * }
37
+ * }
38
+ * }
39
+ * ```
40
+ *
41
+ * The adapter requires the following `authData` fields:
42
+ * - **Secure Authentication**: `code`, `redirect_uri`, and `code_verifier`.
43
+ * - **Insecure Authentication (Not Recommended)**: `id`, `access_token`.
44
+ *
45
+ * ## Auth Payloads
46
+ * ### Secure Authentication Payload
47
+ * ```json
48
+ * {
49
+ * "spotify": {
50
+ * "code": "abc123def456ghi789",
51
+ * "redirect_uri": "https://example.com/callback",
52
+ * "code_verifier": "secure-code-verifier"
53
+ * }
54
+ * }
55
+ * ```
56
+ * ### Insecure Authentication Payload (Not Recommended)
57
+ * ```json
58
+ * {
59
+ * "spotify": {
60
+ * "id": "1234567",
61
+ * "access_token": "abc123def456ghi789"
62
+ * }
63
+ * }
64
+ * ```
65
+ *
66
+ * ## Notes
67
+ * - `enableInsecureAuth` is **not recommended** and bypasses secure flows by validating the user ID and access token directly. This method is not suitable for production environments and may be removed in future versions.
68
+ * - Secure authentication exchanges the `code` provided by the client for an access token using Spotify's OAuth API. This method ensures greater security and is the recommended approach.
69
+ *
70
+ * @see {@link https://developer.spotify.com/documentation/web-api/tutorials/getting-started Spotify OAuth Documentation}
71
+ */
6
72
 
7
- // Returns a promise that fulfills iff this user id is valid.
8
- function validateAuthData(authData) {
9
- return request('me', authData.access_token).then(data => {
10
- if (data && data.id == authData.id) {
11
- return;
73
+ class SpotifyAdapter extends _BaseCodeAuthAdapter.default {
74
+ constructor() {
75
+ super('spotify');
76
+ }
77
+ async getUserFromAccessToken(access_token) {
78
+ const response = await fetch('https://api.spotify.com/v1/me', {
79
+ headers: {
80
+ Authorization: 'Bearer ' + access_token
81
+ }
82
+ });
83
+ if (!response.ok) {
84
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify API request failed.');
12
85
  }
13
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is invalid for this user.');
14
- });
15
- }
16
-
17
- // Returns a promise that fulfills if this app id is valid.
18
- function validateAppId(appIds, authData) {
19
- var access_token = authData.access_token;
20
- if (!appIds.length) {
21
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is not configured.');
86
+ const user = await response.json();
87
+ return {
88
+ id: user.id
89
+ };
22
90
  }
23
- return request('me', access_token).then(data => {
24
- if (data && appIds.indexOf(data.id) != -1) {
25
- return;
91
+ async getAccessTokenFromCode(authData) {
92
+ if (!authData.code || !authData.redirect_uri || !authData.code_verifier) {
93
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth configuration authData.code and/or authData.redirect_uri and/or authData.code_verifier.');
26
94
  }
27
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify auth is invalid for this user.');
28
- });
29
- }
30
-
31
- // A promisey wrapper for Spotify API requests.
32
- function request(path, access_token) {
33
- return new Promise(function (resolve, reject) {
34
- https.get({
35
- host: 'api.spotify.com',
36
- path: '/v1/' + path,
95
+ const response = await fetch('https://accounts.spotify.com/api/token', {
96
+ method: 'POST',
37
97
  headers: {
38
- 'Authorization': 'Bearer ' + access_token
39
- }
40
- }, function (res) {
41
- var data = '';
42
- res.on('data', function (chunk) {
43
- data += chunk;
44
- });
45
- res.on('end', function () {
46
- try {
47
- data = JSON.parse(data);
48
- } catch (e) {
49
- return reject(e);
50
- }
51
- resolve(data);
52
- });
53
- }).on('error', function () {
54
- reject('Failed to validate this access token with Spotify.');
98
+ 'Content-Type': 'application/x-www-form-urlencoded'
99
+ },
100
+ body: new URLSearchParams({
101
+ grant_type: 'authorization_code',
102
+ code: authData.code,
103
+ redirect_uri: authData.redirect_uri,
104
+ code_verifier: authData.code_verifier,
105
+ client_id: this.clientId
106
+ })
55
107
  });
56
- });
108
+ if (!response.ok) {
109
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Spotify API request failed.');
110
+ }
111
+ return response.json();
112
+ }
57
113
  }
58
-
59
- module.exports = {
60
- validateAppId: validateAppId,
61
- validateAuthData: validateAuthData
62
- };
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL3Nwb3RpZnkuanMiXSwibmFtZXMiOlsiaHR0cHMiLCJyZXF1aXJlIiwiUGFyc2UiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXF1ZXN0IiwiYWNjZXNzX3Rva2VuIiwidGhlbiIsImRhdGEiLCJpZCIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJsZW5ndGgiLCJpbmRleE9mIiwicGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwiaG9zdCIsImhlYWRlcnMiLCJyZXMiLCJvbiIsImNodW5rIiwiSlNPTiIsInBhcnNlIiwiZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxJQUFJQSxRQUFRQyxRQUFRLE9BQVIsQ0FBWjtBQUNBLElBQUlDLFFBQVFELFFBQVEsWUFBUixFQUFzQkMsS0FBbEM7O0FBRUE7QUFDQSxTQUFTQyxnQkFBVCxDQUEwQkMsUUFBMUIsRUFBb0M7QUFDbEMsU0FBT0MsUUFBUSxJQUFSLEVBQWNELFNBQVNFLFlBQXZCLEVBQ0pDLElBREksQ0FDRUMsSUFBRCxJQUFVO0FBQ2QsUUFBSUEsUUFBUUEsS0FBS0MsRUFBTCxJQUFXTCxTQUFTSyxFQUFoQyxFQUFvQztBQUNsQztBQUNEO0FBQ0QsVUFBTSxJQUFJUCxNQUFNUSxLQUFWLENBQ0pSLE1BQU1RLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSix3Q0FGSSxDQUFOO0FBR0QsR0FSSSxDQUFQO0FBU0Q7O0FBRUQ7QUFDQSxTQUFTQyxhQUFULENBQXVCQyxNQUF2QixFQUErQlQsUUFBL0IsRUFBeUM7QUFDdkMsTUFBSUUsZUFBZUYsU0FBU0UsWUFBNUI7QUFDQSxNQUFJLENBQUNPLE9BQU9DLE1BQVosRUFBb0I7QUFDbEIsVUFBTSxJQUFJWixNQUFNUSxLQUFWLENBQ0pSLE1BQU1RLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSixpQ0FGSSxDQUFOO0FBR0Q7QUFDRCxTQUFPTixRQUFRLElBQVIsRUFBY0MsWUFBZCxFQUNKQyxJQURJLENBQ0VDLElBQUQsSUFBVTtBQUNkLFFBQUlBLFFBQVFLLE9BQU9FLE9BQVAsQ0FBZVAsS0FBS0MsRUFBcEIsS0FBMkIsQ0FBQyxDQUF4QyxFQUEyQztBQUN6QztBQUNEO0FBQ0QsVUFBTSxJQUFJUCxNQUFNUSxLQUFWLENBQ0pSLE1BQU1RLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSix3Q0FGSSxDQUFOO0FBR0QsR0FSSSxDQUFQO0FBU0Q7O0FBRUQ7QUFDQSxTQUFTTixPQUFULENBQWlCVyxJQUFqQixFQUF1QlYsWUFBdkIsRUFBcUM7QUFDbkMsU0FBTyxJQUFJVyxPQUFKLENBQVksVUFBU0MsT0FBVCxFQUFrQkMsTUFBbEIsRUFBMEI7QUFDM0NuQixVQUFNb0IsR0FBTixDQUFVO0FBQ1JDLFlBQU0saUJBREU7QUFFUkwsWUFBTSxTQUFTQSxJQUZQO0FBR1JNLGVBQVM7QUFDUCx5QkFBaUIsWUFBWWhCO0FBRHRCO0FBSEQsS0FBVixFQU1HLFVBQVNpQixHQUFULEVBQWM7QUFDZixVQUFJZixPQUFPLEVBQVg7QUFDQWUsVUFBSUMsRUFBSixDQUFPLE1BQVAsRUFBZSxVQUFTQyxLQUFULEVBQWdCO0FBQzdCakIsZ0JBQVFpQixLQUFSO0FBQ0QsT0FGRDtBQUdBRixVQUFJQyxFQUFKLENBQU8sS0FBUCxFQUFjLFlBQVc7QUFDdkIsWUFBSTtBQUNGaEIsaUJBQU9rQixLQUFLQyxLQUFMLENBQVduQixJQUFYLENBQVA7QUFDRCxTQUZELENBRUUsT0FBTW9CLENBQU4sRUFBUztBQUNULGlCQUFPVCxPQUFPUyxDQUFQLENBQVA7QUFDRDtBQUNEVixnQkFBUVYsSUFBUjtBQUNELE9BUEQ7QUFRRCxLQW5CRCxFQW1CR2dCLEVBbkJILENBbUJNLE9BbkJOLEVBbUJlLFlBQVc7QUFDeEJMLGFBQU8sb0RBQVA7QUFDRCxLQXJCRDtBQXNCRCxHQXZCTSxDQUFQO0FBd0JEOztBQUVEVSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZsQixpQkFBZUEsYUFEQTtBQUVmVCxvQkFBa0JBO0FBRkgsQ0FBakIiLCJmaWxlIjoic3BvdGlmeS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgU3BvdGlmeSBBUEkuXG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhKSB7XG4gIHJldHVybiByZXF1ZXN0KCdtZScsIGF1dGhEYXRhLmFjY2Vzc190b2tlbilcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5pZCA9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAgICdTcG90aWZ5IGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICAgIH0pO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhKSB7XG4gIHZhciBhY2Nlc3NfdG9rZW4gPSBhdXRoRGF0YS5hY2Nlc3NfdG9rZW47XG4gIGlmICghYXBwSWRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnU3BvdGlmeSBhdXRoIGlzIG5vdCBjb25maWd1cmVkLicpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0KCdtZScsIGFjY2Vzc190b2tlbilcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEgJiYgYXBwSWRzLmluZGV4T2YoZGF0YS5pZCkgIT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAnU3BvdGlmeSBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgICB9KTtcbn1cblxuLy8gQSBwcm9taXNleSB3cmFwcGVyIGZvciBTcG90aWZ5IEFQSSByZXF1ZXN0cy5cbmZ1bmN0aW9uIHJlcXVlc3QocGF0aCwgYWNjZXNzX3Rva2VuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBodHRwcy5nZXQoe1xuICAgICAgaG9zdDogJ2FwaS5zcG90aWZ5LmNvbScsXG4gICAgICBwYXRoOiAnL3YxLycgKyBwYXRoLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIGFjY2Vzc190b2tlblxuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKHJlcykge1xuICAgICAgdmFyIGRhdGEgPSAnJztcbiAgICAgIHJlcy5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICB9KTtcbiAgICAgIHJlcy5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KCdGYWlsZWQgdG8gdmFsaWRhdGUgdGhpcyBhY2Nlc3MgdG9rZW4gd2l0aCBTcG90aWZ5LicpO1xuICAgIH0pO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHZhbGlkYXRlQXBwSWQ6IHZhbGlkYXRlQXBwSWQsXG4gIHZhbGlkYXRlQXV0aERhdGE6IHZhbGlkYXRlQXV0aERhdGFcbn07XG4iXX0=
114
+ var _default = exports.default = new SpotifyAdapter();
115
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmFzZUNvZGVBdXRoQWRhcHRlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiU3BvdGlmeUFkYXB0ZXIiLCJCYXNlQXV0aENvZGVBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuIiwiYWNjZXNzX3Rva2VuIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwib2siLCJQYXJzZSIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsInVzZXIiLCJqc29uIiwiaWQiLCJnZXRBY2Nlc3NUb2tlbkZyb21Db2RlIiwiYXV0aERhdGEiLCJjb2RlIiwicmVkaXJlY3RfdXJpIiwiY29kZV92ZXJpZmllciIsIm1ldGhvZCIsImJvZHkiLCJVUkxTZWFyY2hQYXJhbXMiLCJncmFudF90eXBlIiwiY2xpZW50X2lkIiwiY2xpZW50SWQiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9zcG90aWZ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgU2VydmVyIGF1dGhlbnRpY2F0aW9uIGFkYXB0ZXIgZm9yIFNwb3RpZnkuXG4gKlxuICogQGNsYXNzIFNwb3RpZnlBZGFwdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNsaWVudElkIC0gWW91ciBTcG90aWZ5IGFwcGxpY2F0aW9uJ3MgQ2xpZW50IElELiBSZXF1aXJlZCBmb3Igc2VjdXJlIGF1dGhlbnRpY2F0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5lbmFibGVJbnNlY3VyZUF1dGg9ZmFsc2VdIC0gKipbREVQUkVDQVRFRF0qKiBFbmFibGUgaW5zZWN1cmUgYXV0aGVudGljYXRpb24gKG5vdCByZWNvbW1lbmRlZCkuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAjIyBQYXJzZSBTZXJ2ZXIgQ29uZmlndXJhdGlvblxuICogVG8gY29uZmlndXJlIFBhcnNlIFNlcnZlciBmb3IgU3BvdGlmeSBhdXRoZW50aWNhdGlvbiwgdXNlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICogIyMjIFNlY3VyZSBDb25maWd1cmF0aW9uXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJzcG90aWZ5XCI6IHtcbiAqICAgICAgIFwiY2xpZW50SWRcIjogXCJ5b3VyLWNsaWVudC1pZFwiXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqICMjIyBJbnNlY3VyZSBDb25maWd1cmF0aW9uIChOb3QgUmVjb21tZW5kZWQpXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYXV0aFwiOiB7XG4gKiAgICAgXCJzcG90aWZ5XCI6IHtcbiAqICAgICAgIFwiZW5hYmxlSW5zZWN1cmVBdXRoXCI6IHRydWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBhZGFwdGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgYGF1dGhEYXRhYCBmaWVsZHM6XG4gKiAtICoqU2VjdXJlIEF1dGhlbnRpY2F0aW9uKio6IGBjb2RlYCwgYHJlZGlyZWN0X3VyaWAsIGFuZCBgY29kZV92ZXJpZmllcmAuXG4gKiAtICoqSW5zZWN1cmUgQXV0aGVudGljYXRpb24gKE5vdCBSZWNvbW1lbmRlZCkqKjogYGlkYCwgYGFjY2Vzc190b2tlbmAuXG4gKlxuICogIyMgQXV0aCBQYXlsb2Fkc1xuICogIyMjIFNlY3VyZSBBdXRoZW50aWNhdGlvbiBQYXlsb2FkXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3BvdGlmeVwiOiB7XG4gKiAgICAgXCJjb2RlXCI6IFwiYWJjMTIzZGVmNDU2Z2hpNzg5XCIsXG4gKiAgICAgXCJyZWRpcmVjdF91cmlcIjogXCJodHRwczovL2V4YW1wbGUuY29tL2NhbGxiYWNrXCIsXG4gKiAgICAgXCJjb2RlX3ZlcmlmaWVyXCI6IFwic2VjdXJlLWNvZGUtdmVyaWZpZXJcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqICMjIyBJbnNlY3VyZSBBdXRoZW50aWNhdGlvbiBQYXlsb2FkIChOb3QgUmVjb21tZW5kZWQpXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3BvdGlmeVwiOiB7XG4gKiAgICAgXCJpZFwiOiBcIjEyMzQ1NjdcIixcbiAqICAgICBcImFjY2Vzc190b2tlblwiOiBcImFiYzEyM2RlZjQ1NmdoaTc4OVwiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIE5vdGVzXG4gKiAtIGBlbmFibGVJbnNlY3VyZUF1dGhgIGlzICoqbm90IHJlY29tbWVuZGVkKiogYW5kIGJ5cGFzc2VzIHNlY3VyZSBmbG93cyBieSB2YWxpZGF0aW5nIHRoZSB1c2VyIElEIGFuZCBhY2Nlc3MgdG9rZW4gZGlyZWN0bHkuIFRoaXMgbWV0aG9kIGlzIG5vdCBzdWl0YWJsZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgYW5kIG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAqIC0gU2VjdXJlIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlcyB0aGUgYGNvZGVgIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIGFuIGFjY2VzcyB0b2tlbiB1c2luZyBTcG90aWZ5J3MgT0F1dGggQVBJLiBUaGlzIG1ldGhvZCBlbnN1cmVzIGdyZWF0ZXIgc2VjdXJpdHkgYW5kIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5zcG90aWZ5LmNvbS9kb2N1bWVudGF0aW9uL3dlYi1hcGkvdHV0b3JpYWxzL2dldHRpbmctc3RhcnRlZCBTcG90aWZ5IE9BdXRoIERvY3VtZW50YXRpb259XG4gKi9cblxuaW1wb3J0IEJhc2VBdXRoQ29kZUFkYXB0ZXIgZnJvbSAnLi9CYXNlQ29kZUF1dGhBZGFwdGVyJztcbmNsYXNzIFNwb3RpZnlBZGFwdGVyIGV4dGVuZHMgQmFzZUF1dGhDb2RlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdzcG90aWZ5Jyk7XG4gIH1cblxuICBhc3luYyBnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLnNwb3RpZnkuY29tL3YxL21lJywge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyBhY2Nlc3NfdG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdTcG90aWZ5IEFQSSByZXF1ZXN0IGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdXNlci5pZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZShhdXRoRGF0YSkge1xuICAgIGlmICghYXV0aERhdGEuY29kZSB8fCAhYXV0aERhdGEucmVkaXJlY3RfdXJpIHx8ICFhdXRoRGF0YS5jb2RlX3ZlcmlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAgICdTcG90aWZ5IGF1dGggY29uZmlndXJhdGlvbiBhdXRoRGF0YS5jb2RlIGFuZC9vciBhdXRoRGF0YS5yZWRpcmVjdF91cmkgYW5kL29yIGF1dGhEYXRhLmNvZGVfdmVyaWZpZXIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FjY291bnRzLnNwb3RpZnkuY29tL2FwaS90b2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICB9LFxuICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICBjb2RlOiBhdXRoRGF0YS5jb2RlLFxuICAgICAgICByZWRpcmVjdF91cmk6IGF1dGhEYXRhLnJlZGlyZWN0X3VyaSxcbiAgICAgICAgY29kZV92ZXJpZmllcjogYXV0aERhdGEuY29kZV92ZXJpZmllcixcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1Nwb3RpZnkgQVBJIHJlcXVlc3QgZmFpbGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFNwb3RpZnlBZGFwdGVyKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWdFQSxJQUFBQSxvQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQXdELFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBaEV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0EsTUFBTUcsY0FBYyxTQUFTQyw0QkFBbUIsQ0FBQztFQUMvQ0MsV0FBV0EsQ0FBQSxFQUFHO0lBQ1osS0FBSyxDQUFDLFNBQVMsQ0FBQztFQUNsQjtFQUVBLE1BQU1DLHNCQUFzQkEsQ0FBQ0MsWUFBWSxFQUFFO0lBQ3pDLE1BQU1DLFFBQVEsR0FBRyxNQUFNQyxLQUFLLENBQUMsK0JBQStCLEVBQUU7TUFDNURDLE9BQU8sRUFBRTtRQUNQQyxhQUFhLEVBQUUsU0FBUyxHQUFHSjtNQUM3QjtJQUNGLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ0MsUUFBUSxDQUFDSSxFQUFFLEVBQUU7TUFDaEIsTUFBTSxJQUFJQyxLQUFLLENBQUNDLEtBQUssQ0FBQ0QsS0FBSyxDQUFDQyxLQUFLLENBQUNDLGdCQUFnQixFQUFFLDZCQUE2QixDQUFDO0lBQ3BGO0lBRUEsTUFBTUMsSUFBSSxHQUFHLE1BQU1SLFFBQVEsQ0FBQ1MsSUFBSSxDQUFDLENBQUM7SUFDbEMsT0FBTztNQUNMQyxFQUFFLEVBQUVGLElBQUksQ0FBQ0U7SUFDWCxDQUFDO0VBQ0g7RUFFQSxNQUFNQyxzQkFBc0JBLENBQUNDLFFBQVEsRUFBRTtJQUNyQyxJQUFJLENBQUNBLFFBQVEsQ0FBQ0MsSUFBSSxJQUFJLENBQUNELFFBQVEsQ0FBQ0UsWUFBWSxJQUFJLENBQUNGLFFBQVEsQ0FBQ0csYUFBYSxFQUFFO01BQ3ZFLE1BQU0sSUFBSVYsS0FBSyxDQUFDQyxLQUFLLENBQ25CRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQzVCLHNHQUNGLENBQUM7SUFDSDtJQUVBLE1BQU1QLFFBQVEsR0FBRyxNQUFNQyxLQUFLLENBQUMsd0NBQXdDLEVBQUU7TUFDckVlLE1BQU0sRUFBRSxNQUFNO01BQ2RkLE9BQU8sRUFBRTtRQUNQLGNBQWMsRUFBRTtNQUNsQixDQUFDO01BQ0RlLElBQUksRUFBRSxJQUFJQyxlQUFlLENBQUM7UUFDeEJDLFVBQVUsRUFBRSxvQkFBb0I7UUFDaENOLElBQUksRUFBRUQsUUFBUSxDQUFDQyxJQUFJO1FBQ25CQyxZQUFZLEVBQUVGLFFBQVEsQ0FBQ0UsWUFBWTtRQUNuQ0MsYUFBYSxFQUFFSCxRQUFRLENBQUNHLGFBQWE7UUFDckNLLFNBQVMsRUFBRSxJQUFJLENBQUNDO01BQ2xCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUNyQixRQUFRLENBQUNJLEVBQUUsRUFBRTtNQUNoQixNQUFNLElBQUlDLEtBQUssQ0FBQ0MsS0FBSyxDQUFDRCxLQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsNkJBQTZCLENBQUM7SUFDcEY7SUFFQSxPQUFPUCxRQUFRLENBQUNTLElBQUksQ0FBQyxDQUFDO0VBQ3hCO0FBQ0Y7QUFBQyxJQUFBYSxRQUFBLEdBQUFDLE9BQUEsQ0FBQTdCLE9BQUEsR0FFYyxJQUFJQyxjQUFjLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,57 +1,197 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- // Helper functions for accessing the twitter API.
4
- var OAuth = require('./OAuth1Client');
5
- var Parse = require('parse/node').Parse;
6
- var logger = require('../../logger').default;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Config = _interopRequireDefault(require("../../Config"));
8
+ var _querystring = _interopRequireDefault(require("querystring"));
9
+ var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Parse Server authentication adapter for Twitter.
13
+ *
14
+ * @class TwitterAdapter
15
+ * @param {Object} options - The adapter configuration options.
16
+ * @param {string} options.consumerKey - The Twitter App Consumer Key. Required for secure authentication.
17
+ * @param {string} options.consumerSecret - The Twitter App Consumer Secret. Required for secure authentication.
18
+ * @param {boolean} [options.enableInsecureAuth=false] - **[DEPRECATED]** Enable insecure authentication (not recommended).
19
+ *
20
+ * @description
21
+ * ## Parse Server Configuration
22
+ * To configure Parse Server for Twitter authentication, use the following structure:
23
+ * ### Secure Configuration
24
+ * ```json
25
+ * {
26
+ * "auth": {
27
+ * "twitter": {
28
+ * "consumerKey": "your-consumer-key",
29
+ * "consumerSecret": "your-consumer-secret"
30
+ * }
31
+ * }
32
+ * }
33
+ * ```
34
+ * ### Insecure Configuration (Not Recommended)
35
+ * ```json
36
+ * {
37
+ * "auth": {
38
+ * "twitter": {
39
+ * "enableInsecureAuth": true
40
+ * }
41
+ * }
42
+ * }
43
+ * ```
44
+ *
45
+ * The adapter requires the following `authData` fields:
46
+ * - **Secure Authentication**: `oauth_token`, `oauth_verifier`.
47
+ * - **Insecure Authentication (Not Recommended)**: `id`, `oauth_token`, `oauth_token_secret`.
48
+ *
49
+ * ## Auth Payloads
50
+ * ### Secure Authentication Payload
51
+ * ```json
52
+ * {
53
+ * "twitter": {
54
+ * "oauth_token": "1234567890-abc123def456",
55
+ * "oauth_verifier": "abc123def456"
56
+ * }
57
+ * }
58
+ * ```
59
+ *
60
+ * ### Insecure Authentication Payload (Not Recommended)
61
+ * ```json
62
+ * {
63
+ * "twitter": {
64
+ * "id": "1234567890",
65
+ * "oauth_token": "1234567890-abc123def456",
66
+ * "oauth_token_secret": "1234567890-abc123def456"
67
+ * }
68
+ * }
69
+ * ```
70
+ *
71
+ * ## Notes
72
+ * - **Deprecation Notice**: `enableInsecureAuth` and insecure fields (`id`, `oauth_token_secret`) are **deprecated** and may be removed in future versions. Use secure authentication with `consumerKey` and `consumerSecret`.
73
+ * - Secure authentication exchanges the `oauth_token` and `oauth_verifier` provided by the client for an access token using Twitter's OAuth API.
74
+ *
75
+ * @see {@link https://developer.twitter.com/en/docs/authentication/oauth-1-0a Twitter OAuth Documentation}
76
+ */
7
77
 
8
- // Returns a promise that fulfills iff this user id is valid.
9
- function validateAuthData(authData, options) {
10
- if (!options) {
11
- throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Twitter auth configuration missing');
12
- }
13
- options = handleMultipleConfigurations(authData, options);
14
- var client = new OAuth(options);
15
- client.host = "api.twitter.com";
16
- client.auth_token = authData.auth_token;
17
- client.auth_token_secret = authData.auth_token_secret;
18
-
19
- return client.get("/1.1/account/verify_credentials.json").then(data => {
20
- if (data && data.id_str == '' + authData.id) {
78
+ class TwitterAuthAdapter extends _AuthAdapter.default {
79
+ validateOptions(options) {
80
+ if (!options) {
81
+ throw new Error('Twitter auth options are required.');
82
+ }
83
+ this.enableInsecureAuth = options.enableInsecureAuth;
84
+ if (!this.enableInsecureAuth && (!options.consumer_key || !options.consumer_secret)) {
85
+ throw new Error('Consumer key and secret are required for secure Twitter auth.');
86
+ }
87
+ }
88
+ async validateAuthData(authData, options) {
89
+ const config = _Config.default.get(Parse.applicationId);
90
+ const twitterConfig = config.auth.twitter;
91
+ if (this.enableInsecureAuth && twitterConfig && config.enableInsecureAuthAdapters) {
92
+ return this.validateInsecureAuth(authData, options);
93
+ }
94
+ if (!options.consumer_key || !options.consumer_secret) {
95
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth configuration missing consumer_key and/or consumer_secret.');
96
+ }
97
+ const accessTokenData = await this.exchangeAccessToken(authData);
98
+ if (accessTokenData?.oauth_token && accessTokenData?.user_id) {
99
+ authData.id = accessTokenData.user_id;
100
+ authData.auth_token = accessTokenData.oauth_token;
21
101
  return;
22
102
  }
23
103
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
24
- });
25
- }
26
-
27
- // Returns a promise that fulfills iff this app id is valid.
28
- function validateAppId() {
29
- return Promise.resolve();
30
- }
31
-
32
- function handleMultipleConfigurations(authData, options) {
33
- if (Array.isArray(options)) {
34
- const consumer_key = authData.consumer_key;
35
- if (!consumer_key) {
36
- logger.error('Twitter Auth', 'Multiple twitter configurations are available, by no consumer_key was sent by the client.');
37
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
38
- }
39
- options = options.filter(option => {
40
- return option.consumer_key == consumer_key;
104
+ }
105
+ async validateInsecureAuth(authData, options) {
106
+ if (!authData.oauth_token || !authData.oauth_token_secret) {
107
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter insecure auth requires oauth_token and oauth_token_secret.');
108
+ }
109
+ options = this.handleMultipleConfigurations(authData, options);
110
+ const data = await this.request(authData, options);
111
+ const parsedData = await data.json();
112
+ if (parsedData?.id === authData.id) {
113
+ return;
114
+ }
115
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
116
+ }
117
+ async exchangeAccessToken(authData) {
118
+ const accessTokenRequestOptions = {
119
+ method: 'POST',
120
+ headers: {
121
+ 'Content-Type': 'application/x-www-form-urlencoded'
122
+ },
123
+ body: _querystring.default.stringify({
124
+ oauth_token: authData.oauth_token,
125
+ oauth_verifier: authData.oauth_verifier
126
+ })
127
+ };
128
+ const response = await fetch('https://api.twitter.com/oauth/access_token', accessTokenRequestOptions);
129
+ if (!response.ok) {
130
+ throw new Error('Failed to exchange access token.');
131
+ }
132
+ return response.json();
133
+ }
134
+ handleMultipleConfigurations(authData, options) {
135
+ if (Array.isArray(options)) {
136
+ const consumer_key = authData.consumer_key;
137
+ if (!consumer_key) {
138
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
139
+ }
140
+ options = options.filter(option => option.consumer_key === consumer_key);
141
+ if (options.length === 0) {
142
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
143
+ }
144
+ return options[0];
145
+ }
146
+ return options;
147
+ }
148
+ async request(authData, options) {
149
+ const {
150
+ consumer_key,
151
+ consumer_secret
152
+ } = options;
153
+ const oauth = {
154
+ consumer_key,
155
+ consumer_secret,
156
+ auth_token: authData.oauth_token,
157
+ auth_token_secret: authData.oauth_token_secret
158
+ };
159
+ const url = new URL('https://api.twitter.com/2/users/me');
160
+ const response = await fetch(url, {
161
+ headers: {
162
+ Authorization: 'Bearer ' + oauth.auth_token
163
+ },
164
+ body: JSON.stringify(oauth)
41
165
  });
42
-
43
- if (options.length == 0) {
44
- logger.error('Twitter Auth', 'Cannot find a configuration for the provided consumer_key');
45
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
166
+ if (!response.ok) {
167
+ throw new Error('Failed to fetch user data.');
46
168
  }
47
- options = options[0];
169
+ return response;
170
+ }
171
+ async beforeFind(authData) {
172
+ if (this.enableInsecureAuth && !authData?.code) {
173
+ if (!authData?.access_token) {
174
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
175
+ }
176
+ const user = await this.getUserFromAccessToken(authData.access_token, authData);
177
+ if (user.id !== authData.id) {
178
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.');
179
+ }
180
+ return;
181
+ }
182
+ if (!authData?.code) {
183
+ throw new Parse.Error(Parse.Error.VALIDATION_ERROR, 'Twitter code is required.');
184
+ }
185
+ const access_token = await this.exchangeAccessToken(authData);
186
+ const user = await this.getUserFromAccessToken(access_token, authData);
187
+ authData.access_token = access_token;
188
+ authData.id = user.id;
189
+ delete authData.code;
190
+ delete authData.redirect_uri;
191
+ }
192
+ validateAppId() {
193
+ return Promise.resolve();
48
194
  }
49
- return options;
50
195
  }
51
-
52
- module.exports = {
53
- validateAppId,
54
- validateAuthData,
55
- handleMultipleConfigurations
56
- };
57
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL3R3aXR0ZXIuanMiXSwibmFtZXMiOlsiT0F1dGgiLCJyZXF1aXJlIiwiUGFyc2UiLCJsb2dnZXIiLCJkZWZhdWx0IiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwib3B0aW9ucyIsIkVycm9yIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiaGFuZGxlTXVsdGlwbGVDb25maWd1cmF0aW9ucyIsImNsaWVudCIsImhvc3QiLCJhdXRoX3Rva2VuIiwiYXV0aF90b2tlbl9zZWNyZXQiLCJnZXQiLCJ0aGVuIiwiZGF0YSIsImlkX3N0ciIsImlkIiwiT0JKRUNUX05PVF9GT1VORCIsInZhbGlkYXRlQXBwSWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkFycmF5IiwiaXNBcnJheSIsImNvbnN1bWVyX2tleSIsImVycm9yIiwiZmlsdGVyIiwib3B0aW9uIiwibGVuZ3RoIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBLElBQUlBLFFBQVFDLFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQUlDLFFBQVFELFFBQVEsWUFBUixFQUFzQkMsS0FBbEM7QUFDQSxJQUFJQyxTQUFTRixRQUFRLGNBQVIsRUFBd0JHLE9BQXJDOztBQUVBO0FBQ0EsU0FBU0MsZ0JBQVQsQ0FBMEJDLFFBQTFCLEVBQW9DQyxPQUFwQyxFQUE2QztBQUMzQyxNQUFHLENBQUNBLE9BQUosRUFBYTtBQUNYLFVBQU0sSUFBSUwsTUFBTU0sS0FBVixDQUFnQk4sTUFBTU0sS0FBTixDQUFZQyxxQkFBNUIsRUFBbUQsb0NBQW5ELENBQU47QUFDRDtBQUNERixZQUFVRyw2QkFBNkJKLFFBQTdCLEVBQXVDQyxPQUF2QyxDQUFWO0FBQ0EsTUFBSUksU0FBUyxJQUFJWCxLQUFKLENBQVVPLE9BQVYsQ0FBYjtBQUNBSSxTQUFPQyxJQUFQLEdBQWMsaUJBQWQ7QUFDQUQsU0FBT0UsVUFBUCxHQUFvQlAsU0FBU08sVUFBN0I7QUFDQUYsU0FBT0csaUJBQVAsR0FBMkJSLFNBQVNRLGlCQUFwQzs7QUFFQSxTQUFPSCxPQUFPSSxHQUFQLENBQVcsc0NBQVgsRUFBbURDLElBQW5ELENBQXlEQyxJQUFELElBQVU7QUFDdkUsUUFBSUEsUUFBUUEsS0FBS0MsTUFBTCxJQUFlLEtBQUtaLFNBQVNhLEVBQXpDLEVBQTZDO0FBQzNDO0FBQ0Q7QUFDRCxVQUFNLElBQUlqQixNQUFNTSxLQUFWLENBQ0pOLE1BQU1NLEtBQU4sQ0FBWVksZ0JBRFIsRUFFSix3Q0FGSSxDQUFOO0FBR0QsR0FQTSxDQUFQO0FBUUQ7O0FBRUQ7QUFDQSxTQUFTQyxhQUFULEdBQXlCO0FBQ3ZCLFNBQU9DLFFBQVFDLE9BQVIsRUFBUDtBQUNEOztBQUVELFNBQVNiLDRCQUFULENBQXNDSixRQUF0QyxFQUFnREMsT0FBaEQsRUFBeUQ7QUFDdkQsTUFBSWlCLE1BQU1DLE9BQU4sQ0FBY2xCLE9BQWQsQ0FBSixFQUE0QjtBQUMxQixVQUFNbUIsZUFBZXBCLFNBQVNvQixZQUE5QjtBQUNBLFFBQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQnZCLGFBQU93QixLQUFQLENBQWEsY0FBYixFQUE2QiwyRkFBN0I7QUFDQSxZQUFNLElBQUl6QixNQUFNTSxLQUFWLENBQWdCTixNQUFNTSxLQUFOLENBQVlZLGdCQUE1QixFQUE4Qyx3Q0FBOUMsQ0FBTjtBQUNEO0FBQ0RiLGNBQVVBLFFBQVFxQixNQUFSLENBQWdCQyxNQUFELElBQVk7QUFDbkMsYUFBT0EsT0FBT0gsWUFBUCxJQUF1QkEsWUFBOUI7QUFDRCxLQUZTLENBQVY7O0FBSUEsUUFBSW5CLFFBQVF1QixNQUFSLElBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCM0IsYUFBT3dCLEtBQVAsQ0FBYSxjQUFiLEVBQTRCLDJEQUE1QjtBQUNBLFlBQU0sSUFBSXpCLE1BQU1NLEtBQVYsQ0FBZ0JOLE1BQU1NLEtBQU4sQ0FBWVksZ0JBQTVCLEVBQThDLHdDQUE5QyxDQUFOO0FBQ0Q7QUFDRGIsY0FBVUEsUUFBUSxDQUFSLENBQVY7QUFDRDtBQUNELFNBQU9BLE9BQVA7QUFDRDs7QUFFRHdCLE9BQU9DLE9BQVAsR0FBaUI7QUFDZlgsZUFEZTtBQUVmaEIsa0JBRmU7QUFHZks7QUFIZSxDQUFqQiIsImZpbGUiOiJ0d2l0dGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZSB0d2l0dGVyIEFQSS5cbnZhciBPQXV0aCA9IHJlcXVpcmUoJy4vT0F1dGgxQ2xpZW50Jyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG52YXIgbG9nZ2VyID0gcmVxdWlyZSgnLi4vLi4vbG9nZ2VyJykuZGVmYXVsdDtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSwgb3B0aW9ucykge1xuICBpZighb3B0aW9ucykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdUd2l0dGVyIGF1dGggY29uZmlndXJhdGlvbiBtaXNzaW5nJyk7XG4gIH1cbiAgb3B0aW9ucyA9IGhhbmRsZU11bHRpcGxlQ29uZmlndXJhdGlvbnMoYXV0aERhdGEsIG9wdGlvbnMpO1xuICB2YXIgY2xpZW50ID0gbmV3IE9BdXRoKG9wdGlvbnMpO1xuICBjbGllbnQuaG9zdCA9IFwiYXBpLnR3aXR0ZXIuY29tXCI7XG4gIGNsaWVudC5hdXRoX3Rva2VuID0gYXV0aERhdGEuYXV0aF90b2tlbjtcbiAgY2xpZW50LmF1dGhfdG9rZW5fc2VjcmV0ID0gYXV0aERhdGEuYXV0aF90b2tlbl9zZWNyZXQ7XG5cbiAgcmV0dXJuIGNsaWVudC5nZXQoXCIvMS4xL2FjY291bnQvdmVyaWZ5X2NyZWRlbnRpYWxzLmpzb25cIikudGhlbigoZGF0YSkgPT4ge1xuICAgIGlmIChkYXRhICYmIGRhdGEuaWRfc3RyID09ICcnICsgYXV0aERhdGEuaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICdUd2l0dGVyIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU11bHRpcGxlQ29uZmlndXJhdGlvbnMoYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICBjb25zdCBjb25zdW1lcl9rZXkgPSBhdXRoRGF0YS5jb25zdW1lcl9rZXk7XG4gICAgaWYgKCFjb25zdW1lcl9rZXkpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignVHdpdHRlciBBdXRoJywgJ011bHRpcGxlIHR3aXR0ZXIgY29uZmlndXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgYnkgbm8gY29uc3VtZXJfa2V5IHdhcyBzZW50IGJ5IHRoZSBjbGllbnQuJyk7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uLmNvbnN1bWVyX2tleSA9PSBjb25zdW1lcl9rZXk7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdUd2l0dGVyIEF1dGgnLCdDYW5ub3QgZmluZCBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm92aWRlZCBjb25zdW1lcl9rZXknKTtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnVHdpdHRlciBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnNbMF07XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxuICBoYW5kbGVNdWx0aXBsZUNvbmZpZ3VyYXRpb25zXG59O1xuIl19
196
+ var _default = exports.default = new TwitterAuthAdapter();
197
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcXVlcnlzdHJpbmciLCJfQXV0aEFkYXB0ZXIiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJUd2l0dGVyQXV0aEFkYXB0ZXIiLCJBdXRoQWRhcHRlciIsInZhbGlkYXRlT3B0aW9ucyIsIm9wdGlvbnMiLCJFcnJvciIsImVuYWJsZUluc2VjdXJlQXV0aCIsImNvbnN1bWVyX2tleSIsImNvbnN1bWVyX3NlY3JldCIsInZhbGlkYXRlQXV0aERhdGEiLCJhdXRoRGF0YSIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsIlBhcnNlIiwiYXBwbGljYXRpb25JZCIsInR3aXR0ZXJDb25maWciLCJhdXRoIiwidHdpdHRlciIsImVuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzIiwidmFsaWRhdGVJbnNlY3VyZUF1dGgiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiYWNjZXNzVG9rZW5EYXRhIiwiZXhjaGFuZ2VBY2Nlc3NUb2tlbiIsIm9hdXRoX3Rva2VuIiwidXNlcl9pZCIsImlkIiwiYXV0aF90b2tlbiIsIm9hdXRoX3Rva2VuX3NlY3JldCIsImhhbmRsZU11bHRpcGxlQ29uZmlndXJhdGlvbnMiLCJkYXRhIiwicmVxdWVzdCIsInBhcnNlZERhdGEiLCJqc29uIiwiYWNjZXNzVG9rZW5SZXF1ZXN0T3B0aW9ucyIsIm1ldGhvZCIsImhlYWRlcnMiLCJib2R5IiwicXVlcnlzdHJpbmciLCJzdHJpbmdpZnkiLCJvYXV0aF92ZXJpZmllciIsInJlc3BvbnNlIiwiZmV0Y2giLCJvayIsIkFycmF5IiwiaXNBcnJheSIsImZpbHRlciIsIm9wdGlvbiIsImxlbmd0aCIsIm9hdXRoIiwiYXV0aF90b2tlbl9zZWNyZXQiLCJ1cmwiLCJVUkwiLCJBdXRob3JpemF0aW9uIiwiSlNPTiIsImJlZm9yZUZpbmQiLCJjb2RlIiwiYWNjZXNzX3Rva2VuIiwidXNlciIsImdldFVzZXJGcm9tQWNjZXNzVG9rZW4iLCJWQUxJREFUSU9OX0VSUk9SIiwicmVkaXJlY3RfdXJpIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvdHdpdHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnNlIFNlcnZlciBhdXRoZW50aWNhdGlvbiBhZGFwdGVyIGZvciBUd2l0dGVyLlxuICpcbiAqIEBjbGFzcyBUd2l0dGVyQWRhcHRlclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgYWRhcHRlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jb25zdW1lcktleSAtIFRoZSBUd2l0dGVyIEFwcCBDb25zdW1lciBLZXkuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5jb25zdW1lclNlY3JldCAtIFRoZSBUd2l0dGVyIEFwcCBDb25zdW1lciBTZWNyZXQuIFJlcXVpcmVkIGZvciBzZWN1cmUgYXV0aGVudGljYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUluc2VjdXJlQXV0aD1mYWxzZV0gLSAqKltERVBSRUNBVEVEXSoqIEVuYWJsZSBpbnNlY3VyZSBhdXRoZW50aWNhdGlvbiAobm90IHJlY29tbWVuZGVkKS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICMjIFBhcnNlIFNlcnZlciBDb25maWd1cmF0aW9uXG4gKiBUbyBjb25maWd1cmUgUGFyc2UgU2VydmVyIGZvciBUd2l0dGVyIGF1dGhlbnRpY2F0aW9uLCB1c2UgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKiAjIyMgU2VjdXJlIENvbmZpZ3VyYXRpb25cbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJhdXRoXCI6IHtcbiAqICAgICBcInR3aXR0ZXJcIjoge1xuICogICAgICAgXCJjb25zdW1lcktleVwiOiBcInlvdXItY29uc3VtZXIta2V5XCIsXG4gKiAgICAgICBcImNvbnN1bWVyU2VjcmV0XCI6IFwieW91ci1jb25zdW1lci1zZWNyZXRcIlxuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiAjIyMgSW5zZWN1cmUgQ29uZmlndXJhdGlvbiAoTm90IFJlY29tbWVuZGVkKVxuICogYGBganNvblxuICoge1xuICogICBcImF1dGhcIjoge1xuICogICAgIFwidHdpdHRlclwiOiB7XG4gKiAgICAgICBcImVuYWJsZUluc2VjdXJlQXV0aFwiOiB0cnVlXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgYWRhcHRlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGBhdXRoRGF0YWAgZmllbGRzOlxuICogLSAqKlNlY3VyZSBBdXRoZW50aWNhdGlvbioqOiBgb2F1dGhfdG9rZW5gLCBgb2F1dGhfdmVyaWZpZXJgLlxuICogLSAqKkluc2VjdXJlIEF1dGhlbnRpY2F0aW9uIChOb3QgUmVjb21tZW5kZWQpKio6IGBpZGAsIGBvYXV0aF90b2tlbmAsIGBvYXV0aF90b2tlbl9zZWNyZXRgLlxuICpcbiAqICMjIEF1dGggUGF5bG9hZHNcbiAqICMjIyBTZWN1cmUgQXV0aGVudGljYXRpb24gUGF5bG9hZFxuICogYGBganNvblxuICoge1xuICogICBcInR3aXR0ZXJcIjoge1xuICogICAgIFwib2F1dGhfdG9rZW5cIjogXCIxMjM0NTY3ODkwLWFiYzEyM2RlZjQ1NlwiLFxuICogICAgIFwib2F1dGhfdmVyaWZpZXJcIjogXCJhYmMxMjNkZWY0NTZcIlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgSW5zZWN1cmUgQXV0aGVudGljYXRpb24gUGF5bG9hZCAoTm90IFJlY29tbWVuZGVkKVxuICogYGBganNvblxuICoge1xuICogICBcInR3aXR0ZXJcIjoge1xuICogICAgIFwiaWRcIjogXCIxMjM0NTY3ODkwXCIsXG4gKiAgICAgXCJvYXV0aF90b2tlblwiOiBcIjEyMzQ1Njc4OTAtYWJjMTIzZGVmNDU2XCIsXG4gKiAgICAgXCJvYXV0aF90b2tlbl9zZWNyZXRcIjogXCIxMjM0NTY3ODkwLWFiYzEyM2RlZjQ1NlwiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIE5vdGVzXG4gKiAtICoqRGVwcmVjYXRpb24gTm90aWNlKio6IGBlbmFibGVJbnNlY3VyZUF1dGhgIGFuZCBpbnNlY3VyZSBmaWVsZHMgKGBpZGAsIGBvYXV0aF90b2tlbl9zZWNyZXRgKSBhcmUgKipkZXByZWNhdGVkKiogYW5kIG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gVXNlIHNlY3VyZSBhdXRoZW50aWNhdGlvbiB3aXRoIGBjb25zdW1lcktleWAgYW5kIGBjb25zdW1lclNlY3JldGAuXG4gKiAtIFNlY3VyZSBhdXRoZW50aWNhdGlvbiBleGNoYW5nZXMgdGhlIGBvYXV0aF90b2tlbmAgYW5kIGBvYXV0aF92ZXJpZmllcmAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3IgYW4gYWNjZXNzIHRva2VuIHVzaW5nIFR3aXR0ZXIncyBPQXV0aCBBUEkuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIudHdpdHRlci5jb20vZW4vZG9jcy9hdXRoZW50aWNhdGlvbi9vYXV0aC0xLTBhIFR3aXR0ZXIgT0F1dGggRG9jdW1lbnRhdGlvbn1cbiAqL1xuXG5pbXBvcnQgQ29uZmlnIGZyb20gJy4uLy4uL0NvbmZpZyc7XG5pbXBvcnQgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuaW1wb3J0IEF1dGhBZGFwdGVyIGZyb20gJy4vQXV0aEFkYXB0ZXInO1xuXG5jbGFzcyBUd2l0dGVyQXV0aEFkYXB0ZXIgZXh0ZW5kcyBBdXRoQWRhcHRlciB7XG4gIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R3aXR0ZXIgYXV0aCBvcHRpb25zIGFyZSByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCA9IG9wdGlvbnMuZW5hYmxlSW5zZWN1cmVBdXRoO1xuXG4gICAgaWYgKCF0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCAmJiAoIW9wdGlvbnMuY29uc3VtZXJfa2V5IHx8ICFvcHRpb25zLmNvbnN1bWVyX3NlY3JldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc3VtZXIga2V5IGFuZCBzZWNyZXQgYXJlIHJlcXVpcmVkIGZvciBzZWN1cmUgVHdpdHRlciBhdXRoLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KFBhcnNlLmFwcGxpY2F0aW9uSWQpO1xuICAgIGNvbnN0IHR3aXR0ZXJDb25maWcgPSBjb25maWcuYXV0aC50d2l0dGVyO1xuXG4gICAgaWYgKHRoaXMuZW5hYmxlSW5zZWN1cmVBdXRoICYmIHR3aXR0ZXJDb25maWcgJiYgY29uZmlnLmVuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUluc2VjdXJlQXV0aChhdXRoRGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmNvbnN1bWVyX2tleSB8fCAhb3B0aW9ucy5jb25zdW1lcl9zZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgJ1R3aXR0ZXIgYXV0aCBjb25maWd1cmF0aW9uIG1pc3NpbmcgY29uc3VtZXJfa2V5IGFuZC9vciBjb25zdW1lcl9zZWNyZXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbkRhdGEgPSBhd2FpdCB0aGlzLmV4Y2hhbmdlQWNjZXNzVG9rZW4oYXV0aERhdGEpO1xuXG4gICAgaWYgKGFjY2Vzc1Rva2VuRGF0YT8ub2F1dGhfdG9rZW4gJiYgYWNjZXNzVG9rZW5EYXRhPy51c2VyX2lkKSB7XG4gICAgICBhdXRoRGF0YS5pZCA9IGFjY2Vzc1Rva2VuRGF0YS51c2VyX2lkO1xuICAgICAgYXV0aERhdGEuYXV0aF90b2tlbiA9IGFjY2Vzc1Rva2VuRGF0YS5vYXV0aF90b2tlbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJ1xuICAgICk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUluc2VjdXJlQXV0aChhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIGlmICghYXV0aERhdGEub2F1dGhfdG9rZW4gfHwgIWF1dGhEYXRhLm9hdXRoX3Rva2VuX3NlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAnVHdpdHRlciBpbnNlY3VyZSBhdXRoIHJlcXVpcmVzIG9hdXRoX3Rva2VuIGFuZCBvYXV0aF90b2tlbl9zZWNyZXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gdGhpcy5oYW5kbGVNdWx0aXBsZUNvbmZpZ3VyYXRpb25zKGF1dGhEYXRhLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QoYXV0aERhdGEsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBhd2FpdCBkYXRhLmpzb24oKTtcblxuICAgIGlmIChwYXJzZWREYXRhPy5pZCA9PT0gYXV0aERhdGEuaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJ1xuICAgICk7XG4gIH1cblxuICBhc3luYyBleGNoYW5nZUFjY2Vzc1Rva2VuKGF1dGhEYXRhKSB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW5SZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICB9LFxuICAgICAgYm9keTogcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHtcbiAgICAgICAgb2F1dGhfdG9rZW46IGF1dGhEYXRhLm9hdXRoX3Rva2VuLFxuICAgICAgICBvYXV0aF92ZXJpZmllcjogYXV0aERhdGEub2F1dGhfdmVyaWZpZXIsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkudHdpdHRlci5jb20vb2F1dGgvYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW5SZXF1ZXN0T3B0aW9ucyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZXhjaGFuZ2UgYWNjZXNzIHRva2VuLicpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICBoYW5kbGVNdWx0aXBsZUNvbmZpZ3VyYXRpb25zKGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgIGNvbnN0IGNvbnN1bWVyX2tleSA9IGF1dGhEYXRhLmNvbnN1bWVyX2tleTtcblxuICAgICAgaWYgKCFjb25zdW1lcl9rZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAgICAgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zID0gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi5jb25zdW1lcl9rZXkgPT09IGNvbnN1bWVyX2tleSk7XG5cbiAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgICAnVHdpdHRlciBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcHRpb25zWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgYXN5bmMgcmVxdWVzdChhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29uc3VtZXJfa2V5LCBjb25zdW1lcl9zZWNyZXQgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBvYXV0aCA9IHtcbiAgICAgIGNvbnN1bWVyX2tleSxcbiAgICAgIGNvbnN1bWVyX3NlY3JldCxcbiAgICAgIGF1dGhfdG9rZW46IGF1dGhEYXRhLm9hdXRoX3Rva2VuLFxuICAgICAgYXV0aF90b2tlbl9zZWNyZXQ6IGF1dGhEYXRhLm9hdXRoX3Rva2VuX3NlY3JldCxcbiAgICB9O1xuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCgnaHR0cHM6Ly9hcGkudHdpdHRlci5jb20vMi91c2Vycy9tZScpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAnICsgb2F1dGguYXV0aF90b2tlbixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvYXV0aCksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCB1c2VyIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgYXN5bmMgYmVmb3JlRmluZChhdXRoRGF0YSkge1xuICAgIGlmICh0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCAmJiAhYXV0aERhdGE/LmNvZGUpIHtcbiAgICAgIGlmICghYXV0aERhdGE/LmFjY2Vzc190b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXJGcm9tQWNjZXNzVG9rZW4oYXV0aERhdGEuYWNjZXNzX3Rva2VuLCBhdXRoRGF0YSk7XG5cbiAgICAgIGlmICh1c2VyLmlkICE9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1R3aXR0ZXIgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWF1dGhEYXRhPy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgJ1R3aXR0ZXIgY29kZSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NfdG9rZW4gPSBhd2FpdCB0aGlzLmV4Y2hhbmdlQWNjZXNzVG9rZW4oYXV0aERhdGEpO1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmdldFVzZXJGcm9tQWNjZXNzVG9rZW4oYWNjZXNzX3Rva2VuLCBhdXRoRGF0YSk7XG5cblxuICAgIGF1dGhEYXRhLmFjY2Vzc190b2tlbiA9IGFjY2Vzc190b2tlbjtcbiAgICBhdXRoRGF0YS5pZCA9IHVzZXIuaWQ7XG5cbiAgICBkZWxldGUgYXV0aERhdGEuY29kZTtcbiAgICBkZWxldGUgYXV0aERhdGEucmVkaXJlY3RfdXJpO1xuICB9XG5cbiAgdmFsaWRhdGVBcHBJZCgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFR3aXR0ZXJBdXRoQWRhcHRlcigpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFtRUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsWUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQXdDLFNBQUFELHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBckV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTUEsTUFBTUcsa0JBQWtCLFNBQVNDLG9CQUFXLENBQUM7RUFDM0NDLGVBQWVBLENBQUNDLE9BQU8sRUFBRTtJQUN2QixJQUFJLENBQUNBLE9BQU8sRUFB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
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ const jwt = require('jsonwebtoken');
4
+ const util = require('util');
5
+ const Parse = require('parse/node').Parse;
6
+ const getHeaderFromToken = token => {
7
+ const decodedToken = jwt.decode(token, {
8
+ complete: true
9
+ });
10
+ if (!decodedToken) {
11
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
12
+ }
13
+ return decodedToken.header;
14
+ };
15
+
16
+ /**
17
+ * Returns the signing key from a JWKS client.
18
+ * @param {Object} client The JWKS client.
19
+ * @param {String} key The kid.
20
+ */
21
+ async function getSigningKey(client, key) {
22
+ return util.promisify(client.getSigningKey)(key);
23
+ }
24
+ module.exports = {
25
+ getHeaderFromToken,
26
+ getSigningKey
27
+ };
28
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqd3QiLCJyZXF1aXJlIiwidXRpbCIsIlBhcnNlIiwiZ2V0SGVhZGVyRnJvbVRva2VuIiwidG9rZW4iLCJkZWNvZGVkVG9rZW4iLCJkZWNvZGUiLCJjb21wbGV0ZSIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsImhlYWRlciIsImdldFNpZ25pbmdLZXkiLCJjbGllbnQiLCJrZXkiLCJwcm9taXNpZnkiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgand0ID0gcmVxdWlyZSgnanNvbndlYnRva2VuJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCBnZXRIZWFkZXJGcm9tVG9rZW4gPSB0b2tlbiA9PiB7XG4gIGNvbnN0IGRlY29kZWRUb2tlbiA9IGp3dC5kZWNvZGUodG9rZW4sIHsgY29tcGxldGU6IHRydWUgfSk7XG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBwcm92aWRlZCB0b2tlbiBkb2VzIG5vdCBkZWNvZGUgYXMgSldUYCk7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZFRva2VuLmhlYWRlcjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2lnbmluZyBrZXkgZnJvbSBhIEpXS1MgY2xpZW50LlxuICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBUaGUgSldLUyBjbGllbnQuXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSBraWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFNpZ25pbmdLZXkoY2xpZW50LCBrZXkpIHtcbiAgcmV0dXJuIHV0aWwucHJvbWlzaWZ5KGNsaWVudC5nZXRTaWduaW5nS2V5KShrZXkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldEhlYWRlckZyb21Ub2tlbixcbiAgZ2V0U2lnbmluZ0tleSxcbn07XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsR0FBRyxHQUFHQyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ25DLE1BQU1DLElBQUksR0FBR0QsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM1QixNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ0UsS0FBSztBQUN6QyxNQUFNQyxrQkFBa0IsR0FBR0MsS0FBSyxJQUFJO0VBQ2xDLE1BQU1DLFlBQVksR0FBR04sR0FBRyxDQUFDTyxNQUFNLENBQUNGLEtBQUssRUFBRTtJQUFFRyxRQUFRLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFDMUQsSUFBSSxDQUFDRixZQUFZLEVBQUU7SUFDakIsTUFBTSxJQUFJSCxLQUFLLENBQUNNLEtBQUssQ0FBQ04sS0FBSyxDQUFDTSxLQUFLLENBQUNDLGdCQUFnQixFQUFFLHVDQUF1QyxDQUFDO0VBQzlGO0VBRUEsT0FBT0osWUFBWSxDQUFDSyxNQUFNO0FBQzVCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWVDLGFBQWFBLENBQUNDLE1BQU0sRUFBRUMsR0FBRyxFQUFFO0VBQ3hDLE9BQU9aLElBQUksQ0FBQ2EsU0FBUyxDQUFDRixNQUFNLENBQUNELGFBQWEsQ0FBQyxDQUFDRSxHQUFHLENBQUM7QUFDbEQ7QUFDQUUsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFDZmIsa0JBQWtCO0VBQ2xCUTtBQUNGLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1,36 +1,41 @@
1
1
  'use strict';
2
2
 
3
3
  // Helper functions for accessing the vkontakte API.
4
-
5
- var https = require('https');
4
+ var _Config = _interopRequireDefault(require("../../Config"));
5
+ var _Deprecator = _interopRequireDefault(require("../../Deprecator/Deprecator"));
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ const httpsRequest = require('./httpsRequest');
6
8
  var Parse = require('parse/node').Parse;
7
- var logger = require('../../logger').default;
8
-
9
9
  // Returns a promise that fulfills iff this user id is valid.
10
- function validateAuthData(authData, params) {
11
- return vkOAuth2Request(params).then(function (response) {
12
- if (response && response.access_token) {
13
- return request("api.vk.com", "method/secure.checkToken?token=" + authData.access_token + "&client_secret=" + params.appSecret + "&access_token=" + response.access_token + "&v=5.59").then(function (response) {
14
- if (response && response.response && response.response.user_id == authData.id) {
15
- return;
16
- }
17
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk auth is invalid for this user.');
18
- });
19
- }
20
- logger.error('Vk Auth', 'Vk appIds or appSecret is incorrect.');
21
- throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk appIds or appSecret is incorrect.');
10
+ async function validateAuthData(authData, params) {
11
+ const config = _Config.default.get(Parse.applicationId);
12
+ _Deprecator.default.logRuntimeDeprecation({
13
+ usage: 'vkontakte adapter'
22
14
  });
15
+ const vkConfig = config.auth.vkontakte;
16
+ if (!vkConfig?.enableInsecureAuth || !config.enableInsecureAuthAdapters) {
17
+ throw new Parse.Error('Vk only works with enableInsecureAuth: true');
18
+ }
19
+ const response = await vkOAuth2Request(params);
20
+ if (!response?.access_token) {
21
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk appIds or appSecret is incorrect.');
22
+ }
23
+ const vkUser = await request('api.vk.com', `method/users.get?access_token=${authData.access_token}&v=${params.apiVersion}`);
24
+ if (!vkUser?.response?.length || vkUser.response[0].id !== authData.id) {
25
+ throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk auth is invalid for this user.');
26
+ }
23
27
  }
24
-
25
28
  function vkOAuth2Request(params) {
26
29
  return new Promise(function (resolve) {
27
30
  if (!params || !params.appIds || !params.appIds.length || !params.appSecret || !params.appSecret.length) {
28
- logger.error('Vk Auth', 'Vk auth is not configured. Missing appIds or appSecret.');
29
31
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Vk auth is not configured. Missing appIds or appSecret.');
30
32
  }
33
+ if (!params.apiVersion) {
34
+ params.apiVersion = '5.124';
35
+ }
31
36
  resolve();
32
37
  }).then(function () {
33
- return request("oauth.vk.com", "access_token?client_id=" + params.appIds + "&client_secret=" + params.appSecret + "&v=5.59&grant_type=client_credentials");
38
+ return request('oauth.vk.com', 'access_token?client_id=' + params.appIds + '&client_secret=' + params.appSecret + '&v=' + params.apiVersion + '&grant_type=client_credentials');
34
39
  });
35
40
  }
36
41
 
@@ -41,28 +46,10 @@ function validateAppId() {
41
46
 
42
47
  // A promisey wrapper for api requests
43
48
  function request(host, path) {
44
- return new Promise(function (resolve, reject) {
45
- https.get("https://" + host + "/" + path, function (res) {
46
- var data = '';
47
- res.on('data', function (chunk) {
48
- data += chunk;
49
- });
50
- res.on('end', function () {
51
- try {
52
- data = JSON.parse(data);
53
- } catch (e) {
54
- return reject(e);
55
- }
56
- resolve(data);
57
- });
58
- }).on('error', function () {
59
- reject('Failed to validate this access token with Vk.');
60
- });
61
- });
49
+ return httpsRequest.get('https://' + host + '/' + path);
62
50
  }
63
-
64
51
  module.exports = {
65
52
  validateAppId: validateAppId,
66
53
  validateAuthData: validateAuthData
67
54
  };
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL3Zrb250YWt0ZS5qcyJdLCJuYW1lcyI6WyJodHRwcyIsInJlcXVpcmUiLCJQYXJzZSIsImxvZ2dlciIsImRlZmF1bHQiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJwYXJhbXMiLCJ2a09BdXRoMlJlcXVlc3QiLCJ0aGVuIiwicmVzcG9uc2UiLCJhY2Nlc3NfdG9rZW4iLCJyZXF1ZXN0IiwiYXBwU2VjcmV0IiwidXNlcl9pZCIsImlkIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiZXJyb3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFwcElkcyIsImxlbmd0aCIsInZhbGlkYXRlQXBwSWQiLCJob3N0IiwicGF0aCIsInJlamVjdCIsImdldCIsInJlcyIsImRhdGEiLCJvbiIsImNodW5rIiwiSlNPTiIsInBhcnNlIiwiZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBLElBQUlBLFFBQVFDLFFBQVEsT0FBUixDQUFaO0FBQ0EsSUFBSUMsUUFBUUQsUUFBUSxZQUFSLEVBQXNCQyxLQUFsQztBQUNBLElBQUlDLFNBQVNGLFFBQVEsY0FBUixFQUF3QkcsT0FBckM7O0FBRUE7QUFDQSxTQUFTQyxnQkFBVCxDQUEwQkMsUUFBMUIsRUFBb0NDLE1BQXBDLEVBQTRDO0FBQzFDLFNBQU9DLGdCQUFnQkQsTUFBaEIsRUFBd0JFLElBQXhCLENBQTZCLFVBQVVDLFFBQVYsRUFBb0I7QUFDdEQsUUFBSUEsWUFBWUEsU0FBU0MsWUFBekIsRUFBdUM7QUFDckMsYUFBT0MsUUFBUSxZQUFSLEVBQXNCLG9DQUFvQ04sU0FBU0ssWUFBN0MsR0FBNEQsaUJBQTVELEdBQWdGSixPQUFPTSxTQUF2RixHQUFtRyxnQkFBbkcsR0FBc0hILFNBQVNDLFlBQS9ILEdBQThJLFNBQXBLLEVBQStLRixJQUEvSyxDQUFvTCxVQUFVQyxRQUFWLEVBQW9CO0FBQzdNLFlBQUlBLFlBQVlBLFNBQVNBLFFBQXJCLElBQWlDQSxTQUFTQSxRQUFULENBQWtCSSxPQUFsQixJQUE2QlIsU0FBU1MsRUFBM0UsRUFBK0U7QUFDN0U7QUFDRDtBQUNELGNBQU0sSUFBSWIsTUFBTWMsS0FBVixDQUFnQmQsTUFBTWMsS0FBTixDQUFZQyxnQkFBNUIsRUFBOEMsbUNBQTlDLENBQU47QUFDRCxPQUxNLENBQVA7QUFNRDtBQUNEZCxXQUFPZSxLQUFQLENBQWEsU0FBYixFQUF3QixzQ0FBeEI7QUFDQSxVQUFNLElBQUloQixNQUFNYyxLQUFWLENBQWdCZCxNQUFNYyxLQUFOLENBQVlDLGdCQUE1QixFQUE4QyxzQ0FBOUMsQ0FBTjtBQUNELEdBWE0sQ0FBUDtBQVlEOztBQUVELFNBQVNULGVBQVQsQ0FBeUJELE1BQXpCLEVBQWlDO0FBQy9CLFNBQU8sSUFBSVksT0FBSixDQUFZLFVBQVVDLE9BQVYsRUFBbUI7QUFDcEMsUUFBSSxDQUFDYixNQUFELElBQVcsQ0FBQ0EsT0FBT2MsTUFBbkIsSUFBNkIsQ0FBQ2QsT0FBT2MsTUFBUCxDQUFjQyxNQUE1QyxJQUFzRCxDQUFDZixPQUFPTSxTQUE5RCxJQUEyRSxDQUFDTixPQUFPTSxTQUFQLENBQWlCUyxNQUFqRyxFQUF5RztBQUN2R25CLGFBQU9lLEtBQVAsQ0FBYSxTQUFiLEVBQXdCLHlEQUF4QjtBQUNBLFlBQU0sSUFBSWhCLE1BQU1jLEtBQVYsQ0FBZ0JkLE1BQU1jLEtBQU4sQ0FBWUMsZ0JBQTVCLEVBQThDLHlEQUE5QyxDQUFOO0FBQ0Q7QUFDREc7QUFDRCxHQU5NLEVBTUpYLElBTkksQ0FNQyxZQUFZO0FBQ2xCLFdBQU9HLFFBQVEsY0FBUixFQUF3Qiw0QkFBNEJMLE9BQU9jLE1BQW5DLEdBQTRDLGlCQUE1QyxHQUFnRWQsT0FBT00sU0FBdkUsR0FBbUYsdUNBQTNHLENBQVA7QUFDRCxHQVJNLENBQVA7QUFTRDs7QUFFRDtBQUNBLFNBQVNVLGFBQVQsR0FBeUI7QUFDdkIsU0FBT0osUUFBUUMsT0FBUixFQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFTUixPQUFULENBQWlCWSxJQUFqQixFQUF1QkMsSUFBdkIsRUFBNkI7QUFDM0IsU0FBTyxJQUFJTixPQUFKLENBQVksVUFBVUMsT0FBVixFQUFtQk0sTUFBbkIsRUFBMkI7QUFDNUMxQixVQUFNMkIsR0FBTixDQUFVLGFBQWFILElBQWIsR0FBb0IsR0FBcEIsR0FBMEJDLElBQXBDLEVBQTBDLFVBQVVHLEdBQVYsRUFBZTtBQUN2RCxVQUFJQyxPQUFPLEVBQVg7QUFDQUQsVUFBSUUsRUFBSixDQUFPLE1BQVAsRUFBZSxVQUFVQyxLQUFWLEVBQWlCO0FBQzlCRixnQkFBUUUsS0FBUjtBQUNELE9BRkQ7QUFHQUgsVUFBSUUsRUFBSixDQUFPLEtBQVAsRUFBYyxZQUFZO0FBQ3hCLFlBQUk7QUFDRkQsaUJBQU9HLEtBQUtDLEtBQUwsQ0FBV0osSUFBWCxDQUFQO0FBQ0QsU0FGRCxDQUVFLE9BQU1LLENBQU4sRUFBUztBQUNULGlCQUFPUixPQUFPUSxDQUFQLENBQVA7QUFDRDtBQUNEZCxnQkFBUVMsSUFBUjtBQUNELE9BUEQ7QUFRRCxLQWJELEVBYUdDLEVBYkgsQ0FhTSxPQWJOLEVBYWUsWUFBWTtBQUN6QkosYUFBTywrQ0FBUDtBQUNELEtBZkQ7QUFnQkQsR0FqQk0sQ0FBUDtBQWtCRDs7QUFFRFMsT0FBT0MsT0FBUCxHQUFpQjtBQUNmYixpQkFBZUEsYUFEQTtBQUVmbEIsb0JBQWtCQTtBQUZILENBQWpCIiwiZmlsZSI6InZrb250YWt0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZSB2a29udGFrdGUgQVBJLlxuXG52YXIgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xudmFyIGxvZ2dlciA9IHJlcXVpcmUoJy4uLy4uL2xvZ2dlcicpLmRlZmF1bHQ7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIHBhcmFtcykge1xuICByZXR1cm4gdmtPQXV0aDJSZXF1ZXN0KHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYWNjZXNzX3Rva2VuKSB7XG4gICAgICByZXR1cm4gcmVxdWVzdChcImFwaS52ay5jb21cIiwgXCJtZXRob2Qvc2VjdXJlLmNoZWNrVG9rZW4/dG9rZW49XCIgKyBhdXRoRGF0YS5hY2Nlc3NfdG9rZW4gKyBcIiZjbGllbnRfc2VjcmV0PVwiICsgcGFyYW1zLmFwcFNlY3JldCArIFwiJmFjY2Vzc190b2tlbj1cIiArIHJlc3BvbnNlLmFjY2Vzc190b2tlbiArIFwiJnY9NS41OVwiKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzcG9uc2UudXNlcl9pZCA9PSBhdXRoRGF0YS5pZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1ZrIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxvZ2dlci5lcnJvcignVmsgQXV0aCcsICdWayBhcHBJZHMgb3IgYXBwU2VjcmV0IGlzIGluY29ycmVjdC4nKTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ1ZrIGFwcElkcyBvciBhcHBTZWNyZXQgaXMgaW5jb3JyZWN0LicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmtPQXV0aDJSZXF1ZXN0KHBhcmFtcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCAhcGFyYW1zLmFwcElkcyB8fCAhcGFyYW1zLmFwcElkcy5sZW5ndGggfHwgIXBhcmFtcy5hcHBTZWNyZXQgfHwgIXBhcmFtcy5hcHBTZWNyZXQubGVuZ3RoKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1ZrIEF1dGgnLCAnVmsgYXV0aCBpcyBub3QgY29uZmlndXJlZC4gTWlzc2luZyBhcHBJZHMgb3IgYXBwU2VjcmV0LicpO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdWayBhdXRoIGlzIG5vdCBjb25maWd1cmVkLiBNaXNzaW5nIGFwcElkcyBvciBhcHBTZWNyZXQuJyk7XG4gICAgfVxuICAgIHJlc29sdmUoKTtcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QoXCJvYXV0aC52ay5jb21cIiwgXCJhY2Nlc3NfdG9rZW4/Y2xpZW50X2lkPVwiICsgcGFyYW1zLmFwcElkcyArIFwiJmNsaWVudF9zZWNyZXQ9XCIgKyBwYXJhbXMuYXBwU2VjcmV0ICsgXCImdj01LjU5JmdyYW50X3R5cGU9Y2xpZW50X2NyZWRlbnRpYWxzXCIpO1xuICB9KTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZmYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbi8vIEEgcHJvbWlzZXkgd3JhcHBlciBmb3IgYXBpIHJlcXVlc3RzXG5mdW5jdGlvbiByZXF1ZXN0KGhvc3QsIHBhdGgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBodHRwcy5nZXQoXCJodHRwczovL1wiICsgaG9zdCArIFwiL1wiICsgcGF0aCwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGRhdGEgPSAnJztcbiAgICAgIHJlcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgfSk7XG4gICAgICByZXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSk7XG4gICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmVqZWN0KCdGYWlsZWQgdG8gdmFsaWRhdGUgdGhpcyBhY2Nlc3MgdG9rZW4gd2l0aCBWay4nKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhXG59O1xuIl19
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQ29uZmlnIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfRGVwcmVjYXRvciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImh0dHBzUmVxdWVzdCIsIlBhcnNlIiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwicGFyYW1zIiwiY29uZmlnIiwiQ29uZmlnIiwiZ2V0IiwiYXBwbGljYXRpb25JZCIsIkRlcHJlY2F0b3IiLCJsb2dSdW50aW1lRGVwcmVjYXRpb24iLCJ1c2FnZSIsInZrQ29uZmlnIiwiYXV0aCIsInZrb250YWt0ZSIsImVuYWJsZUluc2VjdXJlQXV0aCIsImVuYWJsZUluc2VjdXJlQXV0aEFkYXB0ZXJzIiwiRXJyb3IiLCJyZXNwb25zZSIsInZrT0F1dGgyUmVxdWVzdCIsImFjY2Vzc190b2tlbiIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2a1VzZXIiLCJyZXF1ZXN0IiwiYXBpVmVyc2lvbiIsImxlbmd0aCIsImlkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhcHBJZHMiLCJhcHBTZWNyZXQiLCJ0aGVuIiwidmFsaWRhdGVBcHBJZCIsImhvc3QiLCJwYXRoIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL3Zrb250YWt0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgdmtvbnRha3RlIEFQSS5cblxuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vLi4vQ29uZmlnJztcbmltcG9ydCBEZXByZWNhdG9yIGZyb20gJy4uLy4uL0RlcHJlY2F0b3IvRGVwcmVjYXRvcic7XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIHBhcmFtcykge1xuICBjb25zdCBjb25maWcgPSBDb25maWcuZ2V0KFBhcnNlLmFwcGxpY2F0aW9uSWQpO1xuICBEZXByZWNhdG9yLmxvZ1J1bnRpbWVEZXByZWNhdGlvbih7IHVzYWdlOiAndmtvbnRha3RlIGFkYXB0ZXInIH0pO1xuXG4gIGNvbnN0IHZrQ29uZmlnID0gY29uZmlnLmF1dGgudmtvbnRha3RlO1xuICBpZiAoIXZrQ29uZmlnPy5lbmFibGVJbnNlY3VyZUF1dGggfHwgIWNvbmZpZy5lbmFibGVJbnNlY3VyZUF1dGhBZGFwdGVycykge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcignVmsgb25seSB3b3JrcyB3aXRoIGVuYWJsZUluc2VjdXJlQXV0aDogdHJ1ZScpO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB2a09BdXRoMlJlcXVlc3QocGFyYW1zKTtcbiAgaWYgKCFyZXNwb25zZT8uYWNjZXNzX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdWayBhcHBJZHMgb3IgYXBwU2VjcmV0IGlzIGluY29ycmVjdC4nKTtcbiAgfVxuXG4gIGNvbnN0IHZrVXNlciA9IGF3YWl0IHJlcXVlc3QoXG4gICAgJ2FwaS52ay5jb20nLFxuICAgIGBtZXRob2QvdXNlcnMuZ2V0P2FjY2Vzc190b2tlbj0ke2F1dGhEYXRhLmFjY2Vzc190b2tlbn0mdj0ke3BhcmFtcy5hcGlWZXJzaW9ufWBcbiAgKTtcblxuICBpZiAoIXZrVXNlcj8ucmVzcG9uc2U/Lmxlbmd0aCB8fCB2a1VzZXIucmVzcG9uc2VbMF0uaWQgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdWayBhdXRoIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2a09BdXRoMlJlcXVlc3QocGFyYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIGlmIChcbiAgICAgICFwYXJhbXMgfHxcbiAgICAgICFwYXJhbXMuYXBwSWRzIHx8XG4gICAgICAhcGFyYW1zLmFwcElkcy5sZW5ndGggfHxcbiAgICAgICFwYXJhbXMuYXBwU2VjcmV0IHx8XG4gICAgICAhcGFyYW1zLmFwcFNlY3JldC5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgJ1ZrIGF1dGggaXMgbm90IGNvbmZpZ3VyZWQuIE1pc3NpbmcgYXBwSWRzIG9yIGFwcFNlY3JldC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5hcGlWZXJzaW9uKSB7XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA9ICc1LjEyNCc7XG4gICAgfVxuICAgIHJlc29sdmUoKTtcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QoXG4gICAgICAnb2F1dGgudmsuY29tJyxcbiAgICAgICdhY2Nlc3NfdG9rZW4/Y2xpZW50X2lkPScgK1xuICAgICAgICBwYXJhbXMuYXBwSWRzICtcbiAgICAgICAgJyZjbGllbnRfc2VjcmV0PScgK1xuICAgICAgICBwYXJhbXMuYXBwU2VjcmV0ICtcbiAgICAgICAgJyZ2PScgK1xuICAgICAgICBwYXJhbXMuYXBpVmVyc2lvbiArXG4gICAgICAgICcmZ3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMnXG4gICAgKTtcbiAgfSk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG4vLyBBIHByb21pc2V5IHdyYXBwZXIgZm9yIGFwaSByZXF1ZXN0c1xuZnVuY3Rpb24gcmVxdWVzdChob3N0LCBwYXRoKSB7XG4gIHJldHVybiBodHRwc1JlcXVlc3QuZ2V0KCdodHRwczovLycgKyBob3N0ICsgJy8nICsgcGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTs7QUFFWjtBQUlBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUFxRCxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUhyRCxNQUFNRyxZQUFZLEdBQUdMLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUM5QyxJQUFJTSxLQUFLLEdBQUdOLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ00sS0FBSztBQUl2QztBQUNBLGVBQWVDLGdCQUFnQkEsQ0FBQ0MsUUFBUSxFQUFFQyxNQUFNLEVBQUU7RUFDaEQsTUFBTUMsTUFBTSxHQUFHQyxlQUFNLENBQUNDLEdBQUcsQ0FBQ04sS0FBSyxDQUFDTyxhQUFhLENBQUM7RUFDOUNDLG1CQUFVLENBQUNDLHFCQUFxQixDQUFDO0lBQUVDLEtBQUssRUFBRTtFQUFvQixDQUFDLENBQUM7RUFFaEUsTUFBTUMsUUFBUSxHQUFHUCxNQUFNLENBQUNRLElBQUksQ0FBQ0MsU0FBUztFQUN0QyxJQUFJLENBQUNGLFFBQVEsRUFBRUcsa0JBQWtCLElBQUksQ0FBQ1YsTUFBTSxDQUFDVywwQkFBMEIsRUFBRTtJQUN2RSxNQUFNLElBQUlmLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQztFQUN0RTtFQUVBLE1BQU1DLFFBQVEsR0FBRyxNQUFNQyxlQUFlLENBQUNmLE1BQU0sQ0FBQztFQUM5QyxJQUFJLENBQUNjLFFBQVEsRUFBRUUsWUFBWSxFQUFFO0lBQzNCLE1BQU0sSUFBSW5CLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQ2hCLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQ0ksZ0JBQWdCLEVBQUUsc0NBQXNDLENBQUM7RUFDN0Y7RUFFQSxNQUFNQyxNQUFNLEdBQUcsTUFBTUMsT0FBTyxDQUMxQixZQUFZLEVBQ1osaUNBQWlDcEIsUUFBUSxDQUFDaUIsWUFBWSxNQUFNaEIsTUFBTSxDQUFDb0IsVUFBVSxFQUMvRSxDQUFDO0VBRUQsSUFBSSxDQUFDRixNQUFNLEVBQUVKLFFBQVEsRUFBRU8sTUFBTSxJQUFJSCxNQUFNLENBQUNKLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ1EsRUFBRSxLQUFLdkIsUUFBUSxDQUFDdUIsRUFBRSxFQUFFO0lBQ3RFLE1BQU0sSUFBSXpCLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQ2hCLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQ0ksZ0JBQWdCLEVBQUUsbUNBQW1DLENBQUM7RUFDMUY7QUFDRjtBQUVBLFNBQVNGLGVBQWVBLENBQUNmLE1BQU0sRUFBRTtFQUMvQixPQUFPLElBQUl1QixPQUFPLENBQUMsVUFBVUMsT0FBTyxFQUFFO0lBQ3BDLElBQ0UsQ0FBQ3hCLE1BQU0sSUFDUCxDQUFDQSxNQUFNLENBQUN5QixNQUFNLElBQ2QsQ0FBQ3pCLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQ0osTUFBTSxJQUNyQixDQUFDckIsTUFBTSxDQUFDMEIsU0FBUyxJQUNqQixDQUFDMUIsTUFBTSxDQUFDMEIsU0FBUyxDQUFDTCxNQUFNLEVBQ3hCO01BQ0EsTUFBTSxJQUFJeEIsS0FBSyxDQUFDZ0IsS0FBSyxDQUNuQmhCLEtBQUssQ0FBQ2dCLEtBQUssQ0FBQ0ksZ0JBQWdCLEVBQzVCLHlEQUNGLENBQUM7SUFDSDtJQUNBLElBQUksQ0FBQ2pCLE1BQU0sQ0FBQ29CLFVBQVUsRUFBRTtNQUN0QnBCLE1BQU0sQ0FBQ29CLFVBQVUsR0FBRyxPQUFPO0lBQzdCO0lBQ0FJLE9BQU8sQ0FBQyxDQUFDO0VBQ1gsQ0FBQyxDQUFDLENBQUNHLElBQUksQ0FBQyxZQUFZO0lBQ2xCLE9BQU9SLE9BQU8sQ0FDWixjQUFjLEVBQ2QseUJBQXlCLEdBQ3ZCbkIsTUFBTSxDQUFDeUIsTUFBTSxHQUNiLGlCQUFpQixHQUNqQnpCLE1BQU0sQ0FBQzBCLFNBQVMsR0FDaEIsS0FBSyxHQUNMMUIsTUFBTSxDQUFDb0IsVUFBVSxHQUNqQixnQ0FDSixDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ0o7O0FBRUE7QUFDQSxTQUFTUSxhQUFhQSxDQUFBLEVBQUc7RUFDdkIsT0FBT0wsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztBQUMxQjs7QUFFQTtBQUNBLFNBQVNMLE9BQU9BLENBQUNVLElBQUksRUFBRUMsSUFBSSxFQUFFO0VBQzNCLE9BQU9sQyxZQUFZLENBQUNPLEdBQUcsQ0FBQyxVQUFVLEdBQUcwQixJQUFJLEdBQUcsR0FBRyxHQUFHQyxJQUFJLENBQUM7QUFDekQ7QUFFQUMsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFDZkosYUFBYSxFQUFFQSxhQUFhO0VBQzVCOUIsZ0JBQWdCLEVBQUVBO0FBQ3BCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=