@beiguancyc/parse-server 9.9.0-ruixiang.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +71 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +280 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +320 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/views/choose_password +215 -0
package/bin/parse-server
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.AccountLockout = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
// This class handles the Account Lockout Policy settings.
|
|
10
|
+
|
|
11
|
+
class AccountLockout {
|
|
12
|
+
constructor(user, config) {
|
|
13
|
+
this._user = user;
|
|
14
|
+
this._config = config;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* set _failed_login_count to value
|
|
19
|
+
*/
|
|
20
|
+
_setFailedLoginCount(value) {
|
|
21
|
+
const query = {
|
|
22
|
+
username: this._user.username
|
|
23
|
+
};
|
|
24
|
+
const updateFields = {
|
|
25
|
+
_failed_login_count: value
|
|
26
|
+
};
|
|
27
|
+
return this._config.database.update('_User', query, updateFields);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* increment _failed_login_count by 1 and return the updated document
|
|
32
|
+
*/
|
|
33
|
+
_incrementFailedLoginCount() {
|
|
34
|
+
const query = {
|
|
35
|
+
username: this._user.username
|
|
36
|
+
};
|
|
37
|
+
const updateFields = {
|
|
38
|
+
_failed_login_count: {
|
|
39
|
+
__op: 'Increment',
|
|
40
|
+
amount: 1
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return this._config.database.update('_User', query, updateFields);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* if the failed login count is greater than the threshold
|
|
48
|
+
* then sets lockout expiration to 'currenttime + accountPolicy.duration', i.e., account is locked out for the next 'accountPolicy.duration' minutes
|
|
49
|
+
* else do nothing
|
|
50
|
+
*/
|
|
51
|
+
_setLockoutExpiration() {
|
|
52
|
+
const query = {
|
|
53
|
+
username: this._user.username,
|
|
54
|
+
_failed_login_count: {
|
|
55
|
+
$gte: this._config.accountLockout.threshold
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const now = new Date();
|
|
59
|
+
const updateFields = {
|
|
60
|
+
_account_lockout_expires_at: _node.default._encode(new Date(now.getTime() + this._config.accountLockout.duration * 60 * 1000))
|
|
61
|
+
};
|
|
62
|
+
return this._config.database.update('_User', query, updateFields).catch(err => {
|
|
63
|
+
if (err && err.code && err.message && err.code === _node.default.Error.OBJECT_NOT_FOUND && err.message === 'Object not found.') {
|
|
64
|
+
return; // nothing to update so we are good
|
|
65
|
+
} else {
|
|
66
|
+
throw err; // unknown error
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* if _account_lockout_expires_at > current_time and _failed_login_count > threshold
|
|
73
|
+
* reject with account locked error
|
|
74
|
+
* else
|
|
75
|
+
* resolve
|
|
76
|
+
*/
|
|
77
|
+
_notLocked() {
|
|
78
|
+
const query = {
|
|
79
|
+
username: this._user.username,
|
|
80
|
+
_account_lockout_expires_at: {
|
|
81
|
+
$gt: _node.default._encode(new Date())
|
|
82
|
+
},
|
|
83
|
+
_failed_login_count: {
|
|
84
|
+
$gte: this._config.accountLockout.threshold
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return this._config.database.find('_User', query).then(users => {
|
|
88
|
+
if (Array.isArray(users) && users.length > 0) {
|
|
89
|
+
throw new _node.default.Error(_node.default.Error.OBJECT_NOT_FOUND, 'Your account is locked due to multiple failed login attempts. Please try again after ' + this._config.accountLockout.duration + ' minute(s)');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Atomically increment _failed_login_count and enforce lockout threshold.
|
|
96
|
+
* Uses the atomic increment result to determine the exact post-increment
|
|
97
|
+
* count, eliminating the TOCTOU race between checking and updating.
|
|
98
|
+
*/
|
|
99
|
+
_handleFailedLoginAttempt() {
|
|
100
|
+
return this._incrementFailedLoginCount().then(result => {
|
|
101
|
+
const count = result._failed_login_count;
|
|
102
|
+
if (count >= this._config.accountLockout.threshold) {
|
|
103
|
+
return this._setLockoutExpiration().then(() => {
|
|
104
|
+
if (count > this._config.accountLockout.threshold) {
|
|
105
|
+
throw new _node.default.Error(_node.default.Error.OBJECT_NOT_FOUND, 'Your account is locked due to multiple failed login attempts. Please try again after ' + this._config.accountLockout.duration + ' minute(s)');
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* handle login attempt if the Account Lockout Policy is enabled
|
|
114
|
+
*/
|
|
115
|
+
handleLoginAttempt(loginSuccessful) {
|
|
116
|
+
if (!this._config.accountLockout) {
|
|
117
|
+
return Promise.resolve();
|
|
118
|
+
}
|
|
119
|
+
return this._notLocked().then(() => {
|
|
120
|
+
if (loginSuccessful) {
|
|
121
|
+
return this._setFailedLoginCount(0);
|
|
122
|
+
} else {
|
|
123
|
+
return this._handleFailedLoginAttempt();
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Removes the account lockout.
|
|
130
|
+
*/
|
|
131
|
+
unlockAccount() {
|
|
132
|
+
if (!this._config.accountLockout || !this._config.accountLockout.unlockOnPasswordReset) {
|
|
133
|
+
return Promise.resolve();
|
|
134
|
+
}
|
|
135
|
+
return this._config.database.update('_User', {
|
|
136
|
+
username: this._user.username
|
|
137
|
+
}, {
|
|
138
|
+
_failed_login_count: {
|
|
139
|
+
__op: 'Delete'
|
|
140
|
+
},
|
|
141
|
+
_account_lockout_expires_at: {
|
|
142
|
+
__op: 'Delete'
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.AccountLockout = AccountLockout;
|
|
148
|
+
var _default = exports.default = AccountLockout;
|
|
149
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiQWNjb3VudExvY2tvdXQiLCJjb25zdHJ1Y3RvciIsInVzZXIiLCJjb25maWciLCJfdXNlciIsIl9jb25maWciLCJfc2V0RmFpbGVkTG9naW5Db3VudCIsInZhbHVlIiwicXVlcnkiLCJ1c2VybmFtZSIsInVwZGF0ZUZpZWxkcyIsIl9mYWlsZWRfbG9naW5fY291bnQiLCJkYXRhYmFzZSIsInVwZGF0ZSIsIl9pbmNyZW1lbnRGYWlsZWRMb2dpbkNvdW50IiwiX19vcCIsImFtb3VudCIsIl9zZXRMb2Nrb3V0RXhwaXJhdGlvbiIsIiRndGUiLCJhY2NvdW50TG9ja291dCIsInRocmVzaG9sZCIsIm5vdyIsIkRhdGUiLCJfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZXRUaW1lIiwiZHVyYXRpb24iLCJjYXRjaCIsImVyciIsImNvZGUiLCJtZXNzYWdlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiX25vdExvY2tlZCIsIiRndCIsImZpbmQiLCJ0aGVuIiwidXNlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJfaGFuZGxlRmFpbGVkTG9naW5BdHRlbXB0IiwicmVzdWx0IiwiY291bnQiLCJoYW5kbGVMb2dpbkF0dGVtcHQiLCJsb2dpblN1Y2Nlc3NmdWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInVubG9ja0FjY291bnQiLCJ1bmxvY2tPblBhc3N3b3JkUmVzZXQiLCJleHBvcnRzIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi9zcmMvQWNjb3VudExvY2tvdXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBBY2NvdW50IExvY2tvdXQgUG9saWN5IHNldHRpbmdzLlxuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5leHBvcnQgY2xhc3MgQWNjb3VudExvY2tvdXQge1xuICBjb25zdHJ1Y3Rvcih1c2VyLCBjb25maWcpIHtcbiAgICB0aGlzLl91c2VyID0gdXNlcjtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogc2V0IF9mYWlsZWRfbG9naW5fY291bnQgdG8gdmFsdWVcbiAgICovXG4gIF9zZXRGYWlsZWRMb2dpbkNvdW50KHZhbHVlKSB7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICB1c2VybmFtZTogdGhpcy5fdXNlci51c2VybmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGRzID0ge1xuICAgICAgX2ZhaWxlZF9sb2dpbl9jb3VudDogdmFsdWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfVXNlcicsIHF1ZXJ5LCB1cGRhdGVGaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluY3JlbWVudCBfZmFpbGVkX2xvZ2luX2NvdW50IGJ5IDEgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBkb2N1bWVudFxuICAgKi9cbiAgX2luY3JlbWVudEZhaWxlZExvZ2luQ291bnQoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB7XG4gICAgICB1c2VybmFtZTogdGhpcy5fdXNlci51c2VybmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGRzID0ge1xuICAgICAgX2ZhaWxlZF9sb2dpbl9jb3VudDogeyBfX29wOiAnSW5jcmVtZW50JywgYW1vdW50OiAxIH0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9jb25maWcuZGF0YWJhc2UudXBkYXRlKCdfVXNlcicsIHF1ZXJ5LCB1cGRhdGVGaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoZSBmYWlsZWQgbG9naW4gY291bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGRcbiAgICogdGhlbiBzZXRzIGxvY2tvdXQgZXhwaXJhdGlvbiB0byAnY3VycmVudHRpbWUgKyBhY2NvdW50UG9saWN5LmR1cmF0aW9uJywgaS5lLiwgYWNjb3VudCBpcyBsb2NrZWQgb3V0IGZvciB0aGUgbmV4dCAnYWNjb3VudFBvbGljeS5kdXJhdGlvbicgbWludXRlc1xuICAgKiBlbHNlIGRvIG5vdGhpbmdcbiAgICovXG4gIF9zZXRMb2Nrb3V0RXhwaXJhdGlvbigpIHtcbiAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLl91c2VyLnVzZXJuYW1lLFxuICAgICAgX2ZhaWxlZF9sb2dpbl9jb3VudDogeyAkZ3RlOiB0aGlzLl9jb25maWcuYWNjb3VudExvY2tvdXQudGhyZXNob2xkIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCB1cGRhdGVGaWVsZHMgPSB7XG4gICAgICBfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQ6IFBhcnNlLl9lbmNvZGUoXG4gICAgICAgIG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLl9jb25maWcuYWNjb3VudExvY2tvdXQuZHVyYXRpb24gKiA2MCAqIDEwMDApXG4gICAgICApLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCBxdWVyeSwgdXBkYXRlRmllbGRzKS5jYXRjaChlcnIgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgJiZcbiAgICAgICAgZXJyLm1lc3NhZ2UgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQgJiZcbiAgICAgICAgZXJyLm1lc3NhZ2UgPT09ICdPYmplY3Qgbm90IGZvdW5kLidcbiAgICAgICkge1xuICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gdXBkYXRlIHNvIHdlIGFyZSBnb29kXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnI7IC8vIHVua25vd24gZXJyb3JcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpZiBfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQgPiBjdXJyZW50X3RpbWUgYW5kIF9mYWlsZWRfbG9naW5fY291bnQgPiB0aHJlc2hvbGRcbiAgICogICByZWplY3Qgd2l0aCBhY2NvdW50IGxvY2tlZCBlcnJvclxuICAgKiBlbHNlXG4gICAqICAgcmVzb2x2ZVxuICAgKi9cbiAgX25vdExvY2tlZCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLl91c2VyLnVzZXJuYW1lLFxuICAgICAgX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0OiB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9LFxuICAgICAgX2ZhaWxlZF9sb2dpbl9jb3VudDogeyAkZ3RlOiB0aGlzLl9jb25maWcuYWNjb3VudExvY2tvdXQudGhyZXNob2xkIH0sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9jb25maWcuZGF0YWJhc2UuZmluZCgnX1VzZXInLCBxdWVyeSkudGhlbih1c2VycyA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1c2VycykgJiYgdXNlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgICAnWW91ciBhY2NvdW50IGlzIGxvY2tlZCBkdWUgdG8gbXVsdGlwbGUgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLiBQbGVhc2UgdHJ5IGFnYWluIGFmdGVyICcgK1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnLmFjY291bnRMb2Nrb3V0LmR1cmF0aW9uICtcbiAgICAgICAgICAgICcgbWludXRlKHMpJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgaW5jcmVtZW50IF9mYWlsZWRfbG9naW5fY291bnQgYW5kIGVuZm9yY2UgbG9ja291dCB0aHJlc2hvbGQuXG4gICAqIFVzZXMgdGhlIGF0b21pYyBpbmNyZW1lbnQgcmVzdWx0IHRvIGRldGVybWluZSB0aGUgZXhhY3QgcG9zdC1pbmNyZW1lbnRcbiAgICogY291bnQsIGVsaW1pbmF0aW5nIHRoZSBUT0NUT1UgcmFjZSBiZXR3ZWVuIGNoZWNraW5nIGFuZCB1cGRhdGluZy5cbiAgICovXG4gIF9oYW5kbGVGYWlsZWRMb2dpbkF0dGVtcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luY3JlbWVudEZhaWxlZExvZ2luQ291bnQoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBjb3VudCA9IHJlc3VsdC5fZmFpbGVkX2xvZ2luX2NvdW50O1xuICAgICAgaWYgKGNvdW50ID49IHRoaXMuX2NvbmZpZy5hY2NvdW50TG9ja291dC50aHJlc2hvbGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldExvY2tvdXRFeHBpcmF0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvdW50ID4gdGhpcy5fY29uZmlnLmFjY291bnRMb2Nrb3V0LnRocmVzaG9sZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICAgICAgICAnWW91ciBhY2NvdW50IGlzIGxvY2tlZCBkdWUgdG8gbXVsdGlwbGUgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLiBQbGVhc2UgdHJ5IGFnYWluIGFmdGVyICcgK1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5hY2NvdW50TG9ja291dC5kdXJhdGlvbiArXG4gICAgICAgICAgICAgICAgJyBtaW51dGUocyknXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogaGFuZGxlIGxvZ2luIGF0dGVtcHQgaWYgdGhlIEFjY291bnQgTG9ja291dCBQb2xpY3kgaXMgZW5hYmxlZFxuICAgKi9cbiAgaGFuZGxlTG9naW5BdHRlbXB0KGxvZ2luU3VjY2Vzc2Z1bCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmFjY291bnRMb2Nrb3V0KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3RMb2NrZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChsb2dpblN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldEZhaWxlZExvZ2luQ291bnQoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRmFpbGVkTG9naW5BdHRlbXB0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYWNjb3VudCBsb2Nrb3V0LlxuICAgKi9cbiAgdW5sb2NrQWNjb3VudCgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5hY2NvdW50TG9ja291dCB8fCAhdGhpcy5fY29uZmlnLmFjY291bnRMb2Nrb3V0LnVubG9ja09uUGFzc3dvcmRSZXNldCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmRhdGFiYXNlLnVwZGF0ZShcbiAgICAgICdfVXNlcicsXG4gICAgICB7IHVzZXJuYW1lOiB0aGlzLl91c2VyLnVzZXJuYW1lIH0sXG4gICAgICB7XG4gICAgICAgIF9mYWlsZWRfbG9naW5fY291bnQ6IHsgX19vcDogJ0RlbGV0ZScgfSxcbiAgICAgICAgX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0OiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY2NvdW50TG9ja291dDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsS0FBQSxHQUFBQyxz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
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
exports.loadAdapter = loadAdapter;
|
|
8
|
+
exports.loadModule = loadModule;
|
|
9
|
+
/**
|
|
10
|
+
* @module AdapterLoader
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* @static
|
|
14
|
+
* Attempt to load an adapter or fallback to the default.
|
|
15
|
+
* @param {Adapter} adapter an adapter
|
|
16
|
+
* @param {Adapter} defaultAdapter the default adapter to load
|
|
17
|
+
* @param {any} options options to pass to the contstructor
|
|
18
|
+
* @returns {Object} the loaded adapter
|
|
19
|
+
*/
|
|
20
|
+
function loadAdapter(adapter, defaultAdapter, options) {
|
|
21
|
+
if (!adapter) {
|
|
22
|
+
if (!defaultAdapter) {
|
|
23
|
+
return options;
|
|
24
|
+
}
|
|
25
|
+
// Load from the default adapter when no adapter is set
|
|
26
|
+
return loadAdapter(defaultAdapter, undefined, options);
|
|
27
|
+
} else if (typeof adapter === 'function') {
|
|
28
|
+
try {
|
|
29
|
+
return adapter(options);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
if (e.name === 'TypeError') {
|
|
32
|
+
var Adapter = adapter;
|
|
33
|
+
return new Adapter(options);
|
|
34
|
+
} else {
|
|
35
|
+
throw e;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
} else if (typeof adapter === 'string') {
|
|
39
|
+
adapter = require(adapter);
|
|
40
|
+
// If it's define as a module, get the default
|
|
41
|
+
if (adapter.default) {
|
|
42
|
+
adapter = adapter.default;
|
|
43
|
+
}
|
|
44
|
+
return loadAdapter(adapter, undefined, options);
|
|
45
|
+
} else if (adapter.module) {
|
|
46
|
+
return loadAdapter(adapter.module, undefined, adapter.options);
|
|
47
|
+
} else if (adapter.class) {
|
|
48
|
+
return loadAdapter(adapter.class, undefined, adapter.options);
|
|
49
|
+
} else if (adapter.adapter) {
|
|
50
|
+
return loadAdapter(adapter.adapter, undefined, adapter.options);
|
|
51
|
+
}
|
|
52
|
+
// return the adapter as provided
|
|
53
|
+
return adapter;
|
|
54
|
+
}
|
|
55
|
+
async function loadModule(modulePath) {
|
|
56
|
+
const module = await import(modulePath);
|
|
57
|
+
return module?.default || module;
|
|
58
|
+
}
|
|
59
|
+
var _default = exports.default = loadAdapter;
|
|
60
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2FkQWRhcHRlciIsImFkYXB0ZXIiLCJkZWZhdWx0QWRhcHRlciIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJlIiwibmFtZSIsIkFkYXB0ZXIiLCJyZXF1aXJlIiwiZGVmYXVsdCIsIm1vZHVsZSIsImNsYXNzIiwibG9hZE1vZHVsZSIsIm1vZHVsZVBhdGgiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvQWRhcHRlcnMvQWRhcHRlckxvYWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgQWRhcHRlckxvYWRlclxuICovXG4vKipcbiAqIEBzdGF0aWNcbiAqIEF0dGVtcHQgdG8gbG9hZCBhbiBhZGFwdGVyIG9yIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0LlxuICogQHBhcmFtIHtBZGFwdGVyfSBhZGFwdGVyIGFuIGFkYXB0ZXJcbiAqIEBwYXJhbSB7QWRhcHRlcn0gZGVmYXVsdEFkYXB0ZXIgdGhlIGRlZmF1bHQgYWRhcHRlciB0byBsb2FkXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnRzdHJ1Y3RvclxuICogQHJldHVybnMge09iamVjdH0gdGhlIGxvYWRlZCBhZGFwdGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQWRhcHRlcjxUPihhZGFwdGVyLCBkZWZhdWx0QWRhcHRlciwgb3B0aW9ucyk6IFQge1xuICBpZiAoIWFkYXB0ZXIpIHtcbiAgICBpZiAoIWRlZmF1bHRBZGFwdGVyKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gTG9hZCBmcm9tIHRoZSBkZWZhdWx0IGFkYXB0ZXIgd2hlbiBubyBhZGFwdGVyIGlzIHNldFxuICAgIHJldHVybiBsb2FkQWRhcHRlcihkZWZhdWx0QWRhcHRlciwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYWRhcHRlcihvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lID09PSAnVHlwZUVycm9yJykge1xuICAgICAgICB2YXIgQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgICAgIHJldHVybiBuZXcgQWRhcHRlcihvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhZGFwdGVyID09PSAnc3RyaW5nJykge1xuICAgIGFkYXB0ZXIgPSByZXF1aXJlKGFkYXB0ZXIpO1xuICAgIC8vIElmIGl0J3MgZGVmaW5lIGFzIGEgbW9kdWxlLCBnZXQgdGhlIGRlZmF1bHRcbiAgICBpZiAoYWRhcHRlci5kZWZhdWx0KSB7XG4gICAgICBhZGFwdGVyID0gYWRhcHRlci5kZWZhdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbG9hZEFkYXB0ZXIoYWRhcHRlciwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChhZGFwdGVyLm1vZHVsZSkge1xuICAgIHJldHVybiBsb2FkQWRhcHRlcihhZGFwdGVyLm1vZHVsZSwgdW5kZWZpbmVkLCBhZGFwdGVyLm9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGFkYXB0ZXIuY2xhc3MpIHtcbiAgICByZXR1cm4gbG9hZEFkYXB0ZXIoYWRhcHRlci5jbGFzcywgdW5kZWZpbmVkLCBhZGFwdGVyLm9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGFkYXB0ZXIuYWRhcHRlcikge1xuICAgIHJldHVybiBsb2FkQWRhcHRlcihhZGFwdGVyLmFkYXB0ZXIsIHVuZGVmaW5lZCwgYWRhcHRlci5vcHRpb25zKTtcbiAgfVxuICAvLyByZXR1cm4gdGhlIGFkYXB0ZXIgYXMgcHJvdmlkZWRcbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkTW9kdWxlKG1vZHVsZVBhdGgpIHtcbiAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KG1vZHVsZVBhdGgpO1xuICByZXR1cm4gbW9kdWxlPy5kZWZhdWx0IHx8IG1vZHVsZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbG9hZEFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNBLFdBQVdBLENBQUlDLE9BQU8sRUFBRUMsY0FBYyxFQUFFQyxPQUFPLEVBQUs7RUFDbEUsSUFBSSxDQUFDRixPQUFPLEVBQUU7SUFDWixJQUFJLENBQUNDLGNBQWMsRUFBRTtNQUNuQixPQUFPQyxPQUFPO0lBQ2hCO0lBQ0E7SUFDQSxPQUFPSCxXQUFXLENBQUNFLGNBQWMsRUFBRUUsU0FBUyxFQUFFRCxPQUFPLENBQUM7RUFDeEQsQ0FBQyxNQUFNLElBQUksT0FBT0YsT0FBTyxLQUFLLFVBQVUsRUFBRTtJQUN4QyxJQUFJO01BQ0YsT0FBT0EsT0FBTyxDQUFDRSxPQUFPLENBQUM7SUFDekIsQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtNQUNWLElBQUlBLENBQUMsQ0FBQ0MsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUMxQixJQUFJQyxPQUFPLEdBQUdOLE9BQU87UUFDckIsT0FBTyxJQUFJTSxPQUFPLENBQUNKLE9BQU8sQ0FBQztNQUM3QixDQUFDLE1BQU07UUFDTCxNQUFNRSxDQUFDO01BQ1Q7SUFDRjtFQUNGLENBQUMsTUFBTSxJQUFJLE9BQU9KLE9BQU8sS0FBSyxRQUFRLEVBQUU7SUFDdENBLE9BQU8sR0FBR08sT0FBTyxDQUFDUCxPQUFPLENBQUM7SUFDMUI7SUFDQSxJQUFJQSxPQUFPLENBQUNRLE9BQU8sRUFBRTtNQUNuQlIsT0FBTyxHQUFHQSxPQUFPLENBQUNRLE9BQU87SUFDM0I7SUFDQSxPQUFPVCxXQUFXLENBQUNDLE9BQU8sRUFBRUcsU0FBUyxFQUFFRCxPQUFPLENBQUM7RUFDakQsQ0FBQyxNQUFNLElBQUlGLE9BQU8sQ0FBQ1MsTUFBTSxFQUFFO0lBQ3pCLE9BQU9WLFdBQVcsQ0FBQ0MsT0FBTyxDQUFDUyxNQUFNLEVBQUVOLFNBQVMsRUFBRUgsT0FBTyxDQUFDRSxPQUFPLENBQUM7RUFDaEUsQ0FBQyxNQUFNLElBQUlGLE9BQU8sQ0FBQ1UsS0FBSyxFQUFFO0lBQ3hCLE9BQU9YLFdBQVcsQ0FBQ0MsT0FBTyxDQUFDVSxLQUFLLEVBQUVQLFNBQVMsRUFBRUgsT0FBTyxDQUFDRSxPQUFPLENBQUM7RUFDL0QsQ0FBQyxNQUFNLElBQUlGLE9BQU8sQ0FBQ0EsT0FBTyxFQUFFO0lBQzFCLE9BQU9ELFdBQVcsQ0FBQ0MsT0FBTyxDQUFDQSxPQUFPLEVBQUVHLFNBQVMsRUFBRUgsT0FBTyxDQUFDRSxPQUFPLENBQUM7RUFDakU7RUFDQTtFQUNBLE9BQU9GLE9BQU87QUFDaEI7QUFFTyxlQUFlVyxVQUFVQSxDQUFDQyxVQUFVLEVBQUU7RUFDM0MsTUFBTUgsTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDRyxVQUFVLENBQUM7RUFDdkMsT0FBT0gsTUFBTSxFQUFFRCxPQUFPLElBQUlDLE1BQU07QUFDbEM7QUFBQyxJQUFBSSxRQUFBLEdBQUFDLE9BQUEsQ0FBQU4sT0FBQSxHQUVjVCxXQUFXIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.AnalyticsAdapter = void 0;
|
|
7
|
+
/* eslint-disable unused-imports/no-unused-vars */
|
|
8
|
+
/**
|
|
9
|
+
* @interface AnalyticsAdapter
|
|
10
|
+
* @module Adapters
|
|
11
|
+
*/
|
|
12
|
+
class AnalyticsAdapter {
|
|
13
|
+
/**
|
|
14
|
+
@param {any} parameters: the analytics request body, analytics info will be in the dimensions property
|
|
15
|
+
@param {Request} req: the original http request
|
|
16
|
+
*/
|
|
17
|
+
appOpened(parameters, req) {
|
|
18
|
+
return Promise.resolve({});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
@param {String} eventName: the name of the custom eventName
|
|
23
|
+
@param {any} parameters: the analytics request body, analytics info will be in the dimensions property
|
|
24
|
+
@param {Request} req: the original http request
|
|
25
|
+
*/
|
|
26
|
+
trackEvent(eventName, parameters, req) {
|
|
27
|
+
return Promise.resolve({});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.AnalyticsAdapter = AnalyticsAdapter;
|
|
31
|
+
var _default = exports.default = AnalyticsAdapter;
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBbmFseXRpY3NBZGFwdGVyIiwiYXBwT3BlbmVkIiwicGFyYW1ldGVycyIsInJlcSIsIlByb21pc2UiLCJyZXNvbHZlIiwidHJhY2tFdmVudCIsImV2ZW50TmFtZSIsImV4cG9ydHMiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQW5hbHl0aWNzL0FuYWx5dGljc0FkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQGludGVyZmFjZSBBbmFseXRpY3NBZGFwdGVyXG4gKiBAbW9kdWxlIEFkYXB0ZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmFseXRpY3NBZGFwdGVyIHtcbiAgLyoqXG4gIEBwYXJhbSB7YW55fSBwYXJhbWV0ZXJzOiB0aGUgYW5hbHl0aWNzIHJlcXVlc3QgYm9keSwgYW5hbHl0aWNzIGluZm8gd2lsbCBiZSBpbiB0aGUgZGltZW5zaW9ucyBwcm9wZXJ0eVxuICBAcGFyYW0ge1JlcXVlc3R9IHJlcTogdGhlIG9yaWdpbmFsIGh0dHAgcmVxdWVzdFxuICAgKi9cbiAgYXBwT3BlbmVkKHBhcmFtZXRlcnMsIHJlcSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICB9XG5cbiAgLyoqXG4gIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWU6IHRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZXZlbnROYW1lXG4gIEBwYXJhbSB7YW55fSBwYXJhbWV0ZXJzOiB0aGUgYW5hbHl0aWNzIHJlcXVlc3QgYm9keSwgYW5hbHl0aWNzIGluZm8gd2lsbCBiZSBpbiB0aGUgZGltZW5zaW9ucyBwcm9wZXJ0eVxuICBAcGFyYW0ge1JlcXVlc3R9IHJlcTogdGhlIG9yaWdpbmFsIGh0dHAgcmVxdWVzdFxuICAgKi9cbiAgdHJhY2tFdmVudChldmVudE5hbWUsIHBhcmFtZXRlcnMsIHJlcSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuYWx5dGljc0FkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNQSxnQkFBZ0IsQ0FBQztFQUM1QjtBQUNGO0FBQ0E7QUFDQTtFQUNFQyxTQUFTQSxDQUFDQyxVQUFVLEVBQUVDLEdBQUcsRUFBRTtJQUN6QixPQUFPQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFVBQVVBLENBQUNDLFNBQVMsRUFBRUwsVUFBVSxFQUFFQyxHQUFHLEVBQUU7SUFDckMsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDNUI7QUFDRjtBQUFDRyxPQUFBLENBQUFSLGdCQUFBLEdBQUFBLGdCQUFBO0FBQUEsSUFBQVMsUUFBQSxHQUFBRCxPQUFBLENBQUFFLE9BQUEsR0FFY1YsZ0JBQWdCIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.AuthAdapter = void 0;
|
|
7
|
+
/* eslint-disable unused-imports/no-unused-vars */
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @interface ParseAuthResponse
|
|
11
|
+
* @property {Boolean} [doNotSave] If true, Parse Server will not save provided authData.
|
|
12
|
+
* @property {Object} [response] If set, Parse Server will send the provided response to the client under authDataResponse
|
|
13
|
+
* @property {Object} [save] If set, Parse Server will save the object provided into this key, instead of client provided authData
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* AuthPolicy
|
|
18
|
+
* default: can be combined with ONE additional auth provider if additional configured on user
|
|
19
|
+
* additional: could be only used with a default policy auth provider
|
|
20
|
+
* solo: Will ignore ALL additional providers if additional configured on user
|
|
21
|
+
* @typedef {"default" | "additional" | "solo"} AuthPolicy
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
class AuthAdapter {
|
|
25
|
+
constructor() {
|
|
26
|
+
/**
|
|
27
|
+
* Usage policy
|
|
28
|
+
* @type {AuthPolicy}
|
|
29
|
+
*/
|
|
30
|
+
if (!this.policy) {
|
|
31
|
+
this.policy = 'default';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @param appIds The specified app IDs in the configuration
|
|
36
|
+
* @param {Object} authData The client provided authData
|
|
37
|
+
* @param {Object} options additional adapter options
|
|
38
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
39
|
+
* @returns {(Promise<undefined|void>|void|undefined)} resolves or returns if the applicationId is valid
|
|
40
|
+
*/
|
|
41
|
+
validateAppId(appIds, authData, options, request) {
|
|
42
|
+
return Promise.resolve({});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Legacy usage, if provided it will be triggered when authData related to this provider is touched (signup/update/login)
|
|
47
|
+
* otherwise you should implement validateSetup, validateLogin and validateUpdate
|
|
48
|
+
* @param {Object} authData The client provided authData
|
|
49
|
+
* @param {Object} options additional adapter options
|
|
50
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
51
|
+
* @returns {Promise<ParseAuthResponse|void|undefined>}
|
|
52
|
+
*/
|
|
53
|
+
validateAuthData(authData, options, request) {
|
|
54
|
+
return Promise.resolve({});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Triggered when user provide for the first time this auth provider
|
|
59
|
+
* could be a register or the user adding a new auth service
|
|
60
|
+
* @param {Object} authData The client provided authData
|
|
61
|
+
* @param {Object} options additional adapter options
|
|
62
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
63
|
+
* @returns {Promise<ParseAuthResponse|void|undefined>}
|
|
64
|
+
*/
|
|
65
|
+
validateSetUp(authData, options, req) {
|
|
66
|
+
return Promise.resolve({});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Triggered when user provide authData related to this provider
|
|
71
|
+
* The user is not logged in and has already set this provider before
|
|
72
|
+
* @param {Object} authData The client provided authData
|
|
73
|
+
* @param {Object} options additional adapter options
|
|
74
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
75
|
+
* @returns {Promise<ParseAuthResponse|void|undefined>}
|
|
76
|
+
*/
|
|
77
|
+
validateLogin(authData, options, req) {
|
|
78
|
+
return Promise.resolve({});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Triggered when user provide authData related to this provider
|
|
83
|
+
* the user is logged in and has already set this provider before
|
|
84
|
+
* @param {Object} authData The client provided authData
|
|
85
|
+
* @param {Object} options additional adapter options
|
|
86
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
87
|
+
* @returns {Promise<ParseAuthResponse|void|undefined>}
|
|
88
|
+
*/
|
|
89
|
+
validateUpdate(authData, options, req) {
|
|
90
|
+
return Promise.resolve({});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Triggered when user is looked up by authData with this provider. Override the `id` field if needed.
|
|
95
|
+
* @param {Object} authData The client provided authData
|
|
96
|
+
*/
|
|
97
|
+
beforeFind(authData) {}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Triggered in pre authentication process if needed (like webauthn, SMS OTP)
|
|
101
|
+
* @param {Object} challengeData Data provided by the client
|
|
102
|
+
* @param {(Object|undefined)} authData Auth data provided by the client, can be used for validation
|
|
103
|
+
* @param {Object} options additional adapter options
|
|
104
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
105
|
+
* @returns {Promise<Object>} A promise that resolves, resolved value will be added to challenge response under challenge key
|
|
106
|
+
*/
|
|
107
|
+
challenge(challengeData, authData, options, request) {
|
|
108
|
+
return Promise.resolve({});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Triggered when auth data is fetched
|
|
113
|
+
* @param {Object} authData authData
|
|
114
|
+
* @param {Object} options additional adapter options
|
|
115
|
+
* @param {Parse.Cloud.TriggerRequest} request
|
|
116
|
+
* @returns {Promise<Object>} Any overrides required to authData
|
|
117
|
+
*/
|
|
118
|
+
afterFind(authData, options, request) {
|
|
119
|
+
return Promise.resolve({});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Triggered when the adapter is first attached to Parse Server
|
|
124
|
+
* @param {Object} options Adapter Options
|
|
125
|
+
*/
|
|
126
|
+
validateOptions(options) {
|
|
127
|
+
/* */
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.AuthAdapter = AuthAdapter;
|
|
131
|
+
var _default = exports.default = AuthAdapter;
|
|
132
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBdXRoQWRhcHRlciIsImNvbnN0cnVjdG9yIiwicG9saWN5IiwidmFsaWRhdGVBcHBJZCIsImFwcElkcyIsImF1dGhEYXRhIiwib3B0aW9ucyIsInJlcXVlc3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsInZhbGlkYXRlQXV0aERhdGEiLCJ2YWxpZGF0ZVNldFVwIiwicmVxIiwidmFsaWRhdGVMb2dpbiIsInZhbGlkYXRlVXBkYXRlIiwiYmVmb3JlRmluZCIsImNoYWxsZW5nZSIsImNoYWxsZW5nZURhdGEiLCJhZnRlckZpbmQiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvQXV0aEFkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlIFBhcnNlQXV0aFJlc3BvbnNlXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkb05vdFNhdmVdIElmIHRydWUsIFBhcnNlIFNlcnZlciB3aWxsIG5vdCBzYXZlIHByb3ZpZGVkIGF1dGhEYXRhLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtyZXNwb25zZV0gSWYgc2V0LCBQYXJzZSBTZXJ2ZXIgd2lsbCBzZW5kIHRoZSBwcm92aWRlZCByZXNwb25zZSB0byB0aGUgY2xpZW50IHVuZGVyIGF1dGhEYXRhUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc2F2ZV0gSWYgc2V0LCBQYXJzZSBTZXJ2ZXIgd2lsbCBzYXZlIHRoZSBvYmplY3QgcHJvdmlkZWQgaW50byB0aGlzIGtleSwgaW5zdGVhZCBvZiBjbGllbnQgcHJvdmlkZWQgYXV0aERhdGFcbiAqL1xuXG4vKipcbiAqIEF1dGhQb2xpY3lcbiAqIGRlZmF1bHQ6IGNhbiBiZSBjb21iaW5lZCB3aXRoIE9ORSBhZGRpdGlvbmFsIGF1dGggcHJvdmlkZXIgaWYgYWRkaXRpb25hbCBjb25maWd1cmVkIG9uIHVzZXJcbiAqIGFkZGl0aW9uYWw6IGNvdWxkIGJlIG9ubHkgdXNlZCB3aXRoIGEgZGVmYXVsdCBwb2xpY3kgYXV0aCBwcm92aWRlclxuICogc29sbzogV2lsbCBpZ25vcmUgQUxMIGFkZGl0aW9uYWwgcHJvdmlkZXJzIGlmIGFkZGl0aW9uYWwgY29uZmlndXJlZCBvbiB1c2VyXG4gKiBAdHlwZWRlZiB7XCJkZWZhdWx0XCIgfCBcImFkZGl0aW9uYWxcIiB8IFwic29sb1wifSBBdXRoUG9saWN5XG4gKi9cblxuZXhwb3J0IGNsYXNzIEF1dGhBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogVXNhZ2UgcG9saWN5XG4gICAgICogQHR5cGUge0F1dGhQb2xpY3l9XG4gICAgICovXG4gICAgaWYgKCF0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kgPSAnZGVmYXVsdCc7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gYXBwSWRzIFRoZSBzcGVjaWZpZWQgYXBwIElEcyBpbiB0aGUgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgVGhlIGNsaWVudCBwcm92aWRlZCBhdXRoRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhZGRpdGlvbmFsIGFkYXB0ZXIgb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhcnNlLkNsb3VkLlRyaWdnZXJSZXF1ZXN0fSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIHsoUHJvbWlzZTx1bmRlZmluZWR8dm9pZD58dm9pZHx1bmRlZmluZWQpfSByZXNvbHZlcyBvciByZXR1cm5zIGlmIHRoZSBhcHBsaWNhdGlvbklkIGlzIHZhbGlkXG4gICAqL1xuICB2YWxpZGF0ZUFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZWdhY3kgdXNhZ2UsIGlmIHByb3ZpZGVkIGl0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gYXV0aERhdGEgcmVsYXRlZCB0byB0aGlzIHByb3ZpZGVyIGlzIHRvdWNoZWQgKHNpZ251cC91cGRhdGUvbG9naW4pXG4gICAqIG90aGVyd2lzZSB5b3Ugc2hvdWxkIGltcGxlbWVudCB2YWxpZGF0ZVNldHVwLCB2YWxpZGF0ZUxvZ2luIGFuZCB2YWxpZGF0ZVVwZGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgVGhlIGNsaWVudCBwcm92aWRlZCBhdXRoRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhZGRpdGlvbmFsIGFkYXB0ZXIgb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhcnNlLkNsb3VkLlRyaWdnZXJSZXF1ZXN0fSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhcnNlQXV0aFJlc3BvbnNlfHZvaWR8dW5kZWZpbmVkPn1cbiAgICovXG4gIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgd2hlbiB1c2VyIHByb3ZpZGUgZm9yIHRoZSBmaXJzdCB0aW1lIHRoaXMgYXV0aCBwcm92aWRlclxuICAgKiBjb3VsZCBiZSBhIHJlZ2lzdGVyIG9yIHRoZSB1c2VyIGFkZGluZyBhIG5ldyBhdXRoIHNlcnZpY2VcbiAgICogQHBhcmFtIHtPYmplY3R9IGF1dGhEYXRhIFRoZSBjbGllbnQgcHJvdmlkZWQgYXV0aERhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYWRkaXRpb25hbCBhZGFwdGVyIG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXJzZS5DbG91ZC5UcmlnZ2VyUmVxdWVzdH0gcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXJzZUF1dGhSZXNwb25zZXx2b2lkfHVuZGVmaW5lZD59XG4gICAqL1xuICB2YWxpZGF0ZVNldFVwKGF1dGhEYXRhLCBvcHRpb25zLCByZXEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgd2hlbiB1c2VyIHByb3ZpZGUgYXV0aERhdGEgcmVsYXRlZCB0byB0aGlzIHByb3ZpZGVyXG4gICAqIFRoZSB1c2VyIGlzIG5vdCBsb2dnZWQgaW4gYW5kIGhhcyBhbHJlYWR5IHNldCB0aGlzIHByb3ZpZGVyIGJlZm9yZVxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgVGhlIGNsaWVudCBwcm92aWRlZCBhdXRoRGF0YVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhZGRpdGlvbmFsIGFkYXB0ZXIgb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhcnNlLkNsb3VkLlRyaWdnZXJSZXF1ZXN0fSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhcnNlQXV0aFJlc3BvbnNlfHZvaWR8dW5kZWZpbmVkPn1cbiAgICovXG4gIHZhbGlkYXRlTG9naW4oYXV0aERhdGEsIG9wdGlvbnMsIHJlcSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJlZCB3aGVuIHVzZXIgcHJvdmlkZSBhdXRoRGF0YSByZWxhdGVkIHRvIHRoaXMgcHJvdmlkZXJcbiAgICogdGhlIHVzZXIgaXMgbG9nZ2VkIGluIGFuZCBoYXMgYWxyZWFkeSBzZXQgdGhpcyBwcm92aWRlciBiZWZvcmVcbiAgICogQHBhcmFtIHtPYmplY3R9IGF1dGhEYXRhIFRoZSBjbGllbnQgcHJvdmlkZWQgYXV0aERhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYWRkaXRpb25hbCBhZGFwdGVyIG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXJzZS5DbG91ZC5UcmlnZ2VyUmVxdWVzdH0gcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXJzZUF1dGhSZXNwb25zZXx2b2lkfHVuZGVmaW5lZD59XG4gICAqL1xuICB2YWxpZGF0ZVVwZGF0ZShhdXRoRGF0YSwgb3B0aW9ucywgcmVxKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcmVkIHdoZW4gdXNlciBpcyBsb29rZWQgdXAgYnkgYXV0aERhdGEgd2l0aCB0aGlzIHByb3ZpZGVyLiBPdmVycmlkZSB0aGUgYGlkYCBmaWVsZCBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdXRoRGF0YSBUaGUgY2xpZW50IHByb3ZpZGVkIGF1dGhEYXRhXG4gICAqL1xuICBiZWZvcmVGaW5kKGF1dGhEYXRhKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgaW4gcHJlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgaWYgbmVlZGVkIChsaWtlIHdlYmF1dGhuLCBTTVMgT1RQKVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbGxlbmdlRGF0YSBEYXRhIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnRcbiAgICogQHBhcmFtIHsoT2JqZWN0fHVuZGVmaW5lZCl9IGF1dGhEYXRhIEF1dGggZGF0YSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhZGRpdGlvbmFsIGFkYXB0ZXIgb3B0aW9uc1xuICAgKiBAcGFyYW0ge1BhcnNlLkNsb3VkLlRyaWdnZXJSZXF1ZXN0fSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzLCByZXNvbHZlZCB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIGNoYWxsZW5nZSByZXNwb25zZSB1bmRlciBjaGFsbGVuZ2Uga2V5XG4gICAqL1xuICBjaGFsbGVuZ2UoY2hhbGxlbmdlRGF0YSwgYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgd2hlbiBhdXRoIGRhdGEgaXMgZmV0Y2hlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gYXV0aERhdGEgYXV0aERhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYWRkaXRpb25hbCBhZGFwdGVyIG9wdGlvbnNcbiAgICogQHBhcmFtIHtQYXJzZS5DbG91ZC5UcmlnZ2VyUmVxdWVzdH0gcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBBbnkgb3ZlcnJpZGVzIHJlcXVpcmVkIHRvIGF1dGhEYXRhXG4gICAqL1xuICBhZnRlckZpbmQoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgYWRhcHRlciBpcyBmaXJzdCBhdHRhY2hlZCB0byBQYXJzZSBTZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQWRhcHRlciBPcHRpb25zXG4gICAqL1xuICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIC8qICovXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXV0aEFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTyxNQUFNQSxXQUFXLENBQUM7RUFDdkJDLFdBQVdBLENBQUEsRUFBRztJQUNaO0FBQ0o7QUFDQTtBQUNBO0lBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQ0MsTUFBTSxFQUFFO01BQ2hCLElBQUksQ0FBQ0EsTUFBTSxHQUFHLFNBQVM7SUFDekI7RUFDRjtFQUNBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLGFBQWFBLENBQUNDLE1BQU0sRUFBRUMsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtJQUNoRCxPQUFPQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLGdCQUFnQkEsQ0FBQ0wsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtJQUMzQyxPQUFPQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VFLGFBQWFBLENBQUNOLFFBQVEsRUFBRUMsT0FBTyxFQUFFTSxHQUFHLEVBQUU7SUFDcEMsT0FBT0osT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDNUI7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFSSxhQUFhQSxDQUFDUixRQUFRLEVBQUVDLE9BQU8sRUFBRU0sR0FBRyxFQUFFO0lBQ3BDLE9BQU9KLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzVCOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUssY0FBY0EsQ0FBQ1QsUUFBUSxFQUFFQyxPQUFPLEVBQUVNLEdBQUcsRUFBRTtJQUNyQyxPQUFPSixPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFTSxVQUFVQSxDQUFDVixRQUFRLEVBQUUsQ0FFckI7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFVyxTQUFTQSxDQUFDQyxhQUFhLEVBQUVaLFFBQVEsRUFBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUU7SUFDbkQsT0FBT0MsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDNUI7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRVMsU0FBU0EsQ0FBQ2IsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLE9BQU8sRUFBRTtJQUNwQyxPQUFPQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM1Qjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtFQUNFVSxlQUFlQSxDQUFDYixPQUFPLEVBQUU7SUFDdkI7RUFBQTtBQUVKO0FBQUNjLE9BQUEsQ0FBQXBCLFdBQUEsR0FBQUEsV0FBQTtBQUFBLElBQUFxQixRQUFBLEdBQUFELE9BQUEsQ0FBQUUsT0FBQSxHQUVjdEIsV0FBVyIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _AuthAdapter = _interopRequireDefault(require("./AuthAdapter"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
// abstract class for auth code adapters
|
|
10
|
+
|
|
11
|
+
class BaseAuthCodeAdapter extends _AuthAdapter.default {
|
|
12
|
+
constructor(adapterName) {
|
|
13
|
+
super();
|
|
14
|
+
this.adapterName = adapterName;
|
|
15
|
+
}
|
|
16
|
+
validateOptions(options) {
|
|
17
|
+
if (!options) {
|
|
18
|
+
throw new Error(`${this.adapterName} options are required.`);
|
|
19
|
+
}
|
|
20
|
+
this.enableInsecureAuth = options.enableInsecureAuth;
|
|
21
|
+
if (this.enableInsecureAuth) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this.clientId = options.clientId;
|
|
25
|
+
this.clientSecret = options.clientSecret;
|
|
26
|
+
if (!this.clientId) {
|
|
27
|
+
throw new Error(`${this.adapterName} clientId is required.`);
|
|
28
|
+
}
|
|
29
|
+
if (!this.clientSecret) {
|
|
30
|
+
throw new Error(`${this.adapterName} clientSecret is required.`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async beforeFind(authData) {
|
|
34
|
+
if (this.enableInsecureAuth && !authData?.code) {
|
|
35
|
+
if (!authData?.access_token) {
|
|
36
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${this.adapterName} auth is invalid for this user.`);
|
|
37
|
+
}
|
|
38
|
+
const user = await this.getUserFromAccessToken(authData.access_token, authData);
|
|
39
|
+
if (user.id !== authData.id) {
|
|
40
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${this.adapterName} auth is invalid for this user.`);
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!authData?.code) {
|
|
45
|
+
throw new Parse.Error(Parse.Error.VALIDATION_ERROR, `${this.adapterName} code is required.`);
|
|
46
|
+
}
|
|
47
|
+
const access_token = await this.getAccessTokenFromCode(authData);
|
|
48
|
+
const user = await this.getUserFromAccessToken(access_token, authData);
|
|
49
|
+
if (authData.id && user.id !== authData.id) {
|
|
50
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${this.adapterName} auth is invalid for this user.`);
|
|
51
|
+
}
|
|
52
|
+
authData.access_token = access_token;
|
|
53
|
+
authData.id = user.id;
|
|
54
|
+
delete authData.code;
|
|
55
|
+
delete authData.redirect_uri;
|
|
56
|
+
}
|
|
57
|
+
async getUserFromAccessToken() {
|
|
58
|
+
// abstract method
|
|
59
|
+
throw new Error('getUserFromAccessToken is not implemented');
|
|
60
|
+
}
|
|
61
|
+
async getAccessTokenFromCode() {
|
|
62
|
+
// abstract method
|
|
63
|
+
throw new Error('getAccessTokenFromCode is not implemented');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Validates auth data on login. In the standard auth flows (login, signup,
|
|
68
|
+
* update), `beforeFind` runs first and validates credentials, so no
|
|
69
|
+
* additional credential check is needed here.
|
|
70
|
+
*/
|
|
71
|
+
validateLogin(authData) {
|
|
72
|
+
return {
|
|
73
|
+
id: authData.id
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Validates auth data on first setup or when linking a new provider.
|
|
79
|
+
* In the standard auth flows, `beforeFind` runs first and validates
|
|
80
|
+
* credentials, so no additional credential check is needed here.
|
|
81
|
+
*/
|
|
82
|
+
validateSetUp(authData) {
|
|
83
|
+
return {
|
|
84
|
+
id: authData.id
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Returns the auth data to expose to the client after a query.
|
|
90
|
+
*/
|
|
91
|
+
afterFind(authData) {
|
|
92
|
+
return {
|
|
93
|
+
id: authData.id
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Validates auth data on update. In the standard auth flows, `beforeFind`
|
|
99
|
+
* runs first for any changed auth data and validates credentials, so no
|
|
100
|
+
* additional credential check is needed here. Unchanged (echoed-back) data
|
|
101
|
+
* skips both `beforeFind` and validation entirely.
|
|
102
|
+
*/
|
|
103
|
+
validateUpdate(authData) {
|
|
104
|
+
return {
|
|
105
|
+
id: authData.id
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
parseResponseData(data) {
|
|
109
|
+
const startPos = data.indexOf('(');
|
|
110
|
+
const endPos = data.indexOf(')');
|
|
111
|
+
if (startPos === -1 || endPos === -1) {
|
|
112
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${this.adapterName} auth is invalid for this user.`);
|
|
113
|
+
}
|
|
114
|
+
const jsonData = data.substring(startPos + 1, endPos);
|
|
115
|
+
return JSON.parse(jsonData);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.default = BaseAuthCodeAdapter;
|
|
119
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXV0aEFkYXB0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkJhc2VBdXRoQ29kZUFkYXB0ZXIiLCJBdXRoQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlck5hbWUiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiRXJyb3IiLCJlbmFibGVJbnNlY3VyZUF1dGgiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsImJlZm9yZUZpbmQiLCJhdXRoRGF0YSIsImNvZGUiLCJhY2Nlc3NfdG9rZW4iLCJQYXJzZSIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ1c2VyIiwiZ2V0VXNlckZyb21BY2Nlc3NUb2tlbiIsImlkIiwiVkFMSURBVElPTl9FUlJPUiIsImdldEFjY2Vzc1Rva2VuRnJvbUNvZGUiLCJyZWRpcmVjdF91cmkiLCJ2YWxpZGF0ZUxvZ2luIiwidmFsaWRhdGVTZXRVcCIsImFmdGVyRmluZCIsInZhbGlkYXRlVXBkYXRlIiwicGFyc2VSZXNwb25zZURhdGEiLCJkYXRhIiwic3RhcnRQb3MiLCJpbmRleE9mIiwiZW5kUG9zIiwianNvbkRhdGEiLCJzdWJzdHJpbmciLCJKU09OIiwicGFyc2UiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvQmFzZUNvZGVBdXRoQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhYnN0cmFjdCBjbGFzcyBmb3IgYXV0aCBjb2RlIGFkYXB0ZXJzXG5pbXBvcnQgQXV0aEFkYXB0ZXIgZnJvbSAnLi9BdXRoQWRhcHRlcic7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQXV0aENvZGVBZGFwdGVyIGV4dGVuZHMgQXV0aEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGFwdGVyTmFtZSA9IGFkYXB0ZXJOYW1lO1xuICB9XG4gIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG5cbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmFkYXB0ZXJOYW1lfSBvcHRpb25zIGFyZSByZXF1aXJlZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCA9IG9wdGlvbnMuZW5hYmxlSW5zZWN1cmVBdXRoO1xuICAgIGlmICh0aGlzLmVuYWJsZUluc2VjdXJlQXV0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkO1xuICAgIHRoaXMuY2xpZW50U2VjcmV0ID0gb3B0aW9ucy5jbGllbnRTZWNyZXQ7XG5cbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmFkYXB0ZXJOYW1lfSBjbGllbnRJZCBpcyByZXF1aXJlZC5gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xpZW50U2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5hZGFwdGVyTmFtZX0gY2xpZW50U2VjcmV0IGlzIHJlcXVpcmVkLmApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJlZm9yZUZpbmQoYXV0aERhdGEpIHtcbiAgICBpZiAodGhpcy5lbmFibGVJbnNlY3VyZUF1dGggJiYgIWF1dGhEYXRhPy5jb2RlKSB7XG4gICAgICBpZiAoIWF1dGhEYXRhPy5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGAke3RoaXMuYWRhcHRlck5hbWV9IGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGF1dGhEYXRhLmFjY2Vzc190b2tlbiwgYXV0aERhdGEpO1xuXG4gICAgICBpZiAodXNlci5pZCAhPT0gYXV0aERhdGEuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGAke3RoaXMuYWRhcHRlck5hbWV9IGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhdXRoRGF0YT8uY29kZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsIGAke3RoaXMuYWRhcHRlck5hbWV9IGNvZGUgaXMgcmVxdWlyZWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXNzX3Rva2VuID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NUb2tlbkZyb21Db2RlKGF1dGhEYXRhKTtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5nZXRVc2VyRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbiwgYXV0aERhdGEpO1xuXG4gICAgaWYgKGF1dGhEYXRhLmlkICYmIHVzZXIuaWQgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYCR7dGhpcy5hZGFwdGVyTmFtZX0gYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gICAgfVxuXG4gICAgYXV0aERhdGEuYWNjZXNzX3Rva2VuID0gYWNjZXNzX3Rva2VuO1xuICAgIGF1dGhEYXRhLmlkID0gdXNlci5pZDtcblxuICAgIGRlbGV0ZSBhdXRoRGF0YS5jb2RlO1xuICAgIGRlbGV0ZSBhdXRoRGF0YS5yZWRpcmVjdF91cmk7XG5cbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJGcm9tQWNjZXNzVG9rZW4oKSB7XG4gICAgLy8gYWJzdHJhY3QgbWV0aG9kXG4gICAgdGhyb3cgbmV3IEVycm9yKCdnZXRVc2VyRnJvbUFjY2Vzc1Rva2VuIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW5Gcm9tQ29kZSgpIHtcbiAgICAvLyBhYnN0cmFjdCBtZXRob2RcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldEFjY2Vzc1Rva2VuRnJvbUNvZGUgaXMgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGF1dGggZGF0YSBvbiBsb2dpbi4gSW4gdGhlIHN0YW5kYXJkIGF1dGggZmxvd3MgKGxvZ2luLCBzaWdudXAsXG4gICAqIHVwZGF0ZSksIGBiZWZvcmVGaW5kYCBydW5zIGZpcnN0IGFuZCB2YWxpZGF0ZXMgY3JlZGVudGlhbHMsIHNvIG5vXG4gICAqIGFkZGl0aW9uYWwgY3JlZGVudGlhbCBjaGVjayBpcyBuZWVkZWQgaGVyZS5cbiAgICovXG4gIHZhbGlkYXRlTG9naW4oYXV0aERhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGF1dGhEYXRhLmlkLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYXV0aCBkYXRhIG9uIGZpcnN0IHNldHVwIG9yIHdoZW4gbGlua2luZyBhIG5ldyBwcm92aWRlci5cbiAgICogSW4gdGhlIHN0YW5kYXJkIGF1dGggZmxvd3MsIGBiZWZvcmVGaW5kYCBydW5zIGZpcnN0IGFuZCB2YWxpZGF0ZXNcbiAgICogY3JlZGVudGlhbHMsIHNvIG5vIGFkZGl0aW9uYWwgY3JlZGVudGlhbCBjaGVjayBpcyBuZWVkZWQgaGVyZS5cbiAgICovXG4gIHZhbGlkYXRlU2V0VXAoYXV0aERhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGF1dGhEYXRhLmlkLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRoIGRhdGEgdG8gZXhwb3NlIHRvIHRoZSBjbGllbnQgYWZ0ZXIgYSBxdWVyeS5cbiAgICovXG4gIGFmdGVyRmluZChhdXRoRGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYXV0aERhdGEuaWQsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhdXRoIGRhdGEgb24gdXBkYXRlLiBJbiB0aGUgc3RhbmRhcmQgYXV0aCBmbG93cywgYGJlZm9yZUZpbmRgXG4gICAqIHJ1bnMgZmlyc3QgZm9yIGFueSBjaGFuZ2VkIGF1dGggZGF0YSBhbmQgdmFsaWRhdGVzIGNyZWRlbnRpYWxzLCBzbyBub1xuICAgKiBhZGRpdGlvbmFsIGNyZWRlbnRpYWwgY2hlY2sgaXMgbmVlZGVkIGhlcmUuIFVuY2hhbmdlZCAoZWNob2VkLWJhY2spIGRhdGFcbiAgICogc2tpcHMgYm90aCBgYmVmb3JlRmluZGAgYW5kIHZhbGlkYXRpb24gZW50aXJlbHkuXG4gICAqL1xuICB2YWxpZGF0ZVVwZGF0ZShhdXRoRGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYXV0aERhdGEuaWQsXG4gICAgfVxuICB9XG5cbiAgcGFyc2VSZXNwb25zZURhdGEoZGF0YSkge1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gZGF0YS5pbmRleE9mKCcoJyk7XG4gICAgY29uc3QgZW5kUG9zID0gZGF0YS5pbmRleE9mKCcpJyk7XG4gICAgaWYgKHN0YXJ0UG9zID09PSAtMSB8fCBlbmRQb3MgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYCR7dGhpcy5hZGFwdGVyTmFtZX0gYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gICAgfVxuICAgIGNvbnN0IGpzb25EYXRhID0gZGF0YS5zdWJzdHJpbmcoc3RhcnRQb3MgKyAxLCBlbmRQb3MpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25EYXRhKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxZQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFBd0MsU0FBQUQsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFD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TUosc0JBQXNCQSxDQUFBLEVBQUc7SUFDN0I7SUFDQSxNQUFNLElBQUlYLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQztFQUM5RDtFQUVBLE1BQU1jLHNCQUFzQkEsQ0FBQSxFQUFHO0lBQzdCO0lBQ0EsTUFBTSxJQUFJZCxLQUFLLENBQUMsMkNBQTJDLENBQUM7RUFDOUQ7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFZ0IsYUFBYUEsQ0FBQ1gsUUFBUSxFQUFFO0lBQ3RCLE9BQU87TUFDTE8sRUFBRSxFQUFFUCxRQUFRLENBQUNPO0lBQ2YsQ0FBQztFQUNIOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRUssYUFBYUEsQ0FBQ1osUUFBUSxFQUFFO0lBQ3RCLE9BQU87TUFDTE8sRUFBRSxFQUFFUCxRQUFRLENBQUNPO0lBQ2YsQ0FBQztFQUNIOztFQUVBO0FBQ0Y7QUFDQTtFQUNFTSxTQUFTQSxDQUFDYixRQUFRLEVBQUU7SUFDbEIsT0FBTztNQUNMTyxFQUFFLEVBQUVQLFFBQVEsQ0FBQ087SUFDZixDQUFDO0VBQ0g7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VPLGNBQWNBLENBQUNkLFFBQVEsRUFBRTtJQUN2QixPQUFPO01BQ0xPLEVBQUUsRUFBRVAsUUFBUSxDQUFDTztJQUNmLENBQUM7RUFDSDtFQUVBUSxpQkFBaUJBLENBQUNDLElBQUksRUFBRTtJQUN0QixNQUFNQyxRQUFRLEdBQUdELElBQUksQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNsQyxNQUFNQyxNQUFNLEdBQUdILElBQUksQ0FBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQyxJQUFJRCxRQUFRLEtBQUssQ0FBQyxDQUFDLElBQUlFLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtNQUNwQyxNQUFNLElBQUloQixLQUFLLENBQUNSLEtBQUssQ0FBQ1EsS0FBSyxDQUFDUixLQUFLLENBQUNTLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDWixXQUFXLGlDQUFpQyxDQUFDO0lBQzNHO0lBQ0EsTUFBTTRCLFFBQVEsR0FBR0osSUFBSSxDQUFDSyxTQUFTLENBQUNKLFFBQVEsR0FBRyxDQUFDLEVBQUVFLE1BQU0sQ0FBQztJQUNyRCxPQUFPRyxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsUUFBUSxDQUFDO0VBQzdCO0FBQ0Y7QUFBQ0ksT0FBQSxDQUFBcEMsT0FBQSxHQUFBQyxtQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|