@furystack/rest-service 13.0.0 → 14.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 (311) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/README.md +47 -28
  3. package/esm/actions/error-action.d.ts +7 -2
  4. package/esm/actions/error-action.d.ts.map +1 -1
  5. package/esm/actions/error-action.js +7 -2
  6. package/esm/actions/error-action.js.map +1 -1
  7. package/esm/actions/get-current-user.d.ts +1 -4
  8. package/esm/actions/get-current-user.d.ts.map +1 -1
  9. package/esm/actions/get-current-user.js +1 -4
  10. package/esm/actions/get-current-user.js.map +1 -1
  11. package/esm/actions/get-current-user.spec.js +10 -6
  12. package/esm/actions/get-current-user.spec.js.map +1 -1
  13. package/esm/actions/is-authenticated.d.ts +3 -4
  14. package/esm/actions/is-authenticated.d.ts.map +1 -1
  15. package/esm/actions/is-authenticated.js +3 -4
  16. package/esm/actions/is-authenticated.js.map +1 -1
  17. package/esm/actions/is-authenticated.spec.js +10 -6
  18. package/esm/actions/is-authenticated.spec.js.map +1 -1
  19. package/esm/actions/logout-action.spec.js +11 -9
  20. package/esm/actions/logout-action.spec.js.map +1 -1
  21. package/esm/actions/logout.d.ts +2 -6
  22. package/esm/actions/logout.d.ts.map +1 -1
  23. package/esm/actions/logout.js +3 -7
  24. package/esm/actions/logout.js.map +1 -1
  25. package/esm/actions/not-found-action.d.ts +1 -3
  26. package/esm/actions/not-found-action.d.ts.map +1 -1
  27. package/esm/actions/not-found-action.js +1 -3
  28. package/esm/actions/not-found-action.js.map +1 -1
  29. package/esm/actions/password-login-action.d.ts +5 -12
  30. package/esm/actions/password-login-action.d.ts.map +1 -1
  31. package/esm/actions/password-login-action.js +6 -13
  32. package/esm/actions/password-login-action.js.map +1 -1
  33. package/esm/actions/password-login-action.spec.js +23 -28
  34. package/esm/actions/password-login-action.spec.js.map +1 -1
  35. package/esm/authenticate.d.ts +5 -11
  36. package/esm/authenticate.d.ts.map +1 -1
  37. package/esm/authenticate.js +6 -12
  38. package/esm/authenticate.js.map +1 -1
  39. package/esm/authenticate.spec.js +41 -33
  40. package/esm/authenticate.spec.js.map +1 -1
  41. package/esm/authentication-providers/authentication-provider.d.ts +17 -0
  42. package/esm/authentication-providers/authentication-provider.d.ts.map +1 -1
  43. package/esm/authentication-providers/basic-auth-provider.d.ts +7 -0
  44. package/esm/authentication-providers/basic-auth-provider.d.ts.map +1 -1
  45. package/esm/authentication-providers/basic-auth-provider.js +7 -0
  46. package/esm/authentication-providers/basic-auth-provider.js.map +1 -1
  47. package/esm/authentication-providers/cookie-auth-provider.d.ts.map +1 -1
  48. package/esm/authentication-providers/cookie-auth-provider.js +8 -0
  49. package/esm/authentication-providers/cookie-auth-provider.js.map +1 -1
  50. package/esm/authorize.d.ts +5 -17
  51. package/esm/authorize.d.ts.map +1 -1
  52. package/esm/authorize.js +5 -17
  53. package/esm/authorize.js.map +1 -1
  54. package/esm/authorize.spec.js +34 -29
  55. package/esm/authorize.spec.js.map +1 -1
  56. package/esm/endpoint-generators/create-delete-endpoint.d.ts +6 -11
  57. package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
  58. package/esm/endpoint-generators/create-delete-endpoint.js +7 -11
  59. package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
  60. package/esm/endpoint-generators/create-delete-endpoint.spec.js +14 -21
  61. package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
  62. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +11 -11
  63. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
  64. package/esm/endpoint-generators/create-get-collection-endpoint.js +13 -12
  65. package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
  66. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +43 -70
  67. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
  68. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +6 -11
  69. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
  70. package/esm/endpoint-generators/create-get-entity-endpoint.js +7 -11
  71. package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
  72. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +16 -33
  73. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
  74. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +1 -1
  75. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -1
  76. package/esm/endpoint-generators/create-get-openapi-document-action.js +1 -1
  77. package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -1
  78. package/esm/endpoint-generators/create-get-schema-action.d.ts +1 -1
  79. package/esm/endpoint-generators/create-get-schema-action.d.ts.map +1 -1
  80. package/esm/endpoint-generators/create-get-schema-action.js.map +1 -1
  81. package/esm/endpoint-generators/create-patch-endpoint.d.ts +7 -13
  82. package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
  83. package/esm/endpoint-generators/create-patch-endpoint.js +8 -13
  84. package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
  85. package/esm/endpoint-generators/create-patch-endpoint.spec.js +10 -17
  86. package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
  87. package/esm/endpoint-generators/create-post-endpoint.d.ts +7 -13
  88. package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
  89. package/esm/endpoint-generators/create-post-endpoint.js +8 -13
  90. package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
  91. package/esm/endpoint-generators/create-post-endpoint.spec.js +41 -14
  92. package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
  93. package/esm/endpoint-generators/utils.d.ts +17 -2
  94. package/esm/endpoint-generators/utils.d.ts.map +1 -1
  95. package/esm/endpoint-generators/utils.js +33 -20
  96. package/esm/endpoint-generators/utils.js.map +1 -1
  97. package/esm/get-schema-from-api.d.ts +1 -1
  98. package/esm/get-schema-from-api.d.ts.map +1 -1
  99. package/esm/get-schema-from-api.js +1 -0
  100. package/esm/get-schema-from-api.js.map +1 -1
  101. package/esm/get-schema-from-api.spec.js.map +1 -1
  102. package/esm/helpers.d.ts +54 -88
  103. package/esm/helpers.d.ts.map +1 -1
  104. package/esm/helpers.js +90 -92
  105. package/esm/helpers.js.map +1 -1
  106. package/esm/helpers.spec.d.ts +2 -1
  107. package/esm/helpers.spec.d.ts.map +1 -1
  108. package/esm/helpers.spec.js +41 -38
  109. package/esm/helpers.spec.js.map +1 -1
  110. package/esm/http-authentication-settings.d.ts +56 -12
  111. package/esm/http-authentication-settings.d.ts.map +1 -1
  112. package/esm/http-authentication-settings.js +27 -29
  113. package/esm/http-authentication-settings.js.map +1 -1
  114. package/esm/http-server-pool.d.ts +64 -0
  115. package/esm/http-server-pool.d.ts.map +1 -0
  116. package/esm/http-server-pool.js +95 -0
  117. package/esm/http-server-pool.js.map +1 -0
  118. package/esm/http-server-pool.spec.d.ts +2 -0
  119. package/esm/http-server-pool.spec.d.ts.map +1 -0
  120. package/esm/http-server-pool.spec.js +193 -0
  121. package/esm/http-server-pool.spec.js.map +1 -0
  122. package/esm/http-user-context.d.ts +34 -44
  123. package/esm/http-user-context.d.ts.map +1 -1
  124. package/esm/http-user-context.js +75 -95
  125. package/esm/http-user-context.js.map +1 -1
  126. package/esm/http-user-context.spec.d.ts +8 -2
  127. package/esm/http-user-context.spec.d.ts.map +1 -1
  128. package/esm/http-user-context.spec.js +226 -332
  129. package/esm/http-user-context.spec.js.map +1 -1
  130. package/esm/identity-cache-keys.d.ts +28 -0
  131. package/esm/identity-cache-keys.d.ts.map +1 -0
  132. package/esm/identity-cache-keys.js +13 -0
  133. package/esm/identity-cache-keys.js.map +1 -0
  134. package/esm/identity-cache-keys.spec.d.ts +2 -0
  135. package/esm/identity-cache-keys.spec.d.ts.map +1 -0
  136. package/esm/identity-cache-keys.spec.js +21 -0
  137. package/esm/identity-cache-keys.spec.js.map +1 -0
  138. package/esm/identity-event-bus.d.ts +102 -0
  139. package/esm/identity-event-bus.d.ts.map +1 -0
  140. package/esm/identity-event-bus.js +151 -0
  141. package/esm/identity-event-bus.js.map +1 -0
  142. package/esm/identity-event-bus.spec.d.ts +2 -0
  143. package/esm/identity-event-bus.spec.d.ts.map +1 -0
  144. package/esm/identity-event-bus.spec.js +392 -0
  145. package/esm/identity-event-bus.spec.js.map +1 -0
  146. package/esm/index.d.ts +9 -4
  147. package/esm/index.d.ts.map +1 -1
  148. package/esm/index.js +9 -4
  149. package/esm/index.js.map +1 -1
  150. package/esm/login-response-strategy.d.ts +11 -10
  151. package/esm/login-response-strategy.d.ts.map +1 -1
  152. package/esm/login-response-strategy.js +7 -6
  153. package/esm/login-response-strategy.js.map +1 -1
  154. package/esm/login-response-strategy.spec.js +25 -29
  155. package/esm/login-response-strategy.spec.js.map +1 -1
  156. package/esm/openapi/generate-openapi-document.spec.js.map +1 -1
  157. package/esm/proxy-manager.spec.js +152 -176
  158. package/esm/proxy-manager.spec.js.map +1 -1
  159. package/esm/proxy-runtime.d.ts +27 -0
  160. package/esm/proxy-runtime.d.ts.map +1 -0
  161. package/esm/proxy-runtime.js +45 -0
  162. package/esm/proxy-runtime.js.map +1 -0
  163. package/esm/proxy-runtime.spec.d.ts +2 -0
  164. package/esm/proxy-runtime.spec.d.ts.map +1 -0
  165. package/esm/proxy-runtime.spec.js +39 -0
  166. package/esm/proxy-runtime.spec.js.map +1 -0
  167. package/esm/request-action-implementation.d.ts +25 -0
  168. package/esm/request-action-implementation.d.ts.map +1 -1
  169. package/esm/request-action-implementation.js +9 -0
  170. package/esm/request-action-implementation.js.map +1 -1
  171. package/esm/rest-api-runtime.d.ts +76 -0
  172. package/esm/rest-api-runtime.d.ts.map +1 -0
  173. package/esm/rest-api-runtime.js +131 -0
  174. package/esm/rest-api-runtime.js.map +1 -0
  175. package/esm/rest-api-runtime.spec.d.ts +2 -0
  176. package/esm/rest-api-runtime.spec.d.ts.map +1 -0
  177. package/esm/rest-api-runtime.spec.js +58 -0
  178. package/esm/rest-api-runtime.spec.js.map +1 -0
  179. package/esm/rest-service.integration.spec.d.ts +1 -1
  180. package/esm/rest-service.integration.spec.d.ts.map +1 -1
  181. package/esm/rest-service.integration.spec.js +57 -80
  182. package/esm/rest-service.integration.spec.js.map +1 -1
  183. package/esm/rest.integration.test.js +26 -84
  184. package/esm/rest.integration.test.js.map +1 -1
  185. package/esm/server-telemetry.d.ts +49 -0
  186. package/esm/server-telemetry.d.ts.map +1 -0
  187. package/esm/server-telemetry.js +25 -0
  188. package/esm/server-telemetry.js.map +1 -0
  189. package/esm/server-telemetry.spec.d.ts +2 -0
  190. package/esm/server-telemetry.spec.d.ts.map +1 -0
  191. package/esm/server-telemetry.spec.js +52 -0
  192. package/esm/server-telemetry.spec.js.map +1 -0
  193. package/esm/static-server-manager.spec.js +60 -125
  194. package/esm/static-server-manager.spec.js.map +1 -1
  195. package/esm/static-site-runtime.d.ts +21 -0
  196. package/esm/static-site-runtime.d.ts.map +1 -0
  197. package/esm/static-site-runtime.js +48 -0
  198. package/esm/static-site-runtime.js.map +1 -0
  199. package/esm/static-site-runtime.spec.d.ts +2 -0
  200. package/esm/static-site-runtime.spec.d.ts.map +1 -0
  201. package/esm/static-site-runtime.spec.js +30 -0
  202. package/esm/static-site-runtime.spec.js.map +1 -0
  203. package/esm/user-resolution-cache.d.ts +65 -0
  204. package/esm/user-resolution-cache.d.ts.map +1 -0
  205. package/esm/user-resolution-cache.js +101 -0
  206. package/esm/user-resolution-cache.js.map +1 -0
  207. package/esm/user-resolution-cache.spec.d.ts +2 -0
  208. package/esm/user-resolution-cache.spec.d.ts.map +1 -0
  209. package/esm/user-resolution-cache.spec.js +220 -0
  210. package/esm/user-resolution-cache.spec.js.map +1 -0
  211. package/esm/user-store.d.ts +39 -0
  212. package/esm/user-store.d.ts.map +1 -0
  213. package/esm/user-store.js +62 -0
  214. package/esm/user-store.js.map +1 -0
  215. package/esm/user-store.spec.d.ts +2 -0
  216. package/esm/user-store.spec.d.ts.map +1 -0
  217. package/esm/user-store.spec.js +72 -0
  218. package/esm/user-store.spec.js.map +1 -0
  219. package/esm/validate.d.ts +13 -12
  220. package/esm/validate.d.ts.map +1 -1
  221. package/esm/validate.integration.spec.js +27 -28
  222. package/esm/validate.integration.spec.js.map +1 -1
  223. package/esm/validate.js +12 -0
  224. package/esm/validate.js.map +1 -1
  225. package/package.json +14 -12
  226. package/src/actions/error-action.ts +7 -3
  227. package/src/actions/get-current-user.spec.ts +11 -10
  228. package/src/actions/get-current-user.ts +1 -4
  229. package/src/actions/is-authenticated.spec.ts +12 -7
  230. package/src/actions/is-authenticated.ts +3 -4
  231. package/src/actions/logout-action.spec.ts +12 -12
  232. package/src/actions/logout.ts +3 -7
  233. package/src/actions/not-found-action.ts +1 -3
  234. package/src/actions/password-login-action.spec.ts +30 -30
  235. package/src/actions/password-login-action.ts +6 -13
  236. package/src/authenticate.spec.ts +45 -51
  237. package/src/authenticate.ts +6 -12
  238. package/src/authentication-providers/authentication-provider.ts +17 -0
  239. package/src/authentication-providers/basic-auth-provider.ts +7 -0
  240. package/src/authentication-providers/cookie-auth-provider.ts +8 -0
  241. package/src/authorize.spec.ts +37 -39
  242. package/src/authorize.ts +6 -17
  243. package/src/endpoint-generators/create-delete-endpoint.spec.ts +16 -24
  244. package/src/endpoint-generators/create-delete-endpoint.ts +11 -17
  245. package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +45 -78
  246. package/src/endpoint-generators/create-get-collection-endpoint.ts +17 -19
  247. package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +17 -33
  248. package/src/endpoint-generators/create-get-entity-endpoint.ts +11 -17
  249. package/src/endpoint-generators/create-get-openapi-document-action.ts +2 -2
  250. package/src/endpoint-generators/create-get-schema-action.ts +1 -1
  251. package/src/endpoint-generators/create-patch-endpoint.spec.ts +11 -18
  252. package/src/endpoint-generators/create-patch-endpoint.ts +12 -23
  253. package/src/endpoint-generators/create-post-endpoint.spec.ts +45 -14
  254. package/src/endpoint-generators/create-post-endpoint.ts +13 -23
  255. package/src/endpoint-generators/utils.ts +36 -28
  256. package/src/get-schema-from-api.spec.ts +1 -1
  257. package/src/get-schema-from-api.ts +2 -1
  258. package/src/helpers.spec.ts +51 -41
  259. package/src/helpers.ts +140 -109
  260. package/src/http-authentication-settings.ts +78 -24
  261. package/src/http-server-pool.spec.ts +220 -0
  262. package/src/http-server-pool.ts +169 -0
  263. package/src/http-user-context.spec.ts +246 -378
  264. package/src/http-user-context.ts +122 -92
  265. package/src/identity-cache-keys.spec.ts +24 -0
  266. package/src/identity-cache-keys.ts +31 -0
  267. package/src/identity-event-bus.spec.ts +285 -0
  268. package/src/identity-event-bus.ts +230 -0
  269. package/src/index.ts +9 -4
  270. package/src/login-response-strategy.spec.ts +32 -31
  271. package/src/login-response-strategy.ts +14 -12
  272. package/src/openapi/generate-openapi-document.spec.ts +2 -2
  273. package/src/proxy-manager.spec.ts +158 -188
  274. package/src/proxy-runtime.spec.ts +50 -0
  275. package/src/proxy-runtime.ts +75 -0
  276. package/src/request-action-implementation.ts +25 -0
  277. package/src/rest-api-runtime.spec.ts +77 -0
  278. package/src/rest-api-runtime.ts +204 -0
  279. package/src/rest-service.integration.spec.ts +65 -85
  280. package/src/rest.integration.test.ts +27 -87
  281. package/src/server-telemetry.spec.ts +56 -0
  282. package/src/server-telemetry.ts +43 -0
  283. package/src/static-server-manager.spec.ts +63 -151
  284. package/src/static-site-runtime.spec.ts +39 -0
  285. package/src/static-site-runtime.ts +75 -0
  286. package/src/user-resolution-cache.spec.ts +241 -0
  287. package/src/user-resolution-cache.ts +164 -0
  288. package/src/user-store.spec.ts +86 -0
  289. package/src/user-store.ts +69 -0
  290. package/src/validate.integration.spec.ts +40 -35
  291. package/src/validate.ts +14 -12
  292. package/esm/api-manager.d.ts +0 -104
  293. package/esm/api-manager.d.ts.map +0 -1
  294. package/esm/api-manager.js +0 -179
  295. package/esm/api-manager.js.map +0 -1
  296. package/esm/proxy-manager.d.ts +0 -53
  297. package/esm/proxy-manager.d.ts.map +0 -1
  298. package/esm/proxy-manager.js +0 -84
  299. package/esm/proxy-manager.js.map +0 -1
  300. package/esm/server-manager.d.ts +0 -48
  301. package/esm/server-manager.d.ts.map +0 -1
  302. package/esm/server-manager.js +0 -100
  303. package/esm/server-manager.js.map +0 -1
  304. package/esm/static-server-manager.d.ts +0 -19
  305. package/esm/static-server-manager.d.ts.map +0 -1
  306. package/esm/static-server-manager.js +0 -65
  307. package/esm/static-server-manager.js.map +0 -1
  308. package/src/api-manager.ts +0 -304
  309. package/src/proxy-manager.ts +0 -102
  310. package/src/server-manager.ts +0 -135
  311. package/src/static-server-manager.ts +0 -90
