@furystack/rest-service 10.0.27 → 10.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.
Files changed (74) hide show
  1. package/README.md +249 -12
  2. package/esm/api-manager.d.ts +1 -3
  3. package/esm/api-manager.d.ts.map +1 -1
  4. package/esm/api-manager.js +4 -6
  5. package/esm/api-manager.js.map +1 -1
  6. package/esm/header-processor.d.ts +39 -0
  7. package/esm/header-processor.d.ts.map +1 -0
  8. package/esm/header-processor.js +113 -0
  9. package/esm/header-processor.js.map +1 -0
  10. package/esm/header-processor.spec.d.ts +2 -0
  11. package/esm/header-processor.spec.d.ts.map +1 -0
  12. package/esm/header-processor.spec.js +420 -0
  13. package/esm/header-processor.spec.js.map +1 -0
  14. package/esm/helpers.d.ts +69 -1
  15. package/esm/helpers.d.ts.map +1 -1
  16. package/esm/helpers.js +70 -1
  17. package/esm/helpers.js.map +1 -1
  18. package/esm/helpers.spec.js +21 -5
  19. package/esm/helpers.spec.js.map +1 -1
  20. package/esm/http-proxy-handler.d.ts +53 -0
  21. package/esm/http-proxy-handler.d.ts.map +1 -0
  22. package/esm/http-proxy-handler.js +179 -0
  23. package/esm/http-proxy-handler.js.map +1 -0
  24. package/esm/http-user-context.d.ts +4 -4
  25. package/esm/http-user-context.d.ts.map +1 -1
  26. package/esm/http-user-context.js +4 -4
  27. package/esm/http-user-context.js.map +1 -1
  28. package/esm/index.d.ts +1 -0
  29. package/esm/index.d.ts.map +1 -1
  30. package/esm/index.js +1 -0
  31. package/esm/index.js.map +1 -1
  32. package/esm/path-processor.d.ts +33 -0
  33. package/esm/path-processor.d.ts.map +1 -0
  34. package/esm/path-processor.js +58 -0
  35. package/esm/path-processor.js.map +1 -0
  36. package/esm/path-processor.spec.d.ts +2 -0
  37. package/esm/path-processor.spec.d.ts.map +1 -0
  38. package/esm/path-processor.spec.js +256 -0
  39. package/esm/path-processor.spec.js.map +1 -0
  40. package/esm/proxy-manager.d.ts +52 -0
  41. package/esm/proxy-manager.d.ts.map +1 -0
  42. package/esm/proxy-manager.js +84 -0
  43. package/esm/proxy-manager.js.map +1 -0
  44. package/esm/proxy-manager.spec.d.ts +2 -0
  45. package/esm/proxy-manager.spec.d.ts.map +1 -0
  46. package/esm/proxy-manager.spec.js +1781 -0
  47. package/esm/proxy-manager.spec.js.map +1 -0
  48. package/esm/server-manager.d.ts +7 -0
  49. package/esm/server-manager.d.ts.map +1 -1
  50. package/esm/server-manager.js +12 -0
  51. package/esm/server-manager.js.map +1 -1
  52. package/esm/static-server-manager.d.ts.map +1 -1
  53. package/esm/static-server-manager.js +5 -7
  54. package/esm/static-server-manager.js.map +1 -1
  55. package/esm/websocket-proxy-handler.d.ts +44 -0
  56. package/esm/websocket-proxy-handler.d.ts.map +1 -0
  57. package/esm/websocket-proxy-handler.js +157 -0
  58. package/esm/websocket-proxy-handler.js.map +1 -0
  59. package/package.json +12 -10
  60. package/src/api-manager.ts +5 -15
  61. package/src/header-processor.spec.ts +514 -0
  62. package/src/header-processor.ts +140 -0
  63. package/src/helpers.spec.ts +23 -5
  64. package/src/helpers.ts +72 -1
  65. package/src/http-proxy-handler.ts +215 -0
  66. package/src/http-user-context.ts +6 -6
  67. package/src/index.ts +1 -0
  68. package/src/path-processor.spec.ts +318 -0
  69. package/src/path-processor.ts +69 -0
  70. package/src/proxy-manager.spec.ts +2094 -0
  71. package/src/proxy-manager.ts +101 -0
  72. package/src/server-manager.ts +19 -0
  73. package/src/static-server-manager.ts +5 -7
  74. package/src/websocket-proxy-handler.ts +204 -0
