nest-graph-inspector 0.2.9 → 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.
Files changed (39) hide show
  1. package/README.md +20 -11
  2. package/package.json +1 -1
  3. package/src/{drivers/file-output.driver.d.ts → adapters/file-output.adapter.d.ts} +17 -2
  4. package/src/adapters/file-output.adapter.js +284 -0
  5. package/src/adapters/file-output.adapter.js.map +1 -0
  6. package/src/adapters/http-output.adapter.d.ts +25 -0
  7. package/src/adapters/http-output.adapter.js +94 -0
  8. package/src/adapters/http-output.adapter.js.map +1 -0
  9. package/src/adapters/http-serve.adapter.d.ts +58 -0
  10. package/src/adapters/http-serve.adapter.js +298 -0
  11. package/src/adapters/http-serve.adapter.js.map +1 -0
  12. package/src/{drivers/json-output.driver.d.ts → adapters/json-output.adapter.d.ts} +1 -1
  13. package/src/{drivers/json-output.driver.js → adapters/json-output.adapter.js} +6 -6
  14. package/src/adapters/json-output.adapter.js.map +1 -0
  15. package/src/adapters/proxy.adapter.d.ts +21 -0
  16. package/src/adapters/proxy.adapter.js +153 -0
  17. package/src/adapters/proxy.adapter.js.map +1 -0
  18. package/src/adapters/viewer-output.adapter.d.ts +22 -0
  19. package/src/adapters/viewer-output.adapter.js +82 -0
  20. package/src/adapters/viewer-output.adapter.js.map +1 -0
  21. package/src/nest-graph-inspector.module.js +22 -9
  22. package/src/nest-graph-inspector.module.js.map +1 -1
  23. package/src/nest-graph-inspector.setup.d.ts +19 -5
  24. package/src/nest-graph-inspector.setup.js +217 -9
  25. package/src/nest-graph-inspector.setup.js.map +1 -1
  26. package/src/nest-graph-inspector.type.d.ts +10 -0
  27. package/src/ports/proxy.gateway.d.ts +15 -0
  28. package/src/ports/proxy.gateway.js +3 -0
  29. package/src/ports/proxy.gateway.js.map +1 -0
  30. package/src/types/graph-output.type.d.ts +27 -0
  31. package/src/drivers/file-output.driver.js +0 -187
  32. package/src/drivers/file-output.driver.js.map +0 -1
  33. package/src/drivers/http-output.driver.d.ts +0 -19
  34. package/src/drivers/http-output.driver.js +0 -62
  35. package/src/drivers/http-output.driver.js.map +0 -1
  36. package/src/drivers/json-output.driver.js.map +0 -1
  37. package/src/drivers/viewer-output.driver.d.ts +0 -16
  38. package/src/drivers/viewer-output.driver.js +0 -42
  39. package/src/drivers/viewer-output.driver.js.map +0 -1
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HttpServeAdapter = void 0;
13
+ const node_http_1 = __importDefault(require("node:http"));
14
+ const node_url_1 = require("node:url");
15
+ const common_1 = require("@nestjs/common");
16
+ let HttpServeAdapter = class HttpServeAdapter {
17
+ servers = new Map();
18
+ register(options, routes) {
19
+ const originUrl = this.normalizeOrigin(options);
20
+ const state = this.serverState(originUrl);
21
+ for (const route of routes) {
22
+ const key = this.routeKey(route.type, this.normalizePath(route.path));
23
+ const routeGroup = state.routes.get(key) ?? [];
24
+ routeGroup.push(route);
25
+ state.routes.set(key, routeGroup);
26
+ }
27
+ return { origin: state.originUrl.origin };
28
+ }
29
+ get(path, callback, options = {}) {
30
+ return { type: 'GET', path, callback, ...options };
31
+ }
32
+ post(path, callback, options = {}) {
33
+ return { type: 'POST', path, callback, ...options };
34
+ }
35
+ all(path, rawCallback, options = {}) {
36
+ return { type: '*', path, rawCallback, ...options };
37
+ }
38
+ async serve() {
39
+ await Promise.all([...this.servers.values()].map((state) => this.serveState(state)));
40
+ }
41
+ close(origin) {
42
+ if (!origin) {
43
+ for (const state of this.servers.values()) {
44
+ state.server?.close();
45
+ }
46
+ this.servers.clear();
47
+ return;
48
+ }
49
+ const originUrl = this.normalizeOrigin({ origin });
50
+ const state = this.servers.get(originUrl.origin);
51
+ state?.server?.close();
52
+ this.servers.delete(originUrl.origin);
53
+ }
54
+ onModuleDestroy() {
55
+ this.close();
56
+ }
57
+ serverState(originUrl) {
58
+ const existing = this.servers.get(originUrl.origin);
59
+ if (existing) {
60
+ return existing;
61
+ }
62
+ const state = {
63
+ originUrl,
64
+ routes: new Map(),
65
+ };
66
+ this.servers.set(originUrl.origin, state);
67
+ return state;
68
+ }
69
+ serveState(state) {
70
+ if (state.listenPromise) {
71
+ return state.listenPromise;
72
+ }
73
+ state.server = node_http_1.default.createServer((req, res) => {
74
+ void this.handleRequest(state.originUrl, state.routes, req, res);
75
+ });
76
+ state.listenPromise = this.listen(state);
77
+ return state.listenPromise;
78
+ }
79
+ listen(state) {
80
+ return new Promise((resolve, reject) => {
81
+ const onError = (error) => {
82
+ reject(error);
83
+ };
84
+ state.server?.once('error', onError);
85
+ state.server?.listen(Number(state.originUrl.port || 80), state.originUrl.hostname, () => {
86
+ state.server?.off('error', onError);
87
+ this.resolveDynamicPort(state);
88
+ resolve();
89
+ });
90
+ });
91
+ }
92
+ async handleRequest(originUrl, routes, req, res) {
93
+ this.setCorsHeaders(res);
94
+ const route = this.route(originUrl, routes, req);
95
+ if (!route) {
96
+ this.sendText(res, 404, 'Not Found');
97
+ return;
98
+ }
99
+ try {
100
+ if (route.rawCallback) {
101
+ await route.rawCallback(req, res);
102
+ return;
103
+ }
104
+ const result = await route.callback?.({
105
+ request: req,
106
+ headers: req.headers,
107
+ });
108
+ this.sendResult(res, route, result);
109
+ }
110
+ catch (err) {
111
+ if (!res.headersSent) {
112
+ this.sendText(res, 500, err instanceof Error ? err.message : 'Error');
113
+ return;
114
+ }
115
+ res.destroy(err instanceof Error ? err : undefined);
116
+ }
117
+ }
118
+ route(originUrl, routes, req) {
119
+ const method = req.method ?? 'GET';
120
+ const path = new node_url_1.URL(req.url ?? '/', originUrl).pathname;
121
+ const candidates = [
122
+ ...(routes.get(this.routeKey(method, path)) ?? []),
123
+ ...this.wildcardPathCandidates(routes, method, path),
124
+ ...(routes.get(this.routeKey(method, '*')) ?? []),
125
+ ...(routes.get(this.routeKey('*', path)) ?? []),
126
+ ...this.wildcardPathCandidates(routes, '*', path),
127
+ ...(routes.get(this.routeKey('*', '*')) ?? []),
128
+ ];
129
+ return candidates.find((route) => this.requestHeadersMatch(route.requestHeaders, req));
130
+ }
131
+ wildcardPathCandidates(routes, method, path) {
132
+ const methodPrefix = `${method.toUpperCase()} `;
133
+ const candidates = [];
134
+ for (const [key, routeGroup] of routes) {
135
+ if (!key.startsWith(methodPrefix)) {
136
+ continue;
137
+ }
138
+ const routePath = key.slice(methodPrefix.length);
139
+ if (!routePath.endsWith('/*')) {
140
+ continue;
141
+ }
142
+ const prefix = routePath.slice(0, -1);
143
+ if (path === prefix.slice(0, -1) || path.startsWith(prefix)) {
144
+ candidates.push(...routeGroup);
145
+ }
146
+ }
147
+ return candidates;
148
+ }
149
+ routeKey(method, path) {
150
+ return `${method.toUpperCase()} ${path}`;
151
+ }
152
+ sendResult(res, route, result) {
153
+ if (res.writableEnded) {
154
+ return;
155
+ }
156
+ const response = this.normalizeResponse(route, result);
157
+ const { body, contentType } = this.serializeBody(response.body, response.contentType);
158
+ res.writeHead(response.statusCode ?? 200, {
159
+ ...response.headers,
160
+ 'content-type': contentType,
161
+ 'content-length': Buffer.byteLength(body),
162
+ });
163
+ res.end(body);
164
+ }
165
+ normalizeResponse(route, result) {
166
+ const defaults = {
167
+ statusCode: route.statusCode,
168
+ contentType: route.contentType ?? this.contentTypeHeader(route.responseHeaders),
169
+ headers: route.responseHeaders,
170
+ };
171
+ if (this.isHttpServeResponse(result)) {
172
+ return {
173
+ ...defaults,
174
+ ...result,
175
+ contentType: result.contentType ??
176
+ this.contentTypeHeader(result.headers) ??
177
+ defaults.contentType,
178
+ headers: {
179
+ ...defaults.headers,
180
+ ...result.headers,
181
+ },
182
+ };
183
+ }
184
+ return { ...defaults, body: result };
185
+ }
186
+ isHttpServeResponse(result) {
187
+ if (!result || typeof result !== 'object' || Buffer.isBuffer(result)) {
188
+ return false;
189
+ }
190
+ return ('body' in result ||
191
+ 'headers' in result ||
192
+ 'contentType' in result ||
193
+ 'statusCode' in result);
194
+ }
195
+ serializeBody(body, contentType) {
196
+ if (body === undefined || body === null) {
197
+ return {
198
+ body: '',
199
+ contentType: contentType ?? 'text/plain; charset=utf-8',
200
+ };
201
+ }
202
+ if (Buffer.isBuffer(body)) {
203
+ return {
204
+ body: body.toString(),
205
+ contentType: contentType ?? 'application/octet-stream',
206
+ };
207
+ }
208
+ if (typeof body === 'string') {
209
+ return {
210
+ body,
211
+ contentType: contentType ?? 'text/plain; charset=utf-8',
212
+ };
213
+ }
214
+ return {
215
+ body: JSON.stringify(body),
216
+ contentType: contentType ?? 'application/json; charset=utf-8',
217
+ };
218
+ }
219
+ sendText(res, statusCode, body) {
220
+ res.writeHead(statusCode, {
221
+ 'content-type': 'text/plain; charset=utf-8',
222
+ 'content-length': Buffer.byteLength(body),
223
+ });
224
+ res.end(body);
225
+ }
226
+ requestHeadersMatch(expectedHeaders, req) {
227
+ if (!expectedHeaders) {
228
+ return true;
229
+ }
230
+ return Object.entries(expectedHeaders).every(([name, expectedValue]) => {
231
+ const actualValue = req.headers[name.toLowerCase()];
232
+ if (Array.isArray(expectedValue)) {
233
+ return expectedValue.join(',') === this.headerValue(actualValue);
234
+ }
235
+ return String(expectedValue) === this.headerValue(actualValue);
236
+ });
237
+ }
238
+ headerValue(value) {
239
+ if (Array.isArray(value)) {
240
+ return value.join(',');
241
+ }
242
+ return value ?? '';
243
+ }
244
+ contentTypeHeader(headers) {
245
+ const value = headers?.['content-type'] ?? headers?.['Content-Type'];
246
+ if (Array.isArray(value)) {
247
+ return value[0];
248
+ }
249
+ return typeof value === 'number' ? String(value) : value;
250
+ }
251
+ setCorsHeaders(res) {
252
+ res.setHeader('Access-Control-Allow-Origin', '*');
253
+ res.setHeader('Access-Control-Allow-Headers', '*');
254
+ }
255
+ resolveDynamicPort(state) {
256
+ if (state.originUrl.port !== '0') {
257
+ return;
258
+ }
259
+ const originalOrigin = state.originUrl.origin;
260
+ const address = state.server?.address();
261
+ if (address && typeof address !== 'string') {
262
+ state.originUrl.port = String(address.port);
263
+ this.servers.delete(originalOrigin);
264
+ this.servers.set(state.originUrl.origin, state);
265
+ }
266
+ }
267
+ normalizeOrigin(options) {
268
+ const origin = options.origin ?? 'http://localhost';
269
+ const normalizedOrigin = origin.startsWith('http://') || origin.startsWith('https://')
270
+ ? origin
271
+ : `http://${origin}`;
272
+ const originUrl = new node_url_1.URL(normalizedOrigin);
273
+ if (originUrl.protocol !== 'http:') {
274
+ throw new Error(`Graph inspector native HTTP server only supports http origins: ${origin}`);
275
+ }
276
+ if (options.host) {
277
+ originUrl.hostname = options.host;
278
+ }
279
+ if (options.port !== undefined) {
280
+ originUrl.port = String(options.port);
281
+ }
282
+ if (!originUrl.port) {
283
+ originUrl.port = '80';
284
+ }
285
+ return originUrl;
286
+ }
287
+ normalizePath(path) {
288
+ if (path === '*') {
289
+ return path;
290
+ }
291
+ return path.startsWith('/') ? path : `/${path}`;
292
+ }
293
+ };
294
+ exports.HttpServeAdapter = HttpServeAdapter;
295
+ exports.HttpServeAdapter = HttpServeAdapter = __decorate([
296
+ (0, common_1.Injectable)()
297
+ ], HttpServeAdapter);
298
+ //# sourceMappingURL=http-serve.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-serve.adapter.js","sourceRoot":"","sources":["../../../../../libs/nest-graph-inspector/src/adapters/http-serve.adapter.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import type { GraphOutput } from '../types/graph-output.type';
4
4
  type JsonOutputConfig = Extract<NestGraphInspectorOutput, {
5
5
  type: 'json';
6
6
  }>;
