@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.
Files changed (252) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +47 -28
  3. package/esm/actions/get-current-user.spec.js +10 -6
  4. package/esm/actions/get-current-user.spec.js.map +1 -1
  5. package/esm/actions/index.d.ts +0 -1
  6. package/esm/actions/index.d.ts.map +1 -1
  7. package/esm/actions/index.js +0 -1
  8. package/esm/actions/index.js.map +1 -1
  9. package/esm/actions/is-authenticated.spec.js +10 -6
  10. package/esm/actions/is-authenticated.spec.js.map +1 -1
  11. package/esm/actions/logout-action.spec.js +11 -9
  12. package/esm/actions/logout-action.spec.js.map +1 -1
  13. package/esm/actions/logout.js +1 -1
  14. package/esm/actions/logout.js.map +1 -1
  15. package/esm/actions/password-login-action.js +1 -1
  16. package/esm/actions/password-login-action.js.map +1 -1
  17. package/esm/actions/password-login-action.spec.js +23 -28
  18. package/esm/actions/password-login-action.spec.js.map +1 -1
  19. package/esm/authenticate.js +1 -1
  20. package/esm/authenticate.js.map +1 -1
  21. package/esm/authenticate.spec.js +41 -33
  22. package/esm/authenticate.spec.js.map +1 -1
  23. package/esm/authorize.spec.js +34 -29
  24. package/esm/authorize.spec.js.map +1 -1
  25. package/esm/endpoint-generators/create-delete-endpoint.d.ts +6 -11
  26. package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
  27. package/esm/endpoint-generators/create-delete-endpoint.js +7 -11
  28. package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
  29. package/esm/endpoint-generators/create-delete-endpoint.spec.js +14 -21
  30. package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
  31. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +11 -11
  32. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
  33. package/esm/endpoint-generators/create-get-collection-endpoint.js +13 -12
  34. package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
  35. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +43 -70
  36. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
  37. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +6 -11
  38. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
  39. package/esm/endpoint-generators/create-get-entity-endpoint.js +7 -11
  40. package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
  41. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +16 -33
  42. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
  43. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +1 -15
  44. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -1
  45. package/esm/endpoint-generators/create-get-openapi-document-action.js +1 -24
  46. package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -1
  47. package/esm/endpoint-generators/create-get-schema-action.d.ts +1 -1
  48. package/esm/endpoint-generators/create-get-schema-action.d.ts.map +1 -1
  49. package/esm/endpoint-generators/create-get-schema-action.js.map +1 -1
  50. package/esm/endpoint-generators/create-patch-endpoint.d.ts +7 -13
  51. package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
  52. package/esm/endpoint-generators/create-patch-endpoint.js +8 -13
  53. package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
  54. package/esm/endpoint-generators/create-patch-endpoint.spec.js +10 -17
  55. package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
  56. package/esm/endpoint-generators/create-post-endpoint.d.ts +7 -13
  57. package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
  58. package/esm/endpoint-generators/create-post-endpoint.js +8 -13
  59. package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
  60. package/esm/endpoint-generators/create-post-endpoint.spec.js +41 -14
  61. package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
  62. package/esm/endpoint-generators/utils.d.ts +17 -2
  63. package/esm/endpoint-generators/utils.d.ts.map +1 -1
  64. package/esm/endpoint-generators/utils.js +33 -20
  65. package/esm/endpoint-generators/utils.js.map +1 -1
  66. package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts +0 -2
  67. package/esm/endpoint-generators/with-schema-and-openapi-action.d.ts.map +1 -1
  68. package/esm/get-schema-from-api.d.ts +1 -1
  69. package/esm/get-schema-from-api.d.ts.map +1 -1
  70. package/esm/get-schema-from-api.spec.js.map +1 -1
  71. package/esm/helpers.d.ts +53 -87
  72. package/esm/helpers.d.ts.map +1 -1
  73. package/esm/helpers.js +91 -92
  74. package/esm/helpers.js.map +1 -1
  75. package/esm/helpers.spec.d.ts +2 -1
  76. package/esm/helpers.spec.d.ts.map +1 -1
  77. package/esm/helpers.spec.js +41 -38
  78. package/esm/helpers.spec.js.map +1 -1
  79. package/esm/http-authentication-settings.d.ts +35 -12
  80. package/esm/http-authentication-settings.d.ts.map +1 -1
  81. package/esm/http-authentication-settings.js +21 -29
  82. package/esm/http-authentication-settings.js.map +1 -1
  83. package/esm/http-server-pool.d.ts +64 -0
  84. package/esm/http-server-pool.d.ts.map +1 -0
  85. package/esm/http-server-pool.js +95 -0
  86. package/esm/http-server-pool.js.map +1 -0
  87. package/esm/http-server-pool.spec.d.ts +2 -0
  88. package/esm/http-server-pool.spec.d.ts.map +1 -0
  89. package/esm/http-server-pool.spec.js +193 -0
  90. package/esm/http-server-pool.spec.js.map +1 -0
  91. package/esm/http-user-context.d.ts +31 -44
  92. package/esm/http-user-context.d.ts.map +1 -1
  93. package/esm/http-user-context.js +76 -95
  94. package/esm/http-user-context.js.map +1 -1
  95. package/esm/http-user-context.spec.d.ts +8 -2
  96. package/esm/http-user-context.spec.d.ts.map +1 -1
  97. package/esm/http-user-context.spec.js +189 -337
  98. package/esm/http-user-context.spec.js.map +1 -1
  99. package/esm/index.d.ts +6 -4
  100. package/esm/index.d.ts.map +1 -1
  101. package/esm/index.js +6 -4
  102. package/esm/index.js.map +1 -1
  103. package/esm/login-response-strategy.d.ts +11 -10
  104. package/esm/login-response-strategy.d.ts.map +1 -1
  105. package/esm/login-response-strategy.js +7 -6
  106. package/esm/login-response-strategy.js.map +1 -1
  107. package/esm/login-response-strategy.spec.js +25 -29
  108. package/esm/login-response-strategy.spec.js.map +1 -1
  109. package/esm/openapi/generate-openapi-document.d.ts +0 -8
  110. package/esm/openapi/generate-openapi-document.d.ts.map +1 -1
  111. package/esm/openapi/generate-openapi-document.js +0 -2
  112. package/esm/openapi/generate-openapi-document.js.map +1 -1
  113. package/esm/proxy-manager.spec.js +152 -176
  114. package/esm/proxy-manager.spec.js.map +1 -1
  115. package/esm/proxy-runtime.d.ts +27 -0
  116. package/esm/proxy-runtime.d.ts.map +1 -0
  117. package/esm/proxy-runtime.js +45 -0
  118. package/esm/proxy-runtime.js.map +1 -0
  119. package/esm/proxy-runtime.spec.d.ts +2 -0
  120. package/esm/proxy-runtime.spec.d.ts.map +1 -0
  121. package/esm/proxy-runtime.spec.js +39 -0
  122. package/esm/proxy-runtime.spec.js.map +1 -0
  123. package/esm/rest-api-runtime.d.ts +76 -0
  124. package/esm/rest-api-runtime.d.ts.map +1 -0
  125. package/esm/rest-api-runtime.js +131 -0
  126. package/esm/rest-api-runtime.js.map +1 -0
  127. package/esm/rest-api-runtime.spec.d.ts +2 -0
  128. package/esm/rest-api-runtime.spec.d.ts.map +1 -0
  129. package/esm/rest-api-runtime.spec.js +58 -0
  130. package/esm/rest-api-runtime.spec.js.map +1 -0
  131. package/esm/rest-service.integration.spec.d.ts +1 -1
  132. package/esm/rest-service.integration.spec.d.ts.map +1 -1
  133. package/esm/rest-service.integration.spec.js +60 -82
  134. package/esm/rest-service.integration.spec.js.map +1 -1
  135. package/esm/rest.integration.test.js +26 -84
  136. package/esm/rest.integration.test.js.map +1 -1
  137. package/esm/server-telemetry.d.ts +57 -0
  138. package/esm/server-telemetry.d.ts.map +1 -0
  139. package/esm/server-telemetry.js +26 -0
  140. package/esm/server-telemetry.js.map +1 -0
  141. package/esm/server-telemetry.spec.d.ts +2 -0
  142. package/esm/server-telemetry.spec.d.ts.map +1 -0
  143. package/esm/server-telemetry.spec.js +52 -0
  144. package/esm/server-telemetry.spec.js.map +1 -0
  145. package/esm/static-server-manager.spec.js +60 -125
  146. package/esm/static-server-manager.spec.js.map +1 -1
  147. package/esm/static-site-runtime.d.ts +21 -0
  148. package/esm/static-site-runtime.d.ts.map +1 -0
  149. package/esm/static-site-runtime.js +48 -0
  150. package/esm/static-site-runtime.js.map +1 -0
  151. package/esm/static-site-runtime.spec.d.ts +2 -0
  152. package/esm/static-site-runtime.spec.d.ts.map +1 -0
  153. package/esm/static-site-runtime.spec.js +30 -0
  154. package/esm/static-site-runtime.spec.js.map +1 -0
  155. package/esm/user-store.d.ts +39 -0
  156. package/esm/user-store.d.ts.map +1 -0
  157. package/esm/user-store.js +62 -0
  158. package/esm/user-store.js.map +1 -0
  159. package/esm/user-store.spec.d.ts +2 -0
  160. package/esm/user-store.spec.d.ts.map +1 -0
  161. package/esm/user-store.spec.js +72 -0
  162. package/esm/user-store.spec.js.map +1 -0
  163. package/esm/validate.integration.spec.js +26 -83
  164. package/esm/validate.integration.spec.js.map +1 -1
  165. package/package.json +8 -8
  166. package/src/actions/get-current-user.spec.ts +11 -10
  167. package/src/actions/index.ts +0 -1
  168. package/src/actions/is-authenticated.spec.ts +12 -7
  169. package/src/actions/logout-action.spec.ts +12 -12
  170. package/src/actions/logout.ts +1 -1
  171. package/src/actions/password-login-action.spec.ts +30 -30
  172. package/src/actions/password-login-action.ts +1 -1
  173. package/src/authenticate.spec.ts +45 -51
  174. package/src/authenticate.ts +1 -1
  175. package/src/authorize.spec.ts +37 -39
  176. package/src/endpoint-generators/create-delete-endpoint.spec.ts +16 -24
  177. package/src/endpoint-generators/create-delete-endpoint.ts +11 -17
  178. package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +45 -78
  179. package/src/endpoint-generators/create-get-collection-endpoint.ts +17 -19
  180. package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +17 -33
  181. package/src/endpoint-generators/create-get-entity-endpoint.ts +11 -17
  182. package/src/endpoint-generators/create-get-openapi-document-action.ts +2 -38
  183. package/src/endpoint-generators/create-get-schema-action.ts +1 -1
  184. package/src/endpoint-generators/create-patch-endpoint.spec.ts +11 -18
  185. package/src/endpoint-generators/create-patch-endpoint.ts +12 -23
  186. package/src/endpoint-generators/create-post-endpoint.spec.ts +45 -14
  187. package/src/endpoint-generators/create-post-endpoint.ts +13 -23
  188. package/src/endpoint-generators/utils.ts +36 -28
  189. package/src/endpoint-generators/with-schema-and-openapi-action.ts +0 -3
  190. package/src/get-schema-from-api.spec.ts +1 -1
  191. package/src/get-schema-from-api.ts +1 -1
  192. package/src/helpers.spec.ts +51 -41
  193. package/src/helpers.ts +140 -109
  194. package/src/http-authentication-settings.ts +51 -25
  195. package/src/http-server-pool.spec.ts +220 -0
  196. package/src/http-server-pool.ts +169 -0
  197. package/src/http-user-context.spec.ts +203 -383
  198. package/src/http-user-context.ts +114 -91
  199. package/src/index.ts +6 -4
  200. package/src/login-response-strategy.spec.ts +32 -31
  201. package/src/login-response-strategy.ts +13 -12
  202. package/src/openapi/generate-openapi-document.ts +0 -3
  203. package/src/proxy-manager.spec.ts +152 -182
  204. package/src/proxy-runtime.spec.ts +50 -0
  205. package/src/proxy-runtime.ts +75 -0
  206. package/src/rest-api-runtime.spec.ts +77 -0
  207. package/src/rest-api-runtime.ts +204 -0
  208. package/src/rest-service.integration.spec.ts +68 -87
  209. package/src/rest.integration.test.ts +27 -87
  210. package/src/server-telemetry.spec.ts +56 -0
  211. package/src/server-telemetry.ts +51 -0
  212. package/src/static-server-manager.spec.ts +63 -151
  213. package/src/static-site-runtime.spec.ts +39 -0
  214. package/src/static-site-runtime.ts +75 -0
  215. package/src/user-store.spec.ts +86 -0
  216. package/src/user-store.ts +68 -0
  217. package/src/validate.integration.spec.ts +39 -97
  218. package/esm/actions/login-action.spec.d.ts +0 -2
  219. package/esm/actions/login-action.spec.d.ts.map +0 -1
  220. package/esm/actions/login-action.spec.js +0 -34
  221. package/esm/actions/login-action.spec.js.map +0 -1
  222. package/esm/actions/login.d.ts +0 -19
  223. package/esm/actions/login.d.ts.map +0 -1
  224. package/esm/actions/login.js +0 -27
  225. package/esm/actions/login.js.map +0 -1
  226. package/esm/api-manager.d.ts +0 -104
  227. package/esm/api-manager.d.ts.map +0 -1
  228. package/esm/api-manager.js +0 -180
  229. package/esm/api-manager.js.map +0 -1
  230. package/esm/proxy-manager.d.ts +0 -53
  231. package/esm/proxy-manager.d.ts.map +0 -1
  232. package/esm/proxy-manager.js +0 -84
  233. package/esm/proxy-manager.js.map +0 -1
  234. package/esm/server-manager.d.ts +0 -48
  235. package/esm/server-manager.d.ts.map +0 -1
  236. package/esm/server-manager.js +0 -100
  237. package/esm/server-manager.js.map +0 -1
  238. package/esm/static-server-manager.d.ts +0 -19
  239. package/esm/static-server-manager.d.ts.map +0 -1
  240. package/esm/static-server-manager.js +0 -65
  241. package/esm/static-server-manager.js.map +0 -1
  242. package/esm/swagger/generate-swagger-json.spec.d.ts +0 -2
  243. package/esm/swagger/generate-swagger-json.spec.d.ts.map +0 -1
  244. package/esm/swagger/generate-swagger-json.spec.js +0 -215
  245. package/esm/swagger/generate-swagger-json.spec.js.map +0 -1
  246. package/src/actions/login-action.spec.ts +0 -42
  247. package/src/actions/login.ts +0 -32
  248. package/src/api-manager.ts +0 -308
  249. package/src/proxy-manager.ts +0 -102
  250. package/src/server-manager.ts +0 -135
  251. package/src/static-server-manager.ts +0 -90
  252. package/src/swagger/generate-swagger-json.spec.ts +0 -250
