@qelos/integrator-nest 4.0.0 → 4.1.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.
@@ -1,12 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeModuleOptions = normalizeModuleOptions;
4
+ function applyProxySkipPaths(config) {
5
+ if (config.disableProxy === true)
6
+ return config;
7
+ const existingSkipPaths = config.skipPaths ?? [];
8
+ const alreadyCovered = existingSkipPaths.some((prefix) => '/api/'.startsWith(prefix));
9
+ if (alreadyCovered)
10
+ return config;
11
+ return { ...config, skipPaths: ['/api/', ...existingSkipPaths] };
12
+ }
4
13
  /**
5
14
  * `forRoot` / `forRootAsync` accept either a full {@link QelosModuleOptions}
6
15
  * object or a shorthand {@link QelosNestConfig} (same shape as Express
7
16
  * `createQelosMiddleware({ config })`).
17
+ *
18
+ * When `disableProxy` is not `true`, `/api/` is prepended to `skipPaths` so
19
+ * the user resolver does not shadow the `/api/**` proxy.
8
20
  */
9
21
  function normalizeModuleOptions(input) {
22
+ let wrapped;
10
23
  if (input !== null &&
11
24
  typeof input === 'object' &&
12
25
  'config' in input &&
@@ -14,8 +27,14 @@ function normalizeModuleOptions(input) {
14
27
  typeof input.config === 'object' &&
15
28
  input.config !== null &&
16
29
  'appUrl' in input.config) {
17
- return input;
30
+ wrapped = input;
31
+ }
32
+ else {
33
+ wrapped = { config: input };
18
34
  }
19
- return { config: input };
35
+ const mergedConfig = applyProxySkipPaths(wrapped.config);
36
+ if (mergedConfig === wrapped.config)
37
+ return wrapped;
38
+ return { ...wrapped, config: mergedConfig };
20
39
  }
21
40
  //# sourceMappingURL=module-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-options.js","sourceRoot":"","sources":["../src/module-options.ts"],"names":[],"mappings":";;AAOA,wDAeC;AApBD;;;;GAIG;AACH,SAAgB,sBAAsB,CACpC,KAA2C;IAE3C,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QAChB,KAA4B,CAAC,MAAM,KAAK,SAAS;QAClD,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI;QAC7C,QAAQ,IAAK,KAA4B,CAAC,MAAM,EAChD,CAAC;QACD,OAAO,KAA2B,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAwB,EAAE,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"module-options.js","sourceRoot":"","sources":["../src/module-options.ts"],"names":[],"mappings":";;AAoBA,wDAoBC;AAtCD,SAAS,mBAAmB,CAAC,MAAuB;IAClD,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACvD,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC3B,CAAC;IACF,IAAI,cAAc;QAAE,OAAO,MAAM,CAAC;IAClC,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CACpC,KAA2C;IAE3C,IAAI,OAA2B,CAAC;IAChC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QAChB,KAA4B,CAAC,MAAM,KAAK,SAAS;QAClD,OAAQ,KAA4B,CAAC,MAAM,KAAK,QAAQ;QACvD,KAA4B,CAAC,MAAM,KAAK,IAAI;QAC7C,QAAQ,IAAK,KAA4B,CAAC,MAAM,EAChD,CAAC;QACD,OAAO,GAAG,KAA2B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,EAAE,MAAM,EAAE,KAAwB,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,YAAY,KAAK,OAAO,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC9C,CAAC"}
package/dist/module.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface QelosOptionsFactory {
10
10
  createQelosOptions(): Promise<QelosNestConfig | QelosModuleOptions> | QelosNestConfig | QelosModuleOptions;
11
11
  }
12
12
  export declare class QelosModule implements NestModule {
13
+ private readonly moduleOptions;
14
+ constructor(moduleOptions: QelosModuleOptions);
13
15
  private static readonly sdkProvider;
14
16
  /**
15
17
  * Register the module with statically-known options.
@@ -17,9 +19,10 @@ export declare class QelosModule implements NestModule {
17
19
  * Pass either a full {@link QelosModuleOptions} object or a shorthand
18
20
  * {@link QelosNestConfig} (e.g. `{ appUrl, apiToken }`).
19
21
  *
20
- * The middleware is wired to `forRoutes('*')` by default. Override by
21
- * importing the module without `forRoot` and applying `QelosMiddleware`
22
- * directly inside your own `MiddlewareConsumer`.
22
+ * By default, {@link QelosMiddleware} runs on `forRoutes('*')` and
23
+ * {@link QelosProxyMiddleware} on `api/*splat` unless `disableProxy: true`.
24
+ * Override by importing the module without `forRoot` and applying the
25
+ * middlewares yourself in `MiddlewareConsumer`.
23
26
  */
24
27
  static forRoot(config: QelosNestConfig): DynamicModule;
25
28
  static forRoot(options: QelosModuleOptions): DynamicModule;
package/dist/module.js CHANGED
@@ -5,6 +5,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
8
14
  var QelosModule_1;
9
15
  Object.defineProperty(exports, "__esModule", { value: true });
10
16
  exports.QelosModule = void 0;
@@ -13,7 +19,11 @@ const core_1 = require("@nestjs/core");
13
19
  const constants_1 = require("./constants");
14
20
  const module_options_1 = require("./module-options");
15
21
  const middleware_1 = require("./middleware");
22
+ const proxy_middleware_1 = require("./proxy.middleware");
16
23
  let QelosModule = QelosModule_1 = class QelosModule {
24
+ constructor(moduleOptions) {
25
+ this.moduleOptions = moduleOptions;
26
+ }
17
27
  static forRoot(configOrOptions) {
18
28
  const options = (0, module_options_1.normalizeModuleOptions)(configOrOptions);
19
29
  const optionsProvider = {
@@ -22,8 +32,18 @@ let QelosModule = QelosModule_1 = class QelosModule {
22
32
  };
23
33
  return {
24
34
  module: QelosModule_1,
25
- providers: [optionsProvider, middleware_1.QelosMiddleware, QelosModule_1.sdkProvider],
26
- exports: [optionsProvider, middleware_1.QelosMiddleware, constants_1.QELOS_SDK],
35
+ providers: [
36
+ optionsProvider,
37
+ middleware_1.QelosMiddleware,
38
+ proxy_middleware_1.QelosProxyMiddleware,
39
+ QelosModule_1.sdkProvider,
40
+ ],
41
+ exports: [
42
+ optionsProvider,
43
+ middleware_1.QelosMiddleware,
44
+ proxy_middleware_1.QelosProxyMiddleware,
45
+ constants_1.QELOS_SDK,
46
+ ],
27
47
  global: true,
28
48
  };
29
49
  }
@@ -35,13 +55,19 @@ let QelosModule = QelosModule_1 = class QelosModule {
35
55
  const providers = [
36
56
  ...this.createAsyncProviders(options),
37
57
  middleware_1.QelosMiddleware,
58
+ proxy_middleware_1.QelosProxyMiddleware,
38
59
  QelosModule_1.sdkProvider,
39
60
  ];
40
61
  return {
41
62
  module: QelosModule_1,
42
63
  imports: options.imports || [],
43
64
  providers,
44
- exports: [constants_1.QELOS_MODULE_OPTIONS, middleware_1.QelosMiddleware, constants_1.QELOS_SDK],
65
+ exports: [
66
+ constants_1.QELOS_MODULE_OPTIONS,
67
+ middleware_1.QelosMiddleware,
68
+ proxy_middleware_1.QelosProxyMiddleware,
69
+ constants_1.QELOS_SDK,
70
+ ],
45
71
  global: true,
46
72
  };
47
73
  }
@@ -73,6 +99,12 @@ let QelosModule = QelosModule_1 = class QelosModule {
73
99
  }
74
100
  configure(consumer) {
75
101
  consumer.apply(middleware_1.QelosMiddleware).forRoutes('*');
102
+ if (this.moduleOptions.config.disableProxy !== true) {
103
+ consumer.apply(proxy_middleware_1.QelosProxyMiddleware).forRoutes({
104
+ path: 'api/*splat',
105
+ method: common_1.RequestMethod.ALL,
106
+ });
107
+ }
76
108
  }
77
109
  };
78
110
  exports.QelosModule = QelosModule;
@@ -83,6 +115,8 @@ QelosModule.sdkProvider = {
83
115
  inject: [core_1.REQUEST],
84
116
  };
85
117
  exports.QelosModule = QelosModule = QelosModule_1 = __decorate([
86
- (0, common_1.Module)({})
118
+ (0, common_1.Module)({}),
119
+ __param(0, (0, common_1.Inject)(constants_1.QELOS_MODULE_OPTIONS)),
120
+ __metadata("design:paramtypes", [Object])
87
121
  ], QelosModule);
88
122
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAUwB;AACxB,uCAAuC;AACvC,2CAA8D;AAC9D,qDAA0D;AAC1D,6CAA+C;AAwBxC,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAoBtB,MAAM,CAAC,OAAO,CAAC,eAAqD;QAClE,MAAM,OAAO,GAAG,IAAA,uCAAsB,EAAC,eAAe,CAAC,CAAC;QACxD,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,gCAAoB;YAC7B,QAAQ,EAAE,OAAO;SAClB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE,CAAC,eAAe,EAAE,4BAAe,EAAE,aAAW,CAAC,WAAW,CAAC;YACtE,OAAO,EAAE,CAAC,eAAe,EAAE,4BAAe,EAAE,qBAAS,CAAC;YACtD,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,MAAM,SAAS,GAAe;YAC5B,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACrC,4BAAe;YACf,aAAW,CAAC,WAAW;SACxB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,CAAC,gCAAoB,EAAE,4BAAe,EAAE,qBAAS,CAAC;YAC3D,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CACjC,OAAgC;QAEhC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,eAAe,GAAwC;gBAC3D,OAAO,EAAE,gCAAoB;gBAC7B,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE,CACvC,IAAA,uCAAsB,EAAC,MAAM,OAAO,CAAC,UAAW,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC5D,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;aAC7B,CAAC;YACF,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;QACJ,CAAC;QACD,MAAM,eAAe,GAAwC;YAC3D,OAAO,EAAE,gCAAoB;YAC7B,UAAU,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE,CACjD,IAAA,uCAAsB,EAAC,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC5D,MAAM,EAAE,CAAC,YAAY,CAAC;SACvB,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO;gBACL,eAAe;gBACf,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAc;aAC9D,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,QAAQ,CAAC,KAAK,CAAC,4BAAe,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;;AAxFU,kCAAW;AACE,uBAAW,GAAa;IAC9C,OAAO,EAAE,qBAAS;IAClB,KAAK,EAAE,cAAK,CAAC,OAAO;IACpB,UAAU,EAAE,CAAC,OAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;IACvD,MAAM,EAAE,CAAC,cAAO,CAAC;CAClB,AALkC,CAKjC;sBANS,WAAW;IADvB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CAyFvB"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { QelosNestConfig } from './types';
2
+ /**
3
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
4
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
5
+ * dev-time overrides when the configured `appUrl` is not reachable from
6
+ * the local host.
7
+ *
8
+ * Priority (highest first):
9
+ * 1. `process.env.QELOS_PROXY_TARGET`
10
+ * 2. `process.env.QELOS_IP`
11
+ * 3. `process.env.QELOS_API_IP`
12
+ * 4. `config.appUrl`
13
+ *
14
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
15
+ * nothing is configured so the caller can surface a clear error.
16
+ */
17
+ export declare function resolveQelosProxyTarget(config: QelosNestConfig): string | undefined;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveQelosProxyTarget = resolveQelosProxyTarget;
4
+ /**
5
+ * Resolve the origin to which `/api/**` requests are proxied. The managed
6
+ * Qelos app URL (`config.appUrl`) is the proxy target — env vars are only
7
+ * dev-time overrides when the configured `appUrl` is not reachable from
8
+ * the local host.
9
+ *
10
+ * Priority (highest first):
11
+ * 1. `process.env.QELOS_PROXY_TARGET`
12
+ * 2. `process.env.QELOS_IP`
13
+ * 3. `process.env.QELOS_API_IP`
14
+ * 4. `config.appUrl`
15
+ *
16
+ * Empty / whitespace-only values are skipped, and `undefined` is returned when
17
+ * nothing is configured so the caller can surface a clear error.
18
+ */
19
+ function resolveQelosProxyTarget(config) {
20
+ const env = process.env;
21
+ const fromEnv = env.QELOS_PROXY_TARGET?.trim() ||
22
+ env.QELOS_IP?.trim() ||
23
+ env.QELOS_API_IP?.trim();
24
+ if (fromEnv)
25
+ return fromEnv;
26
+ const fromAppUrl = config.appUrl?.trim();
27
+ return fromAppUrl || undefined;
28
+ }
29
+ //# sourceMappingURL=proxy-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-target.js","sourceRoot":"","sources":["../src/proxy-target.ts"],"names":[],"mappings":";;AAiBA,0DAYC;AA3BD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,uBAAuB,CACrC,MAAuB;IAEvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,OAAO,GACX,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE;QAC9B,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE;QACpB,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const proxy_target_1 = require("./proxy-target");
9
+ const PROXY_ENV_KEYS = [
10
+ 'QELOS_PROXY_TARGET',
11
+ 'QELOS_IP',
12
+ 'QELOS_API_IP',
13
+ ];
14
+ function clearProxyEnv() {
15
+ for (const key of PROXY_ENV_KEYS) {
16
+ delete process.env[key];
17
+ }
18
+ }
19
+ (0, node_test_1.describe)('resolveQelosProxyTarget', () => {
20
+ const savedEnv = {};
21
+ (0, node_test_1.beforeEach)(() => {
22
+ for (const key of PROXY_ENV_KEYS) {
23
+ savedEnv[key] = process.env[key];
24
+ }
25
+ clearProxyEnv();
26
+ });
27
+ (0, node_test_1.afterEach)(() => {
28
+ for (const key of PROXY_ENV_KEYS) {
29
+ if (savedEnv[key] === undefined) {
30
+ delete process.env[key];
31
+ }
32
+ else {
33
+ process.env[key] = savedEnv[key];
34
+ }
35
+ }
36
+ });
37
+ (0, node_test_1.it)('uses QELOS_PROXY_TARGET when set, even if other env vars and appUrl exist', () => {
38
+ process.env.QELOS_PROXY_TARGET = 'https://from-proxy-env.example';
39
+ process.env.QELOS_IP = 'https://from-qelos-ip.example';
40
+ process.env.QELOS_API_IP = 'https://from-qelos-api-ip.example';
41
+ const config = {
42
+ appUrl: 'https://from-app-url.example',
43
+ };
44
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://from-proxy-env.example');
45
+ });
46
+ (0, node_test_1.it)('falls back to QELOS_IP when QELOS_PROXY_TARGET is unset', () => {
47
+ process.env.QELOS_IP = 'https://from-qelos-ip.example';
48
+ process.env.QELOS_API_IP = 'https://from-qelos-api-ip.example';
49
+ const config = {
50
+ appUrl: 'https://from-app-url.example',
51
+ };
52
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://from-qelos-ip.example');
53
+ });
54
+ (0, node_test_1.it)('falls back to QELOS_API_IP when higher-priority env vars are unset', () => {
55
+ process.env.QELOS_API_IP = 'https://from-qelos-api-ip.example';
56
+ const config = {
57
+ appUrl: 'https://from-app-url.example',
58
+ };
59
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://from-qelos-api-ip.example');
60
+ });
61
+ (0, node_test_1.it)('falls back to config.appUrl when no env var is set', () => {
62
+ const config = {
63
+ appUrl: 'https://from-app-url.example',
64
+ };
65
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://from-app-url.example');
66
+ });
67
+ (0, node_test_1.it)('returns undefined when nothing is configured', () => {
68
+ const config = { appUrl: '' };
69
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), undefined);
70
+ });
71
+ (0, node_test_1.it)('treats whitespace-only values as unset', () => {
72
+ process.env.QELOS_PROXY_TARGET = ' ';
73
+ process.env.QELOS_IP = '\t';
74
+ const config = {
75
+ appUrl: 'https://from-app-url.example',
76
+ };
77
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://from-app-url.example');
78
+ });
79
+ (0, node_test_1.it)('trims surrounding whitespace from resolved values', () => {
80
+ const config = {
81
+ appUrl: ' https://trimmed.example ',
82
+ };
83
+ strict_1.default.equal((0, proxy_target_1.resolveQelosProxyTarget)(config), 'https://trimmed.example');
84
+ });
85
+ });
86
+ //# sourceMappingURL=proxy-target.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-target.test.js","sourceRoot":"","sources":["../src/proxy-target.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type NestMiddleware } from '@nestjs/common';
2
+ import type { QelosModuleOptions } from './types';
3
+ export declare class QelosProxyMiddleware implements NestMiddleware {
4
+ private readonly options;
5
+ constructor(options: QelosModuleOptions);
6
+ use(req: unknown, res: unknown, _next: (err?: unknown) => void): void;
7
+ }
@@ -0,0 +1,197 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __metadata = (this && this.__metadata) || function (k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ };
34
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
35
+ return function (target, key) { decorator(target, key, paramIndex); }
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.QelosProxyMiddleware = void 0;
39
+ const common_1 = require("@nestjs/common");
40
+ const http = __importStar(require("node:http"));
41
+ const https = __importStar(require("node:https"));
42
+ const node_url_1 = require("node:url");
43
+ const constants_1 = require("./constants");
44
+ const cookies_1 = require("./cookies");
45
+ const proxy_target_1 = require("./proxy-target");
46
+ const HOP_BY_HOP = new Set([
47
+ 'connection',
48
+ 'keep-alive',
49
+ 'proxy-authenticate',
50
+ 'proxy-authorization',
51
+ 'te',
52
+ 'trailer',
53
+ 'transfer-encoding',
54
+ 'upgrade',
55
+ 'host',
56
+ 'content-length',
57
+ ]);
58
+ function getIncomingMessage(req) {
59
+ if (req &&
60
+ typeof req === 'object' &&
61
+ 'raw' in req &&
62
+ req.raw &&
63
+ typeof req.raw.pipe === 'function') {
64
+ return req.raw;
65
+ }
66
+ return req;
67
+ }
68
+ function getServerResponse(res) {
69
+ if (res &&
70
+ typeof res === 'object' &&
71
+ 'raw' in res &&
72
+ res.raw &&
73
+ typeof res.raw.setHeader === 'function') {
74
+ return res.raw;
75
+ }
76
+ return res;
77
+ }
78
+ function getRequestUrl(req) {
79
+ const r = req;
80
+ if (typeof r.originalUrl === 'string')
81
+ return r.originalUrl;
82
+ if (typeof r.url === 'string')
83
+ return r.url;
84
+ return '';
85
+ }
86
+ function buildForwardedHeaders(source, targetHost) {
87
+ const out = {};
88
+ for (const [name, value] of Object.entries(source)) {
89
+ if (value === undefined)
90
+ continue;
91
+ if (HOP_BY_HOP.has(name.toLowerCase()))
92
+ continue;
93
+ out[name] = value;
94
+ }
95
+ out.host = targetHost;
96
+ return out;
97
+ }
98
+ function sendJsonError(res, status, body) {
99
+ const framework = res;
100
+ if (typeof framework.status === 'function' && typeof framework.json === 'function') {
101
+ framework.status(status);
102
+ framework.json(body);
103
+ return;
104
+ }
105
+ const raw = getServerResponse(res);
106
+ if (!raw.headersSent) {
107
+ raw.statusCode = status;
108
+ raw.setHeader('content-type', 'application/json');
109
+ raw.end(JSON.stringify(body));
110
+ }
111
+ }
112
+ let QelosProxyMiddleware = class QelosProxyMiddleware {
113
+ constructor(options) {
114
+ this.options = options;
115
+ }
116
+ use(req, res, _next) {
117
+ const request = req;
118
+ const base = (0, proxy_target_1.resolveQelosProxyTarget)(this.options.config);
119
+ if (!base) {
120
+ sendJsonError(res, 503, {
121
+ code: 'QELOS_PROXY_NOT_CONFIGURED',
122
+ message: '[@qelos/integrator-nest] Qelos API proxy is not configured. ' +
123
+ 'Set config.appUrl (or QELOS_PROXY_TARGET / QELOS_IP / QELOS_API_IP in development).',
124
+ });
125
+ return;
126
+ }
127
+ let target;
128
+ try {
129
+ const baseUrl = new node_url_1.URL(base);
130
+ const incomingUrl = getRequestUrl(request);
131
+ target = new node_url_1.URL(incomingUrl, baseUrl);
132
+ }
133
+ catch {
134
+ sendJsonError(res, 502, {
135
+ code: 'QELOS_PROXY_BAD_TARGET',
136
+ message: '[@qelos/integrator-nest] Invalid proxy target URL.',
137
+ });
138
+ return;
139
+ }
140
+ const client = target.protocol === 'https:' ? https : http;
141
+ const hostHeader = request.headers.host;
142
+ const originalHost = typeof hostHeader === 'string'
143
+ ? hostHeader
144
+ : Array.isArray(hostHeader)
145
+ ? hostHeader[0]
146
+ : undefined;
147
+ const nodeReq = getIncomingMessage(req);
148
+ const forwardedHeaders = buildForwardedHeaders(nodeReq.headers, target.host);
149
+ const upstreamReq = client.request({
150
+ protocol: target.protocol,
151
+ hostname: target.hostname,
152
+ port: target.port || (target.protocol === 'https:' ? 443 : 80),
153
+ method: nodeReq.method,
154
+ path: target.pathname + target.search,
155
+ headers: forwardedHeaders,
156
+ }, (upstreamRes) => {
157
+ const rawRes = getServerResponse(res);
158
+ const status = upstreamRes.statusCode ?? 502;
159
+ for (const [name, value] of Object.entries(upstreamRes.headers)) {
160
+ if (value === undefined)
161
+ continue;
162
+ const lower = name.toLowerCase();
163
+ if (HOP_BY_HOP.has(lower))
164
+ continue;
165
+ if (lower === 'set-cookie') {
166
+ const values = Array.isArray(value) ? value : [value];
167
+ rawRes.setHeader('set-cookie', values.map((v) => (0, cookies_1.rewriteSetCookieDomain)(v, originalHost)));
168
+ continue;
169
+ }
170
+ rawRes.setHeader(name, value);
171
+ }
172
+ rawRes.statusCode = status;
173
+ upstreamRes.pipe(rawRes);
174
+ });
175
+ upstreamReq.on('error', (err) => {
176
+ const rawRes = getServerResponse(res);
177
+ if (!rawRes.headersSent) {
178
+ sendJsonError(res, 502, {
179
+ code: 'QELOS_PROXY_UPSTREAM_ERROR',
180
+ message: err.message,
181
+ });
182
+ }
183
+ else {
184
+ rawRes.end();
185
+ }
186
+ });
187
+ nodeReq.on('aborted', () => upstreamReq.destroy());
188
+ nodeReq.pipe(upstreamReq);
189
+ }
190
+ };
191
+ exports.QelosProxyMiddleware = QelosProxyMiddleware;
192
+ exports.QelosProxyMiddleware = QelosProxyMiddleware = __decorate([
193
+ (0, common_1.Injectable)(),
194
+ __param(0, (0, common_1.Inject)(constants_1.QELOS_MODULE_OPTIONS)),
195
+ __metadata("design:paramtypes", [Object])
196
+ ], QelosProxyMiddleware);
197
+ //# sourceMappingURL=proxy.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.middleware.js","sourceRoot":"","sources":["../src/proxy.middleware.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,3 @@
1
- import type { AnyRequest, AnyResponse, QelosNestConfig, QelosTokenPair, ResolvedTokens } from './types';
2
- export declare const DEFAULT_ACCESS_COOKIE = "q_access_token";
3
- export declare const DEFAULT_REFRESH_COOKIE = "q_refresh_token";
4
- export declare function readCookie(request: AnyRequest, name: string): string | undefined;
5
- export declare function readTokens(request: AnyRequest, config: QelosNestConfig): QelosTokenPair;
6
- export declare function writeTokensToCookies(response: AnyResponse, config: QelosNestConfig, tokens: ResolvedTokens): void;
1
+ import type { AnyRequest, AnyResponse, QelosNestConfig } from './types';
2
+ export declare function appendSetCookie(response: AnyResponse, value: string): void;
7
3
  export declare function shouldSkip(request: AnyRequest, config: QelosNestConfig): boolean;
@@ -1,61 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_REFRESH_COOKIE = exports.DEFAULT_ACCESS_COOKIE = void 0;
4
- exports.readCookie = readCookie;
5
- exports.readTokens = readTokens;
6
- exports.writeTokensToCookies = writeTokensToCookies;
3
+ exports.appendSetCookie = appendSetCookie;
7
4
  exports.shouldSkip = shouldSkip;
8
- exports.DEFAULT_ACCESS_COOKIE = 'q_access_token';
9
- exports.DEFAULT_REFRESH_COOKIE = 'q_refresh_token';
10
- function readCookie(request, name) {
11
- // Prefer cookie-parser / @fastify/cookie's parsed output when available.
12
- if (request.cookies && typeof request.cookies[name] === 'string') {
13
- return request.cookies[name];
14
- }
15
- const cookieHeader = request.headers.cookie;
16
- const header = Array.isArray(cookieHeader) ? cookieHeader.join('; ') : cookieHeader;
17
- if (!header)
18
- return undefined;
19
- const prefix = name + '=';
20
- for (const part of header.split(';')) {
21
- const trimmed = part.trim();
22
- if (trimmed.startsWith(prefix)) {
23
- try {
24
- return decodeURIComponent(trimmed.slice(prefix.length));
25
- }
26
- catch {
27
- return trimmed.slice(prefix.length);
28
- }
29
- }
30
- }
31
- return undefined;
32
- }
33
- function readTokens(request, config) {
34
- const accessCookie = config.accessTokenCookie || exports.DEFAULT_ACCESS_COOKIE;
35
- const refreshCookie = config.refreshTokenCookie || exports.DEFAULT_REFRESH_COOKIE;
36
- const cookieAccess = readCookie(request, accessCookie);
37
- const cookieRefresh = readCookie(request, refreshCookie);
38
- const rawAuth = request.headers.authorization;
39
- const authHeader = Array.isArray(rawAuth) ? rawAuth[0] : rawAuth;
40
- const headerAccess = authHeader && authHeader.toLowerCase().startsWith('bearer ')
41
- ? authHeader.slice(7).trim()
42
- : undefined;
43
- return {
44
- accessToken: headerAccess || cookieAccess || undefined,
45
- refreshToken: cookieRefresh || undefined,
46
- };
47
- }
48
- function serializeCookie(name, value, secure) {
49
- const parts = [
50
- `${name}=${encodeURIComponent(value)}`,
51
- 'Path=/',
52
- 'HttpOnly',
53
- 'SameSite=Lax',
54
- ];
55
- if (secure)
56
- parts.push('Secure');
57
- return parts.join('; ');
58
- }
59
5
  function appendSetCookie(response, value) {
60
6
  const setHeader = response.setHeader || response.header;
61
7
  const getHeader = response.getHeader;
@@ -74,37 +20,6 @@ function appendSetCookie(response, value) {
74
20
  setHeader.call(response, 'set-cookie', next);
75
21
  }
76
22
  }
77
- function writeTokensToCookies(response, config, tokens) {
78
- const accessCookie = config.accessTokenCookie || exports.DEFAULT_ACCESS_COOKIE;
79
- const refreshCookie = config.refreshTokenCookie || exports.DEFAULT_REFRESH_COOKIE;
80
- const secure = !/^http:\/\//i.test(config.appUrl);
81
- const cookieOptions = {
82
- httpOnly: true,
83
- secure,
84
- sameSite: 'lax',
85
- path: '/',
86
- };
87
- // Express
88
- if (typeof response.cookie === 'function') {
89
- response.cookie(accessCookie, tokens.accessToken, cookieOptions);
90
- if (tokens.refreshToken) {
91
- response.cookie(refreshCookie, tokens.refreshToken, cookieOptions);
92
- }
93
- return;
94
- }
95
- // Fastify (with @fastify/cookie)
96
- if (typeof response.setCookie === 'function') {
97
- response.setCookie(accessCookie, tokens.accessToken, cookieOptions);
98
- if (tokens.refreshToken) {
99
- response.setCookie(refreshCookie, tokens.refreshToken, cookieOptions);
100
- }
101
- return;
102
- }
103
- appendSetCookie(response, serializeCookie(accessCookie, tokens.accessToken, secure));
104
- if (tokens.refreshToken) {
105
- appendSetCookie(response, serializeCookie(refreshCookie, tokens.refreshToken, secure));
106
- }
107
- }
108
23
  function shouldSkip(request, config) {
109
24
  if (!config.skipPaths?.length)
110
25
  return false;