@furystack/rest-service 12.3.5 → 14.0.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/CHANGELOG.md +55 -0
- package/README.md +47 -28
- package/esm/actions/get-current-user.spec.js +10 -6
- package/esm/actions/get-current-user.spec.js.map +1 -1
- package/esm/actions/index.d.ts +0 -1
- package/esm/actions/index.d.ts.map +1 -1
- package/esm/actions/index.js +0 -1
- package/esm/actions/index.js.map +1 -1
- package/esm/actions/is-authenticated.spec.js +10 -6
- package/esm/actions/is-authenticated.spec.js.map +1 -1
- package/esm/actions/logout-action.spec.js +11 -9
- package/esm/actions/logout-action.spec.js.map +1 -1
- package/esm/actions/logout.js +1 -1
- package/esm/actions/logout.js.map +1 -1
- package/esm/actions/password-login-action.js +1 -1
- package/esm/actions/password-login-action.js.map +1 -1
- package/esm/actions/password-login-action.spec.js +23 -28
- package/esm/actions/password-login-action.spec.js.map +1 -1
- package/esm/authenticate.js +1 -1
- package/esm/authenticate.js.map +1 -1
- package/esm/authenticate.spec.js +41 -33
- package/esm/authenticate.spec.js.map +1 -1
- package/esm/authorize.spec.js +34 -29
- package/esm/authorize.spec.js.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.d.ts +6 -11
- package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.js +7 -11
- package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-delete-endpoint.spec.js +14 -21
- package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +11 -11
- package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.js +13 -12
- package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +43 -70
- package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +6 -11
- package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.js +7 -11
- package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +16 -33
- package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +1 -15
- package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-openapi-document-action.js +1 -24
- package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -1
- package/esm/endpoint-generators/create-get-schema-action.d.ts +1 -1
- package/esm/endpoint-generators/create-get-schema-action.d.ts.map +1 -1
- package/esm/endpoint-generators/create-get-schema-action.js.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.d.ts +7 -13
- package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.js +8 -13
- package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-patch-endpoint.spec.js +10 -17
- package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.d.ts +7 -13
- package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.js +8 -13
- package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
- package/esm/endpoint-generators/create-post-endpoint.spec.js +41 -14
- package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
- package/esm/endpoint-generators/utils.d.ts +17 -2
- package/esm/endpoint-generators/utils.d.ts.map +1 -1
- package/esm/endpoint-generators/utils.js +33 -20
- package/esm/endpoint-generators/utils.js.map +1 -1
- package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts +0 -2
- package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts.map +1 -1
- package/esm/get-schema-from-api.d.ts +1 -1
- package/esm/get-schema-from-api.d.ts.map +1 -1
- package/esm/get-schema-from-api.spec.js.map +1 -1
- package/esm/helpers.d.ts +53 -87
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +91 -92
- package/esm/helpers.js.map +1 -1
- package/esm/helpers.spec.d.ts +2 -1
- package/esm/helpers.spec.d.ts.map +1 -1
- package/esm/helpers.spec.js +41 -38
- package/esm/helpers.spec.js.map +1 -1
- package/esm/http-authentication-settings.d.ts +35 -12
- package/esm/http-authentication-settings.d.ts.map +1 -1
- package/esm/http-authentication-settings.js +21 -29
- package/esm/http-authentication-settings.js.map +1 -1
- package/esm/http-server-pool.d.ts +64 -0
- package/esm/http-server-pool.d.ts.map +1 -0
- package/esm/http-server-pool.js +95 -0
- package/esm/http-server-pool.js.map +1 -0
- package/esm/http-server-pool.spec.d.ts +2 -0
- package/esm/http-server-pool.spec.d.ts.map +1 -0
- package/esm/http-server-pool.spec.js +193 -0
- package/esm/http-server-pool.spec.js.map +1 -0
- package/esm/http-user-context.d.ts +31 -44
- package/esm/http-user-context.d.ts.map +1 -1
- package/esm/http-user-context.js +76 -95
- package/esm/http-user-context.js.map +1 -1
- package/esm/http-user-context.spec.d.ts +8 -2
- package/esm/http-user-context.spec.d.ts.map +1 -1
- package/esm/http-user-context.spec.js +189 -337
- package/esm/http-user-context.spec.js.map +1 -1
- package/esm/index.d.ts +6 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +6 -4
- package/esm/index.js.map +1 -1
- package/esm/login-response-strategy.d.ts +11 -10
- package/esm/login-response-strategy.d.ts.map +1 -1
- package/esm/login-response-strategy.js +7 -6
- package/esm/login-response-strategy.js.map +1 -1
- package/esm/login-response-strategy.spec.js +25 -29
- package/esm/login-response-strategy.spec.js.map +1 -1
- package/esm/openapi/generate-openapi-document.d.ts +0 -8
- package/esm/openapi/generate-openapi-document.d.ts.map +1 -1
- package/esm/openapi/generate-openapi-document.js +0 -2
- package/esm/openapi/generate-openapi-document.js.map +1 -1
- package/esm/proxy-manager.spec.js +152 -176
- package/esm/proxy-manager.spec.js.map +1 -1
- package/esm/proxy-runtime.d.ts +27 -0
- package/esm/proxy-runtime.d.ts.map +1 -0
- package/esm/proxy-runtime.js +45 -0
- package/esm/proxy-runtime.js.map +1 -0
- package/esm/proxy-runtime.spec.d.ts +2 -0
- package/esm/proxy-runtime.spec.d.ts.map +1 -0
- package/esm/proxy-runtime.spec.js +39 -0
- package/esm/proxy-runtime.spec.js.map +1 -0
- package/esm/rest-api-runtime.d.ts +76 -0
- package/esm/rest-api-runtime.d.ts.map +1 -0
- package/esm/rest-api-runtime.js +131 -0
- package/esm/rest-api-runtime.js.map +1 -0
- package/esm/rest-api-runtime.spec.d.ts +2 -0
- package/esm/rest-api-runtime.spec.d.ts.map +1 -0
- package/esm/rest-api-runtime.spec.js +58 -0
- package/esm/rest-api-runtime.spec.js.map +1 -0
- package/esm/rest-service.integration.spec.d.ts +1 -1
- package/esm/rest-service.integration.spec.d.ts.map +1 -1
- package/esm/rest-service.integration.spec.js +60 -82
- package/esm/rest-service.integration.spec.js.map +1 -1
- package/esm/rest.integration.test.js +26 -84
- package/esm/rest.integration.test.js.map +1 -1
- package/esm/server-telemetry.d.ts +57 -0
- package/esm/server-telemetry.d.ts.map +1 -0
- package/esm/server-telemetry.js +26 -0
- package/esm/server-telemetry.js.map +1 -0
- package/esm/server-telemetry.spec.d.ts +2 -0
- package/esm/server-telemetry.spec.d.ts.map +1 -0
- package/esm/server-telemetry.spec.js +52 -0
- package/esm/server-telemetry.spec.js.map +1 -0
- package/esm/static-server-manager.spec.js +60 -125
- package/esm/static-server-manager.spec.js.map +1 -1
- package/esm/static-site-runtime.d.ts +21 -0
- package/esm/static-site-runtime.d.ts.map +1 -0
- package/esm/static-site-runtime.js +48 -0
- package/esm/static-site-runtime.js.map +1 -0
- package/esm/static-site-runtime.spec.d.ts +2 -0
- package/esm/static-site-runtime.spec.d.ts.map +1 -0
- package/esm/static-site-runtime.spec.js +30 -0
- package/esm/static-site-runtime.spec.js.map +1 -0
- package/esm/user-store.d.ts +39 -0
- package/esm/user-store.d.ts.map +1 -0
- package/esm/user-store.js +62 -0
- package/esm/user-store.js.map +1 -0
- package/esm/user-store.spec.d.ts +2 -0
- package/esm/user-store.spec.d.ts.map +1 -0
- package/esm/user-store.spec.js +72 -0
- package/esm/user-store.spec.js.map +1 -0
- package/esm/validate.integration.spec.js +26 -83
- package/esm/validate.integration.spec.js.map +1 -1
- package/package.json +8 -8
- package/src/actions/get-current-user.spec.ts +11 -10
- package/src/actions/index.ts +0 -1
- package/src/actions/is-authenticated.spec.ts +12 -7
- package/src/actions/logout-action.spec.ts +12 -12
- package/src/actions/logout.ts +1 -1
- package/src/actions/password-login-action.spec.ts +30 -30
- package/src/actions/password-login-action.ts +1 -1
- package/src/authenticate.spec.ts +45 -51
- package/src/authenticate.ts +1 -1
- package/src/authorize.spec.ts +37 -39
- package/src/endpoint-generators/create-delete-endpoint.spec.ts +16 -24
- package/src/endpoint-generators/create-delete-endpoint.ts +11 -17
- package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +45 -78
- package/src/endpoint-generators/create-get-collection-endpoint.ts +17 -19
- package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +17 -33
- package/src/endpoint-generators/create-get-entity-endpoint.ts +11 -17
- package/src/endpoint-generators/create-get-openapi-document-action.ts +2 -38
- package/src/endpoint-generators/create-get-schema-action.ts +1 -1
- package/src/endpoint-generators/create-patch-endpoint.spec.ts +11 -18
- package/src/endpoint-generators/create-patch-endpoint.ts +12 -23
- package/src/endpoint-generators/create-post-endpoint.spec.ts +45 -14
- package/src/endpoint-generators/create-post-endpoint.ts +13 -23
- package/src/endpoint-generators/utils.ts +36 -28
- package/src/endpoint-generators/with-schema-and-openapi-action.ts +0 -3
- package/src/get-schema-from-api.spec.ts +1 -1
- package/src/get-schema-from-api.ts +1 -1
- package/src/helpers.spec.ts +51 -41
- package/src/helpers.ts +140 -109
- package/src/http-authentication-settings.ts +51 -25
- package/src/http-server-pool.spec.ts +220 -0
- package/src/http-server-pool.ts +169 -0
- package/src/http-user-context.spec.ts +203 -383
- package/src/http-user-context.ts +114 -91
- package/src/index.ts +6 -4
- package/src/login-response-strategy.spec.ts +32 -31
- package/src/login-response-strategy.ts +13 -12
- package/src/openapi/generate-openapi-document.ts +0 -3
- package/src/proxy-manager.spec.ts +152 -182
- package/src/proxy-runtime.spec.ts +50 -0
- package/src/proxy-runtime.ts +75 -0
- package/src/rest-api-runtime.spec.ts +77 -0
- package/src/rest-api-runtime.ts +204 -0
- package/src/rest-service.integration.spec.ts +68 -87
- package/src/rest.integration.test.ts +27 -87
- package/src/server-telemetry.spec.ts +56 -0
- package/src/server-telemetry.ts +51 -0
- package/src/static-server-manager.spec.ts +63 -151
- package/src/static-site-runtime.spec.ts +39 -0
- package/src/static-site-runtime.ts +75 -0
- package/src/user-store.spec.ts +86 -0
- package/src/user-store.ts +68 -0
- package/src/validate.integration.spec.ts +39 -97
- package/esm/actions/login-action.spec.d.ts +0 -2
- package/esm/actions/login-action.spec.d.ts.map +0 -1
- package/esm/actions/login-action.spec.js +0 -34
- package/esm/actions/login-action.spec.js.map +0 -1
- package/esm/actions/login.d.ts +0 -19
- package/esm/actions/login.d.ts.map +0 -1
- package/esm/actions/login.js +0 -27
- package/esm/actions/login.js.map +0 -1
- package/esm/api-manager.d.ts +0 -104
- package/esm/api-manager.d.ts.map +0 -1
- package/esm/api-manager.js +0 -180
- package/esm/api-manager.js.map +0 -1
- package/esm/proxy-manager.d.ts +0 -53
- package/esm/proxy-manager.d.ts.map +0 -1
- package/esm/proxy-manager.js +0 -84
- package/esm/proxy-manager.js.map +0 -1
- package/esm/server-manager.d.ts +0 -48
- package/esm/server-manager.d.ts.map +0 -1
- package/esm/server-manager.js +0 -100
- package/esm/server-manager.js.map +0 -1
- package/esm/static-server-manager.d.ts +0 -19
- package/esm/static-server-manager.d.ts.map +0 -1
- package/esm/static-server-manager.js +0 -65
- package/esm/static-server-manager.js.map +0 -1
- package/esm/swagger/generate-swagger-json.spec.d.ts +0 -2
- package/esm/swagger/generate-swagger-json.spec.d.ts.map +0 -1
- package/esm/swagger/generate-swagger-json.spec.js +0 -215
- package/esm/swagger/generate-swagger-json.spec.js.map +0 -1
- package/src/actions/login-action.spec.ts +0 -42
- package/src/actions/login.ts +0 -32
- package/src/api-manager.ts +0 -308
- package/src/proxy-manager.ts +0 -102
- package/src/server-manager.ts +0 -135
- package/src/static-server-manager.ts +0 -90
- package/src/swagger/generate-swagger-json.spec.ts +0 -250
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getPort } from '@furystack/core/port-generator';
|
|
2
|
-
import {
|
|
2
|
+
import { createInjector } from '@furystack/inject';
|
|
3
3
|
import { usingAsync } from '@furystack/utils';
|
|
4
4
|
import { mkdirSync, writeFileSync } from 'fs';
|
|
5
5
|
import { createServer as createHttpServer } from 'http';
|
|
@@ -7,8 +7,9 @@ import { tmpdir } from 'os';
|
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { beforeAll, describe, expect, it } from 'vitest';
|
|
9
9
|
import { WebSocket, WebSocketServer } from 'ws';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { useProxy } from './helpers.js';
|
|
11
|
+
import { ServerTelemetryToken } from './server-telemetry.js';
|
|
12
|
+
import { useStaticFiles } from './helpers.js';
|
|
12
13
|
describe('ProxyManager', () => {
|
|
13
14
|
// Create a temporary directory for test files
|
|
14
15
|
const testDir = join(tmpdir(), 'furystack-proxy-test');
|
|
@@ -48,9 +49,7 @@ describe('ProxyManager', () => {
|
|
|
48
49
|
};
|
|
49
50
|
describe('Basic proxy functionality', () => {
|
|
50
51
|
it('Should proxy requests from source URL to target URL', async () => {
|
|
51
|
-
await usingAsync(
|
|
52
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
53
|
-
const staticServerManager = injector.getInstance(StaticServerManager);
|
|
52
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
54
53
|
const proxyPort = getPort();
|
|
55
54
|
const targetPort = getPort();
|
|
56
55
|
// Create a test file for the target server
|
|
@@ -61,13 +60,10 @@ describe('ProxyManager', () => {
|
|
|
61
60
|
timestamp: Date.now(),
|
|
62
61
|
}));
|
|
63
62
|
// Set up target server (static file server) - serve files from testDir
|
|
64
|
-
await
|
|
65
|
-
baseUrl: '/',
|
|
66
|
-
path: testDir,
|
|
67
|
-
port: targetPort,
|
|
68
|
-
});
|
|
63
|
+
await useStaticFiles({ injector, baseUrl: '/', path: testDir, port: targetPort });
|
|
69
64
|
// Set up proxy server
|
|
70
|
-
await
|
|
65
|
+
await useProxy({
|
|
66
|
+
injector,
|
|
71
67
|
sourceBaseUrl: '/old',
|
|
72
68
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
73
69
|
pathRewrite: (path) => path.replace('/path', ''),
|
|
@@ -82,8 +78,7 @@ describe('ProxyManager', () => {
|
|
|
82
78
|
});
|
|
83
79
|
});
|
|
84
80
|
it('Should preserve query strings when proxying', async () => {
|
|
85
|
-
await usingAsync(
|
|
86
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
81
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
87
82
|
const targetPort = getPort();
|
|
88
83
|
const proxyPort = getPort();
|
|
89
84
|
// Create a simple echo server that returns query parameters
|
|
@@ -95,7 +90,8 @@ describe('ProxyManager', () => {
|
|
|
95
90
|
targetServer.listen(targetPort, () => resolve());
|
|
96
91
|
});
|
|
97
92
|
try {
|
|
98
|
-
await
|
|
93
|
+
await useProxy({
|
|
94
|
+
injector,
|
|
99
95
|
sourceBaseUrl: '/api',
|
|
100
96
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
101
97
|
sourcePort: proxyPort,
|
|
@@ -111,9 +107,7 @@ describe('ProxyManager', () => {
|
|
|
111
107
|
});
|
|
112
108
|
});
|
|
113
109
|
it('Should handle header transformation', async () => {
|
|
114
|
-
await usingAsync(
|
|
115
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
116
|
-
const staticServerManager = injector.getInstance(StaticServerManager);
|
|
110
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
117
111
|
const proxyPort = getPort();
|
|
118
112
|
const targetPort = getPort();
|
|
119
113
|
// Create a test file that returns headers
|
|
@@ -123,13 +117,10 @@ describe('ProxyManager', () => {
|
|
|
123
117
|
receivedHeaders: '{{HEADERS}}', // Placeholder for dynamic content
|
|
124
118
|
}));
|
|
125
119
|
// Set up target server
|
|
126
|
-
await
|
|
127
|
-
baseUrl: '/',
|
|
128
|
-
path: testDir,
|
|
129
|
-
port: targetPort,
|
|
130
|
-
});
|
|
120
|
+
await useStaticFiles({ injector, baseUrl: '/', path: testDir, port: targetPort });
|
|
131
121
|
// Set up proxy server with header transformation
|
|
132
|
-
await
|
|
122
|
+
await useProxy({
|
|
123
|
+
injector,
|
|
133
124
|
sourceBaseUrl: '/old',
|
|
134
125
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
135
126
|
pathRewrite: (path) => path.replace('/path', ''),
|
|
@@ -151,9 +142,7 @@ describe('ProxyManager', () => {
|
|
|
151
142
|
});
|
|
152
143
|
});
|
|
153
144
|
it('Should handle cookie transformation', async () => {
|
|
154
|
-
await usingAsync(
|
|
155
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
156
|
-
const staticServerManager = injector.getInstance(StaticServerManager);
|
|
145
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
157
146
|
const proxyPort = getPort();
|
|
158
147
|
const targetPort = getPort();
|
|
159
148
|
// Create a test file for cookies
|
|
@@ -163,13 +152,10 @@ describe('ProxyManager', () => {
|
|
|
163
152
|
receivedCookies: '{{COOKIES}}', // Placeholder for dynamic content
|
|
164
153
|
}));
|
|
165
154
|
// Set up target server
|
|
166
|
-
await
|
|
167
|
-
baseUrl: '/',
|
|
168
|
-
path: testDir,
|
|
169
|
-
port: targetPort,
|
|
170
|
-
});
|
|
155
|
+
await useStaticFiles({ injector, baseUrl: '/', path: testDir, port: targetPort });
|
|
171
156
|
// Set up proxy server with cookie transformation
|
|
172
|
-
await
|
|
157
|
+
await useProxy({
|
|
158
|
+
injector,
|
|
173
159
|
sourceBaseUrl: '/old',
|
|
174
160
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
175
161
|
pathRewrite: (path) => path.replace('/path', ''),
|
|
@@ -187,8 +173,7 @@ describe('ProxyManager', () => {
|
|
|
187
173
|
});
|
|
188
174
|
});
|
|
189
175
|
it('Should handle POST requests with JSON body', async () => {
|
|
190
|
-
await usingAsync(
|
|
191
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
176
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
192
177
|
const targetPort = getPort();
|
|
193
178
|
const proxyPort = getPort();
|
|
194
179
|
// Create an echo server that returns the request body
|
|
@@ -207,7 +192,8 @@ describe('ProxyManager', () => {
|
|
|
207
192
|
targetServer.listen(targetPort, () => resolve());
|
|
208
193
|
});
|
|
209
194
|
try {
|
|
210
|
-
await
|
|
195
|
+
await useProxy({
|
|
196
|
+
injector,
|
|
211
197
|
sourceBaseUrl: '/api',
|
|
212
198
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
213
199
|
sourcePort: proxyPort,
|
|
@@ -229,8 +215,7 @@ describe('ProxyManager', () => {
|
|
|
229
215
|
});
|
|
230
216
|
});
|
|
231
217
|
it('Should handle response cookies transformation', async () => {
|
|
232
|
-
await usingAsync(
|
|
233
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
218
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
234
219
|
const targetPort = getPort();
|
|
235
220
|
const proxyPort = getPort();
|
|
236
221
|
// Create a server that sets cookies
|
|
@@ -245,7 +230,8 @@ describe('ProxyManager', () => {
|
|
|
245
230
|
targetServer.listen(targetPort, () => resolve());
|
|
246
231
|
});
|
|
247
232
|
try {
|
|
248
|
-
await
|
|
233
|
+
await useProxy({
|
|
234
|
+
injector,
|
|
249
235
|
sourceBaseUrl: '/api',
|
|
250
236
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
251
237
|
sourcePort: proxyPort,
|
|
@@ -266,22 +252,17 @@ describe('ProxyManager', () => {
|
|
|
266
252
|
});
|
|
267
253
|
});
|
|
268
254
|
it('Should not match requests outside source base URL', async () => {
|
|
269
|
-
await usingAsync(
|
|
270
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
271
|
-
const staticServerManager = injector.getInstance(StaticServerManager);
|
|
255
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
272
256
|
const proxyPort = getPort();
|
|
273
257
|
const targetPort = getPort();
|
|
274
258
|
// Create a test file
|
|
275
259
|
const testFile = join(testDir, 'test.json');
|
|
276
260
|
writeFileSync(testFile, JSON.stringify({ message: 'test' }));
|
|
277
261
|
// Set up target server
|
|
278
|
-
await
|
|
279
|
-
baseUrl: '/',
|
|
280
|
-
path: testDir,
|
|
281
|
-
port: targetPort,
|
|
282
|
-
});
|
|
262
|
+
await useStaticFiles({ injector, baseUrl: '/', path: testDir, port: targetPort });
|
|
283
263
|
// Set up proxy server
|
|
284
|
-
await
|
|
264
|
+
await useProxy({
|
|
265
|
+
injector,
|
|
285
266
|
sourceBaseUrl: '/old',
|
|
286
267
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
287
268
|
pathRewrite: (path) => path.replace('/path', ''),
|
|
@@ -299,9 +280,7 @@ describe('ProxyManager', () => {
|
|
|
299
280
|
});
|
|
300
281
|
});
|
|
301
282
|
it('Should handle exact URL matches', async () => {
|
|
302
|
-
await usingAsync(
|
|
303
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
304
|
-
const staticServerManager = injector.getInstance(StaticServerManager);
|
|
283
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
305
284
|
const proxyPort = getPort();
|
|
306
285
|
const targetPort = getPort();
|
|
307
286
|
// Create a test file
|
|
@@ -311,13 +290,10 @@ describe('ProxyManager', () => {
|
|
|
311
290
|
url: '/exact',
|
|
312
291
|
}));
|
|
313
292
|
// Set up target server
|
|
314
|
-
await
|
|
315
|
-
baseUrl: '/',
|
|
316
|
-
path: testDir,
|
|
317
|
-
port: targetPort,
|
|
318
|
-
});
|
|
293
|
+
await useStaticFiles({ injector, baseUrl: '/', path: testDir, port: targetPort });
|
|
319
294
|
// Set up proxy server
|
|
320
|
-
await
|
|
295
|
+
await useProxy({
|
|
296
|
+
injector,
|
|
321
297
|
sourceBaseUrl: '/exact',
|
|
322
298
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
323
299
|
pathRewrite: (path) => path, // Keep the path as-is
|
|
@@ -331,12 +307,12 @@ describe('ProxyManager', () => {
|
|
|
331
307
|
});
|
|
332
308
|
});
|
|
333
309
|
it('Should handle server errors gracefully', async () => {
|
|
334
|
-
await usingAsync(
|
|
335
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
310
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
336
311
|
const proxyPort = getPort();
|
|
337
312
|
const unavailablePort = getPort(); // Get a valid port number that doesn't have a server
|
|
338
313
|
// Set up proxy to non-existent target
|
|
339
|
-
await
|
|
314
|
+
await useProxy({
|
|
315
|
+
injector,
|
|
340
316
|
sourceBaseUrl: '/api',
|
|
341
317
|
targetBaseUrl: `http://localhost:${unavailablePort}`,
|
|
342
318
|
sourcePort: proxyPort,
|
|
@@ -347,16 +323,16 @@ describe('ProxyManager', () => {
|
|
|
347
323
|
});
|
|
348
324
|
});
|
|
349
325
|
it('Should emit onProxyFailed event on error', async () => {
|
|
350
|
-
await usingAsync(
|
|
351
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
326
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
352
327
|
const proxyPort = getPort();
|
|
353
328
|
const unavailablePort = getPort();
|
|
354
329
|
let failedEvent;
|
|
355
|
-
|
|
330
|
+
injector.get(ServerTelemetryToken).subscribe('onProxyFailed', (event) => {
|
|
356
331
|
failedEvent = event;
|
|
357
332
|
});
|
|
358
333
|
// Set up proxy to non-existent target
|
|
359
|
-
await
|
|
334
|
+
await useProxy({
|
|
335
|
+
injector,
|
|
360
336
|
sourceBaseUrl: '/api',
|
|
361
337
|
targetBaseUrl: `http://localhost:${unavailablePort}`,
|
|
362
338
|
sourcePort: proxyPort,
|
|
@@ -368,9 +344,9 @@ describe('ProxyManager', () => {
|
|
|
368
344
|
});
|
|
369
345
|
});
|
|
370
346
|
it('Should validate targetBaseUrl on addProxy', async () => {
|
|
371
|
-
await usingAsync(
|
|
372
|
-
|
|
373
|
-
|
|
347
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
348
|
+
await expect(useProxy({
|
|
349
|
+
injector,
|
|
374
350
|
sourceBaseUrl: '/api',
|
|
375
351
|
targetBaseUrl: 'not-a-valid-url',
|
|
376
352
|
sourcePort: getPort(),
|
|
@@ -378,8 +354,7 @@ describe('ProxyManager', () => {
|
|
|
378
354
|
});
|
|
379
355
|
});
|
|
380
356
|
it('Should filter hop-by-hop headers', async () => {
|
|
381
|
-
await usingAsync(
|
|
382
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
357
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
383
358
|
const targetPort = getPort();
|
|
384
359
|
const proxyPort = getPort();
|
|
385
360
|
let receivedHeaders = {};
|
|
@@ -393,7 +368,8 @@ describe('ProxyManager', () => {
|
|
|
393
368
|
targetServer.listen(targetPort, () => resolve());
|
|
394
369
|
});
|
|
395
370
|
try {
|
|
396
|
-
await
|
|
371
|
+
await useProxy({
|
|
372
|
+
injector,
|
|
397
373
|
sourceBaseUrl: '/api',
|
|
398
374
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
399
375
|
sourcePort: proxyPort,
|
|
@@ -421,8 +397,7 @@ describe('ProxyManager', () => {
|
|
|
421
397
|
});
|
|
422
398
|
});
|
|
423
399
|
it('Should preserve multiple Set-Cookie headers from target', async () => {
|
|
424
|
-
await usingAsync(
|
|
425
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
400
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
426
401
|
const targetPort = getPort();
|
|
427
402
|
const proxyPort = getPort();
|
|
428
403
|
const targetServer = createHttpServer((_req, res) => {
|
|
@@ -436,7 +411,8 @@ describe('ProxyManager', () => {
|
|
|
436
411
|
targetServer.listen(targetPort, () => resolve());
|
|
437
412
|
});
|
|
438
413
|
try {
|
|
439
|
-
await
|
|
414
|
+
await useProxy({
|
|
415
|
+
injector,
|
|
440
416
|
sourceBaseUrl: '/api',
|
|
441
417
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
442
418
|
sourcePort: proxyPort,
|
|
@@ -464,8 +440,7 @@ describe('ProxyManager', () => {
|
|
|
464
440
|
});
|
|
465
441
|
});
|
|
466
442
|
it('Should add X-Forwarded headers to target request', async () => {
|
|
467
|
-
await usingAsync(
|
|
468
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
443
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
469
444
|
const targetPort = getPort();
|
|
470
445
|
const proxyPort = getPort();
|
|
471
446
|
let received = {};
|
|
@@ -478,7 +453,8 @@ describe('ProxyManager', () => {
|
|
|
478
453
|
targetServer.listen(targetPort, () => resolve());
|
|
479
454
|
});
|
|
480
455
|
try {
|
|
481
|
-
await
|
|
456
|
+
await useProxy({
|
|
457
|
+
injector,
|
|
482
458
|
sourceBaseUrl: '/api',
|
|
483
459
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
484
460
|
sourcePort: proxyPort,
|
|
@@ -494,8 +470,7 @@ describe('ProxyManager', () => {
|
|
|
494
470
|
});
|
|
495
471
|
});
|
|
496
472
|
it('Should abort upstream when client disconnects', async () => {
|
|
497
|
-
await usingAsync(
|
|
498
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
473
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
499
474
|
const targetPort = getPort();
|
|
500
475
|
const proxyPort = getPort();
|
|
501
476
|
let chunksWritten = 0;
|
|
@@ -520,7 +495,8 @@ describe('ProxyManager', () => {
|
|
|
520
495
|
targetServer.listen(targetPort, () => resolve());
|
|
521
496
|
});
|
|
522
497
|
try {
|
|
523
|
-
await
|
|
498
|
+
await useProxy({
|
|
499
|
+
injector,
|
|
524
500
|
sourceBaseUrl: '/api',
|
|
525
501
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
526
502
|
sourcePort: proxyPort,
|
|
@@ -549,12 +525,11 @@ describe('ProxyManager', () => {
|
|
|
549
525
|
});
|
|
550
526
|
});
|
|
551
527
|
it('Should handle request timeout', async () => {
|
|
552
|
-
await usingAsync(
|
|
553
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
528
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
554
529
|
const targetPort = getPort();
|
|
555
530
|
const proxyPort = getPort();
|
|
556
531
|
let failedEvent;
|
|
557
|
-
|
|
532
|
+
injector.get(ServerTelemetryToken).subscribe('onProxyFailed', (event) => {
|
|
558
533
|
failedEvent = event;
|
|
559
534
|
});
|
|
560
535
|
// Create a server that delays response longer than timeout
|
|
@@ -569,7 +544,8 @@ describe('ProxyManager', () => {
|
|
|
569
544
|
targetServer.listen(targetPort, () => resolve());
|
|
570
545
|
});
|
|
571
546
|
try {
|
|
572
|
-
await
|
|
547
|
+
await useProxy({
|
|
548
|
+
injector,
|
|
573
549
|
sourceBaseUrl: '/api',
|
|
574
550
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
575
551
|
sourcePort: proxyPort,
|
|
@@ -590,8 +566,7 @@ describe('ProxyManager', () => {
|
|
|
590
566
|
});
|
|
591
567
|
});
|
|
592
568
|
it('Should complete successfully when response is faster than timeout', async () => {
|
|
593
|
-
await usingAsync(
|
|
594
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
569
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
595
570
|
const targetPort = getPort();
|
|
596
571
|
const proxyPort = getPort();
|
|
597
572
|
// Create a fast-responding server
|
|
@@ -603,7 +578,8 @@ describe('ProxyManager', () => {
|
|
|
603
578
|
targetServer.listen(targetPort, () => resolve());
|
|
604
579
|
});
|
|
605
580
|
try {
|
|
606
|
-
await
|
|
581
|
+
await useProxy({
|
|
582
|
+
injector,
|
|
607
583
|
sourceBaseUrl: '/api',
|
|
608
584
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
609
585
|
sourcePort: proxyPort,
|
|
@@ -621,8 +597,7 @@ describe('ProxyManager', () => {
|
|
|
621
597
|
});
|
|
622
598
|
});
|
|
623
599
|
it('Should use default timeout when not specified', async () => {
|
|
624
|
-
await usingAsync(
|
|
625
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
600
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
626
601
|
const targetPort = getPort();
|
|
627
602
|
const proxyPort = getPort();
|
|
628
603
|
// Create a server with moderate delay (500ms)
|
|
@@ -637,7 +612,8 @@ describe('ProxyManager', () => {
|
|
|
637
612
|
});
|
|
638
613
|
try {
|
|
639
614
|
// No timeout specified - should use default 30000ms
|
|
640
|
-
await
|
|
615
|
+
await useProxy({
|
|
616
|
+
injector,
|
|
641
617
|
sourceBaseUrl: '/api',
|
|
642
618
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
643
619
|
sourcePort: proxyPort,
|
|
@@ -657,10 +633,10 @@ describe('ProxyManager', () => {
|
|
|
657
633
|
});
|
|
658
634
|
describe('Edge cases and error handling', () => {
|
|
659
635
|
it('Should validate invalid protocol (non-HTTP/HTTPS)', async () => {
|
|
660
|
-
await usingAsync(
|
|
661
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
636
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
662
637
|
const proxyPort = getPort();
|
|
663
|
-
await expect(
|
|
638
|
+
await expect(useProxy({
|
|
639
|
+
injector,
|
|
664
640
|
sourceBaseUrl: '/api',
|
|
665
641
|
targetBaseUrl: 'ftp://example.com',
|
|
666
642
|
sourcePort: proxyPort,
|
|
@@ -668,12 +644,11 @@ describe('ProxyManager', () => {
|
|
|
668
644
|
});
|
|
669
645
|
});
|
|
670
646
|
it('Should handle invalid target URL created by pathRewrite', async () => {
|
|
671
|
-
await usingAsync(
|
|
672
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
647
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
673
648
|
const targetPort = getPort();
|
|
674
649
|
const proxyPort = getPort();
|
|
675
650
|
let failedEvent;
|
|
676
|
-
|
|
651
|
+
injector.get(ServerTelemetryToken).subscribe('onProxyFailed', (event) => {
|
|
677
652
|
failedEvent = event;
|
|
678
653
|
});
|
|
679
654
|
// Create a simple server
|
|
@@ -685,7 +660,8 @@ describe('ProxyManager', () => {
|
|
|
685
660
|
targetServer.listen(targetPort, () => resolve());
|
|
686
661
|
});
|
|
687
662
|
try {
|
|
688
|
-
await
|
|
663
|
+
await useProxy({
|
|
664
|
+
injector,
|
|
689
665
|
sourceBaseUrl: '/api',
|
|
690
666
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
691
667
|
sourcePort: proxyPort,
|
|
@@ -709,8 +685,7 @@ describe('ProxyManager', () => {
|
|
|
709
685
|
});
|
|
710
686
|
});
|
|
711
687
|
it('Should handle number-type header values', async () => {
|
|
712
|
-
await usingAsync(
|
|
713
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
688
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
714
689
|
const targetPort = getPort();
|
|
715
690
|
const proxyPort = getPort();
|
|
716
691
|
let receivedHeaders = {};
|
|
@@ -724,7 +699,8 @@ describe('ProxyManager', () => {
|
|
|
724
699
|
targetServer.listen(targetPort, () => resolve());
|
|
725
700
|
});
|
|
726
701
|
try {
|
|
727
|
-
await
|
|
702
|
+
await useProxy({
|
|
703
|
+
injector,
|
|
728
704
|
sourceBaseUrl: '/api',
|
|
729
705
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
730
706
|
sourcePort: proxyPort,
|
|
@@ -753,8 +729,7 @@ describe('ProxyManager', () => {
|
|
|
753
729
|
});
|
|
754
730
|
});
|
|
755
731
|
it('Should handle array-type header values', async () => {
|
|
756
|
-
await usingAsync(
|
|
757
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
732
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
758
733
|
const targetPort = getPort();
|
|
759
734
|
const proxyPort = getPort();
|
|
760
735
|
let receivedHeaders = {};
|
|
@@ -767,7 +742,8 @@ describe('ProxyManager', () => {
|
|
|
767
742
|
targetServer.listen(targetPort, () => resolve());
|
|
768
743
|
});
|
|
769
744
|
try {
|
|
770
|
-
await
|
|
745
|
+
await useProxy({
|
|
746
|
+
injector,
|
|
771
747
|
sourceBaseUrl: '/api',
|
|
772
748
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
773
749
|
sourcePort: proxyPort,
|
|
@@ -784,8 +760,7 @@ describe('ProxyManager', () => {
|
|
|
784
760
|
});
|
|
785
761
|
});
|
|
786
762
|
it('Should handle undefined header values', async () => {
|
|
787
|
-
await usingAsync(
|
|
788
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
763
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
789
764
|
const targetPort = getPort();
|
|
790
765
|
const proxyPort = getPort();
|
|
791
766
|
let receivedHeaders = {};
|
|
@@ -798,7 +773,8 @@ describe('ProxyManager', () => {
|
|
|
798
773
|
targetServer.listen(targetPort, () => resolve());
|
|
799
774
|
});
|
|
800
775
|
try {
|
|
801
|
-
await
|
|
776
|
+
await useProxy({
|
|
777
|
+
injector,
|
|
802
778
|
sourceBaseUrl: '/api',
|
|
803
779
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
804
780
|
sourcePort: proxyPort,
|
|
@@ -819,8 +795,7 @@ describe('ProxyManager', () => {
|
|
|
819
795
|
});
|
|
820
796
|
describe('WebSocket proxy functionality', () => {
|
|
821
797
|
it('Should proxy WebSocket connections when enabled', async () => {
|
|
822
|
-
await usingAsync(
|
|
823
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
798
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
824
799
|
const targetPort = getPort();
|
|
825
800
|
const proxyPort = getPort();
|
|
826
801
|
// Create target WebSocket server
|
|
@@ -831,7 +806,8 @@ describe('ProxyManager', () => {
|
|
|
831
806
|
});
|
|
832
807
|
try {
|
|
833
808
|
// Set up proxy with WebSocket support
|
|
834
|
-
await
|
|
809
|
+
await useProxy({
|
|
810
|
+
injector,
|
|
835
811
|
sourceBaseUrl: '/ws',
|
|
836
812
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
837
813
|
sourcePort: proxyPort,
|
|
@@ -861,8 +837,7 @@ describe('ProxyManager', () => {
|
|
|
861
837
|
});
|
|
862
838
|
});
|
|
863
839
|
it('Should handle bidirectional WebSocket communication', async () => {
|
|
864
|
-
await usingAsync(
|
|
865
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
840
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
866
841
|
const targetPort = getPort();
|
|
867
842
|
const proxyPort = getPort();
|
|
868
843
|
// Create target WebSocket server
|
|
@@ -885,7 +860,8 @@ describe('ProxyManager', () => {
|
|
|
885
860
|
targetServer.listen(targetPort, () => resolve());
|
|
886
861
|
});
|
|
887
862
|
try {
|
|
888
|
-
await
|
|
863
|
+
await useProxy({
|
|
864
|
+
injector,
|
|
889
865
|
sourceBaseUrl: '/ws',
|
|
890
866
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
891
867
|
sourcePort: proxyPort,
|
|
@@ -927,8 +903,7 @@ describe('ProxyManager', () => {
|
|
|
927
903
|
});
|
|
928
904
|
});
|
|
929
905
|
it('Should not proxy WebSocket when disabled', async () => {
|
|
930
|
-
await usingAsync(
|
|
931
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
906
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
932
907
|
const targetPort = getPort();
|
|
933
908
|
const proxyPort = getPort();
|
|
934
909
|
// Create target WebSocket server
|
|
@@ -939,7 +914,8 @@ describe('ProxyManager', () => {
|
|
|
939
914
|
});
|
|
940
915
|
try {
|
|
941
916
|
// Set up proxy WITHOUT WebSocket support
|
|
942
|
-
await
|
|
917
|
+
await useProxy({
|
|
918
|
+
injector,
|
|
943
919
|
sourceBaseUrl: '/ws',
|
|
944
920
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
945
921
|
sourcePort: proxyPort,
|
|
@@ -968,8 +944,7 @@ describe('ProxyManager', () => {
|
|
|
968
944
|
});
|
|
969
945
|
});
|
|
970
946
|
it('Should preserve WebSocket subprotocols', async () => {
|
|
971
|
-
await usingAsync(
|
|
972
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
947
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
973
948
|
const targetPort = getPort();
|
|
974
949
|
const proxyPort = getPort();
|
|
975
950
|
let receivedProtocol;
|
|
@@ -984,7 +959,8 @@ describe('ProxyManager', () => {
|
|
|
984
959
|
targetServer.listen(targetPort, () => resolve());
|
|
985
960
|
});
|
|
986
961
|
try {
|
|
987
|
-
await
|
|
962
|
+
await useProxy({
|
|
963
|
+
injector,
|
|
988
964
|
sourceBaseUrl: '/ws',
|
|
989
965
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
990
966
|
sourcePort: proxyPort,
|
|
@@ -1019,8 +995,7 @@ describe('ProxyManager', () => {
|
|
|
1019
995
|
});
|
|
1020
996
|
});
|
|
1021
997
|
it('Should handle WebSocket path rewriting', async () => {
|
|
1022
|
-
await usingAsync(
|
|
1023
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
998
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1024
999
|
const targetPort = getPort();
|
|
1025
1000
|
const proxyPort = getPort();
|
|
1026
1001
|
let receivedPath;
|
|
@@ -1035,7 +1010,8 @@ describe('ProxyManager', () => {
|
|
|
1035
1010
|
targetServer.listen(targetPort, () => resolve());
|
|
1036
1011
|
});
|
|
1037
1012
|
try {
|
|
1038
|
-
await
|
|
1013
|
+
await useProxy({
|
|
1014
|
+
injector,
|
|
1039
1015
|
sourceBaseUrl: '/old/ws',
|
|
1040
1016
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1041
1017
|
sourcePort: proxyPort,
|
|
@@ -1068,8 +1044,7 @@ describe('ProxyManager', () => {
|
|
|
1068
1044
|
});
|
|
1069
1045
|
});
|
|
1070
1046
|
it('Should handle WebSocket connection closure from client', async () => {
|
|
1071
|
-
await usingAsync(
|
|
1072
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1047
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1073
1048
|
const targetPort = getPort();
|
|
1074
1049
|
const proxyPort = getPort();
|
|
1075
1050
|
let serverClosed = false;
|
|
@@ -1085,7 +1060,8 @@ describe('ProxyManager', () => {
|
|
|
1085
1060
|
targetServer.listen(targetPort, () => resolve());
|
|
1086
1061
|
});
|
|
1087
1062
|
try {
|
|
1088
|
-
await
|
|
1063
|
+
await useProxy({
|
|
1064
|
+
injector,
|
|
1089
1065
|
sourceBaseUrl: '/ws',
|
|
1090
1066
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1091
1067
|
sourcePort: proxyPort,
|
|
@@ -1116,8 +1092,7 @@ describe('ProxyManager', () => {
|
|
|
1116
1092
|
});
|
|
1117
1093
|
});
|
|
1118
1094
|
it('Should handle WebSocket connection closure from server', async () => {
|
|
1119
|
-
await usingAsync(
|
|
1120
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1095
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1121
1096
|
const targetPort = getPort();
|
|
1122
1097
|
const proxyPort = getPort();
|
|
1123
1098
|
// Create target WebSocket server
|
|
@@ -1132,7 +1107,8 @@ describe('ProxyManager', () => {
|
|
|
1132
1107
|
targetServer.listen(targetPort, () => resolve());
|
|
1133
1108
|
});
|
|
1134
1109
|
try {
|
|
1135
|
-
await
|
|
1110
|
+
await useProxy({
|
|
1111
|
+
injector,
|
|
1136
1112
|
sourceBaseUrl: '/ws',
|
|
1137
1113
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1138
1114
|
sourcePort: proxyPort,
|
|
@@ -1167,15 +1143,15 @@ describe('ProxyManager', () => {
|
|
|
1167
1143
|
});
|
|
1168
1144
|
});
|
|
1169
1145
|
it('Should emit onWebSocketProxyFailed event on error', async () => {
|
|
1170
|
-
await usingAsync(
|
|
1171
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1146
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1172
1147
|
const proxyPort = getPort();
|
|
1173
1148
|
const unavailablePort = getPort();
|
|
1174
1149
|
let failedEvent;
|
|
1175
|
-
|
|
1150
|
+
injector.get(ServerTelemetryToken).subscribe('onWebSocketProxyFailed', (event) => {
|
|
1176
1151
|
failedEvent = event;
|
|
1177
1152
|
});
|
|
1178
|
-
await
|
|
1153
|
+
await useProxy({
|
|
1154
|
+
injector,
|
|
1179
1155
|
sourceBaseUrl: '/ws',
|
|
1180
1156
|
targetBaseUrl: `http://localhost:${unavailablePort}`,
|
|
1181
1157
|
sourcePort: proxyPort,
|
|
@@ -1199,8 +1175,7 @@ describe('ProxyManager', () => {
|
|
|
1199
1175
|
});
|
|
1200
1176
|
});
|
|
1201
1177
|
it('Should handle large WebSocket messages', async () => {
|
|
1202
|
-
await usingAsync(
|
|
1203
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1178
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1204
1179
|
const targetPort = getPort();
|
|
1205
1180
|
const proxyPort = getPort();
|
|
1206
1181
|
// Create target WebSocket server
|
|
@@ -1216,7 +1191,8 @@ describe('ProxyManager', () => {
|
|
|
1216
1191
|
targetServer.listen(targetPort, () => resolve());
|
|
1217
1192
|
});
|
|
1218
1193
|
try {
|
|
1219
|
-
await
|
|
1194
|
+
await useProxy({
|
|
1195
|
+
injector,
|
|
1220
1196
|
sourceBaseUrl: '/ws',
|
|
1221
1197
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1222
1198
|
sourcePort: proxyPort,
|
|
@@ -1253,8 +1229,7 @@ describe('ProxyManager', () => {
|
|
|
1253
1229
|
});
|
|
1254
1230
|
});
|
|
1255
1231
|
it('Should handle binary WebSocket messages', async () => {
|
|
1256
|
-
await usingAsync(
|
|
1257
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1232
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1258
1233
|
const targetPort = getPort();
|
|
1259
1234
|
const proxyPort = getPort();
|
|
1260
1235
|
// Create target WebSocket server
|
|
@@ -1270,7 +1245,8 @@ describe('ProxyManager', () => {
|
|
|
1270
1245
|
targetServer.listen(targetPort, () => resolve());
|
|
1271
1246
|
});
|
|
1272
1247
|
try {
|
|
1273
|
-
await
|
|
1248
|
+
await useProxy({
|
|
1249
|
+
injector,
|
|
1274
1250
|
sourceBaseUrl: '/ws',
|
|
1275
1251
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1276
1252
|
sourcePort: proxyPort,
|
|
@@ -1302,8 +1278,7 @@ describe('ProxyManager', () => {
|
|
|
1302
1278
|
});
|
|
1303
1279
|
});
|
|
1304
1280
|
it('Should apply header transformations to WebSocket upgrade', async () => {
|
|
1305
|
-
await usingAsync(
|
|
1306
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1281
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1307
1282
|
const targetPort = getPort();
|
|
1308
1283
|
const proxyPort = getPort();
|
|
1309
1284
|
let receivedHeaders = {};
|
|
@@ -1318,7 +1293,8 @@ describe('ProxyManager', () => {
|
|
|
1318
1293
|
targetServer.listen(targetPort, () => resolve());
|
|
1319
1294
|
});
|
|
1320
1295
|
try {
|
|
1321
|
-
await
|
|
1296
|
+
await useProxy({
|
|
1297
|
+
injector,
|
|
1322
1298
|
sourceBaseUrl: '/ws',
|
|
1323
1299
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1324
1300
|
sourcePort: proxyPort,
|
|
@@ -1355,8 +1331,7 @@ describe('ProxyManager', () => {
|
|
|
1355
1331
|
});
|
|
1356
1332
|
});
|
|
1357
1333
|
it('Should handle WebSocket upgrade timeout', async () => {
|
|
1358
|
-
await usingAsync(
|
|
1359
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1334
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1360
1335
|
const targetPort = getPort();
|
|
1361
1336
|
const proxyPort = getPort();
|
|
1362
1337
|
// Create a server that delays WebSocket upgrade longer than timeout
|
|
@@ -1368,7 +1343,8 @@ describe('ProxyManager', () => {
|
|
|
1368
1343
|
targetServer.listen(targetPort, () => resolve());
|
|
1369
1344
|
});
|
|
1370
1345
|
try {
|
|
1371
|
-
await
|
|
1346
|
+
await useProxy({
|
|
1347
|
+
injector,
|
|
1372
1348
|
sourceBaseUrl: '/ws',
|
|
1373
1349
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1374
1350
|
sourcePort: proxyPort,
|
|
@@ -1401,12 +1377,11 @@ describe('ProxyManager', () => {
|
|
|
1401
1377
|
});
|
|
1402
1378
|
}, 10000);
|
|
1403
1379
|
it('Should handle unusual path in WebSocket upgrade with PathHelper', async () => {
|
|
1404
|
-
await usingAsync(
|
|
1405
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1380
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1406
1381
|
const targetPort = getPort();
|
|
1407
1382
|
const proxyPort = getPort();
|
|
1408
1383
|
let failedEvent;
|
|
1409
|
-
|
|
1384
|
+
injector.get(ServerTelemetryToken).subscribe('onWebSocketProxyFailed', (event) => {
|
|
1410
1385
|
failedEvent = event;
|
|
1411
1386
|
});
|
|
1412
1387
|
// Create target server that will receive the WebSocket connection
|
|
@@ -1420,7 +1395,8 @@ describe('ProxyManager', () => {
|
|
|
1420
1395
|
targetServer.listen(targetPort, () => resolve());
|
|
1421
1396
|
});
|
|
1422
1397
|
try {
|
|
1423
|
-
await
|
|
1398
|
+
await useProxy({
|
|
1399
|
+
injector,
|
|
1424
1400
|
sourceBaseUrl: '/ws',
|
|
1425
1401
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1426
1402
|
sourcePort: proxyPort,
|
|
@@ -1453,8 +1429,7 @@ describe('ProxyManager', () => {
|
|
|
1453
1429
|
});
|
|
1454
1430
|
});
|
|
1455
1431
|
it('Should handle WebSocket header value types (number, array, undefined)', async () => {
|
|
1456
|
-
await usingAsync(
|
|
1457
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1432
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1458
1433
|
const targetPort = getPort();
|
|
1459
1434
|
const proxyPort = getPort();
|
|
1460
1435
|
let receivedHeaders = {};
|
|
@@ -1464,7 +1439,8 @@ describe('ProxyManager', () => {
|
|
|
1464
1439
|
ws.send('connected');
|
|
1465
1440
|
});
|
|
1466
1441
|
try {
|
|
1467
|
-
await
|
|
1442
|
+
await useProxy({
|
|
1443
|
+
injector,
|
|
1468
1444
|
sourceBaseUrl: '/ws',
|
|
1469
1445
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1470
1446
|
sourcePort: proxyPort,
|
|
@@ -1500,8 +1476,7 @@ describe('ProxyManager', () => {
|
|
|
1500
1476
|
});
|
|
1501
1477
|
});
|
|
1502
1478
|
it('Should handle WebSocket connections with query parameters', async () => {
|
|
1503
|
-
await usingAsync(
|
|
1504
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1479
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1505
1480
|
const targetPort = getPort();
|
|
1506
1481
|
const proxyPort = getPort();
|
|
1507
1482
|
let receivedUrl;
|
|
@@ -1510,7 +1485,8 @@ describe('ProxyManager', () => {
|
|
|
1510
1485
|
ws.send('connected');
|
|
1511
1486
|
});
|
|
1512
1487
|
try {
|
|
1513
|
-
await
|
|
1488
|
+
await useProxy({
|
|
1489
|
+
injector,
|
|
1514
1490
|
sourceBaseUrl: '/ws',
|
|
1515
1491
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1516
1492
|
sourcePort: proxyPort,
|
|
@@ -1537,15 +1513,15 @@ describe('ProxyManager', () => {
|
|
|
1537
1513
|
});
|
|
1538
1514
|
});
|
|
1539
1515
|
it('Should handle WebSocket close with code and reason', async () => {
|
|
1540
|
-
await usingAsync(
|
|
1541
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1516
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1542
1517
|
const targetPort = getPort();
|
|
1543
1518
|
const proxyPort = getPort();
|
|
1544
1519
|
const { server: targetServer, wss: targetWss } = await createWsTestServer(targetPort, (ws) => {
|
|
1545
1520
|
ws.close(1008, 'Policy Violation');
|
|
1546
1521
|
});
|
|
1547
1522
|
try {
|
|
1548
|
-
await
|
|
1523
|
+
await useProxy({
|
|
1524
|
+
injector,
|
|
1549
1525
|
sourceBaseUrl: '/ws',
|
|
1550
1526
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1551
1527
|
sourcePort: proxyPort,
|
|
@@ -1569,8 +1545,7 @@ describe('ProxyManager', () => {
|
|
|
1569
1545
|
});
|
|
1570
1546
|
describe('HTTP Methods and Status Codes', () => {
|
|
1571
1547
|
it('Should handle PUT requests with body', async () => {
|
|
1572
|
-
await usingAsync(
|
|
1573
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1548
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1574
1549
|
const targetPort = getPort();
|
|
1575
1550
|
const proxyPort = getPort();
|
|
1576
1551
|
const targetServer = await createEchoServer(targetPort, (req, res) => {
|
|
@@ -1583,7 +1558,8 @@ describe('ProxyManager', () => {
|
|
|
1583
1558
|
});
|
|
1584
1559
|
});
|
|
1585
1560
|
try {
|
|
1586
|
-
await
|
|
1561
|
+
await useProxy({
|
|
1562
|
+
injector,
|
|
1587
1563
|
sourceBaseUrl: '/api',
|
|
1588
1564
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1589
1565
|
sourcePort: proxyPort,
|
|
@@ -1605,8 +1581,7 @@ describe('ProxyManager', () => {
|
|
|
1605
1581
|
});
|
|
1606
1582
|
});
|
|
1607
1583
|
it('Should handle PATCH requests with body', async () => {
|
|
1608
|
-
await usingAsync(
|
|
1609
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1584
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1610
1585
|
const targetPort = getPort();
|
|
1611
1586
|
const proxyPort = getPort();
|
|
1612
1587
|
const targetServer = await createEchoServer(targetPort, (req, res) => {
|
|
@@ -1619,7 +1594,8 @@ describe('ProxyManager', () => {
|
|
|
1619
1594
|
});
|
|
1620
1595
|
});
|
|
1621
1596
|
try {
|
|
1622
|
-
await
|
|
1597
|
+
await useProxy({
|
|
1598
|
+
injector,
|
|
1623
1599
|
sourceBaseUrl: '/api',
|
|
1624
1600
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1625
1601
|
sourcePort: proxyPort,
|
|
@@ -1641,8 +1617,7 @@ describe('ProxyManager', () => {
|
|
|
1641
1617
|
});
|
|
1642
1618
|
});
|
|
1643
1619
|
it('Should handle DELETE requests', async () => {
|
|
1644
|
-
await usingAsync(
|
|
1645
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1620
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1646
1621
|
const targetPort = getPort();
|
|
1647
1622
|
const proxyPort = getPort();
|
|
1648
1623
|
const targetServer = await createEchoServer(targetPort, (_req, res) => {
|
|
@@ -1650,7 +1625,8 @@ describe('ProxyManager', () => {
|
|
|
1650
1625
|
res.end();
|
|
1651
1626
|
});
|
|
1652
1627
|
try {
|
|
1653
|
-
await
|
|
1628
|
+
await useProxy({
|
|
1629
|
+
injector,
|
|
1654
1630
|
sourceBaseUrl: '/api',
|
|
1655
1631
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1656
1632
|
sourcePort: proxyPort,
|
|
@@ -1666,8 +1642,7 @@ describe('ProxyManager', () => {
|
|
|
1666
1642
|
});
|
|
1667
1643
|
});
|
|
1668
1644
|
it('Should handle OPTIONS requests (CORS preflight)', async () => {
|
|
1669
|
-
await usingAsync(
|
|
1670
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1645
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1671
1646
|
const targetPort = getPort();
|
|
1672
1647
|
const proxyPort = getPort();
|
|
1673
1648
|
const targetServer = await createEchoServer(targetPort, (_req, res) => {
|
|
@@ -1679,7 +1654,8 @@ describe('ProxyManager', () => {
|
|
|
1679
1654
|
res.end();
|
|
1680
1655
|
});
|
|
1681
1656
|
try {
|
|
1682
|
-
await
|
|
1657
|
+
await useProxy({
|
|
1658
|
+
injector,
|
|
1683
1659
|
sourceBaseUrl: '/api',
|
|
1684
1660
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1685
1661
|
sourcePort: proxyPort,
|
|
@@ -1697,8 +1673,7 @@ describe('ProxyManager', () => {
|
|
|
1697
1673
|
});
|
|
1698
1674
|
});
|
|
1699
1675
|
it('Should handle HEAD requests', async () => {
|
|
1700
|
-
await usingAsync(
|
|
1701
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1676
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1702
1677
|
const targetPort = getPort();
|
|
1703
1678
|
const proxyPort = getPort();
|
|
1704
1679
|
const targetServer = await createEchoServer(targetPort, (_req, res) => {
|
|
@@ -1709,7 +1684,8 @@ describe('ProxyManager', () => {
|
|
|
1709
1684
|
res.end();
|
|
1710
1685
|
});
|
|
1711
1686
|
try {
|
|
1712
|
-
await
|
|
1687
|
+
await useProxy({
|
|
1688
|
+
injector,
|
|
1713
1689
|
sourceBaseUrl: '/api',
|
|
1714
1690
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1715
1691
|
sourcePort: proxyPort,
|
|
@@ -1727,8 +1703,7 @@ describe('ProxyManager', () => {
|
|
|
1727
1703
|
});
|
|
1728
1704
|
});
|
|
1729
1705
|
it('Should handle 4xx client error responses', async () => {
|
|
1730
|
-
await usingAsync(
|
|
1731
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1706
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1732
1707
|
const targetPort = getPort();
|
|
1733
1708
|
const proxyPort = getPort();
|
|
1734
1709
|
const targetServer = await createEchoServer(targetPort, (_req, res) => {
|
|
@@ -1736,7 +1711,8 @@ describe('ProxyManager', () => {
|
|
|
1736
1711
|
res.end(JSON.stringify({ error: 'Not Found' }));
|
|
1737
1712
|
});
|
|
1738
1713
|
try {
|
|
1739
|
-
await
|
|
1714
|
+
await useProxy({
|
|
1715
|
+
injector,
|
|
1740
1716
|
sourceBaseUrl: '/api',
|
|
1741
1717
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1742
1718
|
sourcePort: proxyPort,
|
|
@@ -1752,8 +1728,7 @@ describe('ProxyManager', () => {
|
|
|
1752
1728
|
});
|
|
1753
1729
|
});
|
|
1754
1730
|
it('Should handle 5xx server error responses', async () => {
|
|
1755
|
-
await usingAsync(
|
|
1756
|
-
const proxyManager = injector.getInstance(ProxyManager);
|
|
1731
|
+
await usingAsync(createInjector(), async (injector) => {
|
|
1757
1732
|
const targetPort = getPort();
|
|
1758
1733
|
const proxyPort = getPort();
|
|
1759
1734
|
const targetServer = await createEchoServer(targetPort, (_req, res) => {
|
|
@@ -1761,7 +1736,8 @@ describe('ProxyManager', () => {
|
|
|
1761
1736
|
res.end(JSON.stringify({ error: 'Internal Server Error' }));
|
|
1762
1737
|
});
|
|
1763
1738
|
try {
|
|
1764
|
-
await
|
|
1739
|
+
await useProxy({
|
|
1740
|
+
injector,
|
|
1765
1741
|
sourceBaseUrl: '/api',
|
|
1766
1742
|
targetBaseUrl: `http://localhost:${targetPort}`,
|
|
1767
1743
|
sourcePort: proxyPort,
|