@@ -0,0 +1,131 @@
1
+ import { IdentityContext } from '@furystack/core';
2
+ import { RequestError, deserializeQueryString } from '@furystack/rest';
3
+ import { PathHelper, usingAsync } from '@furystack/utils';
4
+ import { match } from 'path-to-regexp';
5
+ import { ErrorAction } from './actions/error-action.js';
6
+ import { NotFoundAction } from './actions/not-found-action.js';
7
+ import { addCorsHeaders } from './add-cors-header.js';
8
+ import { HttpUserContext } from './http-user-context.js';
9
+ import { readPostBody } from './read-post-body.js';
10
+ import './server-response-extensions.js';
11
+ import { DEFAULT_HOST } from './http-server-pool.js';
12
+ /**
13
+ * Compiles a user-supplied REST API definition into the runtime shape used by
14
+ * {@link onRestApiMessage}. Each method's route map is transformed into an
15
+ * array of `{method, fullPath, matcher, action}` entries. The `root` prefix
16
+ * is prepended to every path.
17
+ */
18
+ export const compileApi = (api, root) => {
19
+ const supportedMethods = Object.keys(api);
20
+ const compiled = {};
21
+ supportedMethods.forEach((method) => {
22
+ compiled[method] = Object.entries(api[method]).map(([path, action]) => {
23
+ const fullPath = `/${PathHelper.normalize(PathHelper.joinPaths(root, path))}`;
24
+ const matcher = match(fullPath, { decode: decodeURIComponent });
25
+ return { method, fullPath, matcher, action: action };
26
+ });
27
+ });
28
+ return compiled;
29
+ };
30
+ /**
31
+ * Quick eligibility check executed by the server pool before invoking a
32
+ * {@link ServerApi.onRequest}. Avoids the cost of URL parsing and CORS header
33
+ * handling for requests this API clearly does not own.
34
+ */
35
+ export const shouldExecRequest = (options) => {
36
+ if (!options.method || !options.url) {
37
+ return false;
38
+ }
39
+ if (!options.supportedMethods.includes(options.method) && options.method !== 'OPTIONS') {
40
+ return false;
41
+ }
42
+ return PathHelper.matchesBaseUrl(options.url, options.rootApiPath);
43
+ };
44
+ const getActionFromEndpoint = (compiledApi, fullUrl, method) => {
45
+ let resolvedParams;
46
+ const action = compiledApi[method]?.find((route) => {
47
+ const result = route.matcher(fullUrl.pathname);
48
+ if (result) {
49
+ resolvedParams = result.params;
50
+ }
51
+ return result;
52
+ });
53
+ return (action && {
54
+ ...action,
55
+ params: resolvedParams,
56
+ });
57
+ };
58
+ const executeAction = async (options) => {
59
+ const { injector, req, res, fullUrl, action, deserializeQueryParams, params } = options;
60
+ await usingAsync(injector.createScope({ owner: action }), async (scope) => {
61
+ const httpUserContext = scope.get(HttpUserContext);
62
+ scope.bind(IdentityContext, () => ({
63
+ getCurrentUser: () => httpUserContext.getCurrentUser(req),
64
+ isAuthorized: (...roles) => httpUserContext.isAuthorized(req, ...roles),
65
+ isAuthenticated: () => httpUserContext.isAuthenticated(req),
66
+ }));
67
+ try {
68
+ const actionResult = await action({
69
+ request: req,
70
+ response: res,
71
+ injector: scope,
72
+ getBody: () => readPostBody(req),
73
+ headers: req.headers,
74
+ getQuery: () => deserializeQueryParams ? deserializeQueryParams(fullUrl.search) : deserializeQueryString(fullUrl.search),
75
+ getUrlParams: () => params,
76
+ });
77
+ res.sendActionResult(actionResult);
78
+ }
79
+ catch (error) {
80
+ const errorActionResult = await ErrorAction({
81
+ request: req,
82
+ response: res,
83
+ injector: scope,
84
+ getBody: async () => error,
85
+ });
86
+ res.sendActionResult(errorActionResult);
87
+ }
88
+ });
89
+ };
90
+ /**
91
+ * Handles a single incoming HTTP request matched by a REST API's
92
+ * {@link ServerApi.shouldExec}. Normalises the URL, applies CORS headers,
93
+ * short-circuits `OPTIONS` preflights and dispatches to the compiled action.
94
+ *
95
+ * Moved out of the deleted `ApiManager.onMessage` verbatim; behaviour is
96
+ * unchanged apart from injector resolution (`get` instead of `getInstance`).
97
+ */
98
+ export const onRestApiMessage = async (options) => {
99
+ const protocol = 'http://';
100
+ const host = `${options.hostName ?? DEFAULT_HOST}:${options.port}`;
101
+ const fullUrl = new URL(PathHelper.joinUrl(`${protocol}${host}`, options.req.url));
102
+ if (options.cors) {
103
+ addCorsHeaders(options.cors, options.req, options.res);
104
+ }
105
+ if (options.req.method === 'OPTIONS') {
106
+ options.res.writeHead(200);
107
+ options.res.end();
108
+ return;
109
+ }
110
+ let action;
111
+ try {
112
+ action = getActionFromEndpoint(options.compiledApi, fullUrl, options.req.method?.toUpperCase());
113
+ }
114
+ catch (error) {
115
+ const responseError = error instanceof URIError ? new RequestError('Failed to decode URL path parameter', 400) : error;
116
+ const errorActionResult = await ErrorAction({
117
+ request: options.req,
118
+ response: options.res,
119
+ injector: options.injector,
120
+ getBody: async () => responseError,
121
+ });
122
+ options.res.sendActionResult(errorActionResult);
123
+ return;
124
+ }
125
+ if (action) {
126
+ await executeAction({ ...options, ...action, fullUrl });
127
+ return;
128
+ }
129
+ options.res.sendActionResult(await NotFoundAction({ injector: options.injector, request: options.req, response: options.res }));
130
+ };
131
+ //# sourceMappingURL=rest-api-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-runtime.js","sourceRoot":"","sources":["../src/rest-api-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,iBAAiB,CAAA;AAG5D,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AA6CpD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAoB,GAA6B,EAAE,IAAY,EAAe,EAAE;IACxG,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAa,CAAA;IACrD,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAClC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YACxF,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAA;YAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAA4B,EAAE,CAAA;QAC5E,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAKjC,EAAW,EAAE;IACZ,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;AACpE,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,WAAwB,EAAE,OAAY,EAAE,MAAc,EAAE,EAAE;IACvF,IAAI,cAAuB,CAAA;IAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,cAAc,GAAG,MAAM,CAAC,MAAM,CAAA;QAChC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;IACF,OAAO,CACL,MAAM,IAAI;QACR,GAAG,MAAM;QACT,MAAM,EAAE,cAAc;KACvB,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,KAAK,EACzB,OAIC,EACc,EAAE;IACjB,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IACvF,MAAM,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACxE,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;YACjC,cAAc,EAAE,GAAuB,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,CAAmB;YAC/F,YAAY,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACvE,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC;SAC5D,CAAC,CAAC,CAAA;QACH,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC;gBAChC,OAAO,EAAE,GAAG;gBACZ,QAAQ,EAAE,GAAG;gBACb,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAQ,GAAG,CAAC;gBACvC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,QAAQ,EAAE,GAAG,EAAE,CACb,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC1G,YAAY,EAAE,GAAG,EAAE,CAAC,MAAgB;aACrC,CAAC,CAAA;YACF,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC;gBAC1C,OAAO,EAAE,GAAG;gBACZ,QAAQ,EAAE,GAAG;gBACb,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;aAC3B,CAAC,CAAA;YACF,GAAG,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAA;QACzC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAgC,EAAiB,EAAE;IACxF,MAAM,QAAQ,GAAG,SAAS,CAAA;IAC1B,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,CAAA;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC,CAAA;IAE5F,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QACjB,OAAM;IACR,CAAC;IAED,IAAI,MAAgD,CAAA;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAY,CAAC,CAAA;IAC3G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,aAAa,GACjB,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,KAAe,CAAA;QAC7G,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC;YAC1C,OAAO,EAAE,OAAO,CAAC,GAAG;YACpB,QAAQ,EAAE,OAAO,CAAC,GAAG;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,aAAa;SACnC,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAA;QAC/C,OAAM;IACR,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QACvD,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAC1B,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAClG,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rest-api-runtime.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-runtime.spec.d.ts","sourceRoot":"","sources":["../src/rest-api-runtime.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { JsonResult } from './request-action-implementation.js';
3
+ import { compileApi, shouldExecRequest } from './rest-api-runtime.js';
4
+ const buildImplementation = () => ({
5
+ GET: {
6
+ '/items': async () => JsonResult({ items: [1, 2, 3] }),
7
+ '/items/:id': async ({ getUrlParams }) => JsonResult({ id: getUrlParams().id }),
8
+ },
9
+ POST: {
10
+ '/items': async ({ getBody }) => JsonResult(await getBody()),
11
+ },
12
+ });
13
+ describe('rest-api-runtime', () => {
14
+ describe('compileApi', () => {
15
+ it('normalises paths, prefixes the root, and preserves method→route ordering', () => {
16
+ const compiled = compileApi(buildImplementation(), '/api');
17
+ expect(Object.keys(compiled)).toEqual(['GET', 'POST']);
18
+ const getRoutes = compiled.GET;
19
+ expect(getRoutes).toHaveLength(2);
20
+ expect(getRoutes[0].method).toBe('GET');
21
+ expect(getRoutes[0].fullPath).toBe('/api/items');
22
+ expect(getRoutes[1].fullPath).toBe('/api/items/:id');
23
+ });
24
+ it('produces matchers that extract url params', () => {
25
+ const compiled = compileApi(buildImplementation(), '/api');
26
+ const itemById = compiled.GET.find((r) => r.fullPath === '/api/items/:id');
27
+ const result = itemById.matcher('/api/items/42');
28
+ expect(result && result.params).toEqual({ id: '42' });
29
+ });
30
+ it('returns false from matchers when the path does not match', () => {
31
+ const compiled = compileApi(buildImplementation(), '/api');
32
+ const itemByIdMatcher = compiled.GET.find((r) => r.fullPath === '/api/items/:id').matcher;
33
+ expect(itemByIdMatcher('/api/items')).toBe(false);
34
+ expect(itemByIdMatcher('/other')).toBe(false);
35
+ });
36
+ });
37
+ describe('shouldExecRequest', () => {
38
+ const supportedMethods = ['GET', 'POST'];
39
+ const rootApiPath = '/api';
40
+ it('accepts supported methods whose URL starts with the root api path', () => {
41
+ expect(shouldExecRequest({ method: 'GET', url: '/api/items', rootApiPath, supportedMethods })).toBe(true);
42
+ });
43
+ it('accepts OPTIONS (preflight) even when it is not explicitly in supportedMethods', () => {
44
+ expect(shouldExecRequest({ method: 'OPTIONS', url: '/api/items', rootApiPath, supportedMethods })).toBe(true);
45
+ });
46
+ it('rejects unsupported methods', () => {
47
+ expect(shouldExecRequest({ method: 'DELETE', url: '/api/items', rootApiPath, supportedMethods })).toBe(false);
48
+ });
49
+ it('rejects URLs that do not match the root api path', () => {
50
+ expect(shouldExecRequest({ method: 'GET', url: '/other/items', rootApiPath, supportedMethods })).toBe(false);
51
+ });
52
+ it('rejects requests missing method or url', () => {
53
+ expect(shouldExecRequest({ method: undefined, url: '/api/items', rootApiPath, supportedMethods })).toBe(false);
54
+ expect(shouldExecRequest({ method: 'GET', url: undefined, rootApiPath, supportedMethods })).toBe(false);
55
+ });
56
+ });
57
+ });
58
+ //# sourceMappingURL=rest-api-runtime.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-api-runtime.spec.js","sourceRoot":"","sources":["../src/rest-api-runtime.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import './helpers.js';
1
+ export {};
2
2
  //# sourceMappingURL=rest-service.integration.spec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rest-service.integration.spec.d.ts","sourceRoot":"","sources":["../src/rest-service.integration.spec.ts"],"names":[],"mappings":"AASA,OAAO,cAAc,CAAA"}
