@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 +1 @@
1
- {"version":3,"file":"static-server-manager.spec.js","sourceRoot":"","sources":["../src/static-server-manager.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static-server-manager.spec.js","sourceRoot":"","sources":["../src/static-server-manager.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { OutgoingHttpHeaders } from 'http';
2
+ import type { ServerApi } from './http-server-pool.js';
3
+ /**
4
+ * Options accepted by {@link buildStaticSiteServerApi} and
5
+ * {@link useStaticFiles}.
6
+ */
7
+ export interface StaticServerOptions {
8
+ baseUrl: string;
9
+ path: string;
10
+ hostName?: string;
11
+ port: number;
12
+ fallback?: string;
13
+ headers?: OutgoingHttpHeaders;
14
+ }
15
+ /**
16
+ * Builds a {@link ServerApi} that serves files under `options.path` for every
17
+ * GET request whose URL matches `options.baseUrl`. Falls back to
18
+ * `options.fallback` (if set) for missing files, otherwise responds with 404.
19
+ */
20
+ export declare const buildStaticSiteServerApi: (options: StaticServerOptions) => ServerApi;
21
+ //# sourceMappingURL=static-site-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-runtime.d.ts","sourceRoot":"","sources":["../src/static-site-runtime.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,mBAAmB,EAAkB,MAAM,MAAM,CAAA;AAEhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAGtD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAwBD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS,mBAAmB,KAAG,SA0BvE,CAAA"}
@@ -0,0 +1,48 @@
1
+ import { PathHelper } from '@furystack/utils';
2
+ import { createReadStream } from 'fs';
3
+ import { access, stat } from 'fs/promises';
4
+ import { join, normalize, sep } from 'path';
5
+ import { getMimeForFile } from './mime-types.js';
6
+ const sendFile = async ({ fullPath, headers, res, }) => {
7
+ const { size } = await stat(fullPath);
8
+ await access(fullPath);
9
+ const head = {
10
+ ...headers,
11
+ 'Content-Length': size,
12
+ 'Content-Type': getMimeForFile(fullPath),
13
+ };
14
+ Object.entries(head).forEach(([key, value]) => res.setHeader(key, value));
15
+ await new Promise((resolve, reject) => createReadStream(fullPath, { autoClose: true }).once('finish', resolve).once('error', reject).pipe(res));
16
+ };
17
+ /**
18
+ * Builds a {@link ServerApi} that serves files under `options.path` for every
19
+ * GET request whose URL matches `options.baseUrl`. Falls back to
20
+ * `options.fallback` (if set) for missing files, otherwise responds with 404.
21
+ */
22
+ export const buildStaticSiteServerApi = (options) => {
23
+ const onRequest = async ({ req, res }) => {
24
+ const extractedPath = PathHelper.extractPath(req.url, options.baseUrl);
25
+ const filePath = (extractedPath || '/').replaceAll('/', sep);
26
+ const fullPath = normalize(join(options.path, filePath));
27
+ try {
28
+ await sendFile({ fullPath, res, headers: options.headers });
29
+ }
30
+ catch {
31
+ if (options.fallback) {
32
+ await sendFile({ fullPath: normalize(join(options.path, options.fallback)), res, headers: options.headers });
33
+ return;
34
+ }
35
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
36
+ res.end('Not found');
37
+ }
38
+ };
39
+ return {
40
+ shouldExec: ({ req }) => req.url !== undefined &&
41
+ req.method?.toUpperCase() === 'GET' &&
42
+ PathHelper.matchesBaseUrl(req.url, options.baseUrl)
43
+ ? true
44
+ : false,
45
+ onRequest,
46
+ };
47
+ };
48
+ //# sourceMappingURL=static-site-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-runtime.js","sourceRoot":"","sources":["../src/static-site-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAehD,MAAM,QAAQ,GAAG,KAAK,EAAE,EACtB,QAAQ,EACR,OAAO,EACP,GAAG,GAKJ,EAAiB,EAAE;IAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;IACtB,MAAM,IAAI,GAAG;QACX,GAAG,OAAO;QACV,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC;KACzC,CAAA;IACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACzE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAC1C,gBAAgB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACxG,CAAA;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAA4B,EAAa,EAAE;IAClF,MAAM,SAAS,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAiD,EAAiB,EAAE;QACrG,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,GAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAChF,MAAM,QAAQ,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC5D,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QACxD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;gBAC5G,OAAM;YACR,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAA;YACpD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,CAAA;IAED,OAAO;QACL,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACtB,GAAG,CAAC,GAAG,KAAK,SAAS;YACrB,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK;YACnC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;YACjD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK;QACX,SAAS;KACV,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=static-site-runtime.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-runtime.spec.d.ts","sourceRoot":"","sources":["../src/static-site-runtime.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildStaticSiteServerApi } from './static-site-runtime.js';
3
+ const makeRequest = (url, method = 'GET') => ({ url, method, headers: {} });
4
+ // Full onRequest / sendFile behaviour (streaming, fallback, 404) is covered
5
+ // end-to-end via `static-server-manager.spec.ts` which drives the real HTTP
6
+ // pool. These tests cover the pure-function `shouldExec` gate which is
7
+ // exercised by the server pool before any request is handed to the API.
8
+ describe('buildStaticSiteServerApi / shouldExec', () => {
9
+ const api = buildStaticSiteServerApi({ baseUrl: '/static', path: '/tmp', port: 0 });
10
+ it('matches GET requests under the baseUrl', () => {
11
+ expect(api.shouldExec({ req: makeRequest('/static/index.html'), res: {} })).toBe(true);
12
+ });
13
+ it('is case-insensitive about the method (GET only)', () => {
14
+ expect(api.shouldExec({ req: makeRequest('/static/a.html', 'get'), res: {} })).toBe(true);
15
+ });
16
+ it('rejects non-GET methods', () => {
17
+ expect(api.shouldExec({ req: makeRequest('/static/index.html', 'POST'), res: {} })).toBe(false);
18
+ expect(api.shouldExec({ req: makeRequest('/static/index.html', 'DELETE'), res: {} })).toBe(false);
19
+ });
20
+ it('rejects URLs that do not match the baseUrl', () => {
21
+ expect(api.shouldExec({ req: makeRequest('/other/index.html'), res: {} })).toBe(false);
22
+ });
23
+ it('rejects requests without a URL', () => {
24
+ expect(api.shouldExec({ req: makeRequest(undefined), res: {} })).toBe(false);
25
+ });
26
+ it('never exposes an onUpgrade hook (static sites do not handle upgrades)', () => {
27
+ expect(api.onUpgrade).toBeUndefined();
28
+ });
29
+ });
30
+ //# sourceMappingURL=static-site-runtime.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-runtime.spec.js","sourceRoot":"","sources":["../src/static-site-runtime.spec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,MAAM,WAAW,GAAG,CAAC,GAAuB,EAAE,SAA6B,KAAK,EAAmB,EAAE,CACnG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAA+B,CAAA;AAE9D,4EAA4E;AAC5E,4EAA4E;AAC5E,uEAAuE;AACvE,wEAAwE;AACxE,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,MAAM,GAAG,GAAG,wBAAwB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;IAEnF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjH,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,65 @@
1
+ import type { User } from '@furystack/core';
2
+ import { type Token } from '@furystack/inject';
3
+ import type { IncomingMessage } from 'http';
4
+ import { HttpAuthenticationSettings } from './http-authentication-settings.js';
5
+ /**
6
+ * Singleton TTL cache that memoizes successful identity resolutions across
7
+ * requests within a single process.
8
+ *
9
+ * Cache keys are produced by the configured {@link AuthenticationProvider}s
10
+ * via their `getCacheKey` method (e.g. cookie-auth keys by session id). The
11
+ * cache's `load` callback runs the same provider chain that
12
+ * {@link HttpUserContext.authenticateRequest} would run — it is supplied via
13
+ * an internal "loader" registered when the {@link HttpUserContext} is
14
+ * resolved.
15
+ *
16
+ * Entries expire after `HttpAuthenticationSettings.userCacheTtlMs`; capacity
17
+ * is bounded by `HttpAuthenticationSettings.userCacheCapacity`. Setting the
18
+ * TTL to `0` disables caching (the loader runs on every call).
19
+ *
20
+ * **Multi-node note:** session invalidation on one instance does not
21
+ * propagate to siblings — the TTL bounds the staleness window. Apps that
22
+ * need stricter freshness must shorten the TTL or invalidate explicitly via
23
+ * {@link UserResolutionCache.invalidate} /
24
+ * {@link UserResolutionCache.invalidateByUser}.
25
+ */
26
+ export interface UserResolutionCache extends Disposable {
27
+ /**
28
+ * Returns the cached or freshly-resolved `User` for the supplied
29
+ * cache key. The `loader` is invoked on cache miss; concurrent calls for
30
+ * the same key dedupe to a single loader invocation.
31
+ */
32
+ resolve(cacheKey: string, loader: () => Promise<User>): Promise<User>;
33
+ /** Drops a single cache entry. No-op when the key is unknown. */
34
+ invalidate(cacheKey: string): void;
35
+ /**
36
+ * Drops every cached entry that resolved to `username`, regardless of
37
+ * which {@link AuthenticationProvider}'s key originally populated it.
38
+ * Backed by the cache's reverse tag index — no per-call O(n) scan.
39
+ *
40
+ * Use after role / password / account-state changes that must take
41
+ * effect immediately on the next request, instead of waiting for the
42
+ * TTL window to elapse.
43
+ */
44
+ invalidateByUser(username: string): void;
45
+ /** Drops every cached entry. */
46
+ invalidateAll(): void;
47
+ /** Returns the current entry count (for diagnostics / tests). */
48
+ readonly size: number;
49
+ }
50
+ /**
51
+ * DI token for the singleton {@link UserResolutionCache}. Resolved lazily
52
+ * by {@link HttpUserContext}; sized from {@link HttpAuthenticationSettings}.
53
+ */
54
+ export declare const UserResolutionCache: Token<UserResolutionCache, 'singleton'>;
55
+ /**
56
+ * Resolves the configured cache key for the supplied request by walking the
57
+ * authentication providers in order and returning the first non-null key.
58
+ *
59
+ * Returns `null` when no provider opts in to caching (e.g. Basic Auth, or
60
+ * an anonymous request). The caller should bypass the cache in that case.
61
+ *
62
+ * Exported so plugins / tests can derive the same key the cache uses.
63
+ */
64
+ export declare const resolveUserCacheKey: (settings: HttpAuthenticationSettings, request: Pick<IncomingMessage, "headers">) => string | null;
65
+ //# sourceMappingURL=user-resolution-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resolution-cache.d.ts","sourceRoot":"","sources":["../src/user-resolution-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAE3C,OAAO,EAGL,0BAA0B,EAC3B,MAAM,mCAAmC,CAAA;AAI1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,iEAAiE;IACjE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC;;;;;;;;OAQG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,gCAAgC;IAChC,aAAa,IAAI,IAAI,CAAA;IACrB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAmED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE,WAAW,CActE,CAAA;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,0BAA0B,EACpC,SAAS,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,KACxC,MAAM,GAAG,IAOX,CAAA"}
@@ -0,0 +1,101 @@
1
+ import { Cache } from '@furystack/cache';
2
+ import { defineService } from '@furystack/inject';
3
+ import { DEFAULT_USER_CACHE_CAPACITY, DEFAULT_USER_CACHE_TTL_MS, HttpAuthenticationSettings, } from './http-authentication-settings.js';
4
+ import { userCacheTag } from './identity-cache-keys.js';
5
+ class UserResolutionCacheImpl {
6
+ loaders = new Map();
7
+ cache;
8
+ constructor(ttlMs, capacity) {
9
+ if (ttlMs <= 0) {
10
+ this.cache = null;
11
+ return;
12
+ }
13
+ this.cache = new Cache({
14
+ load: (cacheKey) => {
15
+ const loader = this.loaders.get(cacheKey);
16
+ if (!loader) {
17
+ // The loader is only registered for the duration of a `resolve()`
18
+ // call. A reload triggered via `cache.get(key)` outside that call
19
+ // (e.g. from `getObservable`) would have no loader; refuse the
20
+ // load instead of caching `null`.
21
+ return Promise.reject(new Error(`No loader registered for cache key '${cacheKey}'`));
22
+ }
23
+ return loader();
24
+ },
25
+ cacheTimeMs: ttlMs,
26
+ capacity,
27
+ getKey: (cacheKey) => cacheKey,
28
+ getTags: (user) => [userCacheTag(user.username)],
29
+ });
30
+ }
31
+ async resolve(cacheKey, loader) {
32
+ if (!this.cache) {
33
+ return loader();
34
+ }
35
+ this.loaders.set(cacheKey, loader);
36
+ try {
37
+ return await this.cache.get(cacheKey);
38
+ }
39
+ finally {
40
+ // Loader is per-request; clearing prevents the cache from re-running it
41
+ // out-of-band when the entry transitions to obsolete and a sibling call
42
+ // queries `getObservable`.
43
+ this.loaders.delete(cacheKey);
44
+ }
45
+ }
46
+ invalidate(cacheKey) {
47
+ this.cache?.remove(cacheKey);
48
+ }
49
+ invalidateByUser(username) {
50
+ this.cache?.removeByTag(userCacheTag(username));
51
+ }
52
+ invalidateAll() {
53
+ this.cache?.flushAll();
54
+ }
55
+ get size() {
56
+ return this.cache?.getCount() ?? 0;
57
+ }
58
+ [Symbol.dispose]() {
59
+ this.cache?.[Symbol.dispose]();
60
+ this.loaders.clear();
61
+ }
62
+ }
63
+ /**
64
+ * DI token for the singleton {@link UserResolutionCache}. Resolved lazily
65
+ * by {@link HttpUserContext}; sized from {@link HttpAuthenticationSettings}.
66
+ */
67
+ export const UserResolutionCache = defineService({
68
+ name: 'furystack/rest-service/UserResolutionCache',
69
+ lifetime: 'singleton',
70
+ factory: ({ inject, onDispose }) => {
71
+ const settings = inject(HttpAuthenticationSettings);
72
+ const ttlMs = settings.userCacheTtlMs ?? DEFAULT_USER_CACHE_TTL_MS;
73
+ const capacity = settings.userCacheCapacity ?? DEFAULT_USER_CACHE_CAPACITY;
74
+ const impl = new UserResolutionCacheImpl(ttlMs, capacity);
75
+ onDispose(() => {
76
+ // eslint-disable-next-line furystack/prefer-using-wrapper -- onDispose is the teardown hook
77
+ impl[Symbol.dispose]();
78
+ });
79
+ return impl;
80
+ },
81
+ });
82
+ /**
83
+ * Resolves the configured cache key for the supplied request by walking the
84
+ * authentication providers in order and returning the first non-null key.
85
+ *
86
+ * Returns `null` when no provider opts in to caching (e.g. Basic Auth, or
87
+ * an anonymous request). The caller should bypass the cache in that case.
88
+ *
89
+ * Exported so plugins / tests can derive the same key the cache uses.
90
+ */
91
+ export const resolveUserCacheKey = (settings, request) => {
92
+ for (const provider of settings.authenticationProviders) {
93
+ if (!provider.getCacheKey)
94
+ continue;
95
+ const key = provider.getCacheKey(request);
96
+ if (key)
97
+ return key;
98
+ }
99
+ return null;
100
+ };
101
+ //# sourceMappingURL=user-resolution-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resolution-cache.js","sourceRoot":"","sources":["../src/user-resolution-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=user-resolution-cache.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resolution-cache.spec.d.ts","sourceRoot":"","sources":["../src/user-resolution-cache.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,220 @@
1
+ import { createInjector } from '@furystack/inject';
2
+ import { usingAsync } from '@furystack/utils';
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import { HttpAuthenticationSettings, defaultHttpAuthenticationSettings } from './http-authentication-settings.js';
5
+ import { resolveUserCacheKey, UserResolutionCache } from './user-resolution-cache.js';
6
+ const testUser = { username: 'alice', roles: ['reader'] };
7
+ const otherUser = { username: 'bob', roles: [] };
8
+ describe('UserResolutionCache', () => {
9
+ beforeEach(() => {
10
+ vi.useFakeTimers();
11
+ });
12
+ afterEach(() => {
13
+ vi.useRealTimers();
14
+ });
15
+ describe('resolve', () => {
16
+ it('returns the loader result on first call and reuses it on subsequent calls within TTL', async () => {
17
+ await usingAsync(createInjector(), async (i) => {
18
+ i.bind(HttpAuthenticationSettings, () => ({
19
+ ...defaultHttpAuthenticationSettings(),
20
+ userCacheTtlMs: 30_000,
21
+ }));
22
+ const cache = i.get(UserResolutionCache);
23
+ const loader = vi.fn(async () => testUser);
24
+ const first = await cache.resolve('cookie:abc', loader);
25
+ const second = await cache.resolve('cookie:abc', loader);
26
+ expect(first).toBe(testUser);
27
+ expect(second).toBe(testUser);
28
+ expect(loader).toHaveBeenCalledTimes(1);
29
+ });
30
+ });
31
+ it('treats distinct cache keys independently', async () => {
32
+ await usingAsync(createInjector(), async (i) => {
33
+ i.bind(HttpAuthenticationSettings, () => ({
34
+ ...defaultHttpAuthenticationSettings(),
35
+ userCacheTtlMs: 30_000,
36
+ }));
37
+ const cache = i.get(UserResolutionCache);
38
+ const loaderA = vi.fn(async () => testUser);
39
+ const loaderB = vi.fn(async () => otherUser);
40
+ expect(await cache.resolve('cookie:a', loaderA)).toBe(testUser);
41
+ expect(await cache.resolve('cookie:b', loaderB)).toBe(otherUser);
42
+ expect(await cache.resolve('cookie:a', loaderA)).toBe(testUser);
43
+ expect(loaderA).toHaveBeenCalledTimes(1);
44
+ expect(loaderB).toHaveBeenCalledTimes(1);
45
+ });
46
+ });
47
+ it('drops the entry once cacheTimeMs has elapsed', async () => {
48
+ await usingAsync(createInjector(), async (i) => {
49
+ i.bind(HttpAuthenticationSettings, () => ({
50
+ ...defaultHttpAuthenticationSettings(),
51
+ userCacheTtlMs: 100,
52
+ }));
53
+ const cache = i.get(UserResolutionCache);
54
+ const loader = vi.fn(async () => testUser);
55
+ await cache.resolve('cookie:ttl', loader);
56
+ await vi.advanceTimersByTimeAsync(150);
57
+ await cache.resolve('cookie:ttl', loader);
58
+ expect(loader).toHaveBeenCalledTimes(2);
59
+ });
60
+ });
61
+ it('runs the loader on every call when ttl is 0', async () => {
62
+ await usingAsync(createInjector(), async (i) => {
63
+ i.bind(HttpAuthenticationSettings, () => ({
64
+ ...defaultHttpAuthenticationSettings(),
65
+ userCacheTtlMs: 0,
66
+ }));
67
+ const cache = i.get(UserResolutionCache);
68
+ const loader = vi.fn(async () => testUser);
69
+ await cache.resolve('cookie:disabled', loader);
70
+ await cache.resolve('cookie:disabled', loader);
71
+ expect(loader).toHaveBeenCalledTimes(2);
72
+ expect(cache.size).toBe(0);
73
+ });
74
+ });
75
+ it('dedupes concurrent loaders for the same key', async () => {
76
+ await usingAsync(createInjector(), async (i) => {
77
+ i.bind(HttpAuthenticationSettings, () => ({
78
+ ...defaultHttpAuthenticationSettings(),
79
+ userCacheTtlMs: 30_000,
80
+ }));
81
+ const cache = i.get(UserResolutionCache);
82
+ const loader = vi.fn(() => new Promise((resolve) => {
83
+ setTimeout(() => resolve(testUser), 100);
84
+ }));
85
+ const both = Promise.all([cache.resolve('cookie:dedupe', loader), cache.resolve('cookie:dedupe', loader)]);
86
+ await vi.advanceTimersByTimeAsync(150);
87
+ const [a, b] = await both;
88
+ expect(a).toBe(testUser);
89
+ expect(b).toBe(testUser);
90
+ expect(loader).toHaveBeenCalledTimes(1);
91
+ });
92
+ });
93
+ it('rejects (without caching) when the loader throws', async () => {
94
+ await usingAsync(createInjector(), async (i) => {
95
+ i.bind(HttpAuthenticationSettings, () => ({
96
+ ...defaultHttpAuthenticationSettings(),
97
+ userCacheTtlMs: 30_000,
98
+ }));
99
+ const cache = i.get(UserResolutionCache);
100
+ const loader = vi
101
+ .fn()
102
+ .mockRejectedValueOnce(new Error('boom'))
103
+ .mockResolvedValueOnce(testUser);
104
+ await expect(cache.resolve('cookie:err', loader)).rejects.toThrow('boom');
105
+ await expect(cache.resolve('cookie:err', loader)).resolves.toBe(testUser);
106
+ expect(loader).toHaveBeenCalledTimes(2);
107
+ });
108
+ });
109
+ });
110
+ describe('invalidate', () => {
111
+ it('drops the targeted entry only', async () => {
112
+ await usingAsync(createInjector(), async (i) => {
113
+ i.bind(HttpAuthenticationSettings, () => ({
114
+ ...defaultHttpAuthenticationSettings(),
115
+ userCacheTtlMs: 30_000,
116
+ }));
117
+ const cache = i.get(UserResolutionCache);
118
+ const loaderA = vi.fn(async () => testUser);
119
+ const loaderB = vi.fn(async () => otherUser);
120
+ await cache.resolve('cookie:a', loaderA);
121
+ await cache.resolve('cookie:b', loaderB);
122
+ cache.invalidate('cookie:a');
123
+ await cache.resolve('cookie:a', loaderA);
124
+ await cache.resolve('cookie:b', loaderB);
125
+ expect(loaderA).toHaveBeenCalledTimes(2);
126
+ expect(loaderB).toHaveBeenCalledTimes(1);
127
+ });
128
+ });
129
+ });
130
+ describe('invalidateAll', () => {
131
+ it('flushes every entry', async () => {
132
+ await usingAsync(createInjector(), async (i) => {
133
+ i.bind(HttpAuthenticationSettings, () => ({
134
+ ...defaultHttpAuthenticationSettings(),
135
+ userCacheTtlMs: 30_000,
136
+ }));
137
+ const cache = i.get(UserResolutionCache);
138
+ await cache.resolve('cookie:a', async () => testUser);
139
+ await cache.resolve('cookie:b', async () => otherUser);
140
+ expect(cache.size).toBe(2);
141
+ cache.invalidateAll();
142
+ expect(cache.size).toBe(0);
143
+ });
144
+ });
145
+ });
146
+ describe('invalidateByUser', () => {
147
+ it('drops every cached session that resolved to the supplied username', async () => {
148
+ await usingAsync(createInjector(), async (i) => {
149
+ i.bind(HttpAuthenticationSettings, () => ({
150
+ ...defaultHttpAuthenticationSettings(),
151
+ userCacheTtlMs: 30_000,
152
+ }));
153
+ const cache = i.get(UserResolutionCache);
154
+ const aliceLoaderA = vi.fn(async () => testUser);
155
+ const aliceLoaderB = vi.fn(async () => testUser);
156
+ const bobLoader = vi.fn(async () => otherUser);
157
+ await cache.resolve('cookie:alice-1', aliceLoaderA);
158
+ await cache.resolve('cookie:alice-2', aliceLoaderB);
159
+ await cache.resolve('cookie:bob-1', bobLoader);
160
+ expect(cache.size).toBe(3);
161
+ cache.invalidateByUser('alice');
162
+ expect(cache.size).toBe(1);
163
+ await cache.resolve('cookie:alice-1', aliceLoaderA);
164
+ await cache.resolve('cookie:alice-2', aliceLoaderB);
165
+ await cache.resolve('cookie:bob-1', bobLoader);
166
+ expect(aliceLoaderA).toHaveBeenCalledTimes(2);
167
+ expect(aliceLoaderB).toHaveBeenCalledTimes(2);
168
+ expect(bobLoader).toHaveBeenCalledTimes(1);
169
+ });
170
+ });
171
+ it('is a no-op when the username is unknown', async () => {
172
+ await usingAsync(createInjector(), async (i) => {
173
+ i.bind(HttpAuthenticationSettings, () => ({
174
+ ...defaultHttpAuthenticationSettings(),
175
+ userCacheTtlMs: 30_000,
176
+ }));
177
+ const cache = i.get(UserResolutionCache);
178
+ await cache.resolve('cookie:alice-1', async () => testUser);
179
+ await cache.resolve('cookie:bob-1', async () => otherUser);
180
+ cache.invalidateByUser('charlie');
181
+ expect(cache.size).toBe(2);
182
+ });
183
+ });
184
+ it('is a no-op when caching is disabled (ttl = 0)', async () => {
185
+ await usingAsync(createInjector(), async (i) => {
186
+ i.bind(HttpAuthenticationSettings, () => ({
187
+ ...defaultHttpAuthenticationSettings(),
188
+ userCacheTtlMs: 0,
189
+ }));
190
+ const cache = i.get(UserResolutionCache);
191
+ expect(() => cache.invalidateByUser('alice')).not.toThrow();
192
+ expect(cache.size).toBe(0);
193
+ });
194
+ });
195
+ });
196
+ });
197
+ describe('resolveUserCacheKey', () => {
198
+ it('returns the first non-null key from the configured providers', () => {
199
+ const settings = {
200
+ ...defaultHttpAuthenticationSettings(),
201
+ authenticationProviders: [
202
+ { name: 'first', authenticate: async () => null, getCacheKey: () => null },
203
+ { name: 'second', authenticate: async () => null, getCacheKey: () => 'cookie:matched' },
204
+ { name: 'third', authenticate: async () => null, getCacheKey: () => 'jwt:not-reached' },
205
+ ],
206
+ };
207
+ expect(resolveUserCacheKey(settings, { headers: {} })).toBe('cookie:matched');
208
+ });
209
+ it('returns null when every provider opts out', () => {
210
+ const settings = {
211
+ ...defaultHttpAuthenticationSettings(),
212
+ authenticationProviders: [
213
+ { name: 'a', authenticate: async () => null },
214
+ { name: 'b', authenticate: async () => null, getCacheKey: () => null },
215
+ ],
216
+ };
217
+ expect(resolveUserCacheKey(settings, { headers: {} })).toBeNull();
218
+ });
219
+ });
220
+ //# sourceMappingURL=user-resolution-cache.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-resolution-cache.spec.js","sourceRoot":"","sources":["../src/user-resolution-cache.spec.ts"],"names":[],"mappings":"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"}