@furystack/rest-service 13.0.0 → 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 (224) hide show
  1. package/CHANGELOG.md +17 -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/is-authenticated.spec.js +10 -6
  6. package/esm/actions/is-authenticated.spec.js.map +1 -1
  7. package/esm/actions/logout-action.spec.js +11 -9
  8. package/esm/actions/logout-action.spec.js.map +1 -1
  9. package/esm/actions/logout.js +1 -1
  10. package/esm/actions/logout.js.map +1 -1
  11. package/esm/actions/password-login-action.js +1 -1
  12. package/esm/actions/password-login-action.js.map +1 -1
  13. package/esm/actions/password-login-action.spec.js +23 -28
  14. package/esm/actions/password-login-action.spec.js.map +1 -1
  15. package/esm/authenticate.js +1 -1
  16. package/esm/authenticate.js.map +1 -1
  17. package/esm/authenticate.spec.js +41 -33
  18. package/esm/authenticate.spec.js.map +1 -1
  19. package/esm/authorize.spec.js +34 -29
  20. package/esm/authorize.spec.js.map +1 -1
  21. package/esm/endpoint-generators/create-delete-endpoint.d.ts +6 -11
  22. package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
  23. package/esm/endpoint-generators/create-delete-endpoint.js +7 -11
  24. package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
  25. package/esm/endpoint-generators/create-delete-endpoint.spec.js +14 -21
  26. package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
  27. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +11 -11
  28. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
  29. package/esm/endpoint-generators/create-get-collection-endpoint.js +13 -12
  30. package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
  31. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +43 -70
  32. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
  33. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +6 -11
  34. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
  35. package/esm/endpoint-generators/create-get-entity-endpoint.js +7 -11
  36. package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
  37. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +16 -33
  38. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
  39. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts +1 -1
  40. package/esm/endpoint-generators/create-get-openapi-document-action.d.ts.map +1 -1
  41. package/esm/endpoint-generators/create-get-openapi-document-action.js +1 -1
  42. package/esm/endpoint-generators/create-get-openapi-document-action.js.map +1 -1
  43. package/esm/endpoint-generators/create-get-schema-action.d.ts +1 -1
  44. package/esm/endpoint-generators/create-get-schema-action.d.ts.map +1 -1
  45. package/esm/endpoint-generators/create-get-schema-action.js.map +1 -1
  46. package/esm/endpoint-generators/create-patch-endpoint.d.ts +7 -13
  47. package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
  48. package/esm/endpoint-generators/create-patch-endpoint.js +8 -13
  49. package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
  50. package/esm/endpoint-generators/create-patch-endpoint.spec.js +10 -17
  51. package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
  52. package/esm/endpoint-generators/create-post-endpoint.d.ts +7 -13
  53. package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
  54. package/esm/endpoint-generators/create-post-endpoint.js +8 -13
  55. package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
  56. package/esm/endpoint-generators/create-post-endpoint.spec.js +41 -14
  57. package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
  58. package/esm/endpoint-generators/utils.d.ts +17 -2
  59. package/esm/endpoint-generators/utils.d.ts.map +1 -1
  60. package/esm/endpoint-generators/utils.js +33 -20
  61. package/esm/endpoint-generators/utils.js.map +1 -1
  62. package/esm/get-schema-from-api.d.ts +1 -1
  63. package/esm/get-schema-from-api.d.ts.map +1 -1
  64. package/esm/get-schema-from-api.spec.js.map +1 -1
  65. package/esm/helpers.d.ts +53 -87
  66. package/esm/helpers.d.ts.map +1 -1
  67. package/esm/helpers.js +91 -92
  68. package/esm/helpers.js.map +1 -1
  69. package/esm/helpers.spec.d.ts +2 -1
  70. package/esm/helpers.spec.d.ts.map +1 -1
  71. package/esm/helpers.spec.js +41 -38
  72. package/esm/helpers.spec.js.map +1 -1
  73. package/esm/http-authentication-settings.d.ts +35 -12
  74. package/esm/http-authentication-settings.d.ts.map +1 -1
  75. package/esm/http-authentication-settings.js +21 -29
  76. package/esm/http-authentication-settings.js.map +1 -1
  77. package/esm/http-server-pool.d.ts +64 -0
  78. package/esm/http-server-pool.d.ts.map +1 -0
  79. package/esm/http-server-pool.js +95 -0
  80. package/esm/http-server-pool.js.map +1 -0
  81. package/esm/http-server-pool.spec.d.ts +2 -0
  82. package/esm/http-server-pool.spec.d.ts.map +1 -0
  83. package/esm/http-server-pool.spec.js +193 -0
  84. package/esm/http-server-pool.spec.js.map +1 -0
  85. package/esm/http-user-context.d.ts +31 -44
  86. package/esm/http-user-context.d.ts.map +1 -1
  87. package/esm/http-user-context.js +76 -95
  88. package/esm/http-user-context.js.map +1 -1
  89. package/esm/http-user-context.spec.d.ts +8 -2
  90. package/esm/http-user-context.spec.d.ts.map +1 -1
  91. package/esm/http-user-context.spec.js +189 -337
  92. package/esm/http-user-context.spec.js.map +1 -1
  93. package/esm/index.d.ts +6 -4
  94. package/esm/index.d.ts.map +1 -1
  95. package/esm/index.js +6 -4
  96. package/esm/index.js.map +1 -1
  97. package/esm/login-response-strategy.d.ts +11 -10
  98. package/esm/login-response-strategy.d.ts.map +1 -1
  99. package/esm/login-response-strategy.js +7 -6
  100. package/esm/login-response-strategy.js.map +1 -1
  101. package/esm/login-response-strategy.spec.js +25 -29
  102. package/esm/login-response-strategy.spec.js.map +1 -1
  103. package/esm/proxy-manager.spec.js +152 -176
  104. package/esm/proxy-manager.spec.js.map +1 -1
  105. package/esm/proxy-runtime.d.ts +27 -0
  106. package/esm/proxy-runtime.d.ts.map +1 -0
  107. package/esm/proxy-runtime.js +45 -0
  108. package/esm/proxy-runtime.js.map +1 -0
  109. package/esm/proxy-runtime.spec.d.ts +2 -0
  110. package/esm/proxy-runtime.spec.d.ts.map +1 -0
  111. package/esm/proxy-runtime.spec.js +39 -0
  112. package/esm/proxy-runtime.spec.js.map +1 -0
  113. package/esm/rest-api-runtime.d.ts +76 -0
  114. package/esm/rest-api-runtime.d.ts.map +1 -0
  115. package/esm/rest-api-runtime.js +131 -0
  116. package/esm/rest-api-runtime.js.map +1 -0
  117. package/esm/rest-api-runtime.spec.d.ts +2 -0
  118. package/esm/rest-api-runtime.spec.d.ts.map +1 -0
  119. package/esm/rest-api-runtime.spec.js +58 -0
  120. package/esm/rest-api-runtime.spec.js.map +1 -0
  121. package/esm/rest-service.integration.spec.d.ts +1 -1
  122. package/esm/rest-service.integration.spec.d.ts.map +1 -1
  123. package/esm/rest-service.integration.spec.js +57 -80
  124. package/esm/rest-service.integration.spec.js.map +1 -1
  125. package/esm/rest.integration.test.js +26 -84
  126. package/esm/rest.integration.test.js.map +1 -1
  127. package/esm/server-telemetry.d.ts +57 -0
  128. package/esm/server-telemetry.d.ts.map +1 -0
  129. package/esm/server-telemetry.js +26 -0
  130. package/esm/server-telemetry.js.map +1 -0
  131. package/esm/server-telemetry.spec.d.ts +2 -0
  132. package/esm/server-telemetry.spec.d.ts.map +1 -0
  133. package/esm/server-telemetry.spec.js +52 -0
  134. package/esm/server-telemetry.spec.js.map +1 -0
  135. package/esm/static-server-manager.spec.js +60 -125
  136. package/esm/static-server-manager.spec.js.map +1 -1
  137. package/esm/static-site-runtime.d.ts +21 -0
  138. package/esm/static-site-runtime.d.ts.map +1 -0
  139. package/esm/static-site-runtime.js +48 -0
  140. package/esm/static-site-runtime.js.map +1 -0
  141. package/esm/static-site-runtime.spec.d.ts +2 -0
  142. package/esm/static-site-runtime.spec.d.ts.map +1 -0
  143. package/esm/static-site-runtime.spec.js +30 -0
  144. package/esm/static-site-runtime.spec.js.map +1 -0
  145. package/esm/user-store.d.ts +39 -0
  146. package/esm/user-store.d.ts.map +1 -0
  147. package/esm/user-store.js +62 -0
  148. package/esm/user-store.js.map +1 -0
  149. package/esm/user-store.spec.d.ts +2 -0
  150. package/esm/user-store.spec.d.ts.map +1 -0
  151. package/esm/user-store.spec.js +72 -0
  152. package/esm/user-store.spec.js.map +1 -0
  153. package/esm/validate.integration.spec.js +26 -28
  154. package/esm/validate.integration.spec.js.map +1 -1
  155. package/package.json +8 -8
  156. package/src/actions/get-current-user.spec.ts +11 -10
  157. package/src/actions/is-authenticated.spec.ts +12 -7
  158. package/src/actions/logout-action.spec.ts +12 -12
  159. package/src/actions/logout.ts +1 -1
  160. package/src/actions/password-login-action.spec.ts +30 -30
  161. package/src/actions/password-login-action.ts +1 -1
  162. package/src/authenticate.spec.ts +45 -51
  163. package/src/authenticate.ts +1 -1
  164. package/src/authorize.spec.ts +37 -39
  165. package/src/endpoint-generators/create-delete-endpoint.spec.ts +16 -24
  166. package/src/endpoint-generators/create-delete-endpoint.ts +11 -17
  167. package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +45 -78
  168. package/src/endpoint-generators/create-get-collection-endpoint.ts +17 -19
  169. package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +17 -33
  170. package/src/endpoint-generators/create-get-entity-endpoint.ts +11 -17
  171. package/src/endpoint-generators/create-get-openapi-document-action.ts +2 -2
  172. package/src/endpoint-generators/create-get-schema-action.ts +1 -1
  173. package/src/endpoint-generators/create-patch-endpoint.spec.ts +11 -18
  174. package/src/endpoint-generators/create-patch-endpoint.ts +12 -23
  175. package/src/endpoint-generators/create-post-endpoint.spec.ts +45 -14
  176. package/src/endpoint-generators/create-post-endpoint.ts +13 -23
  177. package/src/endpoint-generators/utils.ts +36 -28
  178. package/src/get-schema-from-api.spec.ts +1 -1
  179. package/src/get-schema-from-api.ts +1 -1
  180. package/src/helpers.spec.ts +51 -41
  181. package/src/helpers.ts +140 -109
  182. package/src/http-authentication-settings.ts +51 -25
  183. package/src/http-server-pool.spec.ts +220 -0
  184. package/src/http-server-pool.ts +169 -0
  185. package/src/http-user-context.spec.ts +203 -383
  186. package/src/http-user-context.ts +114 -91
  187. package/src/index.ts +6 -4
  188. package/src/login-response-strategy.spec.ts +32 -31
  189. package/src/login-response-strategy.ts +13 -12
  190. package/src/proxy-manager.spec.ts +152 -182
  191. package/src/proxy-runtime.spec.ts +50 -0
  192. package/src/proxy-runtime.ts +75 -0
  193. package/src/rest-api-runtime.spec.ts +77 -0
  194. package/src/rest-api-runtime.ts +204 -0
  195. package/src/rest-service.integration.spec.ts +65 -85
  196. package/src/rest.integration.test.ts +27 -87
  197. package/src/server-telemetry.spec.ts +56 -0
  198. package/src/server-telemetry.ts +51 -0
  199. package/src/static-server-manager.spec.ts +63 -151
  200. package/src/static-site-runtime.spec.ts +39 -0
  201. package/src/static-site-runtime.ts +75 -0
  202. package/src/user-store.spec.ts +86 -0
  203. package/src/user-store.ts +68 -0
  204. package/src/validate.integration.spec.ts +39 -35
  205. package/esm/api-manager.d.ts +0 -104
  206. package/esm/api-manager.d.ts.map +0 -1
  207. package/esm/api-manager.js +0 -179
  208. package/esm/api-manager.js.map +0 -1
  209. package/esm/proxy-manager.d.ts +0 -53
  210. package/esm/proxy-manager.d.ts.map +0 -1
  211. package/esm/proxy-manager.js +0 -84
  212. package/esm/proxy-manager.js.map +0 -1
  213. package/esm/server-manager.d.ts +0 -48
  214. package/esm/server-manager.d.ts.map +0 -1
  215. package/esm/server-manager.js +0 -100
  216. package/esm/server-manager.js.map +0 -1
  217. package/esm/static-server-manager.d.ts +0 -19
  218. package/esm/static-server-manager.d.ts.map +0 -1
  219. package/esm/static-server-manager.js +0 -65
  220. package/esm/static-server-manager.js.map +0 -1
  221. package/src/api-manager.ts +0 -304
  222. package/src/proxy-manager.ts +0 -102
  223. package/src/server-manager.ts +0 -135
  224. package/src/static-server-manager.ts +0 -90