@@ -0,0 +1,256 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { PathProcessor } from './path-processor.js';
3
+ describe('PathProcessor', () => {
4
+ const processor = new PathProcessor();
5
+ describe('validateUrl', () => {
6
+ it('should validate and return a valid URL', () => {
7
+ const url = processor.validateUrl('http://example.com/path');
8
+ expect(url).toBeInstanceOf(URL);
9
+ expect(url.href).toBe('http://example.com/path');
10
+ });
11
+ it('should throw error for invalid URL', () => {
12
+ expect(() => processor.validateUrl('not-a-valid-url')).toThrow('Invalid URL');
13
+ });
14
+ it('should include context in error message', () => {
15
+ expect(() => processor.validateUrl('invalid', 'targetBaseUrl')).toThrow('Invalid targetBaseUrl');
16
+ });
17
+ it('should validate HTTPS URLs', () => {
18
+ const url = processor.validateUrl('https://secure.example.com');
19
+ expect(url.protocol).toBe('https:');
20
+ });
21
+ it('should validate URLs with query strings', () => {
22
+ const url = processor.validateUrl('http://example.com/path?foo=bar');
23
+ expect(url.search).toBe('?foo=bar');
24
+ });
25
+ });
26
+ describe('validateHttpProtocol', () => {
27
+ it('should accept HTTP protocol', () => {
28
+ const url = new URL('http://example.com');
29
+ expect(() => processor.validateHttpProtocol(url)).not.toThrow();
30
+ });
31
+ it('should accept HTTPS protocol', () => {
32
+ const url = new URL('https://example.com');
33
+ expect(() => processor.validateHttpProtocol(url)).not.toThrow();
34
+ });
35
+ it('should reject FTP protocol', () => {
36
+ const url = new URL('ftp://example.com');
37
+ expect(() => processor.validateHttpProtocol(url)).toThrow('Invalid targetBaseUrl protocol: ftp:');
38
+ });
39
+ it('should reject WS protocol', () => {
40
+ const url = new URL('ws://example.com');
41
+ expect(() => processor.validateHttpProtocol(url)).toThrow('Invalid targetBaseUrl protocol: ws:');
42
+ });
43
+ it('should reject file protocol', () => {
44
+ const url = new URL('file:///path/to/file');
45
+ expect(() => processor.validateHttpProtocol(url)).toThrow('Invalid targetBaseUrl protocol: file:');
46
+ });
47
+ });
48
+ describe('extractSourcePath', () => {
49
+ it('should extract path after source base URL', () => {
50
+ const path = processor.extractSourcePath('/api/users/123', '/api');
51
+ expect(path).toBe('/users/123');
52
+ });
53
+ it('should extract empty path when URL matches exactly', () => {
54
+ const path = processor.extractSourcePath('/api', '/api');
55
+ expect(path).toBe('');
56
+ });
57
+ it('should preserve query strings', () => {
58
+ const path = processor.extractSourcePath('/api/users?page=1&limit=10', '/api');
59
+ expect(path).toBe('/users?page=1&limit=10');
60
+ });
61
+ it('should handle source base URL with trailing slash', () => {
62
+ const path = processor.extractSourcePath('/api/users/123', '/api/');
63
+ // PathHelper.extractPath now consistently returns paths with leading slashes
64
+ expect(path).toBe('/users/123');
65
+ });
66
+ });
67
+ describe('applyPathRewrite', () => {
68
+ it('should return path as-is when no rewrite function provided', () => {
69
+ const path = processor.applyPathRewrite('/users/123');
70
+ expect(path).toBe('/users/123');
71
+ });
72
+ it('should apply rewrite function when provided', () => {
73
+ const rewrite = (path) => path.replace('/old', '/new');
74
+ const path = processor.applyPathRewrite('/old/path', rewrite);
75
+ expect(path).toBe('/new/path');
76
+ });
77
+ it('should handle complex rewrite logic', () => {
78
+ const rewrite = (path) => {
79
+ // Remove version prefix
80
+ return path.replace(/^\/v\d+/, '');
81
+ };
82
+ const path = processor.applyPathRewrite('/v1/users/123', rewrite);
83
+ expect(path).toBe('/users/123');
84
+ });
85
+ it('should allow complete path transformation', () => {
86
+ const rewrite = () => '/completely/different/path';
87
+ const path = processor.applyPathRewrite('/original', rewrite);
88
+ expect(path).toBe('/completely/different/path');
89
+ });
90
+ });
91
+ describe('buildTargetUrl', () => {
92
+ it('should combine base URL and path', () => {
93
+ const url = processor.buildTargetUrl('http://example.com', '/api/users');
94
+ expect(url).toBe('http://example.com/api/users');
95
+ });
96
+ it('should handle base URL with trailing slash', () => {
97
+ const url = processor.buildTargetUrl('http://example.com/', '/api/users');
98
+ // PathHelper.joinUrl now correctly handles trailing slashes, avoiding double slashes
99
+ expect(url).toBe('http://example.com/api/users');
100
+ });
101
+ it('should preserve query strings in path', () => {
102
+ const url = processor.buildTargetUrl('http://example.com', '/api/users?page=1');
103
+ expect(url).toBe('http://example.com/api/users?page=1');
104
+ });
105
+ it('should handle empty path', () => {
106
+ const url = processor.buildTargetUrl('http://example.com', '');
107
+ expect(url).toBe('http://example.com');
108
+ });
109
+ });
110
+ describe('processUrl', () => {
111
+ it('should process complete URL transformation', () => {
112
+ const url = processor.processUrl('/api/users/123', '/api', 'http://target.com');
113
+ expect(url).toBe('http://target.com/users/123');
114
+ });
115
+ it('should apply path rewrite during processing', () => {
116
+ const rewrite = (path) => path.replace('/old', '/new');
117
+ const url = processor.processUrl('/api/old/path', '/api', 'http://target.com', rewrite);
118
+ expect(url).toBe('http://target.com/new/path');
119
+ });
120
+ it('should preserve query strings', () => {
121
+ const url = processor.processUrl('/api/users?page=1&limit=10', '/api', 'http://target.com');
122
+ expect(url).toBe('http://target.com/users?page=1&limit=10');
123
+ });
124
+ it('should throw error for invalid resulting URL', () => {
125
+ // Use a base URL that when combined with the rewritten path will be invalid
126
+ const rewrite = () => '://invalid-path';
127
+ expect(() => processor.processUrl('/api/test', '/api', 'http:', rewrite)).toThrow('Invalid');
128
+ });
129
+ it('should handle complex source URLs', () => {
130
+ const url = processor.processUrl('/proxy/v1/api/users/123?sort=name&order=asc', '/proxy', 'http://backend.example.com:8080');
131
+ expect(url).toBe('http://backend.example.com:8080/v1/api/users/123?sort=name&order=asc');
132
+ });
133
+ it('should work with HTTPS target URLs', () => {
134
+ const url = processor.processUrl('/api/secure', '/api', 'https://secure.example.com');
135
+ expect(url).toBe('https://secure.example.com/secure');
136
+ });
137
+ it('should handle exact URL matches', () => {
138
+ const url = processor.processUrl('/api', '/api', 'http://target.com');
139
+ expect(url).toBe('http://target.com');
140
+ });
141
+ it('should validate the resulting target URL', () => {
142
+ // This should not throw because the result is valid
143
+ expect(() => processor.processUrl('/api/test', '/api', 'http://target.com')).not.toThrow();
144
+ });
145
+ });
146
+ describe('Edge cases and complex scenarios', () => {
147
+ it('should handle very long URLs', () => {
148
+ const longPath = `/api${'/segment'.repeat(100)}`;
149
+ const url = processor.processUrl(longPath, '/api', 'http://target.com');
150
+ expect(url).toContain('target.com');
151
+ expect(url).toContain('/segment');
152
+ });
153
+ it('should handle URLs with special characters in path', () => {
154
+ const url = processor.processUrl('/api/path%20with%20spaces', '/api', 'http://target.com');
155
+ expect(url).toBe('http://target.com/path%20with%20spaces');
156
+ });
157
+ it('should handle URLs with encoded special characters', () => {
158
+ const url = processor.processUrl('/api/user%2Fname', '/api', 'http://target.com');
159
+ expect(url).toBe('http://target.com/user%2Fname');
160
+ });
161
+ it('should handle URLs with hash fragments', () => {
162
+ const url = processor.processUrl('/api/resource#section', '/api', 'http://target.com');
163
+ expect(url).toBe('http://target.com/resource#section');
164
+ });
165
+ it('should handle multiple query parameters', () => {
166
+ const url = processor.processUrl('/api/search?q=test&sort=date&order=desc&page=1', '/api', 'http://target.com');
167
+ expect(url).toBe('http://target.com/search?q=test&sort=date&order=desc&page=1');
168
+ });
169
+ it('should handle empty query parameter values', () => {
170
+ const url = processor.processUrl('/api/test?empty=&another=value', '/api', 'http://target.com');
171
+ expect(url).toBe('http://target.com/test?empty=&another=value');
172
+ });
173
+ it('should handle source base URL ending with slash and path starting with slash', () => {
174
+ const path = processor.extractSourcePath('/api//users', '/api/');
175
+ // PathHelper.extractPath preserves the double slash from the input URL
176
+ // If normalization is needed, it should be done on the input URL first
177
+ expect(path).toBe('//users');
178
+ });
179
+ it('should handle double slashes in paths', () => {
180
+ const url = processor.buildTargetUrl('http://target.com', '//path//to//resource');
181
+ // PathHelper.joinUrl preserves the double slash at the start since it's already there
182
+ expect(url).toBe('http://target.com//path//to//resource');
183
+ });
184
+ it('should handle target URLs with ports', () => {
185
+ const url = processor.processUrl('/api/test', '/api', 'http://target.com:8080');
186
+ expect(url).toBe('http://target.com:8080/test');
187
+ });
188
+ it('should handle target URLs with paths', () => {
189
+ const url = processor.processUrl('/api/test', '/api', 'http://target.com/base');
190
+ expect(url).toBe('http://target.com/base/test');
191
+ });
192
+ it('should validate URL with only protocol', () => {
193
+ expect(() => processor.validateUrl('http://')).toThrow('Invalid URL');
194
+ });
195
+ it('should handle path rewrite that adds query parameters', () => {
196
+ const rewrite = (path) => `${path}?added=param`;
197
+ const url = processor.processUrl('/api/test?existing=value', '/api', 'http://target.com', rewrite);
198
+ expect(url).toBe('http://target.com/test?existing=value?added=param');
199
+ });
200
+ it('should handle path rewrite that removes path completely', () => {
201
+ const rewrite = () => '';
202
+ const url = processor.processUrl('/api/test', '/api', 'http://target.com', rewrite);
203
+ expect(url).toBe('http://target.com');
204
+ });
205
+ it('should handle path rewrite that adds leading slash', () => {
206
+ const rewrite = (path) => `/${path}`;
207
+ const url = processor.processUrl('/api/test', '/api', 'http://target.com', rewrite);
208
+ expect(url).toBe('http://target.com//test');
209
+ });
210
+ it('should validate HTTPS URLs with authentication', () => {
211
+ const url = processor.validateUrl('https://user:pass@example.com/path');
212
+ expect(url.protocol).toBe('https:');
213
+ expect(url.username).toBe('user');
214
+ expect(url.password).toBe('pass');
215
+ });
216
+ it('should handle URLs with international domain names', () => {
217
+ const url = processor.validateUrl('http://例え.jp/path');
218
+ expect(url.hostname).toBeTruthy();
219
+ });
220
+ it('should handle target URLs with trailing slash and path without leading slash', () => {
221
+ const url = processor.buildTargetUrl('http://target.com/', 'path');
222
+ expect(url).toBe('http://target.com/path');
223
+ });
224
+ it('should extract path with multiple slashes in source base URL', () => {
225
+ const path = processor.extractSourcePath('/api//users', '/api');
226
+ expect(path).toBe('//users');
227
+ });
228
+ it('should handle complex path rewrite with regex', () => {
229
+ const rewrite = (path) => path.replace(/\/v\d+\//, '/');
230
+ const url = processor.processUrl('/api/v2/users', '/api', 'http://target.com', rewrite);
231
+ expect(url).toBe('http://target.com/users');
232
+ });
233
+ it('should validate data URLs are rejected', () => {
234
+ expect(() => processor.validateHttpProtocol(new URL('data:text/plain,hello'))).toThrow('Invalid targetBaseUrl protocol');
235
+ });
236
+ it('should validate mailto URLs are rejected', () => {
237
+ expect(() => processor.validateHttpProtocol(new URL('mailto:test@example.com'))).toThrow('Invalid targetBaseUrl protocol');
238
+ });
239
+ it('should handle IPv4 addresses in URLs', () => {
240
+ const url = processor.validateUrl('http://192.168.1.1:8080/path');
241
+ expect(url.hostname).toBe('192.168.1.1');
242
+ expect(url.port).toBe('8080');
243
+ });
244
+ it('should handle IPv6 addresses in URLs', () => {
245
+ const url = processor.validateUrl('http://[::1]:8080/path');
246
+ expect(url.hostname).toBe('[::1]');
247
+ expect(url.port).toBe('8080');
248
+ });
249
+ it('should handle localhost in URLs', () => {
250
+ const url = processor.validateUrl('http://localhost:3000/api');
251
+ expect(url.hostname).toBe('localhost');
252
+ expect(url.port).toBe('3000');
253
+ });
254
+ });
255
+ });
256
+ //# sourceMappingURL=path-processor.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-processor.spec.js","sourceRoot":"","sources":["../src/path-processor.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { EventHub } from '@furystack/utils';
2
+ import type { IncomingMessage, OutgoingHttpHeaders } from 'http';
3
+ export interface ProxyOptions {
4
+ sourceBaseUrl: string;
5
+ targetBaseUrl: string;
6
+ pathRewrite?: (sourcePath: string) => string;
7
+ sourceHostName?: string;
8
+ sourcePort: number;
9
+ headers?: (originalHeaders: OutgoingHttpHeaders) => OutgoingHttpHeaders;
10
+ cookies?: (originalCookies: string[]) => string[];
11
+ responseCookies?: (responseCookies: string[]) => string[];
12
+ timeout?: number;
13
+ enableWebsockets?: boolean;
14
+ }
15
+ /**
16
+ * Manages HTTP and WebSocket proxy configurations and routing
17
+ */
18
+ export declare class ProxyManager extends EventHub<{
19
+ onProxyFailed: {
20
+ from: string;
21
+ to: string;
22
+ error: unknown;
23
+ };
24
+ onWebSocketProxyFailed: {
25
+ from: string;
26
+ to: string;
27
+ error: unknown;
28
+ };
29
+ }> {
30
+ private readonly serverManager;
31
+ private readonly pathProcessor;
32
+ /**
33
+ * Creates a function that determines if a request should be handled by this proxy
34
+ */
35
+ shouldExec: (sourceBaseUrl: string) => ({ req }: {
36
+ req: Pick<IncomingMessage, "url" | "method">;
37
+ }) => boolean;
38
+ /**
39
+ * Creates an HTTP request handler for the proxy
40
+ */
41
+ private createRequestHandler;
42
+ /**
43
+ * Creates a WebSocket upgrade handler for the proxy
44
+ */
45
+ private createUpgradeHandler;
46
+ /**
47
+ * Adds a new proxy configuration
48
+ * @throws Error if targetBaseUrl is invalid or uses non-HTTP/HTTPS protocol
49
+ */
50
+ addProxy(options: ProxyOptions): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=proxy-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../src/proxy-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAc,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAkB,MAAM,MAAM,CAAA;AAOhF,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,mBAAmB,KAAK,mBAAmB,CAAA;IACvE,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,qBACa,YAAa,SAAQ,QAAQ,CAAC;IACzC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;IAC3D,sBAAsB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CACrE,CAAC;IACA,iBACyB,aAAa,CAAe;IAErD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IAEpD;;OAEG;IACI,UAAU,GACd,eAAe,MAAM,MACrB,SAAS;QAAE,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAA;KAAE,aACW;IAEvE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;OAGG;IACU,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAe5D"}
@@ -0,0 +1,84 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable, Injected } from '@furystack/inject';
11
+ import { EventHub, PathHelper } from '@furystack/utils';
12
+ import { HttpProxyHandler } from './http-proxy-handler.js';
13
+ import { PathProcessor } from './path-processor.js';
14
+ import { ServerManager } from './server-manager.js';
15
+ import { WebSocketProxyHandler } from './websocket-proxy-handler.js';
16
+ /**
17
+ * Manages HTTP and WebSocket proxy configurations and routing
18
+ */
19
+ let ProxyManager = class ProxyManager extends EventHub {
20
+ pathProcessor = new PathProcessor();
21
+ /**
22
+ * Creates a function that determines if a request should be handled by this proxy
23
+ */
24
+ shouldExec = (sourceBaseUrl) => ({ req }) => req.url ? PathHelper.matchesBaseUrl(req.url, sourceBaseUrl) : false;
25
+ /**
26
+ * Creates an HTTP request handler for the proxy
27
+ */
28
+ createRequestHandler(options) {
29
+ const handler = new HttpProxyHandler({
30
+ sourceBaseUrl: options.sourceBaseUrl,
31
+ targetBaseUrl: options.targetBaseUrl,
32
+ pathRewrite: options.pathRewrite,
33
+ headers: options.headers,
34
+ cookies: options.cookies,
35
+ responseCookies: options.responseCookies,
36
+ timeout: options.timeout,
37
+ onError: (error) => this.emit('onProxyFailed', error),
38
+ });
39
+ return async ({ req, res }) => {
40
+ await handler.handle(req, res);
41
+ };
42
+ }
43
+ /**
44
+ * Creates a WebSocket upgrade handler for the proxy
45
+ */
46
+ createUpgradeHandler(options) {
47
+ const handler = new WebSocketProxyHandler({
48
+ sourceBaseUrl: options.sourceBaseUrl,
49
+ targetBaseUrl: options.targetBaseUrl,
50
+ pathRewrite: options.pathRewrite,
51
+ headers: options.headers,
52
+ timeout: options.timeout,
53
+ onError: (error) => this.emit('onWebSocketProxyFailed', error),
54
+ });
55
+ return async ({ req, socket, head }) => {
56
+ await handler.handle(req, socket, head);
57
+ };
58
+ }
59
+ /**
60
+ * Adds a new proxy configuration
61
+ * @throws Error if targetBaseUrl is invalid or uses non-HTTP/HTTPS protocol
62
+ */
63
+ async addProxy(options) {
64
+ // Validate targetBaseUrl format
65
+ const url = this.pathProcessor.validateUrl(options.targetBaseUrl, 'targetBaseUrl');
66
+ this.pathProcessor.validateHttpProtocol(url);
67
+ const server = await this.serverManager.getOrCreate({ hostName: options.sourceHostName, port: options.sourcePort });
68
+ const api = {
69
+ shouldExec: this.shouldExec(options.sourceBaseUrl),
70
+ onRequest: this.createRequestHandler(options),
71
+ ...(options.enableWebsockets ? { onUpgrade: this.createUpgradeHandler(options) } : {}),
72
+ };
73
+ server.apis.push(api);
74
+ }
75
+ };
76
+ __decorate([
77
+ Injected(ServerManager),
78
+ __metadata("design:type", ServerManager)
79
+ ], ProxyManager.prototype, "serverManager", void 0);
80
+ ProxyManager = __decorate([
81
+ Injectable({ lifetime: 'singleton' })
82
+ ], ProxyManager);
83
+ export { ProxyManager };
84
+ //# sourceMappingURL=proxy-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-manager.js","sourceRoot":"","sources":["../src/proxy-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proxy-manager.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-manager.spec.d.ts","sourceRoot":"","sources":["../src/proxy-manager.spec.ts"],"names":[],"mappings":""}