1
+ {"version":3,"file":"rest-service.integration.spec.d.ts","sourceRoot":"","sources":["../src/rest-service.integration.spec.ts"],"names":[],"mappings":""}
@@ -1,24 +1,27 @@
1
- import { InMemoryStore, User, addStore } from '@furystack/core';
1
+ import { InMemoryStore, User as UserModel } from '@furystack/core';
2
2
  import { getPort } from '@furystack/core/port-generator';
3
- import { Injector } from '@furystack/inject';
4
- import { getRepository } from '@furystack/repository';
3
+ import { createInjector } from '@furystack/inject';
5
4
  import { serializeValue } from '@furystack/rest';
5
+ import { PasswordCredential, PasswordCredentialStore, PasswordResetToken, PasswordResetTokenStore, usePasswordPolicy, } from '@furystack/security';
6
6
  import { PathHelper, usingAsync } from '@furystack/utils';
7
7
  import { describe, expect, it, vi } from 'vitest';
8
- import { GetCurrentUser, IsAuthenticated, LoginAction, LogoutAction } from './actions/index.js';
9
- import './helpers.js';
8
+ import { GetCurrentUser, IsAuthenticated, LogoutAction, createPasswordLoginAction } from './actions/index.js';
10
9
  import { useHttpAuthentication, useRestService } from './helpers.js';