7
- export declare class JsonOutputDriver implements OutputAdapter<JsonOutputConfig> {
7
+ export declare class JsonOutputAdapter implements OutputAdapter<JsonOutputConfig> {
8
8
  execute(graphOutput: GraphOutput, config: JsonOutputConfig): Promise<{
9
9
  message: string;
10
10
  }>;
@@ -6,11 +6,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.JsonOutputDriver = void 0;
9
+ exports.JsonOutputAdapter = void 0;
10
10
  const promises_1 = require("node:fs/promises");
11
11
  const common_1 = require("@nestjs/common");
12
12
  const node_path_1 = require("node:path");
13
- let JsonOutputDriver = class JsonOutputDriver {
13
+ let JsonOutputAdapter = class JsonOutputAdapter {
14
14
  async execute(graphOutput, config) {
15
15
  const filePath = (0, node_path_1.join)(process.cwd(), config.path);
16
16
  const json = JSON.stringify(graphOutput, null, 2);
@@ -21,8 +21,8 @@ let JsonOutputDriver = class JsonOutputDriver {
21
21
  };
22
22
  }
23
23
  };
24
- exports.JsonOutputDriver = JsonOutputDriver;
25
- exports.JsonOutputDriver = JsonOutputDriver = __decorate([
24
+ exports.JsonOutputAdapter = JsonOutputAdapter;
25
+ exports.JsonOutputAdapter = JsonOutputAdapter = __decorate([
26
26
  (0, common_1.Injectable)()
27
- ], JsonOutputDriver);
28
- //# sourceMappingURL=json-output.driver.js.map
27
+ ], JsonOutputAdapter);
28
+ //# sourceMappingURL=json-output.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.adapter.js","sourceRoot":"","sources":["../../../../../libs/nest-graph-inspector/src/adapters/json-output.adapter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+CAAoD;AACpD,2CAA4C;AAC5C,yCAA0C;AAQnC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,KAAK,CAAC,OAAO,CACX,WAAwB,EACxB,MAAwB;QAExB,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM,IAAA,gBAAK,EAAC,IAAA,mBAAO,EAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhC,OAAO;YACL,OAAO,EAAE,8CAA8C,QAAQ,EAAE;SAClE,CAAC;IACJ,CAAC;CACF,CAAA;AAfY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAe7B"}
@@ -0,0 +1,21 @@
1
+ import { HttpServeAdapter } from './http-serve.adapter';
2
+ import type { ProxyGateway, ProxyGatewayOptions } from '../ports/proxy.gateway';
3
+ export declare class ProxyAdapter implements ProxyGateway {
4
+ private readonly httpServeAdapters;
5
+ serve(options: ProxyGatewayOptions, internalOptions?: {
6
+ httpAdapter?: HttpServeAdapter;
7
+ pathPrefix?: string;
8
+ }): Promise<void>;
9
+ close(): void;
10
+ private forwardRequest;
11
+ private targetUrl;
12
+ private forwardResponse;
13
+ private createProxyRequestOptions;
14
+ private handleProxyError;
15
+ private getRequestModule;
16
+ private getCorsHeaders;
17
+ private applyCors;
18
+ private isAllowedOrigin;
19
+ private normalizeUrl;
20
+ private normalizePath;
21
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProxyAdapter = void 0;
13
+ const node_http_1 = __importDefault(require("node:http"));
14
+ const node_https_1 = __importDefault(require("node:https"));
15
+ const node_url_1 = require("node:url");
16
+ const common_1 = require("@nestjs/common");
17
+ const http_serve_adapter_1 = require("./http-serve.adapter");
18
+ let ProxyAdapter = class ProxyAdapter {
19
+ httpServeAdapters = [];
20
+ async serve(options, internalOptions = {}) {
21
+ const fromUrl = this.normalizeUrl(options.from);
22
+ const toUrl = this.normalizeUrl(options.to);
23
+ const cors = options.cors === false ? undefined : options.cors;
24
+ const isReuseHttpAdapter = !!internalOptions.httpAdapter;
25
+ const httpServeAdapter = internalOptions.httpAdapter ?? new http_serve_adapter_1.HttpServeAdapter();
26
+ const pathPrefix = internalOptions.pathPrefix
27
+ ? this.normalizePath(internalOptions.pathPrefix)
28
+ : undefined;
29
+ httpServeAdapter.register({ origin: fromUrl.origin }, (pathPrefix ? [pathPrefix, `${pathPrefix}/*`] : ['*']).map((path) => ({
30
+ type: '*',
31
+ path,
32
+ rawCallback: (clientReq, clientRes) => {
33
+ this.applyCors(cors, clientReq, clientRes);
34
+ this.forwardRequest(toUrl, cors, clientReq, clientRes, pathPrefix);
35
+ },
36
+ })));
37
+ if (isReuseHttpAdapter) {
38
+ return;
39
+ }
40
+ try {
41
+ await httpServeAdapter.serve();
42
+ }
43
+ catch (err) {
44
+ httpServeAdapter.close();
45
+ throw err;
46
+ }
47
+ this.httpServeAdapters.push(httpServeAdapter);
48
+ }
49
+ close() {
50
+ for (const httpServeAdapter of this.httpServeAdapters) {
51
+ httpServeAdapter.close();
52
+ }
53
+ this.httpServeAdapters.length = 0;
54
+ }
55
+ forwardRequest(toUrl, cors, clientReq, clientRes, pathPrefix) {
56
+ const targetUrl = this.targetUrl(clientReq.url ?? '/', toUrl, pathPrefix);
57
+ const requestModule = this.getRequestModule(targetUrl);
58
+ const proxyReq = requestModule.request(targetUrl, this.createProxyRequestOptions(clientReq, targetUrl), (proxyRes) => this.forwardResponse(cors, proxyRes, clientReq, clientRes));
59
+ proxyReq.on('error', (error) => {
60
+ this.handleProxyError(error, clientRes);
61
+ });
62
+ clientReq.pipe(proxyReq);
63
+ }
64
+ targetUrl(requestUrl, toUrl, pathPrefix) {
65
+ const targetUrl = new node_url_1.URL(requestUrl, toUrl);
66
+ if (!pathPrefix) {
67
+ return targetUrl;
68
+ }
69
+ if (targetUrl.pathname === pathPrefix ||
70
+ targetUrl.pathname.startsWith(`${pathPrefix}/`)) {
71
+ targetUrl.pathname = targetUrl.pathname.slice(pathPrefix.length) || '/';
72
+ }
73
+ return targetUrl;
74
+ }
75
+ forwardResponse(cors, proxyRes, clientReq, clientRes) {
76
+ clientRes.writeHead(proxyRes.statusCode ?? 500, {
77
+ ...proxyRes.headers,
78
+ ...this.getCorsHeaders(cors, clientReq),
79
+ });
80
+ proxyRes.pipe(clientRes);
81
+ }
82
+ createProxyRequestOptions(clientReq, targetUrl) {
83
+ return {
84
+ method: clientReq.method,
85
+ headers: {
86
+ ...clientReq.headers,
87
+ host: targetUrl.host,
88
+ },
89
+ };
90
+ }
91
+ handleProxyError(error, res) {
92
+ if (res.headersSent) {
93
+ res.destroy(error);
94
+ return;
95
+ }
96
+ res.statusCode = 502;
97
+ res.end(`Proxy error: ${error.message}`);
98
+ }
99
+ getRequestModule(targetUrl) {
100
+ return targetUrl.protocol === 'https:' ? node_https_1.default : node_http_1.default;
101
+ }
102
+ getCorsHeaders(cors, req) {
103
+ if (!cors)
104
+ return {};
105
+ const origin = req.headers.origin;
106
+ if (!this.isAllowedOrigin(cors, origin)) {
107
+ return {};
108
+ }
109
+ const allowHeaders = Array.isArray(cors.allowHeaders)
110
+ ? cors.allowHeaders.join(',')
111
+ : cors.allowHeaders;
112
+ return {
113
+ 'access-control-allow-origin': origin,
114
+ 'access-control-allow-methods': (cors.methods ?? ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']).join(','),
115
+ 'access-control-allow-headers': allowHeaders ?? req.headers['access-control-request-headers'] ?? '*',
116
+ 'access-control-allow-credentials': String(cors.credentials ?? true),
117
+ vary: 'Origin',
118
+ };
119
+ }
120
+ applyCors(cors, req, res) {
121
+ const headers = this.getCorsHeaders(cors, req);
122
+ for (const [key, value] of Object.entries(headers)) {
123
+ if (value !== undefined) {
124
+ res.setHeader(key, value);
125
+ }
126
+ }
127
+ }
128
+ isAllowedOrigin(cors, origin) {
129
+ if (typeof origin !== 'string')
130
+ return false;
131
+ return cors.origins.some((allowedOrigin) => {
132
+ if (typeof allowedOrigin === 'string') {
133
+ return allowedOrigin === origin;
134
+ }
135
+ return allowedOrigin.test(origin);
136
+ });
137
+ }
138
+ normalizeUrl(value) {
139
+ if (!value.startsWith('http://') && !value.startsWith('https://')) {
140
+ return new node_url_1.URL(`http://${value}`);
141
+ }
142
+ return new node_url_1.URL(value);
143
+ }
144
+ normalizePath(path) {
145
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`;
146
+ return normalizedPath.replace(/\/$/, '');
147
+ }
148
+ };
149
+ exports.ProxyAdapter = ProxyAdapter;
150
+ exports.ProxyAdapter = ProxyAdapter = __decorate([
151
+ (0, common_1.Injectable)()
152
+ ], ProxyAdapter);
153
+ //# sourceMappingURL=proxy.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.adapter.js","sourceRoot":"","sources":["../../../../../libs/nest-graph-inspector/src/adapters/proxy.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { OutputAdapter } from '../ports/output.adapter';
2
+ import { NestGraphInspectorOutput } from '../nest-graph-inspector.type';
3
+ import type { GraphOutput } from '../types/graph-output.type';
4
+ import { HttpOutputAdapter } from './http-output.adapter';
5
+ import { ProxyAdapter } from './proxy.adapter';
6
+ import { HttpServeAdapter } from './http-serve.adapter';
7
+ type ViewerOutputConfig = Extract<NestGraphInspectorOutput, {
8
+ type: 'viewer';
9
+ }>;
10
+ export declare class ViewerOutputAdapter implements OutputAdapter<ViewerOutputConfig> {
11
+ private readonly httpOutputAdapter;
12
+ private readonly proxyAdapter;
13
+ private readonly httpServeAdapter;
14
+ private readonly viewerBaseUrl;
15
+ constructor(httpOutputAdapter: HttpOutputAdapter, proxyAdapter: ProxyAdapter, httpServeAdapter: HttpServeAdapter);
16
+ execute(graphOutput: GraphOutput, config: ViewerOutputConfig): Promise<{
17
+ message: string;
18
+ }>;
19
+ private httpOrigin;
20
+ private ollamaProxyOptions;
21
+ }
22
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ViewerOutputAdapter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const http_output_adapter_1 = require("./http-output.adapter");
15
+ const proxy_adapter_1 = require("./proxy.adapter");
16
+ const http_serve_adapter_1 = require("./http-serve.adapter");
17
+ let ViewerOutputAdapter = class ViewerOutputAdapter {
18
+ httpOutputAdapter;
19
+ proxyAdapter;
20
+ httpServeAdapter;
21
+ viewerBaseUrl = process.env.____DEV_VIEWER_BASE_URL ||
22
+ 'https://albasyir.github.io/nest-graph-inspector';
23
+ constructor(httpOutputAdapter, proxyAdapter, httpServeAdapter) {
24
+ this.httpOutputAdapter = httpOutputAdapter;
25
+ this.proxyAdapter = proxyAdapter;
26
+ this.httpServeAdapter = httpServeAdapter;
27
+ }
28
+ async execute(graphOutput, config) {
29
+ const path = this.httpOutputAdapter.normalizePath(config.path ?? '/__graph-inspector');
30
+ const ollama = this.ollamaProxyOptions(config);
31
+ await this.httpOutputAdapter.execute(graphOutput, {
32
+ type: 'http',
33
+ origin: config.origin,
34
+ host: config.host,
35
+ port: config.port,
36
+ path,
37
+ httpAdapter: this.httpServeAdapter,
38
+ });
39
+ await this.proxyAdapter.serve({
40
+ from: this.httpOrigin(config),
41
+ to: ollama.origin,
42
+ cors: false,
43
+ }, {
44
+ httpAdapter: this.httpServeAdapter,
45
+ pathPrefix: ollama.path,
46
+ });
47
+ try {
48
+ await this.httpServeAdapter.serve();
49
+ }
50
+ catch (err) {
51
+ this.httpServeAdapter.close();
52
+ throw err;
53
+ }
54
+ const graphEndpoint = new URL(path, this.httpOrigin(config)).toString();
55
+ const base64Origin = Buffer.from(graphEndpoint).toString('base64url');
56
+ const viewerLink = `${this.viewerBaseUrl}/view/${base64Origin}`;
57
+ return {
58
+ message: `Graph Viewer is available at ${viewerLink}`,
59
+ };
60
+ }
61
+ httpOrigin(config) {
62
+ const { host, port } = http_output_adapter_1.HttpOutputAdapter.defaultConfig;
63
+ return (config.origin ??
64
+ `http://${config.host ?? host}:${config.port ?? port}`);
65
+ }
66
+ ollamaProxyOptions(config) {
67
+ const origin = config.ollama?.origin;
68
+ const path = config.ollama?.path;
69
+ if (!origin || !path) {
70
+ throw new Error('Viewer output requires Ollama proxy origin and path');
71
+ }
72
+ return { origin, path };
73
+ }
74
+ };
75
+ exports.ViewerOutputAdapter = ViewerOutputAdapter;
76
+ exports.ViewerOutputAdapter = ViewerOutputAdapter = __decorate([
77
+ (0, common_1.Injectable)(),
78
+ __metadata("design:paramtypes", [http_output_adapter_1.HttpOutputAdapter,
79
+ proxy_adapter_1.ProxyAdapter,
80
+ http_serve_adapter_1.HttpServeAdapter])
81
+ ], ViewerOutputAdapter);
82
+ //# sourceMappingURL=viewer-output.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer-output.adapter.js","sourceRoot":"","sources":["../../../../../libs/nest-graph-inspector/src/adapters/viewer-output.adapter.ts"],"names":[],"mappings":"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"}