@atxp/server 0.2.22 → 0.4.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/dist/atxpContext.js +9 -6
- package/dist/atxpContext.js.map +1 -1
- package/dist/core/mcp.js +39 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/{oAuthChallenge.js → core/oauth.js} +21 -12
- package/dist/core/oauth.js.map +1 -0
- package/dist/{token.js → core/token.js} +13 -7
- package/dist/core/token.js.map +1 -0
- package/dist/getResource.js +23 -4
- package/dist/getResource.js.map +1 -1
- package/dist/index.cjs +654 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +197 -5
- package/dist/index.js +609 -5
- package/dist/index.js.map +1 -1
- package/dist/node/getRawBody.js +35 -0
- package/dist/node/getRawBody.js.map +1 -0
- package/dist/node/http.js +49 -0
- package/dist/node/http.js.map +1 -0
- package/dist/node/oauth.js +41 -0
- package/dist/node/oauth.js.map +1 -0
- package/dist/node/token.js +15 -0
- package/dist/node/token.js.map +1 -0
- package/dist/oAuthMetadata.js +6 -12
- package/dist/oAuthMetadata.js.map +1 -1
- package/dist/paymentServer.js +5 -20
- package/dist/paymentServer.js.map +1 -1
- package/dist/protectedResourceMetadata.js +10 -16
- package/dist/protectedResourceMetadata.js.map +1 -1
- package/dist/requirePayment.js +7 -4
- package/dist/requirePayment.js.map +1 -1
- package/dist/serverConfig.js +37 -0
- package/dist/serverConfig.js.map +1 -0
- package/dist/serverTestHelpers.d.ts +70 -21
- package/dist/serverTestHelpers.js +55 -24
- package/dist/serverTestHelpers.js.map +1 -1
- package/dist/types.js +4 -2
- package/dist/types.js.map +1 -1
- package/dist/webapi/mcp.js +25 -0
- package/dist/webapi/mcp.js.map +1 -0
- package/dist/webapi/oauth.js +43 -0
- package/dist/webapi/oauth.js.map +1 -0
- package/dist/webapi/token.js +15 -0
- package/dist/webapi/token.js.map +1 -0
- package/package.json +24 -10
- package/dist/atxpContext.d.ts +0 -6
- package/dist/atxpContext.d.ts.map +0 -1
- package/dist/atxpServer.d.ts +0 -12
- package/dist/atxpServer.d.ts.map +0 -1
- package/dist/atxpServer.js +0 -101
- package/dist/atxpServer.js.map +0 -1
- package/dist/getResource.d.ts +0 -4
- package/dist/getResource.d.ts.map +0 -1
- package/dist/http.d.ts +0 -7
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -51
- package/dist/http.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/oAuthChallenge.d.ts +0 -4
- package/dist/oAuthChallenge.d.ts.map +0 -1
- package/dist/oAuthChallenge.js.map +0 -1
- package/dist/oAuthMetadata.d.ts +0 -6
- package/dist/oAuthMetadata.d.ts.map +0 -1
- package/dist/paymentServer.d.ts +0 -62
- package/dist/paymentServer.d.ts.map +0 -1
- package/dist/protectedResourceMetadata.d.ts +0 -5
- package/dist/protectedResourceMetadata.d.ts.map +0 -1
- package/dist/requirePayment.d.ts +0 -3
- package/dist/requirePayment.d.ts.map +0 -1
- package/dist/serverTestHelpers.d.ts.map +0 -1
- package/dist/token.d.ts +0 -4
- package/dist/token.d.ts.map +0 -1
- package/dist/token.js.map +0 -1
- package/dist/types.d.ts +0 -60
- package/dist/types.d.ts.map +0 -1
package/dist/atxpContext.js
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
|
|
2
3
|
const contextStorage = new AsyncLocalStorage();
|
|
3
|
-
|
|
4
|
+
function getATXPConfig() {
|
|
4
5
|
const context = contextStorage.getStore();
|
|
5
6
|
return context?.config ?? null;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
+
function getATXPResource() {
|
|
8
9
|
const context = contextStorage.getStore();
|
|
9
10
|
return context?.resource ?? null;
|
|
10
11
|
}
|
|
11
12
|
// Helper function to get the current request's user
|
|
12
|
-
|
|
13
|
+
function atxpAccountId() {
|
|
13
14
|
const context = contextStorage.getStore();
|
|
14
15
|
return context?.tokenData?.sub ?? null;
|
|
15
16
|
}
|
|
16
17
|
// Helper function to run code within a user context
|
|
17
|
-
|
|
18
|
+
async function withATXPContext(config, resource, tokenInfo, next) {
|
|
18
19
|
config.logger.debug(`Setting user context to ${tokenInfo?.data?.sub ?? 'null'}`);
|
|
19
20
|
if (tokenInfo && tokenInfo.data?.sub) {
|
|
20
21
|
if (tokenInfo.token) {
|
|
@@ -38,4 +39,6 @@ export async function withATXPContext(config, resource, tokenInfo, next) {
|
|
|
38
39
|
};
|
|
39
40
|
return contextStorage.run(ctx, next);
|
|
40
41
|
}
|
|
41
|
-
|
|
42
|
+
|
|
43
|
+
export { atxpAccountId, getATXPConfig, getATXPResource, withATXPContext };
|
|
44
|
+
//# sourceMappingURL=atxpContext.js.map
|
package/dist/atxpContext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atxpContext.js","
|
|
1
|
+
{"version":3,"file":"atxpContext.js","sources":["../src/atxpContext.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAsB;SAQlD,aAAa,GAAA;AAC3B,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE;AACzC,IAAA,OAAO,OAAO,EAAE,MAAM,IAAI,IAAI;AAChC;SAEgB,eAAe,GAAA;AAC7B,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE;AACzC,IAAA,OAAO,OAAO,EAAE,QAAQ,IAAI,IAAI;AAClC;AAEA;SACgB,aAAa,GAAA;AAC3B,IAAA,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE;AACzC,IAAA,OAAO,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI;AACxC;AAEA;AACO,eAAe,eAAe,CAAC,MAAkB,EAAE,QAAa,EAAE,SAAoD,EAAE,IAAgB,EAAA;AAC7I,IAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,wBAAA,EAA2B,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,CAAA,CAAE,CAAC;IAEhF,IAAG,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE;AACnC,QAAA,IAAG,SAAS,CAAC,KAAK,EAAE;AAClB,YAAA,MAAM,MAAM,GAAG;gBACb,WAAW,EAAE,SAAS,CAAC,KAAM;AAC7B,gBAAA,WAAW,EAAE;aACd;;;AAGD,YAAA,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC;QACtE;aAAO;AACL,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,qJAAA,CAAuJ,CAAC;AAC3K,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;QACtE;IACF;AAEA,IAAA,MAAM,GAAG,GAAG;AACV,QAAA,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI;QAClC,MAAM;QACN;KACD;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AACtC;;;;"}
|
package/dist/core/mcp.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core platform-agnostic MCP request parsing logic
|
|
3
|
+
* Takes parsed JSON and request metadata instead of platform-specific request objects
|
|
4
|
+
*/
|
|
5
|
+
function parseMcpRequestsCore(config, requestUrl, method, parsedBody) {
|
|
6
|
+
if (!method || method.toLowerCase() !== 'post') {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
// The middleware has to be mounted at the root to serve the protected resource metadata,
|
|
10
|
+
// but the actual MCP server it's controlling is specified by the mountPath.
|
|
11
|
+
const path = requestUrl.pathname.replace(/\/$/, '');
|
|
12
|
+
const mountPath = config.mountPath.replace(/\/$/, '');
|
|
13
|
+
if (path !== mountPath && path !== `${mountPath}/message`) {
|
|
14
|
+
config.logger.debug(`Request path (${path}) does not match the mountPath (${mountPath}), skipping MCP middleware`);
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
if (!parsedBody || typeof parsedBody !== 'object') {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
// Check if it's a JSON-RPC request
|
|
21
|
+
if (Array.isArray(parsedBody)) {
|
|
22
|
+
// Batch request
|
|
23
|
+
return parsedBody.filter(msg => msg && typeof msg === 'object' &&
|
|
24
|
+
msg.jsonrpc === '2.0' &&
|
|
25
|
+
msg.method &&
|
|
26
|
+
msg.id !== undefined);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Single request
|
|
30
|
+
const body = parsedBody;
|
|
31
|
+
if (body.jsonrpc === '2.0' && body.method && body.id !== undefined) {
|
|
32
|
+
return [body];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { parseMcpRequestsCore };
|
|
39
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sources":["../../src/core/mcp.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAClC,MAAkB,EAClB,UAAe,EACf,MAAc,EACd,UAAmB,EAAA;IAEnB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;AAC9C,QAAA,OAAO,EAAE;IACX;;;AAIA,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACnD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACrD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,CAAA,EAAG,SAAS,CAAA,QAAA,CAAU,EAAE;QACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAA,gCAAA,EAAmC,SAAS,CAAA,0BAAA,CAA4B,CAAC;AAClH,QAAA,OAAO,EAAE;IACX;IAEA,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AACjD,QAAA,OAAO,EAAE;IACX;;AAGA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;;AAE7B,QAAA,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,IAC1B,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAC9B,GAAG,CAAC,OAAO,KAAK,KAAK;AACrB,YAAA,GAAG,CAAC,MAAM;AACV,YAAA,GAAG,CAAC,EAAE,KAAK,SAAS,CACrB;IACH;SAAO;;QAEL,MAAM,IAAI,GAAG,UAA+D;AAC5E,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;YAClE,OAAO,CAAC,IAAI,CAAC;QACf;IACF;AAEA,IAAA,OAAO,EAAE;AACX;;;;"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { TokenProblem } from
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { TokenProblem } from '../types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core platform-agnostic OAuth challenge response creation
|
|
5
|
+
* Returns the response data instead of writing to platform-specific response objects
|
|
6
|
+
*/
|
|
7
|
+
function createOAuthChallengeResponseCore(tokenCheck) {
|
|
4
8
|
if (tokenCheck.passes) {
|
|
5
|
-
return
|
|
9
|
+
return null;
|
|
6
10
|
}
|
|
7
11
|
let status = 401;
|
|
8
12
|
let body = {};
|
|
@@ -18,7 +22,7 @@ export function sendOAuthChallenge(res, tokenCheck) {
|
|
|
18
22
|
body = { error: 'invalid_token', error_description: 'Token is not active' };
|
|
19
23
|
break;
|
|
20
24
|
case TokenProblem.INVALID_AUDIENCE:
|
|
21
|
-
body = { error: 'invalid_token', error_description: 'Token
|
|
25
|
+
body = { error: 'invalid_token', error_description: 'Token does not match the expected audience' };
|
|
22
26
|
break;
|
|
23
27
|
case TokenProblem.NON_SUFFICIENT_FUNDS:
|
|
24
28
|
status = 403;
|
|
@@ -28,12 +32,17 @@ export function sendOAuthChallenge(res, tokenCheck) {
|
|
|
28
32
|
status = 502;
|
|
29
33
|
body = { error: 'server_error', error_description: 'An internal server error occurred' };
|
|
30
34
|
break;
|
|
31
|
-
default:
|
|
32
|
-
assertNever(tokenCheck.problem);
|
|
33
35
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const wwwAuthenticate = `Bearer resource_metadata="${tokenCheck.resourceMetadataUrl}"`;
|
|
37
|
+
return {
|
|
38
|
+
status,
|
|
39
|
+
headers: {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
'WWW-Authenticate': wwwAuthenticate
|
|
42
|
+
},
|
|
43
|
+
body: JSON.stringify(body)
|
|
44
|
+
};
|
|
38
45
|
}
|
|
39
|
-
|
|
46
|
+
|
|
47
|
+
export { createOAuthChallengeResponseCore };
|
|
48
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sources":["../../src/core/oauth.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;AAGG;AACG,SAAU,gCAAgC,CAAC,UAAsB,EAAA;AAKrE,IAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AACrB,QAAA,OAAO,IAAI;IACb;IAEA,IAAI,MAAM,GAAG,GAAG;IAChB,IAAI,IAAI,GAAkE,EAAE;;AAG5E,IAAA,QAAQ,UAAU,CAAC,OAAO;QACxB,KAAK,YAAY,CAAC,QAAQ;YACxB;QACF,KAAK,YAAY,CAAC,sBAAsB;YACtC,MAAM,GAAG,GAAG;YACZ,IAAI,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qDAAqD,EAAE;YAC7G;QACF,KAAK,YAAY,CAAC,aAAa;YAC7B,IAAI,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE;YAC3E;QACF,KAAK,YAAY,CAAC,gBAAgB;YAChC,IAAI,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,4CAA4C,EAAE;YAClG;QACF,KAAK,YAAY,CAAC,oBAAoB;YACpC,MAAM,GAAG,GAAG;YACZ,IAAI,GAAG,EAAE,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE;YACjF;QACF,KAAK,YAAY,CAAC,gBAAgB;YAChC,MAAM,GAAG,GAAG;YACZ,IAAI,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,mCAAmC,EAAE;YACxF;;AAMJ,IAAA,MAAM,eAAe,GAAG,CAAA,0BAAA,EAA6B,UAAU,CAAC,mBAAmB,GAAG;IAEtF,OAAO;QACL,MAAM;AACN,QAAA,OAAO,EAAE;AACP,YAAA,cAAc,EAAE,kBAAkB;AAClC,YAAA,kBAAkB,EAAE;AACrB,SAAA;AACD,QAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;KAC1B;AACH;;;;"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import { TokenProblem } from
|
|
2
|
-
|
|
1
|
+
import { TokenProblem } from '../types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Core platform-agnostic token checking logic
|
|
5
|
+
* Takes an authorization header string instead of platform-specific request objects
|
|
6
|
+
*/
|
|
7
|
+
async function checkTokenCore(config, resourceURL, authorizationHeader) {
|
|
3
8
|
const protocol = resourceURL.protocol;
|
|
4
9
|
const host = resourceURL.host;
|
|
5
10
|
const pathname = resourceURL.pathname;
|
|
@@ -9,14 +14,13 @@ export async function checkToken(config, resourceURL, req) {
|
|
|
9
14
|
resourceMetadataUrl: protectedResourceMetadataUrl,
|
|
10
15
|
};
|
|
11
16
|
// Extract the Bearer token from the Authorization header
|
|
12
|
-
|
|
13
|
-
if (!authHeader) {
|
|
17
|
+
if (!authorizationHeader) {
|
|
14
18
|
return { ...failure, problem: TokenProblem.NO_TOKEN, data: null, token: null };
|
|
15
19
|
}
|
|
16
|
-
if (!
|
|
20
|
+
if (!authorizationHeader.startsWith('Bearer ')) {
|
|
17
21
|
return { ...failure, problem: TokenProblem.NON_BEARER_AUTH_HEADER, data: null, token: null };
|
|
18
22
|
}
|
|
19
|
-
const token =
|
|
23
|
+
const token = authorizationHeader.substring(7);
|
|
20
24
|
try {
|
|
21
25
|
const introspectionResult = await config.oAuthClient.introspectToken(config.server, token);
|
|
22
26
|
if (!introspectionResult.active) {
|
|
@@ -33,4 +37,6 @@ export async function checkToken(config, resourceURL, req) {
|
|
|
33
37
|
return { ...failure, problem: TokenProblem.INTROSPECT_ERROR, data: null, token };
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
|
-
|
|
40
|
+
|
|
41
|
+
export { checkTokenCore };
|
|
42
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../src/core/token.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;AAGG;AACI,eAAe,cAAc,CAClC,MAAkB,EAClB,WAAgB,EAChB,mBAAkC,EAAA;AAElC,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ;AACrC,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI;AAC7B,IAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ;IACrC,MAAM,4BAA4B,GAAG,CAAA,EAAG,QAAQ,KAAK,IAAI,CAAA,qCAAA,EAAwC,QAAQ,CAAA,CAAE;AAE3G,IAAA,MAAM,OAAO,GAAG;AACd,QAAA,MAAM,EAAE,KAAc;AACtB,QAAA,mBAAmB,EAAE,4BAA4B;KAClD;;IAGD,IAAI,CAAC,mBAAmB,EAAE;AACxB,QAAA,OAAO,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC;IAC9E;IACA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AAC9C,QAAA,OAAO,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC;IAC5F;IAEA,MAAM,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AAE9C,IAAA,IAAI;AACF,QAAA,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;AAE1F,QAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;AAC/B,YAAA,OAAO,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC;QAC7E;QAEA,OAAO;AACL,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,IAAI,EAAE,mBAAmB;YACzB,KAAK;SACN;IACH;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,KAAK,CAAA,CAAE,CAAC;AACjE,QAAA,OAAO,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC;IAChF;AACF;;;;"}
|
package/dist/getResource.js
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
function getPath(url) {
|
|
2
2
|
const fullPath = url.pathname.replace(/^\/$/, '');
|
|
3
3
|
return fullPath;
|
|
4
4
|
}
|
|
5
|
-
|
|
5
|
+
function getProtocolFromHeaders(headers, requestProtocol) {
|
|
6
|
+
// Check for X-Forwarded-Proto header (common proxy header)
|
|
7
|
+
const forwardedProto = headers['x-forwarded-proto'] || headers['X-Forwarded-Proto'];
|
|
8
|
+
if (forwardedProto) {
|
|
9
|
+
const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto;
|
|
10
|
+
return proto === 'https' ? 'https:' : 'http:';
|
|
11
|
+
}
|
|
12
|
+
// Check for X-Forwarded-Protocol header (alternative)
|
|
13
|
+
const forwardedProtocol = headers['x-forwarded-protocol'] || headers['X-Forwarded-Protocol'];
|
|
14
|
+
if (forwardedProtocol) {
|
|
15
|
+
const proto = Array.isArray(forwardedProtocol) ? forwardedProtocol[0] : forwardedProtocol;
|
|
16
|
+
return proto === 'https' ? 'https:' : 'http:';
|
|
17
|
+
}
|
|
18
|
+
// Fall back to request protocol
|
|
19
|
+
return requestProtocol;
|
|
20
|
+
}
|
|
21
|
+
function getResource(config, requestUrl, headers) {
|
|
6
22
|
if (config.resource) {
|
|
7
23
|
return new URL(config.resource);
|
|
8
24
|
}
|
|
9
|
-
const
|
|
25
|
+
const originalProtocol = headers ? getProtocolFromHeaders(headers, requestUrl.protocol) : requestUrl.protocol;
|
|
26
|
+
const protocol = config.allowHttp ? originalProtocol : 'https:';
|
|
10
27
|
const url = new URL(`${protocol}//${requestUrl.host}${requestUrl.pathname}`);
|
|
11
28
|
const fullPath = getPath(url);
|
|
12
29
|
// If this is a PRM path, convert it into the path for the resource this is the metadata for
|
|
@@ -14,4 +31,6 @@ export function getResource(config, requestUrl) {
|
|
|
14
31
|
const resource = new URL(`${protocol}//${requestUrl.host}${resourcePath}`);
|
|
15
32
|
return resource;
|
|
16
33
|
}
|
|
17
|
-
|
|
34
|
+
|
|
35
|
+
export { getPath, getResource };
|
|
36
|
+
//# sourceMappingURL=getResource.js.map
|
package/dist/getResource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getResource.js","
|
|
1
|
+
{"version":3,"file":"getResource.js","sources":["../src/getResource.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEM,SAAU,OAAO,CAAC,GAAQ,EAAA;AAC9B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACjD,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,sBAAsB,CAAC,OAAsD,EAAE,eAAuB,EAAA;;IAE7G,MAAM,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IACnF,IAAI,cAAc,EAAE;AAClB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc;QAChF,OAAO,KAAK,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO;IAC/C;;IAGA,MAAM,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAC5F,IAAI,iBAAiB,EAAE;AACrB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB;QACzF,OAAO,KAAK,KAAK,OAAO,GAAG,QAAQ,GAAG,OAAO;IAC/C;;AAGA,IAAA,OAAO,eAAe;AACxB;SAEgB,WAAW,CAAC,MAAkB,EAAE,UAAe,EAAE,OAAuD,EAAA;AACtH,IAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,QAAA,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;IACjC;IAEA,MAAM,gBAAgB,GAAG,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,QAAQ;AAC7G,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,gBAAgB,GAAG,QAAQ;AAC/D,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAA,EAAA,EAAK,UAAU,CAAC,IAAI,CAAA,EAAG,UAAU,CAAC,QAAQ,CAAA,CAAE,CAAC;AAE5E,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;;AAE7B,IAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAErG,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,UAAU,CAAC,IAAI,CAAA,EAAG,YAAY,CAAA,CAAE,CAAC;AAC1E,IAAA,OAAO,QAAQ;AACjB;;;;"}
|