10
+ import { HttpServerPoolToken } from './http-server-pool.js';
11
+ import { createCookieLoginStrategy } from './login-response-strategy.js';
11
12
  import { DefaultSession } from './models/default-session.js';
12
- import { ServerManager } from './server-manager.js';
13
13
  import { JsonResult } from './request-action-implementation.js';
14
+ import { ServerTelemetryToken } from './server-telemetry.js';
15
+ import { SessionStore, UserStore } from './user-store.js';
14
16
  const createIntegrationApi = async () => {
15
- const i = new Injector();
17
+ const i = createInjector();
16
18
  const port = getPort();
17
19
  const root = 'test-api';
18
- addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }));
19
- const repo = getRepository(i);
20
- repo.createDataSet(User, 'username');
21
- repo.createDataSet(DefaultSession, 'sessionId');
20
+ i.bind(UserStore, () => new InMemoryStore({ model: UserModel, primaryKey: 'username' }));
21
+ i.bind(SessionStore, () => new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }));
22
+ i.bind(PasswordCredentialStore, () => new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }));
23
+ i.bind(PasswordResetTokenStore, () => new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
24
+ usePasswordPolicy(i);
22
25
  useHttpAuthentication(i);
23
26
  await useRestService({
24
27
  injector: i,
@@ -37,7 +40,7 @@ const createIntegrationApi = async () => {
37
40
  '/testUrlParams/:urlParam': async (options) => JsonResult({ urlParamValue: options.getUrlParams().urlParam }),
38
41
  },
39
42
  POST: {
40
- '/login': LoginAction,
43
+ '/login': createPasswordLoginAction(createCookieLoginStrategy(i)),
41
44
  '/logout': LogoutAction,
42
45
  '/testPostBody': async (options) => {
43
46
  const body = await options.getBody();
@@ -50,34 +53,24 @@ const createIntegrationApi = async () => {
50
53
  return {
51
54
  apiUrl: `http://127.0.0.1:${port}/${root}`,
52
55
  port,
56
+ injector: i,
53
57
  [Symbol.asyncDispose]: i[Symbol.asyncDispose].bind(i),
54
58
  };
55
59
  };
56
- describe('@furystack/rest-service inregration tests', () => {
57
- it('Should be started and disposed', async () => {
60
+ describe('@furystack/rest-service integration tests', () => {
61
+ it('starts and disposes cleanly', async () => {
58
62
  await usingAsync(await createIntegrationApi(), async () => { });
59
63
  });
60
- it('Should respond with 404 when a route is not found', async () => {
64
+ it('responds 404 for unknown routes', async () => {
61
65
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
62
- const result = await fetch(PathHelper.joinPaths(apiUrl, 'some-route-that-does-not-exists'), {
63
- method: 'GET',
64
- });
66
+ const result = await fetch(PathHelper.joinPaths(apiUrl, 'some-route-that-does-not-exist'));
65
67
  expect(result.ok).toBe(false);
66
68
  expect(result.status).toBe(404);
67
69
  const response = (await result.json());
68
70
  expect(response).toEqual({ error: 'Content not found' });
69
71
  });
70
72
  });
71
- it('Should respond with 401 for unauthorized request errors', async () => {
72
- await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
73
- const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'));
74
- expect(result.ok).toBe(false);
75
- expect(result.status).toBe(401);
76
- const response = (await result.json());
77
- expect(response).toEqual({ error: 'unauthorized' });
78
- });
79
- });
80
- it('Should respond with 401 for unauthorized request errors', async () => {
73
+ it('responds 401 for authenticated routes hit anonymously', async () => {
81
74
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
82
75
  const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'));
83
76
  expect(result.ok).toBe(false);
@@ -86,7 +79,7 @@ describe('@furystack/rest-service inregration tests', () => {
86
79
  expect(response).toEqual({ error: 'unauthorized' });
87
80
  });
88
81
  });
89
- it('Should respond with the correct result body', async () => {
82
+ it('returns JSON bodies from async actions', async () => {
90
83
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
91
84
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'isAuthenticated'));
92
85
  expect(response.status).toBe(200);
@@ -94,16 +87,15 @@ describe('@furystack/rest-service inregration tests', () => {
94
87
  expect(result).toEqual({ isAuthenticated: false });
95
88
  });
96
89
  });
97
- it('Should be able to read query parameters', async () => {
90
+ it('deserialises query parameters', async () => {
98
91
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
99
- console.log('apiUrl', apiUrl);
100
92
  const response = await fetch(PathHelper.joinPaths(apiUrl, `testQuery?param1=${serializeValue('foo')}`));
101
93
  expect(response.status).toBe(200);
102
94
  const result = (await response.json());
103
95
  expect(result).toEqual({ param1Value: 'foo' });
104
96
  });
105
97
  });
106
- it('Should be able to read url parameters', async () => {
98
+ it('extracts url parameters', async () => {
107
99
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
108
100
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testUrlParams/bar'));
109
101
  expect(response.status).toBe(200);
@@ -111,7 +103,7 @@ describe('@furystack/rest-service inregration tests', () => {
111
103
  expect(result).toEqual({ urlParamValue: 'bar' });
112
104
  });
113
105
  });
114
- it('Should be able to read post body', async () => {
106
+ it('reads the POST body once and memoises subsequent reads', async () => {
115
107
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
116
108
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
117
109
  method: 'POST',
@@ -122,23 +114,18 @@ describe('@furystack/rest-service inregration tests', () => {
122
114
  expect(result).toEqual({ bodyValue: 'baz', body2Value: 'baz' });
123
115
  });
124
116
  });
125
- it('Should respond with OK to OPTIONS requests', async () => {
117
+ it('responds 200 to OPTIONS preflight requests', async () => {
126
118
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
127
- const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
128
- method: 'OPTIONS',
129
- }).catch((e) => {
130
- console.log(e);
131
- throw e;
132
- });
119
+ const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), { method: 'OPTIONS' });
133
120
  expect(response.status).toBe(200);
134
121
  });
135
122
  });
136
- it('Should reject requests outside of the API Root', async () => {
123
+ it('rejects requests outside the API root with a dropped socket', async () => {
137
124
  await usingAsync(await createIntegrationApi(), async ({ port }) => {
138
125
  await expect(fetch(PathHelper.joinPaths(`http://127.0.0.1:${port}`, 'not-my-api-root'))).rejects.toThrowError('fetch failed');
139
126
  });
140
127
  });
141
- it('Should respond with 400 for malformed query parameter values', async () => {
128
+ it('responds 400 for malformed query-parameter values', async () => {
142
129
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
143
130
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testQuery?param1=not-valid-base64!!!'));
144
131
  expect(response.status).toBe(400);
@@ -146,7 +133,7 @@ describe('@furystack/rest-service inregration tests', () => {
146
133
  expect(result.message).toBe('Failed to decode query parameter value');
147
134
  });
148
135
  });
149
- it('Should respond with 400 for malformed percent-encoded path parameters', async () => {
136
+ it('responds 400 for malformed percent-encoded path parameters', async () => {
150
137
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
151
138
  const response = await fetch(`${apiUrl}/testUrlParams/%E0%A4%A`);
152
139
  expect(response.status).toBe(400);
@@ -155,56 +142,47 @@ describe('@furystack/rest-service inregration tests', () => {
155
142
  });
156
143
  });
157
144
  });
158
- describe('ServerManager events', () => {
159
- it('Should emit onServerListening when a server is created', async () => {
160
- await usingAsync(new Injector(), async (i) => {
161
- const serverManager = i.getInstance(ServerManager);
145
+ describe('HttpServerPool telemetry', () => {
146
+ it('emits onServerListening with the url / port / host for newly-opened servers', async () => {
147
+ await usingAsync(createInjector(), async (i) => {
148
+ const telemetry = i.get(ServerTelemetryToken);
162
149
  const handler = vi.fn();
163
- serverManager.addListener('onServerListening', handler);
150
+ telemetry.addListener('onServerListening', handler);
164
151
  const port = getPort();
165
- await serverManager.getOrCreate({ port });
152
+ await i.get(HttpServerPoolToken).acquire({ port });
166
153
  expect(handler).toHaveBeenCalledTimes(1);
167
- expect(handler).toHaveBeenCalledWith({
168
- url: `http://localhost:${port}`,
169
- port,
170
- hostName: undefined,
171
- });
154
+ expect(handler).toHaveBeenCalledWith({ url: `http://localhost:${port}`, port, hostName: undefined });
172
155
  });
173
156
  });
174
- it('Should emit onServerListening with hostName when provided', async () => {
175
- await usingAsync(new Injector(), async (i) => {
176
- const serverManager = i.getInstance(ServerManager);
157
+ it('forwards the configured host name into the emitted event', async () => {
158
+ await usingAsync(createInjector(), async (i) => {
159
+ const telemetry = i.get(ServerTelemetryToken);
177
160
  const handler = vi.fn();
178
- serverManager.addListener('onServerListening', handler);
161
+ telemetry.addListener('onServerListening', handler);
179
162
  const port = getPort();
180
- await serverManager.getOrCreate({ port, hostName: '127.0.0.1' });
181
- expect(handler).toHaveBeenCalledWith({
182
- url: `http://127.0.0.1:${port}`,
183
- port,
184
- hostName: '127.0.0.1',
185
- });
186
- });
187
- });
188
- it('Should emit onServerClosed when the server manager is disposed', async () => {
189
- await usingAsync(new Injector(), async (i) => {
190
- const serverManager = i.getInstance(ServerManager);
191
- const handler = vi.fn();
192
- serverManager.addListener('onServerClosed', handler);
193
- const port = getPort();
194
- await serverManager.getOrCreate({ port });
195
- await serverManager[Symbol.asyncDispose]();
196
- expect(handler).toHaveBeenCalledTimes(1);
197
- expect(handler).toHaveBeenCalledWith({ url: `http://localhost:${port}` });
163
+ await i.get(HttpServerPoolToken).acquire({ port, hostName: '127.0.0.1' });
164
+ expect(handler).toHaveBeenCalledWith({ url: `http://127.0.0.1:${port}`, port, hostName: '127.0.0.1' });
198
165
  });
199
166
  });
200
- it('Should not emit onServerListening for an existing server', async () => {
201
- await usingAsync(new Injector(), async (i) => {
202
- const serverManager = i.getInstance(ServerManager);
167
+ it('emits onServerClosed when the pool is disposed', async () => {
168
+ const i = createInjector();
169
+ const telemetry = i.get(ServerTelemetryToken);
170
+ const handler = vi.fn();
171
+ telemetry.addListener('onServerClosed', handler);
172
+ const port = getPort();
173
+ await i.get(HttpServerPoolToken).acquire({ port });
174
+ await i[Symbol.asyncDispose]();
175
+ expect(handler).toHaveBeenCalledTimes(1);
176
+ expect(handler).toHaveBeenCalledWith({ url: `http://localhost:${port}` });
177
+ });
178
+ it('does not emit onServerListening a second time for the same url', async () => {
179
+ await usingAsync(createInjector(), async (i) => {
203
180
  const port = getPort();
204
- await serverManager.getOrCreate({ port });
181
+ await i.get(HttpServerPoolToken).acquire({ port });
182
+ const telemetry = i.get(ServerTelemetryToken);
205
183
  const handler = vi.fn();
206
- serverManager.addListener('onServerListening', handler);
207
- await serverManager.getOrCreate({ port });
184
+ telemetry.addListener('onServerListening', handler);
185
+ await i.get(HttpServerPoolToken).acquire({ port });
208
186
  expect(handler).not.toHaveBeenCalled();
209
187
  });
210
188
  });
@@ -1 +1 @@
1
- {"version":3,"file":"rest-service.integration.spec.js","sourceRoot":"","sources":["../src/rest-service.integration.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rest-service.integration.spec.js","sourceRoot":"","sources":["../src/rest-service.integration.spec.ts"],"names":[],"mappings":"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"}