@@ -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":"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"}
@@ -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,25 +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
8
  import { GetCurrentUser, IsAuthenticated, LogoutAction, createPasswordLoginAction } from './actions/index.js';
9
- import './helpers.js';
10
9
  import { useHttpAuthentication, useRestService } from './helpers.js';
10
+ import { HttpServerPoolToken } from './http-server-pool.js';
11
11
  import { createCookieLoginStrategy } from './login-response-strategy.js';
12
12
  import { DefaultSession } from './models/default-session.js';
13
- import { ServerManager } from './server-manager.js';
14
13
  import { JsonResult } from './request-action-implementation.js';
14
+ import { ServerTelemetryToken } from './server-telemetry.js';
15
+ import { SessionStore, UserStore } from './user-store.js';
15
16
  const createIntegrationApi = async () => {
16
- const i = new Injector();
17
+ const i = createInjector();
17
18
  const port = getPort();
18
19
  const root = 'test-api';
19
- addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }));
20
- const repo = getRepository(i);
21
- repo.createDataSet(User, 'username');
22
- 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);
23
25
  useHttpAuthentication(i);
24
26
  await useRestService({
25
27
  injector: i,
@@ -51,34 +53,24 @@ const createIntegrationApi = async () => {
51
53
  return {
52
54
  apiUrl: `http://127.0.0.1:${port}/${root}`,
53
55
  port,
56
+ injector: i,
54
57
  [Symbol.asyncDispose]: i[Symbol.asyncDispose].bind(i),
55
58
  };
56
59
  };
57
- describe('@furystack/rest-service inregration tests', () => {
58
- it('Should be started and disposed', async () => {
60
+ describe('@furystack/rest-service integration tests', () => {
61
+ it('starts and disposes cleanly', async () => {
59
62
  await usingAsync(await createIntegrationApi(), async () => { });
60
63
  });
61
- it('Should respond with 404 when a route is not found', async () => {
64
+ it('responds 404 for unknown routes', async () => {
62
65
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
63
- const result = await fetch(PathHelper.joinPaths(apiUrl, 'some-route-that-does-not-exists'), {
64
- method: 'GET',
65
- });
66
+ const result = await fetch(PathHelper.joinPaths(apiUrl, 'some-route-that-does-not-exist'));
66
67
  expect(result.ok).toBe(false);
67
68
  expect(result.status).toBe(404);
68
69
  const response = (await result.json());
69
70
  expect(response).toEqual({ error: 'Content not found' });
70
71
  });
71
72
  });
72
- it('Should respond with 401 for unauthorized request errors', async () => {
73
- await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
74
- const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'));
75
- expect(result.ok).toBe(false);
76
- expect(result.status).toBe(401);
77
- const response = (await result.json());
78
- expect(response).toEqual({ error: 'unauthorized' });
79
- });
80
- });
81
- it('Should respond with 401 for unauthorized request errors', async () => {
73
+ it('responds 401 for authenticated routes hit anonymously', async () => {
82
74
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
83
75
  const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'));
84
76
  expect(result.ok).toBe(false);
@@ -87,7 +79,7 @@ describe('@furystack/rest-service inregration tests', () => {
87
79
  expect(response).toEqual({ error: 'unauthorized' });
88
80
  });
89
81
  });
90
- it('Should respond with the correct result body', async () => {
82
+ it('returns JSON bodies from async actions', async () => {
91
83
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
92
84
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'isAuthenticated'));
93
85
  expect(response.status).toBe(200);
@@ -95,16 +87,15 @@ describe('@furystack/rest-service inregration tests', () => {
95
87
  expect(result).toEqual({ isAuthenticated: false });
96
88
  });
97
89
  });
98
- it('Should be able to read query parameters', async () => {
90
+ it('deserialises query parameters', async () => {
99
91
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
100
- console.log('apiUrl', apiUrl);
101
92
  const response = await fetch(PathHelper.joinPaths(apiUrl, `testQuery?param1=${serializeValue('foo')}`));
102
93
  expect(response.status).toBe(200);
103
94
  const result = (await response.json());
104
95
  expect(result).toEqual({ param1Value: 'foo' });
105
96
  });
106
97
  });
107
- it('Should be able to read url parameters', async () => {
98
+ it('extracts url parameters', async () => {
108
99
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
109
100
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testUrlParams/bar'));
110
101
  expect(response.status).toBe(200);
@@ -112,7 +103,7 @@ describe('@furystack/rest-service inregration tests', () => {
112
103
  expect(result).toEqual({ urlParamValue: 'bar' });
113
104
  });
114
105
  });
115
- it('Should be able to read post body', async () => {
106
+ it('reads the POST body once and memoises subsequent reads', async () => {
116
107
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
117
108
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
118
109
  method: 'POST',
@@ -123,23 +114,18 @@ describe('@furystack/rest-service inregration tests', () => {
123
114
  expect(result).toEqual({ bodyValue: 'baz', body2Value: 'baz' });
124
115
  });
125
116
  });
126
- it('Should respond with OK to OPTIONS requests', async () => {
117
+ it('responds 200 to OPTIONS preflight requests', async () => {
127
118
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
128
- const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
129
- method: 'OPTIONS',
130
- }).catch((e) => {
131
- console.log(e);
132
- throw e;
133
- });
119
+ const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), { method: 'OPTIONS' });
134
120
  expect(response.status).toBe(200);
135
121
  });
136
122
  });
137
- it('Should reject requests outside of the API Root', async () => {
123
+ it('rejects requests outside the API root with a dropped socket', async () => {
138
124
  await usingAsync(await createIntegrationApi(), async ({ port }) => {
139
125
  await expect(fetch(PathHelper.joinPaths(`http://127.0.0.1:${port}`, 'not-my-api-root'))).rejects.toThrowError('fetch failed');
140
126
  });
141
127
  });
142
- it('Should respond with 400 for malformed query parameter values', async () => {
128
+ it('responds 400 for malformed query-parameter values', async () => {
143
129
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
144
130
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testQuery?param1=not-valid-base64!!!'));
145
131
  expect(response.status).toBe(400);
@@ -147,7 +133,7 @@ describe('@furystack/rest-service inregration tests', () => {
147
133
  expect(result.message).toBe('Failed to decode query parameter value');
148
134
  });
149
135
  });
150
- it('Should respond with 400 for malformed percent-encoded path parameters', async () => {
136
+ it('responds 400 for malformed percent-encoded path parameters', async () => {
151
137
  await usingAsync(await createIntegrationApi(), async ({ apiUrl }) => {
152
138
  const response = await fetch(`${apiUrl}/testUrlParams/%E0%A4%A`);
153
139
  expect(response.status).toBe(400);
@@ -156,56 +142,47 @@ describe('@furystack/rest-service inregration tests', () => {
156
142
  });
157
143
  });
158
144
  });
159
- describe('ServerManager events', () => {
160
- it('Should emit onServerListening when a server is created', async () => {
161
- await usingAsync(new Injector(), async (i) => {
162
- 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);
163
149
  const handler = vi.fn();
164
- serverManager.addListener('onServerListening', handler);
150
+ telemetry.addListener('onServerListening', handler);
165
151
  const port = getPort();
166
- await serverManager.getOrCreate({ port });
152
+ await i.get(HttpServerPoolToken).acquire({ port });
167
153
  expect(handler).toHaveBeenCalledTimes(1);
168
- expect(handler).toHaveBeenCalledWith({
169
- url: `http://localhost:${port}`,
170
- port,
171
- hostName: undefined,
172
- });
154
+ expect(handler).toHaveBeenCalledWith({ url: `http://localhost:${port}`, port, hostName: undefined });
173
155
  });
174
156
  });
175
- it('Should emit onServerListening with hostName when provided', async () => {
176
- await usingAsync(new Injector(), async (i) => {
177
- 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);
178
160
  const handler = vi.fn();
179
- serverManager.addListener('onServerListening', handler);
161
+ telemetry.addListener('onServerListening', handler);
180
162
  const port = getPort();
181
- await serverManager.getOrCreate({ port, hostName: '127.0.0.1' });
182
- expect(handler).toHaveBeenCalledWith({
183
- url: `http://127.0.0.1:${port}`,
184
- port,
185
- hostName: '127.0.0.1',
186
- });
187
- });
188
- });
189
- it('Should emit onServerClosed when the server manager is disposed', async () => {
190
- await usingAsync(new Injector(), async (i) => {
191
- const serverManager = i.getInstance(ServerManager);
192
- const handler = vi.fn();
193
- serverManager.addListener('onServerClosed', handler);
194
- const port = getPort();
195
- await serverManager.getOrCreate({ port });
196
- await serverManager[Symbol.asyncDispose]();
197
- expect(handler).toHaveBeenCalledTimes(1);
198
- 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' });
199
165
  });
200
166
  });
201
- it('Should not emit onServerListening for an existing server', async () => {
202
- await usingAsync(new Injector(), async (i) => {
203
- 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) => {
204
180
  const port = getPort();
205
- await serverManager.getOrCreate({ port });
181
+ await i.get(HttpServerPoolToken).acquire({ port });
182
+ const telemetry = i.get(ServerTelemetryToken);
206
183
  const handler = vi.fn();
207
- serverManager.addListener('onServerListening', handler);
208
- await serverManager.getOrCreate({ port });
184
+ telemetry.addListener('onServerListening', handler);
185
+ await i.get(HttpServerPoolToken).acquire({ port });
209
186
  expect(handler).not.toHaveBeenCalled();
210
187
  });
211
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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"}