cdk-serverless 3.2.0 → 3.3.0
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/README.md +111 -0
- package/docs/constructs/assets/hierarchy.js +1 -1
- package/docs/constructs/assets/navigation.js +1 -1
- package/docs/constructs/assets/search.js +1 -1
- package/docs/constructs/classes/McpAuth.html +43 -0
- package/docs/constructs/classes/McpCognitoAuth.html +43 -0
- package/docs/constructs/classes/RestApi.html +6 -3
- package/docs/constructs/classes/SingleTableDatastore.html +1 -1
- package/docs/constructs/classes/Workflow.html +1 -1
- package/docs/constructs/hierarchy.html +1 -1
- package/docs/constructs/index.html +112 -1
- package/docs/constructs/interfaces/McpAuthCognitoOptions.html +17 -0
- package/docs/constructs/interfaces/McpAuthFunctions.html +14 -0
- package/docs/constructs/interfaces/McpAuthGenericOptions.html +11 -0
- package/docs/constructs/interfaces/McpAuthOptions.html +33 -0
- package/docs/constructs/interfaces/McpAuthProps.html +43 -0
- package/docs/constructs/interfaces/McpCognitoAuthProps.html +49 -0
- package/docs/constructs/interfaces/RestApiProps.html +24 -6
- package/docs/constructs/modules.html +1 -1
- package/docs/lambda/index.html +112 -1
- package/docs/projen/index.html +112 -1
- package/lib/constructs/index.d.ts +2 -0
- package/lib/constructs/index.js +3 -1
- package/lib/constructs/mcp-auth.d.ts +117 -0
- package/lib/constructs/mcp-auth.js +127 -0
- package/lib/constructs/mcp-cognito-auth.d.ts +110 -0
- package/lib/constructs/mcp-cognito-auth.js +76 -0
- package/lib/constructs/rest-api.d.ts +136 -0
- package/lib/constructs/rest-api.js +159 -1
- package/lib/lambda/handler.js +15 -4
- package/lib/mcp-auth/config.d.ts +39 -0
- package/lib/mcp-auth/config.js +3 -0
- package/lib/mcp-auth/handlers/authorization-server.d.ts +7 -0
- package/lib/mcp-auth/handlers/authorization-server.js +34 -0
- package/lib/mcp-auth/handlers/authorize.d.ts +8 -0
- package/lib/mcp-auth/handlers/authorize.js +32 -0
- package/lib/mcp-auth/handlers/index.d.ts +7 -0
- package/lib/mcp-auth/handlers/index.js +24 -0
- package/lib/mcp-auth/handlers/protected-resource.d.ts +7 -0
- package/lib/mcp-auth/handlers/protected-resource.js +26 -0
- package/lib/mcp-auth/handlers/register.d.ts +7 -0
- package/lib/mcp-auth/handlers/register.js +68 -0
- package/lib/mcp-auth/handlers/token.d.ts +8 -0
- package/lib/mcp-auth/handlers/token.js +74 -0
- package/lib/mcp-auth/handlers/types.d.ts +21 -0
- package/lib/mcp-auth/handlers/types.js +3 -0
- package/lib/mcp-auth/handlers/validate-redirect-uris.d.ts +10 -0
- package/lib/mcp-auth/handlers/validate-redirect-uris.js +22 -0
- package/lib/mcp-auth/index.d.ts +3 -0
- package/lib/mcp-auth/index.js +20 -0
- package/lib/mcp-auth/lambda-handlers/authorization-server.handler.d.ts +2 -0
- package/lib/mcp-auth/lambda-handlers/authorization-server.handler.js +23 -0
- package/lib/mcp-auth/lambda-handlers/authorize.handler.d.ts +2 -0
- package/lib/mcp-auth/lambda-handlers/authorize.handler.js +23 -0
- package/lib/mcp-auth/lambda-handlers/env-config.d.ts +7 -0
- package/lib/mcp-auth/lambda-handlers/env-config.js +37 -0
- package/lib/mcp-auth/lambda-handlers/protected-resource.handler.d.ts +2 -0
- package/lib/mcp-auth/lambda-handlers/protected-resource.handler.js +23 -0
- package/lib/mcp-auth/lambda-handlers/register.handler.d.ts +2 -0
- package/lib/mcp-auth/lambda-handlers/register.handler.js +23 -0
- package/lib/mcp-auth/lambda-handlers/token.handler.d.ts +2 -0
- package/lib/mcp-auth/lambda-handlers/token.handler.js +23 -0
- package/lib/mcp-auth/mcp/errors.d.ts +8 -0
- package/lib/mcp-auth/mcp/errors.js +20 -0
- package/lib/mcp-auth/mcp/index.d.ts +4 -0
- package/lib/mcp-auth/mcp/index.js +21 -0
- package/lib/mcp-auth/mcp/jsonrpc.d.ts +21 -0
- package/lib/mcp-auth/mcp/jsonrpc.js +56 -0
- package/lib/mcp-auth/mcp/server.d.ts +9 -0
- package/lib/mcp-auth/mcp/server.js +107 -0
- package/lib/mcp-auth/mcp/types.d.ts +32 -0
- package/lib/mcp-auth/mcp/types.js +3 -0
- package/llm.md +214 -0
- package/package.json +1 -1
package/lib/lambda/handler.js
CHANGED
|
@@ -152,6 +152,16 @@ const createHttpHandler = (handler) => {
|
|
|
152
152
|
};
|
|
153
153
|
};
|
|
154
154
|
exports.createHttpHandler = createHttpHandler;
|
|
155
|
+
/**
|
|
156
|
+
* Looks up a header value case-insensitively.
|
|
157
|
+
* HTTP header names are case-insensitive per RFC 9110 §5.1.
|
|
158
|
+
*/
|
|
159
|
+
function headerValue(headers, name) {
|
|
160
|
+
if (!headers)
|
|
161
|
+
return undefined;
|
|
162
|
+
const key = Object.keys(headers).find(k => k.toLowerCase() === name.toLowerCase());
|
|
163
|
+
return key ? headers[key] : undefined;
|
|
164
|
+
}
|
|
155
165
|
/**
|
|
156
166
|
* This function takes an event object representing an API Gateway Proxy event
|
|
157
167
|
* with a Cognito authorizer, and extracts and parses the request body, if present.
|
|
@@ -167,7 +177,7 @@ function parseBody(event) {
|
|
|
167
177
|
body = buff.toString('utf8');
|
|
168
178
|
}
|
|
169
179
|
// If the request body is in JSON format, parse it into a JavaScript object
|
|
170
|
-
if (event.headers
|
|
180
|
+
if (headerValue(event.headers, 'content-type')?.includes('application/json')) {
|
|
171
181
|
return JSON.parse(body ?? '{}');
|
|
172
182
|
}
|
|
173
183
|
// If the request body is not present or not in JSON format, return it as-is
|
|
@@ -180,9 +190,10 @@ function parseBody(event) {
|
|
|
180
190
|
* @returns An object containing the CORS headers.
|
|
181
191
|
*/
|
|
182
192
|
function corsHeader(event) {
|
|
193
|
+
const origin = headerValue(event?.headers, 'origin');
|
|
183
194
|
return {
|
|
184
|
-
'Access-Control-Allow-Origin':
|
|
185
|
-
'Access-Control-Allow-Credentials':
|
|
195
|
+
'Access-Control-Allow-Origin': origin ?? '*', // Allow requests from the origin header, or allow any origin if not present
|
|
196
|
+
'Access-Control-Allow-Credentials': origin ? 'true' : 'false', // Include cookies in cross-origin requests if the origin header is present
|
|
186
197
|
'Access-Control-Allow-Methods': '*', // Allow any HTTP method
|
|
187
198
|
'Access-Control-Allow-Headers': 'Authorization, *', // Allow the Authorization header and any other headers
|
|
188
199
|
};
|
|
@@ -221,4 +232,4 @@ const createAppSyncHandler = (handler) => {
|
|
|
221
232
|
};
|
|
222
233
|
};
|
|
223
234
|
exports.createAppSyncHandler = createAppSyncHandler;
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGEvaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBOEI7QUFDOUIsNERBQStDO0FBQy9DLGlDQU1nQjtBQUNoQixpREFBbUM7QUE2RG5DOztHQUVHO0FBQ0ksTUFBTSxtQ0FBbUMsR0FBRyxDQUErRCxPQUEwSCxFQUF1QixFQUFFO0lBQ25RLE9BQU8sSUFBQSx5QkFBaUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFGVyxRQUFBLG1DQUFtQyx1Q0FFOUM7QUFFRjs7R0FFRztBQUNJLE1BQU0sNkNBQTZDLEdBQUcsQ0FBc0MsT0FBNEUsRUFBdUIsRUFBRTtJQUN0TSxPQUFPLElBQUEseUJBQWlCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRlcsUUFBQSw2Q0FBNkMsaURBRXhEO0FBRUY7O0dBRUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLENBQWdELE9BQTZFLEVBQXVCLEVBQUU7SUFDeEwsT0FBTyxJQUFBLHlCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUZXLFFBQUEsb0JBQW9CLHdCQUUvQjtBQUVGOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQXFGLEVBQUUsR0FBYyxFQUFFLEVBQUU7SUFDakksaUhBQWlIO0lBQ2pILElBQUksYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxvQ0FBNkIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztTQUFNLENBQUM7UUFDTixnR0FBZ0c7UUFDaEcsT0FBTyxJQUFJLGdDQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztBQUNI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QUErQztZQUMvQyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLG1DQUFtQztZQUNuQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUE3QlMsUUFBQSxvQkFBb0Isd0JBNkI3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVudiB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IGxvZ2dlciwgeyBMYW1iZGFMb2cgfSBmcm9tICdsYW1iZGEtbG9nJztcbmltcG9ydCB7XG4gIEFwaUdhdGV3YXl2MUNvZ25pdG9BdXRob3JpemVyLFxuICBBcGlHYXRld2F5djFKd3RBdXRob3JpemVyLFxuICBBcHBTeW5jQ29nbml0b0F1dGhvcml6ZXIsXG4gIENvZ25pdG9BdXRob3JpemVyLFxuICBKd3RBdXRob3JpemVyLFxufSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzJztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLyBIVFRQIEFwaVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgZm9yIGFuIEhUVFAgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cFJlc3BvbnNlQ29udGV4dCB7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICBqc29uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZvciBhbiBIVFRQIHJlcXVlc3QgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwSGFuZGxlckNvbnRleHQge1xuICBldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50O1xuICBsYW1iZGFDb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dDtcbiAgbG9nZ2VyOiBsb2dnZXIuTGFtYmRhTG9nO1xuICByZXNwb25zZTogSHR0cFJlc3BvbnNlQ29udGV4dDtcbiAgYXV0aDogSnd0QXV0aG9yaXplcjtcbn1cblxuLyoqXG4gKiBBIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gSFRUUCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBIdHRwSGFuZGxlcjxULCBSPiA9IChcbiAgY29udGV4dDogSHR0cEhhbmRsZXJDb250ZXh0LFxuICBib2R5OiBULFxuKSA9PiBQcm9taXNlPFI+O1xuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZvciBhbiBPcGVuQVBJIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb24ge1xuICByZXNwb25zZXM6IHtcbiAgICBbc3RhdHVzQ29kZTogbnVtYmVyXToge1xuICAgICAgY29udGVudDoge1xuICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IGFueTtcbiAgICAgIH07XG4gICAgfSB8IGFueTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gQVBJIEdhdGV3YXkgdjEgcmVxdWVzdCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBBUElHYXRld2F5djFIYW5kbGVyID1cbiAgQVdTTGFtYmRhLkhhbmRsZXI8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50LCBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0IHwgdW5kZWZpbmVkPjtcblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBmb3IgYW4gT3BlbkFQSSBvcGVyYXRpb24gd2l0aCBhIHJlcXVlc3QgYm9keS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25XaXRoUmVxdWVzdEJvZHkgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICByZXF1ZXN0Qm9keTogeyBjb250ZW50OiB7ICdhcHBsaWNhdGlvbi9qc29uJzogYW55IH0gfTtcbn1cblxuLyoqXG4gKiBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIEhUVFAgcmVxdWVzdCBoYW5kbGVyIGZvciBhbiBPcGVuQVBJIG9wZXJhdGlvbiB3aXRoIGEgcmVxdWVzdCBib2R5LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlT3BlbkFwaUhhbmRsZXJXaXRoUmVxdWVzdEJvZHkgPSA8T1AgZXh0ZW5kcyBPcGVyYXRpb25XaXRoUmVxdWVzdEJvZHksIFNDIGV4dGVuZHMgbnVtYmVyID0gMjAwPihoYW5kbGVyOiBIdHRwSGFuZGxlcjxPUFsncmVxdWVzdEJvZHknXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10sIE9QWydyZXNwb25zZXMnXVtTQ11bJ2NvbnRlbnQnXVsnYXBwbGljYXRpb24vanNvbiddPik6IEFQSUdhdGV3YXl2MUhhbmRsZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlSHR0cEhhbmRsZXIoaGFuZGxlcik7XG59O1xuXG4vKipcbiAqIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gSFRUUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGFuIE9wZW5BUEkgb3BlcmF0aW9uIHdpdGggYSByZXF1ZXN0IGJvZHkgYW5kIG5vIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlT3BlbkFwaUhhbmRsZXJXaXRoUmVxdWVzdEJvZHlOb1Jlc3BvbnNlID0gPE9QIGV4dGVuZHMgT3BlcmF0aW9uV2l0aFJlcXVlc3RCb2R5PihoYW5kbGVyOiBIdHRwSGFuZGxlcjxPUFsncmVxdWVzdEJvZHknXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10sIHZvaWQ+KTogQVBJR2F0ZXdheXYxSGFuZGxlciA9PiB7XG4gIHJldHVybiBjcmVhdGVIdHRwSGFuZGxlcihoYW5kbGVyKTtcbn07XG5cbi8qKlxuICogQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBIVFRQIHJlcXVlc3QgaGFuZGxlciBmb3IgYW4gT3BlbkFQSSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVPcGVuQXBpSGFuZGxlciA9IDxPUCBleHRlbmRzIE9wZXJhdGlvbiwgU0MgZXh0ZW5kcyBudW1iZXIgPSAyMDA+KGhhbmRsZXI6IEh0dHBIYW5kbGVyPGFueSwgT1BbJ3Jlc3BvbnNlcyddW1NDXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10+KTogQVBJR2F0ZXdheXYxSGFuZGxlciA9PiB7XG4gIHJldHVybiBjcmVhdGVIdHRwSGFuZGxlcihoYW5kbGVyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIGF1dGhvcml6ZXIgZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgY2hvc2VuIChKV1Qgb3IgQ29nbml0bykuXG4gKi9cbmNvbnN0IGNyZWF0ZUF1dGhvcml6ZXIgPSAoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudEJhc2U8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUNvZ25pdG9BdXRob3JpemVyPiwgbG9nOiBMYW1iZGFMb2cpID0+IHtcbiAgLy8gSWYgQ29nbml0byBpcyB1c2VkLCBVU0VSX1BPT0xfSUQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudC4gQ3VycmVudGx5IGFzc3VtZXMgSldUIG90aGVyd2lzZS5cbiAgaWYgKGVudi5VU0VSX1BPT0xfSUQpIHtcbiAgICByZXR1cm4gbmV3IEFwaUdhdGV3YXl2MUNvZ25pdG9BdXRob3JpemVyKGV2ZW50LCBsb2cpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgbWlnaHQgbmVlZCB0byBnZXQgbW9yZSBzb3BoaXN0aWNhdGVkIGlmIG1vcmUgYXV0aG9yaXphdGlvbiBtZXRob2RzIG5lZWQgdG8gYmUgc3VwcG9ydGVkLlxuICAgIHJldHVybiBuZXcgQXBpR2F0ZXdheXYxSnd0QXV0aG9yaXplcihldmVudCwgJ2FkbWluJywgbG9nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIEhUVFAgcmVxdWVzdCBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cEhhbmRsZXIgPVxuICA8VCwgUj4oaGFuZGxlcjogSHR0cEhhbmRsZXI8VCwgUj4pOiBBUElHYXRld2F5djFIYW5kbGVyID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYW4gb2JqZWN0IHRvIGhvbGQgdGhlIGNvbnRleHQgZm9yIHRoaXMgSFRUUCByZXF1ZXN0XG4gICAgICBjb25zdCBhdXRoID0gY3JlYXRlQXV0aG9yaXplcihldmVudCwgbG9nZ2VyIGFzIHVua25vd24gYXMgbG9nZ2VyLkxhbWJkYUxvZyk7XG4gICAgICBjb25zdCBjdHg6IEh0dHBIYW5kbGVyQ29udGV4dCA9IHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGxhbWJkYUNvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgIGxvZ2dlcjogbG9nZ2VyIGFzIHVua25vd24gYXMgbG9nZ2VyLkxhbWJkYUxvZyxcbiAgICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczoge30sIGpzb246IHRydWUgfSxcbiAgICAgIH07XG4gICAgICAvLyBBZGQgdGhlIHJlcXVlc3QgSUQgdG8gdGhlIGxvZ2dpbmcgbWV0YWRhdGEsIGFuZCBlbmFibGUgZGVidWcgbG9nZ2luZyBpZiB0aGUgREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIFwidHJ1ZVwiXG4gICAgICBjdHgubG9nZ2VyLm9wdGlvbnMubWV0YS5yZXF1ZXN0SWQgPSBjb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICAgIGN0eC5sb2dnZXIub3B0aW9ucy5kZWJ1ZyA9IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZSc7XG5cbiAgICAgIC8vIExvZyB0aGUgZXZlbnQgb2JqZWN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICAgIGN0eC5sb2dnZXIuZGVidWcoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQXV0aGVudGljYXRlIHRoZSB1c2VyIHVzaW5nIHRoZSBDb2duaXRvIGF1dGhvcml6ZXJcbiAgICAgICAgYXdhaXQgY3R4LmF1dGguYXV0aGVudGljYXRlKCk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24sIHBhc3NpbmcgaW4gdGhlIHJlcXVlc3QgY29udGV4dCBvYmplY3QgYW5kIHRoZSBwYXJzZWQgcmVxdWVzdCBib2R5XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGhhbmRsZXIoY3R4LCBwYXJzZUJvZHkoZXZlbnQpKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIHJldHVybiB0aGUgSFRUUCByZXNwb25zZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IGN0eC5yZXNwb25zZS5zdGF0dXNDb2RlID8/IChyZXMgPyAyMDAgOiAyMDQpLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgIC4uLmN0eC5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogcmVzID8gKGN0eC5yZXNwb25zZS5qc29uID8gSlNPTi5zdHJpbmdpZnkocmVzKSA6IHJlcykgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSGFuZGxlIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nXG5cbiAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIEh0dHBFcnJvciwgcmV0dXJuIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgZXJyb3Igc3RhdHVzIGNvZGUgYW5kIG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JzLkh0dHBFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgICAgLi4uY3R4LnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyBhIEJvb20gZXJyb3IgKGZyb20gdGhlIGhhcGkuanMgZnJhbWV3b3JrKSwgcmV0dXJuIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgZXJyb3Igc3RhdHVzIGNvZGUgYW5kIHBheWxvYWRcbiAgICAgICAgaWYgKGVycm9yLmlzQm9vbSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5vdXRwdXQuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgLi4uZXJyb3Iub3V0cHV0LmhlYWRlcnMsXG4gICAgICAgICAgICAgIC4uLmNvcnNIZWFkZXIoZXZlbnQpLFxuICAgICAgICAgICAgICAuLi5jdHgucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShlcnJvci5vdXRwdXQucGF5bG9hZCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVycm9ycywgbG9nIHRoZSBlcnJvciBhbmQgcmV0dXJuIGEgNTAwIHN0YXR1cyBjb2RlIHdpdGggdGhlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgY3R4LmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGUgPz8gNTAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgIC4uLmN0eC5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gZXZlbnQgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBBUEkgR2F0ZXdheSBQcm94eSBldmVudFxuICogd2l0aCBhIENvZ25pdG8gYXV0aG9yaXplciwgYW5kIGV4dHJhY3RzIGFuZCBwYXJzZXMgdGhlIHJlcXVlc3QgYm9keSwgaWYgcHJlc2VudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIEFQSSBHYXRld2F5IFByb3h5IGV2ZW50IHdpdGggYSBDb2duaXRvIGF1dGhvcml6ZXJcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgcmVxdWVzdCBib2R5XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQm9keTxUPihldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50KTogVCB7XG4gIGxldCBib2R5ID0gZXZlbnQuYm9keTtcblxuICAvLyBJZiB0aGUgcmVxdWVzdCBib2R5IGlzIGJhc2U2NC1lbmNvZGVkLCBkZWNvZGUgaXRcbiAgaWYgKGV2ZW50LmJvZHkgJiYgZXZlbnQuaXNCYXNlNjRFbmNvZGVkKSB7XG4gICAgY29uc3QgYnVmZiA9IEJ1ZmZlci5mcm9tKGV2ZW50LmJvZHkhLCAnYmFzZTY0Jyk7XG4gICAgYm9keSA9IGJ1ZmYudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8vIElmIHRoZSByZXF1ZXN0IGJvZHkgaXMgaW4gSlNPTiBmb3JtYXQsIHBhcnNlIGl0IGludG8gYSBKYXZhU2NyaXB0IG9iamVjdFxuICBpZiAoZXZlbnQuaGVhZGVycyAmJiBldmVudC5oZWFkZXJzWydjb250ZW50LXR5cGUnXT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkgPz8gJ3t9Jyk7XG4gIH1cblxuICAvLyBJZiB0aGUgcmVxdWVzdCBib2R5IGlzIG5vdCBwcmVzZW50IG9yIG5vdCBpbiBKU09OIGZvcm1hdCwgcmV0dXJuIGl0IGFzLWlzXG4gIHJldHVybiBib2R5IGFzIGFueTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIENPUlMgaGVhZGVycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQVBJIEdhdGV3YXkgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIEFQSSBHYXRld2F5IGV2ZW50IG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBDT1JTIGhlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIGNvcnNIZWFkZXIoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlXaXRoQ29nbml0b0F1dGhvcml6ZXJFdmVudCk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgcmV0dXJuIHtcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogZXZlbnQ/LmhlYWRlcnM/Lm9yaWdpbiA/PyAnKicsIC8vIEFsbG93IHJlcXVlc3RzIGZyb20gdGhlIG9yaWdpbiBoZWFkZXIsIG9yIGFsbG93IGFueSBvcmlnaW4gaWYgbm90IHByZXNlbnRcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMnOiBldmVudD8uaGVhZGVycz8ub3JpZ2luID8gJ3RydWUnIDogJ2ZhbHNlJywgLy8gSW5jbHVkZSBjb29raWVzIGluIGNyb3NzLW9yaWdpbiByZXF1ZXN0cyBpZiB0aGUgb3JpZ2luIGhlYWRlciBpcyBwcmVzZW50XG4gICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiAnKicsIC8vIEFsbG93IGFueSBIVFRQIG1ldGhvZFxuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0F1dGhvcml6YXRpb24sIConLCAvLyBBbGxvdyB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgYW5kIGFueSBvdGhlciBoZWFkZXJzXG4gIH07XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vIEFwcFN5bmNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIFRoZSBjb250ZXh0IGZvciB0aGUgQXBwU3luYyByZXNvbHZlciBmdW5jdGlvbi5cbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCwgbGFtYmRhIGNvbnRleHQsIGxvZ2dlciwgYW5kIENvZ25pdG8gYXV0aG9yaXplci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBTeW5jSGFuZGxlckNvbnRleHQ8VD4ge1xuICBldmVudDogQVdTTGFtYmRhLkFwcFN5bmNSZXNvbHZlckV2ZW50PFQ+O1xuICBsYW1iZGFDb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dDtcbiAgbG9nZ2VyOiBsb2dnZXIuTGFtYmRhTG9nO1xuICBjb2duaXRvQXV0aDogQ29nbml0b0F1dGhvcml6ZXI7XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYW4gQXBwU3luYyByZXNvbHZlciBldmVudC5cbiAqIFJlY2VpdmVzIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCB0eXBlIEFwcFN5bmNIYW5kbGVyPFQsIFI+ID0gKFxuICBjb250ZXh0OiBBcHBTeW5jSGFuZGxlckNvbnRleHQ8VD4sXG4pID0+IFByb21pc2U8Uj47XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBcHBTeW5jIHJlc29sdmVyIGhhbmRsZXIgZnJvbSB0aGUgZ2l2ZW4gQXBwU3luY0hhbmRsZXIuXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBBcHBTeW5jIHJlc29sdmVyLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBBcHBTeW5jSGFuZGxlciB0byB1c2UgYXMgdGhlIHJlc29sdmVyLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXBwU3luY0hhbmRsZXIgPVxuICA8VCwgUj4oaGFuZGxlcjogQXBwU3luY0hhbmRsZXI8VCwgUj4pOiBBV1NMYW1iZGEuQXBwU3luY1Jlc29sdmVySGFuZGxlcjxULCBSPiA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY3R4OiBBcHBTeW5jSGFuZGxlckNvbnRleHQ8VD4gPSB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsYW1iZGFDb250ZXh0OiBjb250ZXh0LFxuICAgICAgICBsb2dnZXI6IGxvZ2dlciBhcyB1bmtub3duIGFzIGxvZ2dlci5MYW1iZGFMb2csXG4gICAgICAgIGNvZ25pdG9BdXRoOiBuZXcgQXBwU3luY0NvZ25pdG9BdXRob3JpemVyKGV2ZW50KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIHNldCB0aGUgbWV0YSBpbmZvcm1hdGlvbiBpbiBsb2dnZXJcbiAgICAgIGN0eC5sb2dnZXIub3B0aW9ucy5tZXRhLnJlcXVlc3RJZCA9IGNvbnRleHQuYXdzUmVxdWVzdElkO1xuICAgICAgLy8gc2V0IHRoZSBkZWJ1ZyBmbGFnIGZvciBsb2dnZXJcbiAgICAgIGN0eC5sb2dnZXIub3B0aW9ucy5kZWJ1ZyA9IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZSc7XG5cbiAgICAgIC8vIGxvZyB0aGUgcmVjZWl2ZWQgZXZlbnRcbiAgICAgIGN0eC5sb2dnZXIuZGVidWcoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gYXV0aGVudGljYXRlIHRoZSBpbmNvbWluZyByZXF1ZXN0XG4gICAgICAgIGF3YWl0IGN0eC5jb2duaXRvQXV0aC5hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgLy8gaW52b2tlIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHdpdGggdGhlIGNvbnRleHRcbiAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIoY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gbG9nIHRoZSBlcnJvciBhbmQgdGhyb3cgaXQgYWdhaW5cbiAgICAgICAgY3R4LmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiJdfQ==
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGEvaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBOEI7QUFDOUIsNERBQStDO0FBQy9DLGlDQU1nQjtBQUNoQixpREFBbUM7QUE2RG5DOztHQUVHO0FBQ0ksTUFBTSxtQ0FBbUMsR0FBRyxDQUErRCxPQUEwSCxFQUF1QixFQUFFO0lBQ25RLE9BQU8sSUFBQSx5QkFBaUIsRUFBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFGVyxRQUFBLG1DQUFtQyx1Q0FFOUM7QUFFRjs7R0FFRztBQUNJLE1BQU0sNkNBQTZDLEdBQUcsQ0FBc0MsT0FBNEUsRUFBdUIsRUFBRTtJQUN0TSxPQUFPLElBQUEseUJBQWlCLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRlcsUUFBQSw2Q0FBNkMsaURBRXhEO0FBRUY7O0dBRUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLENBQWdELE9BQTZFLEVBQXVCLEVBQUU7SUFDeEwsT0FBTyxJQUFBLHlCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUZXLFFBQUEsb0JBQW9CLHdCQUUvQjtBQUVGOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQXFGLEVBQUUsR0FBYyxFQUFFLEVBQUU7SUFDakksaUhBQWlIO0lBQ2pILElBQUksYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxvQ0FBNkIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztTQUFNLENBQUM7UUFDTixnR0FBZ0c7UUFDaEcsT0FBTyxJQUFJLGdDQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztBQUNI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QUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDekQsZ0NBQWdDO1FBQ2hDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUM7UUFFeEQseUJBQXlCO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUM7WUFDSCxvQ0FBb0M7WUFDcEMsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLCtDQUErQztZQUMvQyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1lBQ3BCLG1DQUFtQztZQUNuQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUE3QlMsUUFBQSxvQkFBb0Isd0JBNkI3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVudiB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IGxvZ2dlciwgeyBMYW1iZGFMb2cgfSBmcm9tICdsYW1iZGEtbG9nJztcbmltcG9ydCB7XG4gIEFwaUdhdGV3YXl2MUNvZ25pdG9BdXRob3JpemVyLFxuICBBcGlHYXRld2F5djFKd3RBdXRob3JpemVyLFxuICBBcHBTeW5jQ29nbml0b0F1dGhvcml6ZXIsXG4gIENvZ25pdG9BdXRob3JpemVyLFxuICBKd3RBdXRob3JpemVyLFxufSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzJztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLyBIVFRQIEFwaVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgZm9yIGFuIEhUVFAgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cFJlc3BvbnNlQ29udGV4dCB7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIGhlYWRlcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICBqc29uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZvciBhbiBIVFRQIHJlcXVlc3QgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwSGFuZGxlckNvbnRleHQge1xuICBldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50O1xuICBsYW1iZGFDb250ZXh0OiBBV1NMYW1iZGEuQ29udGV4dDtcbiAgbG9nZ2VyOiBsb2dnZXIuTGFtYmRhTG9nO1xuICByZXNwb25zZTogSHR0cFJlc3BvbnNlQ29udGV4dDtcbiAgYXV0aDogSnd0QXV0aG9yaXplcjtcbn1cblxuLyoqXG4gKiBBIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gSFRUUCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBIdHRwSGFuZGxlcjxULCBSPiA9IChcbiAgY29udGV4dDogSHR0cEhhbmRsZXJDb250ZXh0LFxuICBib2R5OiBULFxuKSA9PiBQcm9taXNlPFI+O1xuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGZvciBhbiBPcGVuQVBJIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb24ge1xuICByZXNwb25zZXM6IHtcbiAgICBbc3RhdHVzQ29kZTogbnVtYmVyXToge1xuICAgICAgY29udGVudDoge1xuICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IGFueTtcbiAgICAgIH07XG4gICAgfSB8IGFueTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gQVBJIEdhdGV3YXkgdjEgcmVxdWVzdCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBBUElHYXRld2F5djFIYW5kbGVyID1cbiAgQVdTTGFtYmRhLkhhbmRsZXI8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50LCBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0IHwgdW5kZWZpbmVkPjtcblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBmb3IgYW4gT3BlbkFQSSBvcGVyYXRpb24gd2l0aCBhIHJlcXVlc3QgYm9keS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25XaXRoUmVxdWVzdEJvZHkgZXh0ZW5kcyBPcGVyYXRpb24ge1xuICByZXF1ZXN0Qm9keTogeyBjb250ZW50OiB7ICdhcHBsaWNhdGlvbi9qc29uJzogYW55IH0gfTtcbn1cblxuLyoqXG4gKiBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIEhUVFAgcmVxdWVzdCBoYW5kbGVyIGZvciBhbiBPcGVuQVBJIG9wZXJhdGlvbiB3aXRoIGEgcmVxdWVzdCBib2R5LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlT3BlbkFwaUhhbmRsZXJXaXRoUmVxdWVzdEJvZHkgPSA8T1AgZXh0ZW5kcyBPcGVyYXRpb25XaXRoUmVxdWVzdEJvZHksIFNDIGV4dGVuZHMgbnVtYmVyID0gMjAwPihoYW5kbGVyOiBIdHRwSGFuZGxlcjxPUFsncmVxdWVzdEJvZHknXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10sIE9QWydyZXNwb25zZXMnXVtTQ11bJ2NvbnRlbnQnXVsnYXBwbGljYXRpb24vanNvbiddPik6IEFQSUdhdGV3YXl2MUhhbmRsZXIgPT4ge1xuICByZXR1cm4gY3JlYXRlSHR0cEhhbmRsZXIoaGFuZGxlcik7XG59O1xuXG4vKipcbiAqIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gSFRUUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGFuIE9wZW5BUEkgb3BlcmF0aW9uIHdpdGggYSByZXF1ZXN0IGJvZHkgYW5kIG5vIHJlc3BvbnNlLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlT3BlbkFwaUhhbmRsZXJXaXRoUmVxdWVzdEJvZHlOb1Jlc3BvbnNlID0gPE9QIGV4dGVuZHMgT3BlcmF0aW9uV2l0aFJlcXVlc3RCb2R5PihoYW5kbGVyOiBIdHRwSGFuZGxlcjxPUFsncmVxdWVzdEJvZHknXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10sIHZvaWQ+KTogQVBJR2F0ZXdheXYxSGFuZGxlciA9PiB7XG4gIHJldHVybiBjcmVhdGVIdHRwSGFuZGxlcihoYW5kbGVyKTtcbn07XG5cbi8qKlxuICogQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBIVFRQIHJlcXVlc3QgaGFuZGxlciBmb3IgYW4gT3BlbkFQSSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVPcGVuQXBpSGFuZGxlciA9IDxPUCBleHRlbmRzIE9wZXJhdGlvbiwgU0MgZXh0ZW5kcyBudW1iZXIgPSAyMDA+KGhhbmRsZXI6IEh0dHBIYW5kbGVyPGFueSwgT1BbJ3Jlc3BvbnNlcyddW1NDXVsnY29udGVudCddWydhcHBsaWNhdGlvbi9qc29uJ10+KTogQVBJR2F0ZXdheXYxSGFuZGxlciA9PiB7XG4gIHJldHVybiBjcmVhdGVIdHRwSGFuZGxlcihoYW5kbGVyKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIGF1dGhvcml6ZXIgZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgY2hvc2VuIChKV1Qgb3IgQ29nbml0bykuXG4gKi9cbmNvbnN0IGNyZWF0ZUF1dGhvcml6ZXIgPSAoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudEJhc2U8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUNvZ25pdG9BdXRob3JpemVyPiwgbG9nOiBMYW1iZGFMb2cpID0+IHtcbiAgLy8gSWYgQ29nbml0byBpcyB1c2VkLCBVU0VSX1BPT0xfSUQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudC4gQ3VycmVudGx5IGFzc3VtZXMgSldUIG90aGVyd2lzZS5cbiAgaWYgKGVudi5VU0VSX1BPT0xfSUQpIHtcbiAgICByZXR1cm4gbmV3IEFwaUdhdGV3YXl2MUNvZ25pdG9BdXRob3JpemVyKGV2ZW50LCBsb2cpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgbWlnaHQgbmVlZCB0byBnZXQgbW9yZSBzb3BoaXN0aWNhdGVkIGlmIG1vcmUgYXV0aG9yaXphdGlvbiBtZXRob2RzIG5lZWQgdG8gYmUgc3VwcG9ydGVkLlxuICAgIHJldHVybiBuZXcgQXBpR2F0ZXdheXYxSnd0QXV0aG9yaXplcihldmVudCwgJ2FkbWluJywgbG9nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIEhUVFAgcmVxdWVzdCBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlSHR0cEhhbmRsZXIgPVxuICA8VCwgUj4oaGFuZGxlcjogSHR0cEhhbmRsZXI8VCwgUj4pOiBBUElHYXRld2F5djFIYW5kbGVyID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYW4gb2JqZWN0IHRvIGhvbGQgdGhlIGNvbnRleHQgZm9yIHRoaXMgSFRUUCByZXF1ZXN0XG4gICAgICBjb25zdCBhdXRoID0gY3JlYXRlQXV0aG9yaXplcihldmVudCwgbG9nZ2VyIGFzIHVua25vd24gYXMgbG9nZ2VyLkxhbWJkYUxvZyk7XG4gICAgICBjb25zdCBjdHg6IEh0dHBIYW5kbGVyQ29udGV4dCA9IHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGxhbWJkYUNvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgIGxvZ2dlcjogbG9nZ2VyIGFzIHVua25vd24gYXMgbG9nZ2VyLkxhbWJkYUxvZyxcbiAgICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczoge30sIGpzb246IHRydWUgfSxcbiAgICAgIH07XG4gICAgICAvLyBBZGQgdGhlIHJlcXVlc3QgSUQgdG8gdGhlIGxvZ2dpbmcgbWV0YWRhdGEsIGFuZCBlbmFibGUgZGVidWcgbG9nZ2luZyBpZiB0aGUgREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIFwidHJ1ZVwiXG4gICAgICBjdHgubG9nZ2VyLm9wdGlvbnMubWV0YS5yZXF1ZXN0SWQgPSBjb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICAgIGN0eC5sb2dnZXIub3B0aW9ucy5kZWJ1ZyA9IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZSc7XG5cbiAgICAgIC8vIExvZyB0aGUgZXZlbnQgb2JqZWN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICAgIGN0eC5sb2dnZXIuZGVidWcoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQXV0aGVudGljYXRlIHRoZSB1c2VyIHVzaW5nIHRoZSBDb2duaXRvIGF1dGhvcml6ZXJcbiAgICAgICAgYXdhaXQgY3R4LmF1dGguYXV0aGVudGljYXRlKCk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24sIHBhc3NpbmcgaW4gdGhlIHJlcXVlc3QgY29udGV4dCBvYmplY3QgYW5kIHRoZSBwYXJzZWQgcmVxdWVzdCBib2R5XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGhhbmRsZXIoY3R4LCBwYXJzZUJvZHkoZXZlbnQpKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIHJldHVybiB0aGUgSFRUUCByZXNwb25zZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IGN0eC5yZXNwb25zZS5zdGF0dXNDb2RlID8/IChyZXMgPyAyMDAgOiAyMDQpLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgIC4uLmN0eC5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogcmVzID8gKGN0eC5yZXNwb25zZS5qc29uID8gSlNPTi5zdHJpbmdpZnkocmVzKSA6IHJlcykgOiAnJyxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSGFuZGxlIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nXG5cbiAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIEh0dHBFcnJvciwgcmV0dXJuIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgZXJyb3Igc3RhdHVzIGNvZGUgYW5kIG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgZXJyb3JzLkh0dHBFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgICAgLi4uY3R4LnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSBlcnJvciBpcyBhIEJvb20gZXJyb3IgKGZyb20gdGhlIGhhcGkuanMgZnJhbWV3b3JrKSwgcmV0dXJuIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCB0aGUgZXJyb3Igc3RhdHVzIGNvZGUgYW5kIHBheWxvYWRcbiAgICAgICAgaWYgKGVycm9yLmlzQm9vbSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5vdXRwdXQuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgLi4uZXJyb3Iub3V0cHV0LmhlYWRlcnMsXG4gICAgICAgICAgICAgIC4uLmNvcnNIZWFkZXIoZXZlbnQpLFxuICAgICAgICAgICAgICAuLi5jdHgucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShlcnJvci5vdXRwdXQucGF5bG9hZCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVycm9ycywgbG9nIHRoZSBlcnJvciBhbmQgcmV0dXJuIGEgNTAwIHN0YXR1cyBjb2RlIHdpdGggdGhlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgY3R4LmxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGUgPz8gNTAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAuLi5jb3JzSGVhZGVyKGV2ZW50KSxcbiAgICAgICAgICAgIC4uLmN0eC5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIExvb2tzIHVwIGEgaGVhZGVyIHZhbHVlIGNhc2UtaW5zZW5zaXRpdmVseS5cbiAqIEhUVFAgaGVhZGVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIHBlciBSRkMgOTExMCDCpzUuMS5cbiAqL1xuZnVuY3Rpb24gaGVhZGVyVmFsdWUoaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IG51bGwgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoaGVhZGVycykuZmluZChrID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIGtleSA/IGhlYWRlcnNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIGV2ZW50IG9iamVjdCByZXByZXNlbnRpbmcgYW4gQVBJIEdhdGV3YXkgUHJveHkgZXZlbnRcbiAqIHdpdGggYSBDb2duaXRvIGF1dGhvcml6ZXIsIGFuZCBleHRyYWN0cyBhbmQgcGFyc2VzIHRoZSByZXF1ZXN0IGJvZHksIGlmIHByZXNlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBBUEkgR2F0ZXdheSBQcm94eSBldmVudCB3aXRoIGEgQ29nbml0byBhdXRob3JpemVyXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIHJlcXVlc3QgYm9keVxuICovXG5mdW5jdGlvbiBwYXJzZUJvZHk8VD4oZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlXaXRoQ29nbml0b0F1dGhvcml6ZXJFdmVudCk6IFQge1xuICBsZXQgYm9keSA9IGV2ZW50LmJvZHk7XG5cbiAgLy8gSWYgdGhlIHJlcXVlc3QgYm9keSBpcyBiYXNlNjQtZW5jb2RlZCwgZGVjb2RlIGl0XG4gIGlmIChldmVudC5ib2R5ICYmIGV2ZW50LmlzQmFzZTY0RW5jb2RlZCkge1xuICAgIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuZnJvbShldmVudC5ib2R5ISwgJ2Jhc2U2NCcpO1xuICAgIGJvZHkgPSBidWZmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cblxuICAvLyBJZiB0aGUgcmVxdWVzdCBib2R5IGlzIGluIEpTT04gZm9ybWF0LCBwYXJzZSBpdCBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAgaWYgKGhlYWRlclZhbHVlKGV2ZW50LmhlYWRlcnMsICdjb250ZW50LXR5cGUnKT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkgPz8gJ3t9Jyk7XG4gIH1cblxuICAvLyBJZiB0aGUgcmVxdWVzdCBib2R5IGlzIG5vdCBwcmVzZW50IG9yIG5vdCBpbiBKU09OIGZvcm1hdCwgcmV0dXJuIGl0IGFzLWlzXG4gIHJldHVybiBib2R5IGFzIGFueTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIENPUlMgaGVhZGVycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgQVBJIEdhdGV3YXkgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gVGhlIEFQSSBHYXRld2F5IGV2ZW50IG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBDT1JTIGhlYWRlcnMuXG4gKi9cbmZ1bmN0aW9uIGNvcnNIZWFkZXIoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlXaXRoQ29nbml0b0F1dGhvcml6ZXJFdmVudCk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgb3JpZ2luID0gaGVhZGVyVmFsdWUoZXZlbnQ/LmhlYWRlcnMsICdvcmlnaW4nKTtcbiAgcmV0dXJuIHtcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogb3JpZ2luID8/ICcqJywgLy8gQWxsb3cgcmVxdWVzdHMgZnJvbSB0aGUgb3JpZ2luIGhlYWRlciwgb3IgYWxsb3cgYW55IG9yaWdpbiBpZiBub3QgcHJlc2VudFxuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6IG9yaWdpbiA/ICd0cnVlJyA6ICdmYWxzZScsIC8vIEluY2x1ZGUgY29va2llcyBpbiBjcm9zcy1vcmlnaW4gcmVxdWVzdHMgaWYgdGhlIG9yaWdpbiBoZWFkZXIgaXMgcHJlc2VudFxuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJyonLCAvLyBBbGxvdyBhbnkgSFRUUCBtZXRob2RcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6ICdBdXRob3JpemF0aW9uLCAqJywgLy8gQWxsb3cgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGFuZCBhbnkgb3RoZXIgaGVhZGVyc1xuICB9O1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLyBBcHBTeW5jXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgdGhlIEFwcFN5bmMgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXZlbnQsIGxhbWJkYSBjb250ZXh0LCBsb2dnZXIsIGFuZCBDb2duaXRvIGF1dGhvcml6ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwU3luY0hhbmRsZXJDb250ZXh0PFQ+IHtcbiAgZXZlbnQ6IEFXU0xhbWJkYS5BcHBTeW5jUmVzb2x2ZXJFdmVudDxUPjtcbiAgbGFtYmRhQ29udGV4dDogQVdTTGFtYmRhLkNvbnRleHQ7XG4gIGxvZ2dlcjogbG9nZ2VyLkxhbWJkYUxvZztcbiAgY29nbml0b0F1dGg6IENvZ25pdG9BdXRob3JpemVyO1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGFuIEFwcFN5bmMgcmVzb2x2ZXIgZXZlbnQuXG4gKiBSZWNlaXZlcyB0aGUgY29udGV4dCBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgdHlwZSBBcHBTeW5jSGFuZGxlcjxULCBSPiA9IChcbiAgY29udGV4dDogQXBwU3luY0hhbmRsZXJDb250ZXh0PFQ+LFxuKSA9PiBQcm9taXNlPFI+O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQXBwU3luYyByZXNvbHZlciBoYW5kbGVyIGZyb20gdGhlIGdpdmVuIEFwcFN5bmNIYW5kbGVyLlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gQXBwU3luYyByZXNvbHZlci5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgQXBwU3luY0hhbmRsZXIgdG8gdXNlIGFzIHRoZSByZXNvbHZlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFwcFN5bmNIYW5kbGVyID1cbiAgPFQsIFI+KGhhbmRsZXI6IEFwcFN5bmNIYW5kbGVyPFQsIFI+KTogQVdTTGFtYmRhLkFwcFN5bmNSZXNvbHZlckhhbmRsZXI8VCwgUj4gPT4ge1xuICAgIHJldHVybiBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGN0eDogQXBwU3luY0hhbmRsZXJDb250ZXh0PFQ+ID0ge1xuICAgICAgICBldmVudCxcbiAgICAgICAgbGFtYmRhQ29udGV4dDogY29udGV4dCxcbiAgICAgICAgbG9nZ2VyOiBsb2dnZXIgYXMgdW5rbm93biBhcyBsb2dnZXIuTGFtYmRhTG9nLFxuICAgICAgICBjb2duaXRvQXV0aDogbmV3IEFwcFN5bmNDb2duaXRvQXV0aG9yaXplcihldmVudCksXG4gICAgICB9O1xuXG4gICAgICAvLyBzZXQgdGhlIG1ldGEgaW5mb3JtYXRpb24gaW4gbG9nZ2VyXG4gICAgICBjdHgubG9nZ2VyLm9wdGlvbnMubWV0YS5yZXF1ZXN0SWQgPSBjb250ZXh0LmF3c1JlcXVlc3RJZDtcbiAgICAgIC8vIHNldCB0aGUgZGVidWcgZmxhZyBmb3IgbG9nZ2VyXG4gICAgICBjdHgubG9nZ2VyLm9wdGlvbnMuZGVidWcgPSBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJ3RydWUnO1xuXG4gICAgICAvLyBsb2cgdGhlIHJlY2VpdmVkIGV2ZW50XG4gICAgICBjdHgubG9nZ2VyLmRlYnVnKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0ZSB0aGUgaW5jb21pbmcgcmVxdWVzdFxuICAgICAgICBhd2FpdCBjdHguY29nbml0b0F1dGguYXV0aGVudGljYXRlKCk7XG4gICAgICAgIC8vIGludm9rZSB0aGUgaGFuZGxlciBmdW5jdGlvbiB3aXRoIHRoZSBjb250ZXh0XG4gICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKGN0eCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIGxvZyB0aGUgZXJyb3IgYW5kIHRocm93IGl0IGFnYWluXG4gICAgICAgIGN0eC5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4iXX0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for the MCP OAuth façade.
|
|
3
|
+
* Service-agnostic: works with any OAuth2/OIDC provider that exposes
|
|
4
|
+
* a standard authorize + token endpoint.
|
|
5
|
+
*/
|
|
6
|
+
export interface McpAuthConfig {
|
|
7
|
+
/** The API domain serving as the OAuth issuer (e.g. 'api.example.com') */
|
|
8
|
+
readonly apiDomain: string;
|
|
9
|
+
/**
|
|
10
|
+
* The upstream OAuth authorize endpoint URL.
|
|
11
|
+
* The authorize handler proxies requests here (302 redirect).
|
|
12
|
+
* Example: 'https://auth.example.com/oauth2/authorize'
|
|
13
|
+
*/
|
|
14
|
+
readonly authorizeEndpoint: string;
|
|
15
|
+
/**
|
|
16
|
+
* The upstream OAuth token endpoint URL.
|
|
17
|
+
* The token handler proxies requests here.
|
|
18
|
+
* Example: 'https://auth.example.com/oauth2/token'
|
|
19
|
+
*/
|
|
20
|
+
readonly tokenEndpoint: string;
|
|
21
|
+
/** Allowed redirect URIs for dynamic client registration */
|
|
22
|
+
readonly allowedRedirectUris: string[];
|
|
23
|
+
/** The pre-provisioned OAuth client ID returned by registration */
|
|
24
|
+
readonly clientId: string;
|
|
25
|
+
/** MCP server info for the initialize response */
|
|
26
|
+
readonly serverInfo: {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly version: string;
|
|
29
|
+
};
|
|
30
|
+
/** Supported MCP protocol versions */
|
|
31
|
+
readonly protocolVersions: string[];
|
|
32
|
+
/** OAuth scopes to advertise in discovery metadata */
|
|
33
|
+
readonly scopes?: string[];
|
|
34
|
+
/**
|
|
35
|
+
* Parameters to strip from authorize/token requests before proxying.
|
|
36
|
+
* Defaults to ['resource'] (RFC 8707 not supported by most providers).
|
|
37
|
+
*/
|
|
38
|
+
readonly stripParameters?: string[];
|
|
39
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21jcC1hdXRoL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgTUNQIE9BdXRoIGZhw6dhZGUuXG4gKiBTZXJ2aWNlLWFnbm9zdGljOiB3b3JrcyB3aXRoIGFueSBPQXV0aDIvT0lEQyBwcm92aWRlciB0aGF0IGV4cG9zZXNcbiAqIGEgc3RhbmRhcmQgYXV0aG9yaXplICsgdG9rZW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWNwQXV0aENvbmZpZyB7XG4gIC8qKiBUaGUgQVBJIGRvbWFpbiBzZXJ2aW5nIGFzIHRoZSBPQXV0aCBpc3N1ZXIgKGUuZy4gJ2FwaS5leGFtcGxlLmNvbScpICovXG4gIHJlYWRvbmx5IGFwaURvbWFpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdXBzdHJlYW0gT0F1dGggYXV0aG9yaXplIGVuZHBvaW50IFVSTC5cbiAgICogVGhlIGF1dGhvcml6ZSBoYW5kbGVyIHByb3hpZXMgcmVxdWVzdHMgaGVyZSAoMzAyIHJlZGlyZWN0KS5cbiAgICogRXhhbXBsZTogJ2h0dHBzOi8vYXV0aC5leGFtcGxlLmNvbS9vYXV0aDIvYXV0aG9yaXplJ1xuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplRW5kcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIE9BdXRoIHRva2VuIGVuZHBvaW50IFVSTC5cbiAgICogVGhlIHRva2VuIGhhbmRsZXIgcHJveGllcyByZXF1ZXN0cyBoZXJlLlxuICAgKiBFeGFtcGxlOiAnaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29tL29hdXRoMi90b2tlbidcbiAgICovXG4gIHJlYWRvbmx5IHRva2VuRW5kcG9pbnQ6IHN0cmluZztcblxuICAvKiogQWxsb3dlZCByZWRpcmVjdCBVUklzIGZvciBkeW5hbWljIGNsaWVudCByZWdpc3RyYXRpb24gKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFJlZGlyZWN0VXJpczogc3RyaW5nW107XG5cbiAgLyoqIFRoZSBwcmUtcHJvdmlzaW9uZWQgT0F1dGggY2xpZW50IElEIHJldHVybmVkIGJ5IHJlZ2lzdHJhdGlvbiAqL1xuICByZWFkb25seSBjbGllbnRJZDogc3RyaW5nO1xuXG4gIC8qKiBNQ1Agc2VydmVyIGluZm8gZm9yIHRoZSBpbml0aWFsaXplIHJlc3BvbnNlICovXG4gIHJlYWRvbmx5IHNlcnZlckluZm86IHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfTtcblxuICAvKiogU3VwcG9ydGVkIE1DUCBwcm90b2NvbCB2ZXJzaW9ucyAqL1xuICByZWFkb25seSBwcm90b2NvbFZlcnNpb25zOiBzdHJpbmdbXTtcblxuICAvKiogT0F1dGggc2NvcGVzIHRvIGFkdmVydGlzZSBpbiBkaXNjb3ZlcnkgbWV0YWRhdGEgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBhcmFtZXRlcnMgdG8gc3RyaXAgZnJvbSBhdXRob3JpemUvdG9rZW4gcmVxdWVzdHMgYmVmb3JlIHByb3h5aW5nLlxuICAgKiBEZWZhdWx0cyB0byBbJ3Jlc291cmNlJ10gKFJGQyA4NzA3IG5vdCBzdXBwb3J0ZWQgYnkgbW9zdCBwcm92aWRlcnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaXBQYXJhbWV0ZXJzPzogc3RyaW5nW107XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpAuthConfig } from '../config';
|
|
2
|
+
import type { McpOAuthHandler } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the `/.well-known/oauth-authorization-server` endpoint (RFC 8414).
|
|
5
|
+
* Returns OAuth server metadata with all endpoint URLs pointing to the API domain.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createAuthorizationServerHandler(config: McpAuthConfig): McpOAuthHandler;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthorizationServerHandler = createAuthorizationServerHandler;
|
|
4
|
+
/**
|
|
5
|
+
* Factory for the `/.well-known/oauth-authorization-server` endpoint (RFC 8414).
|
|
6
|
+
* Returns OAuth server metadata with all endpoint URLs pointing to the API domain.
|
|
7
|
+
*/
|
|
8
|
+
function createAuthorizationServerHandler(config) {
|
|
9
|
+
return async (event) => {
|
|
10
|
+
console.log(JSON.stringify({
|
|
11
|
+
event: 'oauth-authorization-server',
|
|
12
|
+
method: event.httpMethod,
|
|
13
|
+
path: event.path,
|
|
14
|
+
}));
|
|
15
|
+
const scopes = config.scopes ?? ['openid', 'email', 'profile'];
|
|
16
|
+
const body = {
|
|
17
|
+
issuer: `https://${config.apiDomain}`,
|
|
18
|
+
authorization_endpoint: `https://${config.apiDomain}/oauth/authorize`,
|
|
19
|
+
token_endpoint: `https://${config.apiDomain}/oauth/token`,
|
|
20
|
+
registration_endpoint: `https://${config.apiDomain}/oauth/register`,
|
|
21
|
+
scopes_supported: scopes,
|
|
22
|
+
response_types_supported: ['code'],
|
|
23
|
+
grant_types_supported: ['authorization_code', 'refresh_token'],
|
|
24
|
+
code_challenge_methods_supported: ['S256'],
|
|
25
|
+
token_endpoint_auth_methods_supported: ['none'],
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
statusCode: 200,
|
|
29
|
+
headers: { 'Content-Type': 'application/json' },
|
|
30
|
+
body: JSON.stringify(body),
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvYXV0aG9yaXphdGlvbi1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSw0RUEyQkM7QUEvQkQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQUMsTUFBcUI7SUFDcEUsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUE2QixFQUFFO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN6QixLQUFLLEVBQUUsNEJBQTRCO1lBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVTtZQUN4QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRztZQUNYLE1BQU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDckMsc0JBQXNCLEVBQUUsV0FBVyxNQUFNLENBQUMsU0FBUyxrQkFBa0I7WUFDckUsY0FBYyxFQUFFLFdBQVcsTUFBTSxDQUFDLFNBQVMsY0FBYztZQUN6RCxxQkFBcUIsRUFBRSxXQUFXLE1BQU0sQ0FBQyxTQUFTLGlCQUFpQjtZQUNuRSxnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLHdCQUF3QixFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2xDLHFCQUFxQixFQUFFLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDO1lBQzlELGdDQUFnQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzFDLHFDQUFxQyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ2hELENBQUM7UUFFRixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzNCLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNY3BBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB0eXBlIHsgTWNwT0F1dGhIYW5kbGVyLCBNY3BPQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgdGhlIGAvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXJgIGVuZHBvaW50IChSRkMgODQxNCkuXG4gKiBSZXR1cm5zIE9BdXRoIHNlcnZlciBtZXRhZGF0YSB3aXRoIGFsbCBlbmRwb2ludCBVUkxzIHBvaW50aW5nIHRvIHRoZSBBUEkgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblNlcnZlckhhbmRsZXIoY29uZmlnOiBNY3BBdXRoQ29uZmlnKTogTWNwT0F1dGhIYW5kbGVyIHtcbiAgcmV0dXJuIGFzeW5jIChldmVudCk6IFByb21pc2U8TWNwT0F1dGhSZXNwb25zZT4gPT4ge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXInLFxuICAgICAgbWV0aG9kOiBldmVudC5odHRwTWV0aG9kLFxuICAgICAgcGF0aDogZXZlbnQucGF0aCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzY29wZXMgPSBjb25maWcuc2NvcGVzID8/IFsnb3BlbmlkJywgJ2VtYWlsJywgJ3Byb2ZpbGUnXTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgaXNzdWVyOiBgaHR0cHM6Ly8ke2NvbmZpZy5hcGlEb21haW59YCxcbiAgICAgIGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6IGBodHRwczovLyR7Y29uZmlnLmFwaURvbWFpbn0vb2F1dGgvYXV0aG9yaXplYCxcbiAgICAgIHRva2VuX2VuZHBvaW50OiBgaHR0cHM6Ly8ke2NvbmZpZy5hcGlEb21haW59L29hdXRoL3Rva2VuYCxcbiAgICAgIHJlZ2lzdHJhdGlvbl9lbmRwb2ludDogYGh0dHBzOi8vJHtjb25maWcuYXBpRG9tYWlufS9vYXV0aC9yZWdpc3RlcmAsXG4gICAgICBzY29wZXNfc3VwcG9ydGVkOiBzY29wZXMsXG4gICAgICByZXNwb25zZV90eXBlc19zdXBwb3J0ZWQ6IFsnY29kZSddLFxuICAgICAgZ3JhbnRfdHlwZXNfc3VwcG9ydGVkOiBbJ2F1dGhvcml6YXRpb25fY29kZScsICdyZWZyZXNoX3Rva2VuJ10sXG4gICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZDogWydTMjU2J10sXG4gICAgICB0b2tlbl9lbmRwb2ludF9hdXRoX21ldGhvZHNfc3VwcG9ydGVkOiBbJ25vbmUnXSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpAuthConfig } from '../config';
|
|
2
|
+
import type { McpOAuthHandler } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the `/oauth/authorize` proxy endpoint.
|
|
5
|
+
* Strips configured parameters (default: 'resource') before redirecting
|
|
6
|
+
* to the upstream authorization endpoint.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createAuthorizeHandler(config: McpAuthConfig): McpOAuthHandler;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthorizeHandler = createAuthorizeHandler;
|
|
4
|
+
/**
|
|
5
|
+
* Factory for the `/oauth/authorize` proxy endpoint.
|
|
6
|
+
* Strips configured parameters (default: 'resource') before redirecting
|
|
7
|
+
* to the upstream authorization endpoint.
|
|
8
|
+
*/
|
|
9
|
+
function createAuthorizeHandler(config) {
|
|
10
|
+
return async (event) => {
|
|
11
|
+
const params = new URLSearchParams(event.queryStringParameters);
|
|
12
|
+
// Strip unsupported parameters (e.g. RFC 8707 'resource')
|
|
13
|
+
const stripParams = config.stripParameters ?? ['resource'];
|
|
14
|
+
for (const param of stripParams) {
|
|
15
|
+
params.delete(param);
|
|
16
|
+
}
|
|
17
|
+
const upstreamUrl = `${config.authorizeEndpoint}?${params.toString()}`;
|
|
18
|
+
console.log(JSON.stringify({
|
|
19
|
+
event: 'oauth-authorize-proxy',
|
|
20
|
+
upstreamUrl,
|
|
21
|
+
strippedParams: stripParams.filter(p => event.queryStringParameters?.[p]),
|
|
22
|
+
}));
|
|
23
|
+
return {
|
|
24
|
+
statusCode: 302,
|
|
25
|
+
headers: {
|
|
26
|
+
'Location': upstreamUrl,
|
|
27
|
+
'Cache-Control': 'no-cache, no-store',
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21jcC1hdXRoL2hhbmRsZXJzL2F1dGhvcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLHdEQTBCQztBQS9CRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsTUFBcUI7SUFDMUQsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUE2QixFQUFFO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxxQkFBK0MsQ0FBQyxDQUFDO1FBRTFGLDBEQUEwRDtRQUMxRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUV2RSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekIsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixXQUFXO1lBQ1gsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxRSxDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87WUFDTCxVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsV0FBVztnQkFDdkIsZUFBZSxFQUFFLG9CQUFvQjthQUN0QztTQUNGLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNY3BBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB0eXBlIHsgTWNwT0F1dGhIYW5kbGVyLCBNY3BPQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgdGhlIGAvb2F1dGgvYXV0aG9yaXplYCBwcm94eSBlbmRwb2ludC5cbiAqIFN0cmlwcyBjb25maWd1cmVkIHBhcmFtZXRlcnMgKGRlZmF1bHQ6ICdyZXNvdXJjZScpIGJlZm9yZSByZWRpcmVjdGluZ1xuICogdG8gdGhlIHVwc3RyZWFtIGF1dGhvcml6YXRpb24gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRob3JpemVIYW5kbGVyKGNvbmZpZzogTWNwQXV0aENvbmZpZyk6IE1jcE9BdXRoSGFuZGxlciB7XG4gIHJldHVybiBhc3luYyAoZXZlbnQpOiBQcm9taXNlPE1jcE9BdXRoUmVzcG9uc2U+ID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcblxuICAgIC8vIFN0cmlwIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgKGUuZy4gUkZDIDg3MDcgJ3Jlc291cmNlJylcbiAgICBjb25zdCBzdHJpcFBhcmFtcyA9IGNvbmZpZy5zdHJpcFBhcmFtZXRlcnMgPz8gWydyZXNvdXJjZSddO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygc3RyaXBQYXJhbXMpIHtcbiAgICAgIHBhcmFtcy5kZWxldGUocGFyYW0pO1xuICAgIH1cblxuICAgIGNvbnN0IHVwc3RyZWFtVXJsID0gYCR7Y29uZmlnLmF1dGhvcml6ZUVuZHBvaW50fT8ke3BhcmFtcy50b1N0cmluZygpfWA7XG5cbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudDogJ29hdXRoLWF1dGhvcml6ZS1wcm94eScsXG4gICAgICB1cHN0cmVhbVVybCxcbiAgICAgIHN0cmlwcGVkUGFyYW1zOiBzdHJpcFBhcmFtcy5maWx0ZXIocCA9PiBldmVudC5xdWVyeVN0cmluZ1BhcmFtZXRlcnM/LltwXSksXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDMwMixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0xvY2F0aW9uJzogdXBzdHJlYW1VcmwsXG4gICAgICAgICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlLCBuby1zdG9yZScsXG4gICAgICB9LFxuICAgIH07XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./authorize"), exports);
|
|
19
|
+
__exportStar(require("./authorization-server"), exports);
|
|
20
|
+
__exportStar(require("./protected-resource"), exports);
|
|
21
|
+
__exportStar(require("./register"), exports);
|
|
22
|
+
__exportStar(require("./token"), exports);
|
|
23
|
+
__exportStar(require("./validate-redirect-uris"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4Qiw4Q0FBNEI7QUFDNUIseURBQXVDO0FBQ3ZDLHVEQUFxQztBQUNyQyw2Q0FBMkI7QUFDM0IsMENBQXdCO0FBQ3hCLDJEQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRob3JpemUnO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRob3JpemF0aW9uLXNlcnZlcic7XG5leHBvcnQgKiBmcm9tICcuL3Byb3RlY3RlZC1yZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL3JlZ2lzdGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdG9rZW4nO1xuZXhwb3J0ICogZnJvbSAnLi92YWxpZGF0ZS1yZWRpcmVjdC11cmlzJztcbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpAuthConfig } from '../config';
|
|
2
|
+
import type { McpOAuthHandler } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the `/.well-known/oauth-protected-resource` endpoint (RFC 9728).
|
|
5
|
+
* Returns the resource identifier and authorization servers.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createProtectedResourceHandler(config: McpAuthConfig): McpOAuthHandler;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProtectedResourceHandler = createProtectedResourceHandler;
|
|
4
|
+
/**
|
|
5
|
+
* Factory for the `/.well-known/oauth-protected-resource` endpoint (RFC 9728).
|
|
6
|
+
* Returns the resource identifier and authorization servers.
|
|
7
|
+
*/
|
|
8
|
+
function createProtectedResourceHandler(config) {
|
|
9
|
+
return async (event) => {
|
|
10
|
+
console.log(JSON.stringify({
|
|
11
|
+
event: 'oauth-protected-resource',
|
|
12
|
+
method: event.httpMethod,
|
|
13
|
+
path: event.path,
|
|
14
|
+
}));
|
|
15
|
+
const body = {
|
|
16
|
+
resource: `https://${config.apiDomain}/mcp`,
|
|
17
|
+
authorization_servers: [`https://${config.apiDomain}`],
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
statusCode: 200,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
body: JSON.stringify(body),
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdGVjdGVkLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21jcC1hdXRoL2hhbmRsZXJzL3Byb3RlY3RlZC1yZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHdFQW1CQztBQXZCRDs7O0dBR0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxNQUFxQjtJQUNsRSxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQTZCLEVBQUU7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3pCLEtBQUssRUFBRSwwQkFBMEI7WUFDakMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQ3hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDLENBQUMsQ0FBQztRQUVKLE1BQU0sSUFBSSxHQUFHO1lBQ1gsUUFBUSxFQUFFLFdBQVcsTUFBTSxDQUFDLFNBQVMsTUFBTTtZQUMzQyxxQkFBcUIsRUFBRSxDQUFDLFdBQVcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3ZELENBQUM7UUFFRixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzNCLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNY3BBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB0eXBlIHsgTWNwT0F1dGhIYW5kbGVyLCBNY3BPQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgdGhlIGAvLndlbGwta25vd24vb2F1dGgtcHJvdGVjdGVkLXJlc291cmNlYCBlbmRwb2ludCAoUkZDIDk3MjgpLlxuICogUmV0dXJucyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllciBhbmQgYXV0aG9yaXphdGlvbiBzZXJ2ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvdGVjdGVkUmVzb3VyY2VIYW5kbGVyKGNvbmZpZzogTWNwQXV0aENvbmZpZyk6IE1jcE9BdXRoSGFuZGxlciB7XG4gIHJldHVybiBhc3luYyAoZXZlbnQpOiBQcm9taXNlPE1jcE9BdXRoUmVzcG9uc2U+ID0+IHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudDogJ29hdXRoLXByb3RlY3RlZC1yZXNvdXJjZScsXG4gICAgICBtZXRob2Q6IGV2ZW50Lmh0dHBNZXRob2QsXG4gICAgICBwYXRoOiBldmVudC5wYXRoLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICByZXNvdXJjZTogYGh0dHBzOi8vJHtjb25maWcuYXBpRG9tYWlufS9tY3BgLFxuICAgICAgYXV0aG9yaXphdGlvbl9zZXJ2ZXJzOiBbYGh0dHBzOi8vJHtjb25maWcuYXBpRG9tYWlufWBdLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpAuthConfig } from '../config';
|
|
2
|
+
import type { McpOAuthHandler } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the `/oauth/register` endpoint (RFC 7591 simplified).
|
|
5
|
+
* Validates redirect URIs against the allowlist and returns the pre-provisioned client_id.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createRegisterHandler(config: McpAuthConfig): McpOAuthHandler;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRegisterHandler = createRegisterHandler;
|
|
4
|
+
const validate_redirect_uris_1 = require("./validate-redirect-uris");
|
|
5
|
+
/**
|
|
6
|
+
* Factory for the `/oauth/register` endpoint (RFC 7591 simplified).
|
|
7
|
+
* Validates redirect URIs against the allowlist and returns the pre-provisioned client_id.
|
|
8
|
+
*/
|
|
9
|
+
function createRegisterHandler(config) {
|
|
10
|
+
return async (event) => {
|
|
11
|
+
console.log(JSON.stringify({
|
|
12
|
+
event: 'register-oauth-client',
|
|
13
|
+
method: event.httpMethod,
|
|
14
|
+
path: event.path,
|
|
15
|
+
}));
|
|
16
|
+
// Parse body
|
|
17
|
+
const rawBody = event.isBase64Encoded
|
|
18
|
+
? Buffer.from(event.body ?? '', 'base64').toString('utf-8')
|
|
19
|
+
: (event.body ?? '');
|
|
20
|
+
let data;
|
|
21
|
+
try {
|
|
22
|
+
data = typeof rawBody === 'string' ? JSON.parse(rawBody) : rawBody;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return {
|
|
26
|
+
statusCode: 400,
|
|
27
|
+
headers: { 'Content-Type': 'application/json' },
|
|
28
|
+
body: JSON.stringify({ error: 'invalid_request', error_description: 'Malformed JSON body' }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (data === null || typeof data !== 'object' || Array.isArray(data)) {
|
|
32
|
+
return {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
headers: { 'Content-Type': 'application/json' },
|
|
35
|
+
body: JSON.stringify({ error: 'invalid_request', error_description: 'Request body must be a JSON object' }),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const redirectUris = data.redirect_uris;
|
|
39
|
+
const clientName = data.client_name ?? 'MCP Connector';
|
|
40
|
+
if (!redirectUris || !Array.isArray(redirectUris) || redirectUris.length === 0) {
|
|
41
|
+
return {
|
|
42
|
+
statusCode: 400,
|
|
43
|
+
headers: { 'Content-Type': 'application/json' },
|
|
44
|
+
body: JSON.stringify({ error: 'invalid_request', error_description: 'redirect_uris is required' }),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (!(0, validate_redirect_uris_1.validateRedirectUris)(redirectUris, config.allowedRedirectUris)) {
|
|
48
|
+
return {
|
|
49
|
+
statusCode: 400,
|
|
50
|
+
headers: { 'Content-Type': 'application/json' },
|
|
51
|
+
body: JSON.stringify({ error: 'invalid_redirect_uri', error_description: 'One or more redirect_uris are not allowed' }),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const response = {
|
|
55
|
+
client_id: config.clientId,
|
|
56
|
+
client_name: clientName,
|
|
57
|
+
redirect_uris: redirectUris,
|
|
58
|
+
token_endpoint_auth_method: 'none',
|
|
59
|
+
};
|
|
60
|
+
console.log(JSON.stringify({ event: 'register-oauth-client-response', status: 201, body: response }));
|
|
61
|
+
return {
|
|
62
|
+
statusCode: 201,
|
|
63
|
+
headers: { 'Content-Type': 'application/json' },
|
|
64
|
+
body: JSON.stringify(response),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSxzREFrRUM7QUF4RUQscUVBQWdFO0FBRWhFOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE1BQXFCO0lBQ3pELE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBNkIsRUFBRTtRQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekIsS0FBSyxFQUFFLHVCQUF1QjtZQUM5QixNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDeEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUosYUFBYTtRQUNiLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxlQUFlO1lBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDM0QsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV2QixJQUFJLElBQTZCLENBQUM7UUFDbEMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3JFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHO2dCQUNmLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQzthQUM3RixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU87Z0JBQ0wsVUFBVSxFQUFFLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO2dCQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQ0FBb0MsRUFBRSxDQUFDO2FBQzVHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQXFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQUksSUFBSSxDQUFDLFdBQXNCLElBQUksZUFBZSxDQUFDO1FBRW5FLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0UsT0FBTztnQkFDTCxVQUFVLEVBQUUsR0FBRztnQkFDZixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLDJCQUEyQixFQUFFLENBQUM7YUFDbkcsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBQSw2Q0FBb0IsRUFBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUNwRSxPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHO2dCQUNmLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtnQkFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsMkNBQTJDLEVBQUUsQ0FBQzthQUN4SCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQzFCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGFBQWEsRUFBRSxZQUFZO1lBQzNCLDBCQUEwQixFQUFFLE1BQU07U0FDbkMsQ0FBQztRQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFdEcsT0FBTztZQUNMLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztTQUMvQixDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTWNwQXV0aENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgdHlwZSB7IE1jcE9BdXRoSGFuZGxlciwgTWNwT0F1dGhSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVSZWRpcmVjdFVyaXMgfSBmcm9tICcuL3ZhbGlkYXRlLXJlZGlyZWN0LXVyaXMnO1xuXG4vKipcbiAqIEZhY3RvcnkgZm9yIHRoZSBgL29hdXRoL3JlZ2lzdGVyYCBlbmRwb2ludCAoUkZDIDc1OTEgc2ltcGxpZmllZCkuXG4gKiBWYWxpZGF0ZXMgcmVkaXJlY3QgVVJJcyBhZ2FpbnN0IHRoZSBhbGxvd2xpc3QgYW5kIHJldHVybnMgdGhlIHByZS1wcm92aXNpb25lZCBjbGllbnRfaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWdpc3RlckhhbmRsZXIoY29uZmlnOiBNY3BBdXRoQ29uZmlnKTogTWNwT0F1dGhIYW5kbGVyIHtcbiAgcmV0dXJuIGFzeW5jIChldmVudCk6IFByb21pc2U8TWNwT0F1dGhSZXNwb25zZT4gPT4ge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAncmVnaXN0ZXItb2F1dGgtY2xpZW50JyxcbiAgICAgIG1ldGhvZDogZXZlbnQuaHR0cE1ldGhvZCxcbiAgICAgIHBhdGg6IGV2ZW50LnBhdGgsXG4gICAgfSkpO1xuXG4gICAgLy8gUGFyc2UgYm9keVxuICAgIGNvbnN0IHJhd0JvZHkgPSBldmVudC5pc0Jhc2U2NEVuY29kZWRcbiAgICAgID8gQnVmZmVyLmZyb20oZXZlbnQuYm9keSA/PyAnJywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpXG4gICAgICA6IChldmVudC5ib2R5ID8/ICcnKTtcblxuICAgIGxldCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IHR5cGVvZiByYXdCb2R5ID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UocmF3Qm9keSkgOiByYXdCb2R5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ2ludmFsaWRfcmVxdWVzdCcsIGVycm9yX2Rlc2NyaXB0aW9uOiAnTWFsZm9ybWVkIEpTT04gYm9keScgfSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVycm9yOiAnaW52YWxpZF9yZXF1ZXN0JywgZXJyb3JfZGVzY3JpcHRpb246ICdSZXF1ZXN0IGJvZHkgbXVzdCBiZSBhIEpTT04gb2JqZWN0JyB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RVcmlzID0gZGF0YS5yZWRpcmVjdF91cmlzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNsaWVudE5hbWUgPSAoZGF0YS5jbGllbnRfbmFtZSBhcyBzdHJpbmcpID8/ICdNQ1AgQ29ubmVjdG9yJztcblxuICAgIGlmICghcmVkaXJlY3RVcmlzIHx8ICFBcnJheS5pc0FycmF5KHJlZGlyZWN0VXJpcykgfHwgcmVkaXJlY3RVcmlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ2ludmFsaWRfcmVxdWVzdCcsIGVycm9yX2Rlc2NyaXB0aW9uOiAncmVkaXJlY3RfdXJpcyBpcyByZXF1aXJlZCcgfSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdmFsaWRhdGVSZWRpcmVjdFVyaXMocmVkaXJlY3RVcmlzLCBjb25maWcuYWxsb3dlZFJlZGlyZWN0VXJpcykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdpbnZhbGlkX3JlZGlyZWN0X3VyaScsIGVycm9yX2Rlc2NyaXB0aW9uOiAnT25lIG9yIG1vcmUgcmVkaXJlY3RfdXJpcyBhcmUgbm90IGFsbG93ZWQnIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgIGNsaWVudF9pZDogY29uZmlnLmNsaWVudElkLFxuICAgICAgY2xpZW50X25hbWU6IGNsaWVudE5hbWUsXG4gICAgICByZWRpcmVjdF91cmlzOiByZWRpcmVjdFVyaXMsXG4gICAgICB0b2tlbl9lbmRwb2ludF9hdXRoX21ldGhvZDogJ25vbmUnLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGV2ZW50OiAncmVnaXN0ZXItb2F1dGgtY2xpZW50LXJlc3BvbnNlJywgc3RhdHVzOiAyMDEsIGJvZHk6IHJlc3BvbnNlIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiAyMDEsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSxcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpAuthConfig } from '../config';
|
|
2
|
+
import type { McpOAuthHandler } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for the `/oauth/token` proxy endpoint.
|
|
5
|
+
* Forwards token exchange to the upstream token endpoint,
|
|
6
|
+
* stripping configured parameters from the request body.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createTokenHandler(config: McpAuthConfig): McpOAuthHandler;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTokenHandler = createTokenHandler;
|
|
4
|
+
const ALLOWED_GRANT_TYPES = ['authorization_code', 'refresh_token'];
|
|
5
|
+
/**
|
|
6
|
+
* Factory for the `/oauth/token` proxy endpoint.
|
|
7
|
+
* Forwards token exchange to the upstream token endpoint,
|
|
8
|
+
* stripping configured parameters from the request body.
|
|
9
|
+
*/
|
|
10
|
+
function createTokenHandler(config) {
|
|
11
|
+
return async (event) => {
|
|
12
|
+
const tokenUrl = config.tokenEndpoint;
|
|
13
|
+
// Decode body if base64-encoded
|
|
14
|
+
const rawBody = event.isBase64Encoded
|
|
15
|
+
? Buffer.from(event.body ?? '', 'base64').toString('utf-8')
|
|
16
|
+
: (event.body ?? '');
|
|
17
|
+
// Parse form-encoded body and strip unsupported parameters
|
|
18
|
+
const params = new URLSearchParams(rawBody);
|
|
19
|
+
const stripParamsList = config.stripParameters ?? ['resource'];
|
|
20
|
+
for (const param of stripParamsList) {
|
|
21
|
+
params.delete(param);
|
|
22
|
+
}
|
|
23
|
+
// Validate grant_type
|
|
24
|
+
const grantType = params.get('grant_type');
|
|
25
|
+
if (!grantType || !ALLOWED_GRANT_TYPES.includes(grantType)) {
|
|
26
|
+
return {
|
|
27
|
+
statusCode: 400,
|
|
28
|
+
headers: { 'Content-Type': 'application/json' },
|
|
29
|
+
body: JSON.stringify({ error: 'unsupported_grant_type', error_description: `grant_type must be one of: ${ALLOWED_GRANT_TYPES.join(', ')}` }),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const body = params.toString();
|
|
33
|
+
console.log(JSON.stringify({
|
|
34
|
+
event: 'oauth-token-proxy',
|
|
35
|
+
tokenUrl,
|
|
36
|
+
grantType,
|
|
37
|
+
}));
|
|
38
|
+
let responseBody;
|
|
39
|
+
let statusCode;
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const timeout = setTimeout(() => controller.abort(), 10000);
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(tokenUrl, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
46
|
+
body,
|
|
47
|
+
signal: controller.signal,
|
|
48
|
+
});
|
|
49
|
+
responseBody = await response.text();
|
|
50
|
+
statusCode = response.status;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
console.log(JSON.stringify({ event: 'oauth-token-proxy-error', error: err.message }));
|
|
54
|
+
return {
|
|
55
|
+
statusCode: 502,
|
|
56
|
+
headers: { 'Content-Type': 'application/json' },
|
|
57
|
+
body: JSON.stringify({ error: 'upstream_error', error_description: 'Token endpoint unreachable' }),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
clearTimeout(timeout);
|
|
62
|
+
}
|
|
63
|
+
console.log(JSON.stringify({
|
|
64
|
+
event: 'oauth-token-proxy-response',
|
|
65
|
+
status: statusCode,
|
|
66
|
+
}));
|
|
67
|
+
return {
|
|
68
|
+
statusCode,
|
|
69
|
+
headers: { 'Content-Type': 'application/json' },
|
|
70
|
+
body: responseBody,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFVQSxnREFxRUM7QUE1RUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLG9CQUFvQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRXBFOzs7O0dBSUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFxQjtJQUN0RCxPQUFPLEtBQUssRUFBRSxLQUFLLEVBQTZCLEVBQUU7UUFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUV0QyxnQ0FBZ0M7UUFDaEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGVBQWU7WUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXZCLDJEQUEyRDtRQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsS0FBSyxNQUFNLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsT0FBTztnQkFDTCxVQUFVLEVBQUUsR0FBRztnQkFDZixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLDhCQUE4QixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQzdJLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRS9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN6QixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRTtnQkFDaEUsSUFBSTtnQkFDSixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JDLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRyxHQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pHLE9BQU87Z0JBQ0wsVUFBVSxFQUFFLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO2dCQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxDQUFDO2FBQ25HLENBQUM7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN6QixLQUFLLEVBQUUsNEJBQTRCO1lBQ25DLE1BQU0sRUFBRSxVQUFVO1NBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUosT0FBTztZQUNMLFVBQVU7WUFDVixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLFlBQVk7U0FDbkIsQ0FBQztJQUNKLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1jcEF1dGhDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBNY3BPQXV0aEhhbmRsZXIsIE1jcE9BdXRoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQUxMT1dFRF9HUkFOVF9UWVBFUyA9IFsnYXV0aG9yaXphdGlvbl9jb2RlJywgJ3JlZnJlc2hfdG9rZW4nXTtcblxuLyoqXG4gKiBGYWN0b3J5IGZvciB0aGUgYC9vYXV0aC90b2tlbmAgcHJveHkgZW5kcG9pbnQuXG4gKiBGb3J3YXJkcyB0b2tlbiBleGNoYW5nZSB0byB0aGUgdXBzdHJlYW0gdG9rZW4gZW5kcG9pbnQsXG4gKiBzdHJpcHBpbmcgY29uZmlndXJlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QgYm9keS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRva2VuSGFuZGxlcihjb25maWc6IE1jcEF1dGhDb25maWcpOiBNY3BPQXV0aEhhbmRsZXIge1xuICByZXR1cm4gYXN5bmMgKGV2ZW50KTogUHJvbWlzZTxNY3BPQXV0aFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgdG9rZW5VcmwgPSBjb25maWcudG9rZW5FbmRwb2ludDtcblxuICAgIC8vIERlY29kZSBib2R5IGlmIGJhc2U2NC1lbmNvZGVkXG4gICAgY29uc3QgcmF3Qm9keSA9IGV2ZW50LmlzQmFzZTY0RW5jb2RlZFxuICAgICAgPyBCdWZmZXIuZnJvbShldmVudC5ib2R5ID8/ICcnLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgIDogKGV2ZW50LmJvZHkgPz8gJycpO1xuXG4gICAgLy8gUGFyc2UgZm9ybS1lbmNvZGVkIGJvZHkgYW5kIHN0cmlwIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnNcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHJhd0JvZHkpO1xuICAgIGNvbnN0IHN0cmlwUGFyYW1zTGlzdCA9IGNvbmZpZy5zdHJpcFBhcmFtZXRlcnMgPz8gWydyZXNvdXJjZSddO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygc3RyaXBQYXJhbXNMaXN0KSB7XG4gICAgICBwYXJhbXMuZGVsZXRlKHBhcmFtKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBncmFudF90eXBlXG4gICAgY29uc3QgZ3JhbnRUeXBlID0gcGFyYW1zLmdldCgnZ3JhbnRfdHlwZScpO1xuICAgIGlmICghZ3JhbnRUeXBlIHx8ICFBTExPV0VEX0dSQU5UX1RZUEVTLmluY2x1ZGVzKGdyYW50VHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICd1bnN1cHBvcnRlZF9ncmFudF90eXBlJywgZXJyb3JfZGVzY3JpcHRpb246IGBncmFudF90eXBlIG11c3QgYmUgb25lIG9mOiAke0FMTE9XRURfR1JBTlRfVFlQRVMuam9pbignLCAnKX1gIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudDogJ29hdXRoLXRva2VuLXByb3h5JyxcbiAgICAgIHRva2VuVXJsLFxuICAgICAgZ3JhbnRUeXBlLFxuICAgIH0pKTtcblxuICAgIGxldCByZXNwb25zZUJvZHk6IHN0cmluZztcbiAgICBsZXQgc3RhdHVzQ29kZTogbnVtYmVyO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAxMF8wMDApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRva2VuVXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9LFxuICAgICAgICBib2R5LFxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBzdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBldmVudDogJ29hdXRoLXRva2VuLXByb3h5LWVycm9yJywgZXJyb3I6IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UgfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogNTAyLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ3Vwc3RyZWFtX2Vycm9yJywgZXJyb3JfZGVzY3JpcHRpb246ICdUb2tlbiBlbmRwb2ludCB1bnJlYWNoYWJsZScgfSksXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6ICdvYXV0aC10b2tlbi1wcm94eS1yZXNwb25zZScsXG4gICAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IHJlc3BvbnNlQm9keSxcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A generic Lambda-like handler: receives an event (simplified) and returns
|
|
3
|
+
* a response with statusCode, headers, and body.
|
|
4
|
+
*/
|
|
5
|
+
export interface McpOAuthResponse {
|
|
6
|
+
statusCode: number;
|
|
7
|
+
headers: Record<string, string>;
|
|
8
|
+
body?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface McpOAuthEvent {
|
|
11
|
+
httpMethod: string;
|
|
12
|
+
path: string;
|
|
13
|
+
headers: Record<string, string | undefined>;
|
|
14
|
+
queryStringParameters: Record<string, string | undefined> | null;
|
|
15
|
+
body: string | null;
|
|
16
|
+
isBase64Encoded: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Handler function signature returned by all factories.
|
|
20
|
+
*/
|
|
21
|
+
export type McpOAuthHandler = (event: McpOAuthEvent) => Promise<McpOAuthResponse>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBnZW5lcmljIExhbWJkYS1saWtlIGhhbmRsZXI6IHJlY2VpdmVzIGFuIGV2ZW50IChzaW1wbGlmaWVkKSBhbmQgcmV0dXJuc1xuICogYSByZXNwb25zZSB3aXRoIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGFuZCBib2R5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1jcE9BdXRoUmVzcG9uc2Uge1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJvZHk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWNwT0F1dGhFdmVudCB7XG4gIGh0dHBNZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCBudWxsO1xuICBib2R5OiBzdHJpbmcgfCBudWxsO1xuICBpc0Jhc2U2NEVuY29kZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSGFuZGxlciBmdW5jdGlvbiBzaWduYXR1cmUgcmV0dXJuZWQgYnkgYWxsIGZhY3Rvcmllcy5cbiAqL1xuZXhwb3J0IHR5cGUgTWNwT0F1dGhIYW5kbGVyID0gKGV2ZW50OiBNY3BPQXV0aEV2ZW50KSA9PiBQcm9taXNlPE1jcE9BdXRoUmVzcG9uc2U+O1xuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default allowlisted redirect URIs for MCP connector registration.
|
|
3
|
+
* These cover the most common MCP-compatible clients.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_ALLOWED_REDIRECT_URIS: readonly string[];
|
|
6
|
+
/**
|
|
7
|
+
* Returns true if every URI in the list is on the allowlist.
|
|
8
|
+
* Uses the provided allowlist or falls back to the default.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateRedirectUris(uris: string[], allowlist?: readonly string[]): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_ALLOWED_REDIRECT_URIS = void 0;
|
|
4
|
+
exports.validateRedirectUris = validateRedirectUris;
|
|
5
|
+
/**
|
|
6
|
+
* Default allowlisted redirect URIs for MCP connector registration.
|
|
7
|
+
* These cover the most common MCP-compatible clients.
|
|
8
|
+
*/
|
|
9
|
+
exports.DEFAULT_ALLOWED_REDIRECT_URIS = [
|
|
10
|
+
'https://claude.ai/oauth/callback',
|
|
11
|
+
'https://claude.ai/api/mcp/auth_callback',
|
|
12
|
+
'https://chatgpt.com/oauth/callback',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Returns true if every URI in the list is on the allowlist.
|
|
16
|
+
* Uses the provided allowlist or falls back to the default.
|
|
17
|
+
*/
|
|
18
|
+
function validateRedirectUris(uris, allowlist) {
|
|
19
|
+
const list = allowlist ?? exports.DEFAULT_ALLOWED_REDIRECT_URIS;
|
|
20
|
+
return uris.every(uri => list.includes(uri));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtcmVkaXJlY3QtdXJpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tY3AtYXV0aC9oYW5kbGVycy92YWxpZGF0ZS1yZWRpcmVjdC11cmlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWNBLG9EQUdDO0FBakJEOzs7R0FHRztBQUNVLFFBQUEsNkJBQTZCLEdBQXNCO0lBQzlELGtDQUFrQztJQUNsQyx5Q0FBeUM7SUFDekMsb0NBQW9DO0NBQ3JDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxJQUFjLEVBQUUsU0FBNkI7SUFDaEYsTUFBTSxJQUFJLEdBQUcsU0FBUyxJQUFJLHFDQUE2QixDQUFDO0lBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0IGFsbG93bGlzdGVkIHJlZGlyZWN0IFVSSXMgZm9yIE1DUCBjb25uZWN0b3IgcmVnaXN0cmF0aW9uLlxuICogVGhlc2UgY292ZXIgdGhlIG1vc3QgY29tbW9uIE1DUC1jb21wYXRpYmxlIGNsaWVudHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FMTE9XRURfUkVESVJFQ1RfVVJJUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdodHRwczovL2NsYXVkZS5haS9vYXV0aC9jYWxsYmFjaycsXG4gICdodHRwczovL2NsYXVkZS5haS9hcGkvbWNwL2F1dGhfY2FsbGJhY2snLFxuICAnaHR0cHM6Ly9jaGF0Z3B0LmNvbS9vYXV0aC9jYWxsYmFjaycsXG5dO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBldmVyeSBVUkkgaW4gdGhlIGxpc3QgaXMgb24gdGhlIGFsbG93bGlzdC5cbiAqIFVzZXMgdGhlIHByb3ZpZGVkIGFsbG93bGlzdCBvciBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZWRpcmVjdFVyaXModXJpczogc3RyaW5nW10sIGFsbG93bGlzdD86IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxpc3QgPSBhbGxvd2xpc3QgPz8gREVGQVVMVF9BTExPV0VEX1JFRElSRUNUX1VSSVM7XG4gIHJldHVybiB1cmlzLmV2ZXJ5KHVyaSA9PiBsaXN0LmluY2x1ZGVzKHVyaSkpO1xufVxuIl19
|