@@ -1,5 +1,5 @@
1
1
  import { getPort } from '@furystack/core/port-generator';
2
- import { Injector } from '@furystack/inject';
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 { ProxyManager } from './proxy-manager.js';
11
- import { StaticServerManager } from './static-server-manager.js';
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(new Injector(), async (injector) => {
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 staticServerManager.addStaticSite({
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 staticServerManager.addStaticSite({
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 staticServerManager.addStaticSite({
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 staticServerManager.addStaticSite({
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 staticServerManager.addStaticSite({
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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
- proxyManager.subscribe('onProxyFailed', (event) => {
330
+ injector.get(ServerTelemetryToken).subscribe('onProxyFailed', (event) => {
356
331
  failedEvent = event;
357
332
  });
358
333
  // Set up proxy to non-existent target
359
- await proxyManager.addProxy({
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(new Injector(), async (injector) => {
372
- const proxyManager = injector.getInstance(ProxyManager);
373
- await expect(proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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
- proxyManager.subscribe('onProxyFailed', (event) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
661
- const proxyManager = injector.getInstance(ProxyManager);
636
+ await usingAsync(createInjector(), async (injector) => {
662
637
  const proxyPort = getPort();
663
- await expect(proxyManager.addProxy({
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(new Injector(), async (injector) => {
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
- proxyManager.subscribe('onProxyFailed', (event) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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
- proxyManager.subscribe('onWebSocketProxyFailed', (event) => {
1150
+ injector.get(ServerTelemetryToken).subscribe('onWebSocketProxyFailed', (event) => {
1176
1151
  failedEvent = event;
1177
1152
  });
1178
- await proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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
- proxyManager.subscribe('onWebSocketProxyFailed', (event) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
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(new Injector(), async (injector) => {
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 proxyManager.addProxy({
1739
+ await useProxy({
1740
+ injector,
1765
1741
  sourceBaseUrl: '/api',
1766
1742
  targetBaseUrl: `http://localhost:${targetPort}`,
1767
1743
  sourcePort: proxyPort,