@makerx/graphql-core 3.2.0 → 3.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/README.md +68 -10
- package/context.d.cts +7 -0
- package/context.d.mts +7 -0
- package/context.d.ts +7 -0
- package/context.js +6 -5
- package/context.js.map +1 -1
- package/context.mjs +6 -5
- package/context.mjs.map +1 -1
- package/deprecation.d.cts +81 -0
- package/deprecation.d.mts +81 -0
- package/deprecation.d.ts +81 -0
- package/deprecation.js +240 -0
- package/deprecation.js.map +1 -0
- package/deprecation.mjs +235 -0
- package/deprecation.mjs.map +1 -0
- package/index.d.cts +1 -0
- package/index.d.mts +1 -0
- package/index.d.ts +1 -0
- package/index.js +5 -0
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/logging.d.cts +17 -2
- package/logging.d.mts +17 -2
- package/logging.d.ts +17 -2
- package/logging.js +21 -3
- package/logging.js.map +1 -1
- package/logging.mjs +21 -3
- package/logging.mjs.map +1 -1
- package/package.json +1 -1
- package/subscriptions/context.d.cts +7 -0
- package/subscriptions/context.d.mts +7 -0
- package/subscriptions/context.d.ts +7 -0
- package/subscriptions/context.js +5 -5
- package/subscriptions/context.js.map +1 -1
- package/subscriptions/context.mjs +6 -6
- package/subscriptions/context.mjs.map +1 -1
- package/subscriptions/server.d.cts +13 -2
- package/subscriptions/server.d.mts +13 -2
- package/subscriptions/server.d.ts +13 -2
- package/subscriptions/server.js +12 -6
- package/subscriptions/server.js.map +1 -1
- package/subscriptions/server.mjs +13 -7
- package/subscriptions/server.mjs.map +1 -1
- package/subscriptions/utils.d.cts +2 -0
- package/subscriptions/utils.d.mts +2 -0
- package/subscriptions/utils.d.ts +2 -0
- package/subscriptions/utils.js +2 -0
- package/subscriptions/utils.js.map +1 -1
- package/subscriptions/utils.mjs +2 -1
- package/subscriptions/utils.mjs.map +1 -1
package/subscriptions/server.js
CHANGED
|
@@ -7,7 +7,7 @@ var ws = require('ws');
|
|
|
7
7
|
var logging = require('../logging.js');
|
|
8
8
|
var utils = require('./utils.js');
|
|
9
9
|
|
|
10
|
-
function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext, logger, operationLogLevel = 'info', path = '/graphql', verifyToken, requireAuth, jwtClaimsToLog = ['oid', 'iss'], resolveSubscriptionOperationLogger, }) {
|
|
10
|
+
function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext, logger, operationLogLevel = 'info', path = '/graphql', verifyToken, extractToken = utils.defaultExtractSubscriptionToken, requireAuth, jwtClaimsToLog = ['oid', 'iss'], resolveSubscriptionOperationLogger, includeDeprecatedElements, }) {
|
|
11
11
|
if (requireAuth && !verifyToken)
|
|
12
12
|
throw new Error('verifyToken must be supplied when requireAuth is true');
|
|
13
13
|
const wsServer = new ws.WebSocketServer({
|
|
@@ -25,10 +25,10 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
25
25
|
logger.info(connectionEstablished);
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
28
|
-
const token =
|
|
28
|
+
const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams });
|
|
29
29
|
if (!token) {
|
|
30
30
|
if (requireAuth) {
|
|
31
|
-
logger.error('No
|
|
31
|
+
logger.error('No auth token was supplied with the websocket connection');
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
logger.info(connectionEstablished);
|
|
@@ -50,10 +50,10 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
50
50
|
onSubscribe: async (ctx) => {
|
|
51
51
|
if (!verifyToken)
|
|
52
52
|
return;
|
|
53
|
-
const token =
|
|
53
|
+
const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams });
|
|
54
54
|
if (!token) {
|
|
55
55
|
if (requireAuth) {
|
|
56
|
-
logger.error('No
|
|
56
|
+
logger.error('No auth token was supplied with the websocket connection');
|
|
57
57
|
ctx.extra.socket.close(graphqlWs.CloseCode.Forbidden, 'Forbidden');
|
|
58
58
|
}
|
|
59
59
|
return;
|
|
@@ -77,7 +77,13 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
77
77
|
});
|
|
78
78
|
},
|
|
79
79
|
onOperation(_ctx, id, _payload, args) {
|
|
80
|
-
logging.logSubscriptionOperation({
|
|
80
|
+
logging.logSubscriptionOperation({
|
|
81
|
+
id,
|
|
82
|
+
args,
|
|
83
|
+
logLevel: operationLogLevel,
|
|
84
|
+
resolveLogger: resolveSubscriptionOperationLogger,
|
|
85
|
+
includeDeprecatedElements,
|
|
86
|
+
});
|
|
81
87
|
},
|
|
82
88
|
onNext(_ctx, id, _payload, args, { data, ...result }) {
|
|
83
89
|
logging.logSubscriptionOperation({ id, args, logLevel: operationLogLevel, result, resolveLogger: resolveSubscriptionOperationLogger });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../../src/subscriptions/server.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { pick } from 'es-toolkit/compat'\nimport type { GraphQLSchema } from 'graphql'\nimport { CloseCode } from 'graphql-ws'\nimport { useServer } from 'graphql-ws/use/ws'\nimport type { Server } from 'http'\nimport { WebSocketServer } from 'ws'\nimport type { GraphQLContext, JwtPayload } from '../context'\nimport { logSubscriptionOperation } from '../logging'\nimport type { CreateSubscriptionContext } from './context'\nimport {
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../../src/subscriptions/server.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { pick } from 'es-toolkit/compat'\nimport type { GraphQLSchema } from 'graphql'\nimport { CloseCode } from 'graphql-ws'\nimport { useServer } from 'graphql-ws/use/ws'\nimport type { Server } from 'http'\nimport { WebSocketServer } from 'ws'\nimport type { GraphQLContext, JwtPayload } from '../context'\nimport { logSubscriptionOperation } from '../logging'\nimport type { CreateSubscriptionContext, ExtractSubscriptionToken } from './context'\nimport { defaultExtractSubscriptionToken, getHost } from './utils'\n\nexport function useSubscriptionsServer<TLogger extends Logger = Logger>({\n schema,\n httpServer,\n createSubscriptionContext,\n logger,\n operationLogLevel = 'info',\n path = '/graphql',\n verifyToken,\n extractToken = defaultExtractSubscriptionToken,\n requireAuth,\n jwtClaimsToLog = ['oid', 'iss'],\n resolveSubscriptionOperationLogger,\n includeDeprecatedElements,\n}: {\n schema: GraphQLSchema\n httpServer: Server\n createSubscriptionContext: CreateSubscriptionContext\n logger: TLogger\n operationLogLevel?: keyof TLogger\n path?: string\n verifyToken?: (host: string, token: string) => Promise<JwtPayload>\n /**\n * Returns the token to pass to `verifyToken`, e.g. from a JWT assertion header that a proxy adds\n * to the connect request. Defaults to the bearer token in the `authorization` or `Authorization`\n * connection parameter. Pass the same function to `createSubscriptionContextFactory`.\n */\n extractToken?: ExtractSubscriptionToken\n requireAuth?: boolean\n jwtClaimsToLog?: string[]\n resolveSubscriptionOperationLogger?: (context: GraphQLContext) => TLogger\n /**\n * If true, deprecated schema elements a subscription uses are collected and logged when it is\n * established. Not collected per emitted payload: the usage is a property of the operation.\n */\n includeDeprecatedElements?: boolean\n}) {\n if (requireAuth && !verifyToken) throw new Error('verifyToken must be supplied when requireAuth is true')\n\n const wsServer = new WebSocketServer({\n server: httpServer,\n path,\n })\n\n return useServer(\n {\n schema,\n onError(_ctx, message, errors) {\n logger.error('GraphQL subscriptions server error', { message, errors })\n },\n onConnect: async (ctx) => {\n const connectionEstablished = 'Subscription connection established'\n if (!verifyToken) {\n logger.info(connectionEstablished)\n return true\n }\n\n const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams })\n if (!token) {\n if (requireAuth) {\n logger.error('No auth token was supplied with the websocket connection')\n return false\n }\n logger.info(connectionEstablished)\n return true\n }\n\n try {\n const claims = await verifyToken(getHost(ctx.extra.request), token)\n ctx.extra.claims = claims as unknown as undefined\n logger.info(connectionEstablished, {\n claims: pick(claims, jwtClaimsToLog),\n })\n return true\n } catch (error) {\n logger.error('Failed to verify subscription connection auth token', { error })\n return false\n }\n },\n onSubscribe: async (ctx) => {\n if (!verifyToken) return\n const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams })\n if (!token) {\n if (requireAuth) {\n logger.error('No auth token was supplied with the websocket connection')\n ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden')\n }\n return\n }\n try {\n await verifyToken(getHost(ctx.extra.request), token)\n } catch (error) {\n logger.warn('Subscription connection auth token is no longer valid', { claims: pick(ctx.extra.claims, jwtClaimsToLog), error })\n ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden')\n }\n },\n onDisconnect({ extra: { claims } }) {\n logger.info('Subscription connection disconnected', { claims: pick(claims, jwtClaimsToLog) })\n },\n context: async (ctx) => {\n return createSubscriptionContext({\n connectRequest: ctx.extra.request,\n connectionParams: ctx.connectionParams,\n claims: ctx.extra.claims as JwtPayload | undefined,\n })\n },\n onOperation(_ctx, id, _payload, args) {\n logSubscriptionOperation({\n id,\n args,\n logLevel: operationLogLevel,\n resolveLogger: resolveSubscriptionOperationLogger,\n includeDeprecatedElements,\n })\n },\n onNext(_ctx, id, _payload, args, { data, ...result }) {\n logSubscriptionOperation({ id, args, logLevel: operationLogLevel, result, resolveLogger: resolveSubscriptionOperationLogger })\n },\n },\n wsServer,\n )\n}\n"],"names":["defaultExtractSubscriptionToken","WebSocketServer","useServer","getHost","pick","CloseCode","logSubscriptionOperation"],"mappings":"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"}
|
package/subscriptions/server.mjs
CHANGED
|
@@ -3,9 +3,9 @@ import { CloseCode } from 'graphql-ws';
|
|
|
3
3
|
import { useServer } from 'graphql-ws/use/ws';
|
|
4
4
|
import { WebSocketServer } from 'ws';
|
|
5
5
|
import { logSubscriptionOperation } from '../logging.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import { defaultExtractSubscriptionToken, getHost } from './utils.mjs';
|
|
7
7
|
|
|
8
|
-
function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext, logger, operationLogLevel = 'info', path = '/graphql', verifyToken, requireAuth, jwtClaimsToLog = ['oid', 'iss'], resolveSubscriptionOperationLogger, }) {
|
|
8
|
+
function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext, logger, operationLogLevel = 'info', path = '/graphql', verifyToken, extractToken = defaultExtractSubscriptionToken, requireAuth, jwtClaimsToLog = ['oid', 'iss'], resolveSubscriptionOperationLogger, includeDeprecatedElements, }) {
|
|
9
9
|
if (requireAuth && !verifyToken)
|
|
10
10
|
throw new Error('verifyToken must be supplied when requireAuth is true');
|
|
11
11
|
const wsServer = new WebSocketServer({
|
|
@@ -23,10 +23,10 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
23
23
|
logger.info(connectionEstablished);
|
|
24
24
|
return true;
|
|
25
25
|
}
|
|
26
|
-
const token =
|
|
26
|
+
const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams });
|
|
27
27
|
if (!token) {
|
|
28
28
|
if (requireAuth) {
|
|
29
|
-
logger.error('No
|
|
29
|
+
logger.error('No auth token was supplied with the websocket connection');
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
32
32
|
logger.info(connectionEstablished);
|
|
@@ -48,10 +48,10 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
48
48
|
onSubscribe: async (ctx) => {
|
|
49
49
|
if (!verifyToken)
|
|
50
50
|
return;
|
|
51
|
-
const token =
|
|
51
|
+
const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams });
|
|
52
52
|
if (!token) {
|
|
53
53
|
if (requireAuth) {
|
|
54
|
-
logger.error('No
|
|
54
|
+
logger.error('No auth token was supplied with the websocket connection');
|
|
55
55
|
ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden');
|
|
56
56
|
}
|
|
57
57
|
return;
|
|
@@ -75,7 +75,13 @@ function useSubscriptionsServer({ schema, httpServer, createSubscriptionContext,
|
|
|
75
75
|
});
|
|
76
76
|
},
|
|
77
77
|
onOperation(_ctx, id, _payload, args) {
|
|
78
|
-
logSubscriptionOperation({
|
|
78
|
+
logSubscriptionOperation({
|
|
79
|
+
id,
|
|
80
|
+
args,
|
|
81
|
+
logLevel: operationLogLevel,
|
|
82
|
+
resolveLogger: resolveSubscriptionOperationLogger,
|
|
83
|
+
includeDeprecatedElements,
|
|
84
|
+
});
|
|
79
85
|
},
|
|
80
86
|
onNext(_ctx, id, _payload, args, { data, ...result }) {
|
|
81
87
|
logSubscriptionOperation({ id, args, logLevel: operationLogLevel, result, resolveLogger: resolveSubscriptionOperationLogger });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","sources":["../../src/subscriptions/server.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { pick } from 'es-toolkit/compat'\nimport type { GraphQLSchema } from 'graphql'\nimport { CloseCode } from 'graphql-ws'\nimport { useServer } from 'graphql-ws/use/ws'\nimport type { Server } from 'http'\nimport { WebSocketServer } from 'ws'\nimport type { GraphQLContext, JwtPayload } from '../context'\nimport { logSubscriptionOperation } from '../logging'\nimport type { CreateSubscriptionContext } from './context'\nimport {
|
|
1
|
+
{"version":3,"file":"server.mjs","sources":["../../src/subscriptions/server.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { pick } from 'es-toolkit/compat'\nimport type { GraphQLSchema } from 'graphql'\nimport { CloseCode } from 'graphql-ws'\nimport { useServer } from 'graphql-ws/use/ws'\nimport type { Server } from 'http'\nimport { WebSocketServer } from 'ws'\nimport type { GraphQLContext, JwtPayload } from '../context'\nimport { logSubscriptionOperation } from '../logging'\nimport type { CreateSubscriptionContext, ExtractSubscriptionToken } from './context'\nimport { defaultExtractSubscriptionToken, getHost } from './utils'\n\nexport function useSubscriptionsServer<TLogger extends Logger = Logger>({\n schema,\n httpServer,\n createSubscriptionContext,\n logger,\n operationLogLevel = 'info',\n path = '/graphql',\n verifyToken,\n extractToken = defaultExtractSubscriptionToken,\n requireAuth,\n jwtClaimsToLog = ['oid', 'iss'],\n resolveSubscriptionOperationLogger,\n includeDeprecatedElements,\n}: {\n schema: GraphQLSchema\n httpServer: Server\n createSubscriptionContext: CreateSubscriptionContext\n logger: TLogger\n operationLogLevel?: keyof TLogger\n path?: string\n verifyToken?: (host: string, token: string) => Promise<JwtPayload>\n /**\n * Returns the token to pass to `verifyToken`, e.g. from a JWT assertion header that a proxy adds\n * to the connect request. Defaults to the bearer token in the `authorization` or `Authorization`\n * connection parameter. Pass the same function to `createSubscriptionContextFactory`.\n */\n extractToken?: ExtractSubscriptionToken\n requireAuth?: boolean\n jwtClaimsToLog?: string[]\n resolveSubscriptionOperationLogger?: (context: GraphQLContext) => TLogger\n /**\n * If true, deprecated schema elements a subscription uses are collected and logged when it is\n * established. Not collected per emitted payload: the usage is a property of the operation.\n */\n includeDeprecatedElements?: boolean\n}) {\n if (requireAuth && !verifyToken) throw new Error('verifyToken must be supplied when requireAuth is true')\n\n const wsServer = new WebSocketServer({\n server: httpServer,\n path,\n })\n\n return useServer(\n {\n schema,\n onError(_ctx, message, errors) {\n logger.error('GraphQL subscriptions server error', { message, errors })\n },\n onConnect: async (ctx) => {\n const connectionEstablished = 'Subscription connection established'\n if (!verifyToken) {\n logger.info(connectionEstablished)\n return true\n }\n\n const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams })\n if (!token) {\n if (requireAuth) {\n logger.error('No auth token was supplied with the websocket connection')\n return false\n }\n logger.info(connectionEstablished)\n return true\n }\n\n try {\n const claims = await verifyToken(getHost(ctx.extra.request), token)\n ctx.extra.claims = claims as unknown as undefined\n logger.info(connectionEstablished, {\n claims: pick(claims, jwtClaimsToLog),\n })\n return true\n } catch (error) {\n logger.error('Failed to verify subscription connection auth token', { error })\n return false\n }\n },\n onSubscribe: async (ctx) => {\n if (!verifyToken) return\n const token = extractToken({ connectRequest: ctx.extra.request, connectionParams: ctx.connectionParams })\n if (!token) {\n if (requireAuth) {\n logger.error('No auth token was supplied with the websocket connection')\n ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden')\n }\n return\n }\n try {\n await verifyToken(getHost(ctx.extra.request), token)\n } catch (error) {\n logger.warn('Subscription connection auth token is no longer valid', { claims: pick(ctx.extra.claims, jwtClaimsToLog), error })\n ctx.extra.socket.close(CloseCode.Forbidden, 'Forbidden')\n }\n },\n onDisconnect({ extra: { claims } }) {\n logger.info('Subscription connection disconnected', { claims: pick(claims, jwtClaimsToLog) })\n },\n context: async (ctx) => {\n return createSubscriptionContext({\n connectRequest: ctx.extra.request,\n connectionParams: ctx.connectionParams,\n claims: ctx.extra.claims as JwtPayload | undefined,\n })\n },\n onOperation(_ctx, id, _payload, args) {\n logSubscriptionOperation({\n id,\n args,\n logLevel: operationLogLevel,\n resolveLogger: resolveSubscriptionOperationLogger,\n includeDeprecatedElements,\n })\n },\n onNext(_ctx, id, _payload, args, { data, ...result }) {\n logSubscriptionOperation({ id, args, logLevel: operationLogLevel, result, resolveLogger: resolveSubscriptionOperationLogger })\n },\n },\n wsServer,\n )\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'http';
|
|
2
|
+
import type { ExtractSubscriptionToken } from './context';
|
|
2
3
|
/**
|
|
3
4
|
* Extracts a token from a connection parameter named `authorization` or `Authorization`.
|
|
4
5
|
* The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.
|
|
@@ -7,4 +8,5 @@ import type { IncomingMessage } from 'http';
|
|
|
7
8
|
* @returns
|
|
8
9
|
*/
|
|
9
10
|
export declare function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>): string | undefined;
|
|
11
|
+
export declare const defaultExtractSubscriptionToken: ExtractSubscriptionToken;
|
|
10
12
|
export declare function getHost(request: IncomingMessage): string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'http';
|
|
2
|
+
import type { ExtractSubscriptionToken } from './context.mjs';
|
|
2
3
|
/**
|
|
3
4
|
* Extracts a token from a connection parameter named `authorization` or `Authorization`.
|
|
4
5
|
* The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.
|
|
@@ -7,4 +8,5 @@ import type { IncomingMessage } from 'http';
|
|
|
7
8
|
* @returns
|
|
8
9
|
*/
|
|
9
10
|
export declare function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>): string | undefined;
|
|
11
|
+
export declare const defaultExtractSubscriptionToken: ExtractSubscriptionToken;
|
|
10
12
|
export declare function getHost(request: IncomingMessage): string;
|
package/subscriptions/utils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'http';
|
|
2
|
+
import type { ExtractSubscriptionToken } from './context';
|
|
2
3
|
/**
|
|
3
4
|
* Extracts a token from a connection parameter named `authorization` or `Authorization`.
|
|
4
5
|
* The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.
|
|
@@ -7,4 +8,5 @@ import type { IncomingMessage } from 'http';
|
|
|
7
8
|
* @returns
|
|
8
9
|
*/
|
|
9
10
|
export declare function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>): string | undefined;
|
|
11
|
+
export declare const defaultExtractSubscriptionToken: ExtractSubscriptionToken;
|
|
10
12
|
export declare function getHost(request: IncomingMessage): string;
|
package/subscriptions/utils.js
CHANGED
|
@@ -13,12 +13,14 @@ function extractTokenFromConnectionParams(connectionParams) {
|
|
|
13
13
|
return undefined;
|
|
14
14
|
return bearerTokenValue.substring(7);
|
|
15
15
|
}
|
|
16
|
+
const defaultExtractSubscriptionToken = ({ connectionParams }) => extractTokenFromConnectionParams(connectionParams);
|
|
16
17
|
function getHost(request) {
|
|
17
18
|
const proxyHostHeader = request.headers['x-forwarded-host'];
|
|
18
19
|
const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined);
|
|
19
20
|
return host ?? 'subscriptions';
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
exports.defaultExtractSubscriptionToken = defaultExtractSubscriptionToken;
|
|
22
24
|
exports.extractTokenFromConnectionParams = extractTokenFromConnectionParams;
|
|
23
25
|
exports.getHost = getHost;
|
|
24
26
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../src/subscriptions/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'http'\n\n/**\n * Extracts a token from a connection parameter named `authorization` or `Authorization`.\n * The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.\n * Apollo Sandbox sets an `Authorization` connection parameter when you specify an HTTP Authorization header via the UI.\n * @param connectionParams\n * @returns\n */\nexport function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>) {\n const bearerTokenValue = (connectionParams?.authorization ?? connectionParams?.Authorization) as string | undefined\n if (!bearerTokenValue?.startsWith('Bearer ')) return undefined\n return bearerTokenValue.substring(7)\n}\n\nexport function getHost(request: IncomingMessage) {\n const proxyHostHeader = request.headers['x-forwarded-host']\n const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined)\n return host ?? 'subscriptions'\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/subscriptions/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'http'\nimport type { ExtractSubscriptionToken } from './context'\n\n/**\n * Extracts a token from a connection parameter named `authorization` or `Authorization`.\n * The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.\n * Apollo Sandbox sets an `Authorization` connection parameter when you specify an HTTP Authorization header via the UI.\n * @param connectionParams\n * @returns\n */\nexport function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>) {\n const bearerTokenValue = (connectionParams?.authorization ?? connectionParams?.Authorization) as string | undefined\n if (!bearerTokenValue?.startsWith('Bearer ')) return undefined\n return bearerTokenValue.substring(7)\n}\n\nexport const defaultExtractSubscriptionToken: ExtractSubscriptionToken = ({ connectionParams }) =>\n extractTokenFromConnectionParams(connectionParams)\n\nexport function getHost(request: IncomingMessage) {\n const proxyHostHeader = request.headers['x-forwarded-host']\n const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined)\n return host ?? 'subscriptions'\n}\n"],"names":[],"mappings":";;AAGA;;;;;;AAMG;AACG,SAAU,gCAAgC,CAAC,gBAAoD,EAAA;IACnG,MAAM,gBAAgB,IAAI,gBAAgB,EAAE,aAAa,IAAI,gBAAgB,EAAE,aAAa,CAAuB;AACnH,IAAA,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC;AAAE,QAAA,OAAO,SAAS;AAC9D,IAAA,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtC;AAEO,MAAM,+BAA+B,GAA6B,CAAC,EAAE,gBAAgB,EAAE,KAC5F,gCAAgC,CAAC,gBAAgB;AAE7C,SAAU,OAAO,CAAC,OAAwB,EAAA;IAC9C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;AAC3D,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IACxI,OAAO,IAAI,IAAI,eAAe;AAChC;;;;;;"}
|
package/subscriptions/utils.mjs
CHANGED
|
@@ -11,11 +11,12 @@ function extractTokenFromConnectionParams(connectionParams) {
|
|
|
11
11
|
return undefined;
|
|
12
12
|
return bearerTokenValue.substring(7);
|
|
13
13
|
}
|
|
14
|
+
const defaultExtractSubscriptionToken = ({ connectionParams }) => extractTokenFromConnectionParams(connectionParams);
|
|
14
15
|
function getHost(request) {
|
|
15
16
|
const proxyHostHeader = request.headers['x-forwarded-host'];
|
|
16
17
|
const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined);
|
|
17
18
|
return host ?? 'subscriptions';
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
export { extractTokenFromConnectionParams, getHost };
|
|
21
|
+
export { defaultExtractSubscriptionToken, extractTokenFromConnectionParams, getHost };
|
|
21
22
|
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../src/subscriptions/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'http'\n\n/**\n * Extracts a token from a connection parameter named `authorization` or `Authorization`.\n * The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.\n * Apollo Sandbox sets an `Authorization` connection parameter when you specify an HTTP Authorization header via the UI.\n * @param connectionParams\n * @returns\n */\nexport function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>) {\n const bearerTokenValue = (connectionParams?.authorization ?? connectionParams?.Authorization) as string | undefined\n if (!bearerTokenValue?.startsWith('Bearer ')) return undefined\n return bearerTokenValue.substring(7)\n}\n\nexport function getHost(request: IncomingMessage) {\n const proxyHostHeader = request.headers['x-forwarded-host']\n const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined)\n return host ?? 'subscriptions'\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../src/subscriptions/utils.ts"],"sourcesContent":["import type { IncomingMessage } from 'http'\nimport type { ExtractSubscriptionToken } from './context'\n\n/**\n * Extracts a token from a connection parameter named `authorization` or `Authorization`.\n * The expected format of the parameter value is: Bearer <token>, consistent with an HTTP Authorization header.\n * Apollo Sandbox sets an `Authorization` connection parameter when you specify an HTTP Authorization header via the UI.\n * @param connectionParams\n * @returns\n */\nexport function extractTokenFromConnectionParams(connectionParams?: Readonly<Record<string, unknown>>) {\n const bearerTokenValue = (connectionParams?.authorization ?? connectionParams?.Authorization) as string | undefined\n if (!bearerTokenValue?.startsWith('Bearer ')) return undefined\n return bearerTokenValue.substring(7)\n}\n\nexport const defaultExtractSubscriptionToken: ExtractSubscriptionToken = ({ connectionParams }) =>\n extractTokenFromConnectionParams(connectionParams)\n\nexport function getHost(request: IncomingMessage) {\n const proxyHostHeader = request.headers['x-forwarded-host']\n const host = Array.isArray(proxyHostHeader) ? (proxyHostHeader[0] ?? undefined) : (proxyHostHeader ?? request.headers.host ?? undefined)\n return host ?? 'subscriptions'\n}\n"],"names":[],"mappings":"AAGA;;;;;;AAMG;AACG,SAAU,gCAAgC,CAAC,gBAAoD,EAAA;IACnG,MAAM,gBAAgB,IAAI,gBAAgB,EAAE,aAAa,IAAI,gBAAgB,EAAE,aAAa,CAAuB;AACnH,IAAA,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC;AAAE,QAAA,OAAO,SAAS;AAC9D,IAAA,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;AACtC;AAEO,MAAM,+BAA+B,GAA6B,CAAC,EAAE,gBAAgB,EAAE,KAC5F,gCAAgC,CAAC,gBAAgB;AAE7C,SAAU,OAAO,CAAC,OAAwB,EAAA;IAC9C,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;AAC3D,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IACxI,OAAO,IAAI,IAAI,eAAe;AAChC;;;;"}
|