@byline/host-tanstack-start 5.0.0 → 5.1.1

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 (258) hide show
  1. package/dist/admin-shell/chrome/admin-app-bar.d.ts +7 -0
  2. package/dist/admin-shell/chrome/admin-app-bar.js +10 -2
  3. package/dist/admin-shell/chrome/optional-i18n-provider.d.ts +29 -0
  4. package/dist/admin-shell/chrome/optional-i18n-provider.js +24 -0
  5. package/dist/admin-shell/chrome/session-change-boundary.d.ts +14 -0
  6. package/dist/admin-shell/chrome/session-change-boundary.js +119 -0
  7. package/dist/admin-shell/chrome/session-change-boundary.module.js +11 -0
  8. package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
  9. package/dist/admin-shell/chrome/session-change-boundary_module.css +81 -0
  10. package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
  11. package/dist/admin-shell/chrome/sign-in-page.js +60 -3
  12. package/dist/integrations/byline-admin-services.js +7 -1
  13. package/dist/integrations/client-ip.d.ts +19 -0
  14. package/dist/integrations/client-ip.js +34 -0
  15. package/dist/integrations/session-coordination.d.ts +24 -0
  16. package/dist/integrations/session-coordination.js +85 -0
  17. package/dist/integrations/session-middleware.d.ts +11 -0
  18. package/dist/integrations/session-middleware.js +94 -0
  19. package/dist/integrations/session-request-kind.d.ts +9 -0
  20. package/dist/integrations/session-request-kind.js +10 -0
  21. package/dist/integrations/session-request-middleware.d.ts +9 -0
  22. package/dist/integrations/session-request-middleware.js +7 -0
  23. package/dist/integrations/sign-in-body.d.ts +12 -0
  24. package/dist/integrations/sign-in-body.js +52 -0
  25. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  26. package/dist/integrations/sign-in-middleware.js +10 -0
  27. package/dist/routes/create-admin-layout-route.js +46 -31
  28. package/dist/routes/create-sign-in-route.js +4 -2
  29. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  30. package/dist/server-fns/admin-account/change-password.js +9 -3
  31. package/dist/server-fns/admin-account/get.d.ts +3 -1
  32. package/dist/server-fns/admin-account/get.js +4 -1
  33. package/dist/server-fns/admin-account/index.d.ts +5 -5
  34. package/dist/server-fns/admin-account/update.d.ts +3 -1
  35. package/dist/server-fns/admin-account/update.js +4 -1
  36. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  37. package/dist/server-fns/admin-activity/get.js +4 -1
  38. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  39. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  40. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  41. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  42. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  43. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  44. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  45. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  46. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  47. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  48. package/dist/server-fns/admin-roles/create.js +4 -1
  49. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  50. package/dist/server-fns/admin-roles/delete.js +4 -1
  51. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  52. package/dist/server-fns/admin-roles/get.js +4 -1
  53. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  54. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  55. package/dist/server-fns/admin-roles/list.js +4 -1
  56. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  57. package/dist/server-fns/admin-roles/reorder.js +4 -1
  58. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  59. package/dist/server-fns/admin-roles/update.js +4 -1
  60. package/dist/server-fns/admin-users/create.d.ts +3 -1
  61. package/dist/server-fns/admin-users/create.js +4 -1
  62. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  63. package/dist/server-fns/admin-users/delete.js +4 -1
  64. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  65. package/dist/server-fns/admin-users/disable.js +4 -1
  66. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  67. package/dist/server-fns/admin-users/enable.js +4 -1
  68. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  69. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  70. package/dist/server-fns/admin-users/get.d.ts +3 -1
  71. package/dist/server-fns/admin-users/get.js +4 -1
  72. package/dist/server-fns/admin-users/index.d.ts +10 -10
  73. package/dist/server-fns/admin-users/list.d.ts +3 -1
  74. package/dist/server-fns/admin-users/list.js +4 -1
  75. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  76. package/dist/server-fns/admin-users/set-password.js +4 -1
  77. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  78. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  79. package/dist/server-fns/admin-users/update.d.ts +3 -1
  80. package/dist/server-fns/admin-users/update.js +4 -1
  81. package/dist/server-fns/ai/execute.d.ts +3 -1
  82. package/dist/server-fns/ai/execute.js +4 -1
  83. package/dist/server-fns/ai/index.d.ts +1 -1
  84. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  85. package/dist/server-fns/analytics/maintenance.js +7 -2
  86. package/dist/server-fns/analytics/queries.d.ts +18 -6
  87. package/dist/server-fns/analytics/queries.js +19 -6
  88. package/dist/server-fns/auth/current-user.d.ts +1 -0
  89. package/dist/server-fns/auth/current-user.js +5 -2
  90. package/dist/server-fns/auth/renew.d.ts +13 -0
  91. package/dist/server-fns/auth/renew.js +45 -0
  92. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  93. package/dist/server-fns/auth/sign-in.js +88 -17
  94. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  95. package/dist/server-fns/auth/sign-out.js +38 -6
  96. package/dist/server-fns/collections/audit.d.ts +3 -1
  97. package/dist/server-fns/collections/audit.js +4 -1
  98. package/dist/server-fns/collections/copy-to-locale.d.ts +10 -1
  99. package/dist/server-fns/collections/copy-to-locale.js +5 -2
  100. package/dist/server-fns/collections/create.d.ts +10 -1
  101. package/dist/server-fns/collections/create.js +5 -2
  102. package/dist/server-fns/collections/delete-locale.d.ts +10 -1
  103. package/dist/server-fns/collections/delete-locale.js +5 -2
  104. package/dist/server-fns/collections/delete.d.ts +10 -1
  105. package/dist/server-fns/collections/delete.js +5 -2
  106. package/dist/server-fns/collections/duplicate.d.ts +10 -1
  107. package/dist/server-fns/collections/duplicate.js +5 -2
  108. package/dist/server-fns/collections/get.d.ts +7 -0
  109. package/dist/server-fns/collections/get.js +8 -3
  110. package/dist/server-fns/collections/history.d.ts +3 -1
  111. package/dist/server-fns/collections/history.js +4 -1
  112. package/dist/server-fns/collections/index.d.ts +21 -21
  113. package/dist/server-fns/collections/list.d.ts +10 -1
  114. package/dist/server-fns/collections/list.js +5 -2
  115. package/dist/server-fns/collections/reindex.d.ts +3 -1
  116. package/dist/server-fns/collections/reindex.js +4 -1
  117. package/dist/server-fns/collections/reorder.d.ts +10 -1
  118. package/dist/server-fns/collections/reorder.js +5 -2
  119. package/dist/server-fns/collections/restore-version.d.ts +10 -1
  120. package/dist/server-fns/collections/restore-version.js +5 -2
  121. package/dist/server-fns/collections/scheduled-publication.d.ts +22 -5
  122. package/dist/server-fns/collections/scheduled-publication.js +17 -6
  123. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  124. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  125. package/dist/server-fns/collections/stats.js +4 -1
  126. package/dist/server-fns/collections/status.d.ts +13 -2
  127. package/dist/server-fns/collections/status.js +8 -3
  128. package/dist/server-fns/collections/tree.d.ts +22 -5
  129. package/dist/server-fns/collections/tree.js +17 -6
  130. package/dist/server-fns/collections/update.d.ts +13 -2
  131. package/dist/server-fns/collections/update.js +8 -3
  132. package/dist/server-fns/collections/upload.d.ts +10 -1
  133. package/dist/server-fns/collections/upload.js +4 -1
  134. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  135. package/dist/server-fns/i18n/set-locale.js +18 -3
  136. package/dist/server-fns/preview/disable.d.ts +3 -1
  137. package/dist/server-fns/preview/disable.js +4 -1
  138. package/dist/server-fns/preview/enable.d.ts +3 -1
  139. package/dist/server-fns/preview/enable.js +4 -1
  140. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +10 -1
  141. package/dist/server-fns/singletons/cancel-scheduled-publish.js +5 -2
  142. package/dist/server-fns/singletons/change-status.d.ts +10 -1
  143. package/dist/server-fns/singletons/change-status.js +5 -2
  144. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +10 -1
  145. package/dist/server-fns/singletons/confirm-scheduled-publish.js +5 -2
  146. package/dist/server-fns/singletons/copy-to-locale.d.ts +10 -1
  147. package/dist/server-fns/singletons/copy-to-locale.js +5 -2
  148. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  149. package/dist/server-fns/singletons/find-by-version.js +4 -1
  150. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  151. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  152. package/dist/server-fns/singletons/get.d.ts +3 -1
  153. package/dist/server-fns/singletons/get.js +4 -1
  154. package/dist/server-fns/singletons/history.d.ts +3 -1
  155. package/dist/server-fns/singletons/history.js +4 -1
  156. package/dist/server-fns/singletons/restore-version.d.ts +10 -1
  157. package/dist/server-fns/singletons/restore-version.js +5 -2
  158. package/dist/server-fns/singletons/schedule-publish.d.ts +10 -1
  159. package/dist/server-fns/singletons/schedule-publish.js +5 -2
  160. package/dist/server-fns/singletons/unpublish.d.ts +10 -1
  161. package/dist/server-fns/singletons/unpublish.js +5 -2
  162. package/dist/server-fns/singletons/update.d.ts +10 -1
  163. package/dist/server-fns/singletons/update.js +5 -2
  164. package/package.json +19 -19
  165. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  166. package/src/admin-shell/chrome/optional-i18n-provider.tsx +61 -0
  167. package/src/admin-shell/chrome/session-change-boundary.module.css +112 -0
  168. package/src/admin-shell/chrome/session-change-boundary.test.tsx +91 -0
  169. package/src/admin-shell/chrome/session-change-boundary.tsx +155 -0
  170. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  171. package/src/integrations/byline-admin-services.ts +7 -1
  172. package/src/integrations/client-ip.test.node.ts +45 -0
  173. package/src/integrations/client-ip.ts +54 -0
  174. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  175. package/src/integrations/session-client.test.node.ts +121 -0
  176. package/src/integrations/session-coordination.test.node.ts +77 -0
  177. package/src/integrations/session-coordination.ts +96 -0
  178. package/src/integrations/session-middleware.test.node.ts +87 -0
  179. package/src/integrations/session-middleware.ts +107 -0
  180. package/src/integrations/session-request-kind.ts +18 -0
  181. package/src/integrations/session-request-middleware.ts +17 -0
  182. package/src/integrations/sign-in-body.test.node.ts +59 -0
  183. package/src/integrations/sign-in-body.ts +50 -0
  184. package/src/integrations/sign-in-middleware.ts +24 -0
  185. package/src/routes/create-admin-layout-route.tsx +48 -30
  186. package/src/routes/create-sign-in-route.tsx +10 -2
  187. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  188. package/src/server-fns/admin-account/change-password.ts +13 -2
  189. package/src/server-fns/admin-account/get.ts +2 -0
  190. package/src/server-fns/admin-account/update.ts +2 -0
  191. package/src/server-fns/admin-activity/get.ts +2 -0
  192. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  193. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  194. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  195. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  196. package/src/server-fns/admin-roles/create.ts +2 -0
  197. package/src/server-fns/admin-roles/delete.ts +2 -0
  198. package/src/server-fns/admin-roles/get.ts +2 -0
  199. package/src/server-fns/admin-roles/list.ts +5 -4
  200. package/src/server-fns/admin-roles/reorder.ts +2 -0
  201. package/src/server-fns/admin-roles/update.ts +2 -0
  202. package/src/server-fns/admin-users/create.ts +2 -0
  203. package/src/server-fns/admin-users/delete.ts +2 -0
  204. package/src/server-fns/admin-users/disable.ts +2 -0
  205. package/src/server-fns/admin-users/enable.ts +2 -0
  206. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  207. package/src/server-fns/admin-users/get.ts +2 -0
  208. package/src/server-fns/admin-users/list.ts +2 -0
  209. package/src/server-fns/admin-users/set-password.ts +2 -0
  210. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  211. package/src/server-fns/admin-users/update.ts +2 -0
  212. package/src/server-fns/ai/execute.ts +3 -0
  213. package/src/server-fns/analytics/maintenance.ts +4 -0
  214. package/src/server-fns/analytics/queries.ts +14 -8
  215. package/src/server-fns/auth/current-user.ts +7 -3
  216. package/src/server-fns/auth/renew.test.node.ts +85 -0
  217. package/src/server-fns/auth/renew.ts +54 -0
  218. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  219. package/src/server-fns/auth/sign-in.ts +80 -27
  220. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  221. package/src/server-fns/auth/sign-out.ts +44 -19
  222. package/src/server-fns/collections/audit.ts +2 -0
  223. package/src/server-fns/collections/copy-to-locale.ts +3 -1
  224. package/src/server-fns/collections/create.ts +3 -1
  225. package/src/server-fns/collections/delete-locale.ts +3 -1
  226. package/src/server-fns/collections/delete.ts +3 -1
  227. package/src/server-fns/collections/duplicate.ts +3 -1
  228. package/src/server-fns/collections/get.ts +4 -1
  229. package/src/server-fns/collections/history.ts +2 -0
  230. package/src/server-fns/collections/list.ts +3 -1
  231. package/src/server-fns/collections/reindex.ts +2 -0
  232. package/src/server-fns/collections/reorder.ts +3 -1
  233. package/src/server-fns/collections/restore-version.ts +3 -1
  234. package/src/server-fns/collections/revision-input.test.node.ts +14 -0
  235. package/src/server-fns/collections/scheduled-publication.ts +14 -7
  236. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  237. package/src/server-fns/collections/stats.ts +2 -0
  238. package/src/server-fns/collections/status.ts +4 -1
  239. package/src/server-fns/collections/tree.ts +7 -1
  240. package/src/server-fns/collections/update.ts +4 -1
  241. package/src/server-fns/collections/upload-singleton.test.node.ts +8 -1
  242. package/src/server-fns/collections/upload.ts +10 -0
  243. package/src/server-fns/i18n/set-locale.ts +19 -3
  244. package/src/server-fns/preview/disable.ts +8 -4
  245. package/src/server-fns/preview/enable.ts +9 -5
  246. package/src/server-fns/singletons/cancel-scheduled-publish.ts +3 -1
  247. package/src/server-fns/singletons/change-status.ts +3 -1
  248. package/src/server-fns/singletons/confirm-scheduled-publish.ts +3 -1
  249. package/src/server-fns/singletons/copy-to-locale.ts +3 -1
  250. package/src/server-fns/singletons/find-by-version.ts +2 -0
  251. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  252. package/src/server-fns/singletons/get.ts +2 -0
  253. package/src/server-fns/singletons/history.ts +2 -0
  254. package/src/server-fns/singletons/restore-version.ts +3 -1
  255. package/src/server-fns/singletons/schedule-publish.ts +3 -1
  256. package/src/server-fns/singletons/singletons.test.node.ts +6 -0
  257. package/src/server-fns/singletons/unpublish.ts +3 -1
  258. package/src/server-fns/singletons/update.ts +3 -1
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { assertAdminActor, requireAdminActor } from "@byline/admin";
3
3
  import { ANALYTICS_ABILITIES } from "@byline/admin/analytics";
4
4
  import { getAdminRequestContext } from "@byline/client/server";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const getAnalyticsRuntime = createServerFn({
6
7
  method: 'GET'
7
- }).handler(async ()=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).handler(async ()=>{
8
11
  const context = await getAdminRequestContext();
9
12
  requireAdminActor(context, 'reading analytics runtime state');
10
13
  const { isAnalyticsRegistered } = await import("@byline/analytics");
@@ -14,35 +17,45 @@ const getAnalyticsRuntime = createServerFn({
14
17
  });
15
18
  const getAnalyticsSummary = createServerFn({
16
19
  method: 'GET'
17
- }).validator((input)=>input).handler(async ({ data })=>{
20
+ }).middleware([
21
+ adminSessionMiddleware
22
+ ]).validator((input)=>input).handler(async ({ data })=>{
18
23
  await assertAnalyticsRead();
19
24
  const { getAnalytics } = await import("@byline/analytics");
20
25
  return getAnalytics().getSummary(data);
21
26
  });
22
27
  const getAnalyticsReportCoverage = createServerFn({
23
28
  method: 'GET'
24
- }).handler(async ()=>{
29
+ }).middleware([
30
+ adminSessionMiddleware
31
+ ]).handler(async ()=>{
25
32
  await assertAnalyticsRead();
26
33
  const { getAnalytics } = await import("@byline/analytics");
27
34
  return getAnalytics().getReportCoverage();
28
35
  });
29
36
  const getAnalyticsTop = createServerFn({
30
37
  method: 'GET'
31
- }).validator((input)=>input).handler(async ({ data })=>{
38
+ }).middleware([
39
+ adminSessionMiddleware
40
+ ]).validator((input)=>input).handler(async ({ data })=>{
32
41
  await assertAnalyticsRead();
33
42
  const { getAnalytics } = await import("@byline/analytics");
34
43
  return getAnalytics().getTopPaths(data);
35
44
  });
36
45
  const getAnalyticsReferrers = createServerFn({
37
46
  method: 'GET'
38
- }).validator((input)=>input).handler(async ({ data })=>{
47
+ }).middleware([
48
+ adminSessionMiddleware
49
+ ]).validator((input)=>input).handler(async ({ data })=>{
39
50
  await assertAnalyticsRead();
40
51
  const { getAnalytics } = await import("@byline/analytics");
41
52
  return getAnalytics().getReferrers(data);
42
53
  });
43
54
  const getAnalyticsCountries = createServerFn({
44
55
  method: 'GET'
45
- }).validator((input)=>input).handler(async ({ data })=>{
56
+ }).middleware([
57
+ adminSessionMiddleware
58
+ ]).validator((input)=>input).handler(async ({ data })=>{
46
59
  await assertAnalyticsRead();
47
60
  const { getAnalytics } = await import("@byline/analytics");
48
61
  return getAnalytics().getCountries(data);
@@ -6,6 +6,7 @@
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
8
  export interface CurrentAdminUser {
9
+ sessionId: string;
9
10
  id: string;
10
11
  email: string;
11
12
  given_name: string | null;
@@ -5,11 +5,12 @@ import { bylineCore } from "../../integrations/byline-core.js";
5
5
  const getCurrentAdminUser = createServerFn({
6
6
  method: 'GET'
7
7
  }).handler(async ()=>{
8
- const { actor } = await getAdminRequestContext();
8
+ const { actor, sessionId } = await getAdminRequestContext();
9
9
  if (!actor) throw new Error('unexpected null actor after getAdminRequestContext');
10
10
  const row = await bylineCore().adminStore?.adminUsers.getById(actor.id);
11
11
  if (!row) throw new Error('admin user not found for current session');
12
12
  return {
13
+ sessionId: sessionId,
13
14
  id: row.id,
14
15
  email: row.email,
15
16
  given_name: row.given_name,
@@ -23,8 +24,9 @@ const getCurrentAdminUserSoft = createServerFn({
23
24
  }).handler(async ()=>{
24
25
  try {
25
26
  let actor;
27
+ let sessionId;
26
28
  try {
27
- ({ actor } = await getAdminRequestContext());
29
+ ({ actor, sessionId } = await getAdminRequestContext());
28
30
  } catch (err) {
29
31
  if (err instanceof AuthError) return null;
30
32
  throw err;
@@ -33,6 +35,7 @@ const getCurrentAdminUserSoft = createServerFn({
33
35
  const row = await bylineCore().adminStore?.adminUsers.getById(actor.id);
34
36
  if (!row) return null;
35
37
  return {
38
+ sessionId: sessionId,
36
39
  id: row.id,
37
40
  email: row.email,
38
41
  given_name: row.given_name,
@@ -0,0 +1,13 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ /** Explicit renewal only. Global CSRF protection applies before this POST handler. */
9
+ export declare const renewAdminSession: import("@tanstack/react-start").OptionalFetcher<undefined, (value: unknown) => {
10
+ expectedSessionId?: string;
11
+ }, Promise<{
12
+ sessionId: string;
13
+ }>>;
@@ -0,0 +1,45 @@
1
+ import { createServerFn } from "@tanstack/react-start";
2
+ import { setResponseHeader } from "@tanstack/react-start/server";
3
+ import { AuthError, ERR_SESSION_CHANGED, ERR_UNAUTHENTICATED } from "@byline/auth";
4
+ import { readAccessTokenCookie, readRefreshTokenCookie, setSessionCookies } from "@byline/client/server";
5
+ import { getServerConfig } from "@byline/core";
6
+ const renewAdminSession = createServerFn({
7
+ method: 'POST'
8
+ }).validator((value)=>{
9
+ if (null == value) return {};
10
+ if ('object' != typeof value) throw new Error('Invalid renewal input');
11
+ const sid = value.expectedSessionId;
12
+ if (void 0 !== sid && ('string' != typeof sid || !sid || sid.length > 256)) throw new Error('Invalid login identity');
13
+ return {
14
+ expectedSessionId: sid
15
+ };
16
+ }).handler(async ({ data })=>{
17
+ setResponseHeader('Cache-Control', 'no-store');
18
+ const provider = getServerConfig().sessionProvider;
19
+ if (!provider) throw new Error('no sessionProvider configured');
20
+ const access = readAccessTokenCookie();
21
+ if (access) try {
22
+ const verified = await provider.verifyAccessToken(access);
23
+ if (data.expectedSessionId && data.expectedSessionId !== verified.sessionId) throw ERR_SESSION_CHANGED({
24
+ message: 'session changed'
25
+ });
26
+ return {
27
+ sessionId: verified.sessionId
28
+ };
29
+ } catch (error) {
30
+ if (!(error instanceof AuthError) || 'ERR_ACCESS_EXPIRED' !== error.code) throw error;
31
+ }
32
+ const refreshToken = readRefreshTokenCookie();
33
+ if (!refreshToken) throw ERR_UNAUTHENTICATED({
34
+ message: 'no session to renew'
35
+ });
36
+ const tokens = await provider.refreshSession({
37
+ refreshToken,
38
+ expectedSessionId: data.expectedSessionId
39
+ });
40
+ setSessionCookies(tokens);
41
+ return {
42
+ sessionId: tokens.sessionId
43
+ };
44
+ });
45
+ export { renewAdminSession };
@@ -11,8 +11,9 @@ export interface SignInInput {
11
11
  }
12
12
  export interface SignInResult {
13
13
  userId: string;
14
+ sessionId: string;
14
15
  }
15
- export declare const adminSignIn: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SignInInput) => {
16
+ export declare const adminSignIn: import("@tanstack/react-start").OptionalFetcher<undefined, (input: unknown) => {
16
17
  email: string;
17
18
  password: string;
18
19
  }, Promise<SignInResult>>;
@@ -1,36 +1,107 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
- import { getRequestHeader } from "@tanstack/react-start/server";
3
- import { setSessionCookies } from "@byline/client/server";
2
+ import { getRequest, getRequestHeader } from "@tanstack/react-start/server";
3
+ import { readAccessTokenCookie, readRefreshTokenCookie, setSessionCookies } from "@byline/client/server";
4
4
  import { getServerConfig } from "@byline/core";
5
+ import { passwordSignInSchema } from "@byline/core/validation";
5
6
  import { readAdminLocaleCookie } from "../../i18n/locale-cookie.js";
6
7
  import { bylineCore } from "../../integrations/byline-core.js";
8
+ import { normalizeClientIp } from "../../integrations/client-ip.js";
9
+ import { wasSignInBodyChecked } from "../../integrations/sign-in-body.js";
7
10
  const adminSignIn = createServerFn({
8
11
  method: 'POST'
9
12
  }).validator((input)=>{
10
- if ('string' != typeof input?.email || 0 === input.email.length) throw new Error('email is required');
11
- if ('string' != typeof input?.password || 0 === input.password.length) throw new Error('password is required');
12
- return {
13
- email: input.email,
14
- password: input.password
15
- };
13
+ const parsed = passwordSignInSchema.safeParse(input);
14
+ if (!parsed.success) throw new Response('Invalid sign-in input', {
15
+ status: 400
16
+ });
17
+ return parsed.data;
16
18
  }).handler(async ({ data })=>{
17
19
  const provider = getServerConfig().sessionProvider;
18
20
  if (!provider) throw new Error('no sessionProvider configured');
19
- const userAgent = getRequestHeader('user-agent') ?? void 0;
20
- const forwardedFor = getRequestHeader('x-forwarded-for') ?? void 0;
21
- const ip = forwardedFor?.split(',')[0]?.trim() || void 0;
22
- const result = await provider.signInWithPassword({
23
- email: data.email,
24
- password: data.password,
25
- userAgent,
26
- ip
21
+ const request = getRequest();
22
+ const protection = getServerConfig().passwordSignIn;
23
+ if (!wasSignInBodyChecked(request)) throw new Response('Password sign-in request middleware is not configured', {
24
+ status: 503
25
+ });
26
+ if (!protection) throw new Response('Password sign-in protection is not configured', {
27
+ status: 503
27
28
  });
29
+ const userAgent = getRequestHeader('user-agent')?.slice(0, 512);
30
+ let ip;
31
+ try {
32
+ ip = normalizeClientIp(await protection.resolveClientIp(request));
33
+ } catch {
34
+ throw new Response('Client address unavailable', {
35
+ status: 503
36
+ });
37
+ }
38
+ if (!ip) throw new Response('Client address unavailable', {
39
+ status: 503
40
+ });
41
+ const tooMany = (seconds)=>new Response('Too many sign-in attempts', {
42
+ status: 429,
43
+ headers: {
44
+ 'Retry-After': String(seconds),
45
+ 'Cache-Control': 'no-store'
46
+ }
47
+ });
48
+ let release;
49
+ try {
50
+ release = await protection.limiter.acquire();
51
+ } catch {
52
+ throw new Response('Sign-in temporarily unavailable', {
53
+ status: 503
54
+ });
55
+ }
56
+ if (!release) throw tooMany(1);
57
+ const recordResult = (outcome)=>{
58
+ try {
59
+ protection.limiter.recordResult?.({
60
+ email: data.email,
61
+ ip
62
+ }, outcome);
63
+ } catch {}
64
+ };
65
+ const result = await (async ()=>{
66
+ try {
67
+ let admission;
68
+ try {
69
+ admission = await protection.limiter.consume({
70
+ email: data.email,
71
+ ip
72
+ });
73
+ } catch {
74
+ throw new Response('Sign-in temporarily unavailable', {
75
+ status: 503
76
+ });
77
+ }
78
+ if (!admission.allowed) throw tooMany(admission.retryAfterSeconds);
79
+ try {
80
+ const result = await provider.signInWithPassword({
81
+ previousAccessToken: readAccessTokenCookie(),
82
+ previousRefreshToken: readRefreshTokenCookie(),
83
+ email: data.email,
84
+ password: data.password,
85
+ userAgent,
86
+ ip
87
+ });
88
+ recordResult('success');
89
+ return result;
90
+ } catch (error) {
91
+ recordResult('failure');
92
+ throw error;
93
+ }
94
+ } finally{
95
+ release();
96
+ }
97
+ })();
28
98
  setSessionCookies(result);
29
99
  try {
30
100
  await reconcileLocaleAfterSignIn(result.actor.id);
31
101
  } catch {}
32
102
  return {
33
- userId: result.actor.id
103
+ userId: result.actor.id,
104
+ sessionId: result.sessionId
34
105
  };
35
106
  });
36
107
  async function reconcileLocaleAfterSignIn(adminUserId) {
@@ -5,6 +5,8 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const adminSignOut: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<{
8
+ export declare const adminSignOut: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterClient<{}, unknown, undefined, {
9
+ expectedSessionId: string | null;
10
+ }, undefined>], undefined, Promise<{
9
11
  status: 'ok';
10
12
  }>>;
@@ -1,14 +1,46 @@
1
- import { createServerFn } from "@tanstack/react-start";
2
- import { clearPreviewCookie, clearSessionCookies, readRefreshTokenCookie } from "@byline/client/server";
1
+ import { createMiddleware, createServerFn } from "@tanstack/react-start";
2
+ import { ERR_SESSION_CHANGED } from "@byline/auth";
3
+ import { clearPreviewCookie, clearSessionCookies, readAccessTokenCookie, readRefreshTokenCookie } from "@byline/client/server";
3
4
  import { getServerConfig } from "@byline/core";
5
+ import { coordinateAuthAction, flagSessionChanged, notifySessionAction, sessionSnapshot } from "../../integrations/session-coordination.js";
6
+ const signOutBoundary = createMiddleware({
7
+ type: 'function'
8
+ }).client(async ({ next })=>{
9
+ const snapshot = sessionSnapshot();
10
+ return coordinateAuthAction(async ()=>{
11
+ try {
12
+ const result = await next({
13
+ sendContext: {
14
+ expectedSessionId: snapshot.sessionId
15
+ }
16
+ });
17
+ notifySessionAction();
18
+ return result;
19
+ } catch (error) {
20
+ if (error?.code === 'ERR_SESSION_CHANGED') flagSessionChanged();
21
+ throw error;
22
+ }
23
+ });
24
+ });
4
25
  const adminSignOut = createServerFn({
5
26
  method: 'POST'
6
- }).handler(async ()=>{
27
+ }).middleware([
28
+ signOutBoundary
29
+ ]).handler(async ({ context })=>{
7
30
  const provider = getServerConfig().sessionProvider;
8
31
  const refreshToken = readRefreshTokenCookie();
9
- if (provider && refreshToken) try {
10
- await provider.revokeSession(refreshToken);
11
- } catch {}
32
+ const accessToken = readAccessTokenCookie();
33
+ if (refreshToken || accessToken) {
34
+ if (!provider) throw new Error('no sessionProvider configured');
35
+ if (!context.expectedSessionId) throw ERR_SESSION_CHANGED({
36
+ message: 'logout requires the page login identity'
37
+ });
38
+ await provider.revokeSession({
39
+ refreshToken,
40
+ accessToken,
41
+ expectedSessionId: context.expectedSessionId
42
+ });
43
+ }
12
44
  clearSessionCookies();
13
45
  clearPreviewCookie();
14
46
  return {
@@ -30,7 +30,9 @@ export interface AuditLogEntryDto {
30
30
  after: string | string[] | null;
31
31
  occurredAt: string;
32
32
  }
33
- export declare const getCollectionDocumentAuditLog: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
33
+ export declare const getCollectionDocumentAuditLog: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
34
+ bylineExpectedSessionId: string | null;
35
+ }, undefined, undefined>], (input: {
34
36
  collection: string;
35
37
  id: string;
36
38
  params?: AuditLogSearchParams;
@@ -2,10 +2,13 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
3
  import { ERR_NOT_FOUND, getLogger } from "@byline/core";
4
4
  import { ensureCollection } from "../../integrations/api-utils.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  import { resolveActorLabels } from "./actors.js";
6
7
  const getCollectionDocumentAuditLog = createServerFn({
7
8
  method: 'GET'
8
- }).validator((input)=>input).handler(async ({ data })=>{
9
+ }).middleware([
10
+ adminSessionMiddleware
11
+ ]).validator((input)=>input).handler(async ({ data })=>{
9
12
  const { collection: path, id, params } = data;
10
13
  const config = await ensureCollection(path);
11
14
  if (!config) throw ERR_NOT_FOUND({
@@ -1,3 +1,10 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
1
8
  import type { CopyToLocaleResult } from '@byline/core/services';
2
9
  import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
3
10
  /**
@@ -9,7 +16,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
9
16
  * `assertActorCanPerform('update')` runs inside the service; auth
10
17
  * failures propagate to TanStack Start's transport layer.
11
18
  */
12
- export declare const copyDocumentToLocale: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
19
+ export declare const copyDocumentToLocale: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
20
+ bylineExpectedSessionId: string | null;
21
+ }, undefined, undefined>], (input: {
13
22
  expectedRevision: number;
14
23
  collection: string;
15
24
  id: string;
@@ -1,13 +1,16 @@
1
- import { withDocumentMutationErrors } from "../document-mutation-errors.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminRequestContext } from "@byline/client/server";
4
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
5
4
  import { copyToLocale } from "@byline/core/services";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
7
8
  import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
8
9
  const copyDocumentToLocale = createServerFn({
9
10
  method: 'POST'
10
- }).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
14
  const { collection: path, id, sourceLocale, targetLocale, overwrite } = input;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -1,4 +1,13 @@
1
- export declare const createCollectionDocument: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ export declare const createCollectionDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
2
11
  collection: string;
3
12
  data: any;
4
13
  locale?: string;
@@ -1,13 +1,16 @@
1
- import { withDocumentMutationErrors } from "../document-mutation-errors.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminRequestContext } from "@byline/client/server";
4
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
5
4
  import { createDocument } from "@byline/core/services";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
7
8
  import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
8
9
  const createCollectionDocument = createServerFn({
9
10
  method: 'POST'
10
- }).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
14
  const { collection: path, data: documentData, locale, path: explicitPath, availableLocales } = input;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -1,3 +1,10 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
1
8
  import type { DeleteLocaleResult } from '@byline/core/services';
2
9
  import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
3
10
  /**
@@ -10,7 +17,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
10
17
  * the service; auth and validation failures propagate to TanStack Start's
11
18
  * transport layer.
12
19
  */
13
- export declare const deleteDocumentLocale: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
20
+ export declare const deleteDocumentLocale: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
21
+ bylineExpectedSessionId: string | null;
22
+ }, undefined, undefined>], (input: {
14
23
  expectedRevision: number;
15
24
  collection: string;
16
25
  id: string;
@@ -1,13 +1,16 @@
1
- import { withDocumentMutationErrors } from "../document-mutation-errors.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminRequestContext } from "@byline/client/server";
4
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
5
4
  import { deleteLocale } from "@byline/core/services";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
7
8
  import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
8
9
  const deleteDocumentLocale = createServerFn({
9
10
  method: 'POST'
10
- }).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
14
  const { collection: path, id, locale } = input;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -1,4 +1,13 @@
1
- export declare const deleteDocument: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ export declare const deleteDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
2
11
  expectedRevision: number;
3
12
  collection: string;
4
13
  id: string;
@@ -1,13 +1,16 @@
1
- import { withDocumentMutationErrors } from "../document-mutation-errors.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminRequestContext } from "@byline/client/server";
4
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig, getUploadFields } from "@byline/core";
5
4
  import { deleteDocument } from "@byline/core/services";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
7
8
  import { toDeleteDocumentResponse } from "./delete-outcome.js";
8
9
  const delete_deleteDocument = createServerFn({
9
10
  method: 'POST'
10
- }).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
14
  const { collection: path, id } = input;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -1,3 +1,10 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
1
8
  import type { DuplicateDocumentResult } from '@byline/core/services';
2
9
  import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
3
10
  /**
@@ -11,7 +18,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
11
18
  * `assertActorCanPerform(..., 'create')`; any auth failure propagates to
12
19
  * TanStack Start's transport layer for the client to branch on.
13
20
  */
14
- export declare const duplicateCollectionDocument: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
21
+ export declare const duplicateCollectionDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
22
+ bylineExpectedSessionId: string | null;
23
+ }, undefined, undefined>], (input: {
15
24
  expectedRevision: number;
16
25
  collection: string;
17
26
  id: string;
@@ -1,13 +1,16 @@
1
- import { withDocumentMutationErrors } from "../document-mutation-errors.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminRequestContext } from "@byline/client/server";
4
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
5
4
  import { duplicateDocument } from "@byline/core/services";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
7
8
  import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
8
9
  const duplicateCollectionDocument = createServerFn({
9
10
  method: 'POST'
10
- }).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
11
14
  const { collection: path, id: sourceDocumentId } = input;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -1,3 +1,10 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
1
8
  /**
2
9
  * Fetch a single document by ID. Returns `null` when the document is not found
3
10
  * so callers can degrade gracefully (e.g. `notFound()`).
@@ -1,13 +1,16 @@
1
- import { withEditableRevision } from "../editable-revision.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getAdminBylineClient, getAdminRequestContext } from "@byline/client/server";
4
3
  import { BylineError, ERR_NOT_FOUND, ErrorCodes, documentAbilityKey, getCollectionSchemasForPath, getLogger, getServerConfig } from "@byline/core";
5
4
  import { ensureCollection } from "../../integrations/api-utils.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
6
6
  import { resolveAdminDocumentRead } from "../admin-document-presentation.js";
7
+ import { withEditableRevision } from "../editable-revision.js";
7
8
  import { serialise } from "./utils.js";
8
9
  const getDocumentFn = createServerFn({
9
10
  method: 'GET'
10
- }).validator((input)=>input).handler(async ({ data })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(async ({ data })=>{
11
14
  const { collection: path, id, locale, depth, populateRelations } = data;
12
15
  const logger = getLogger();
13
16
  const config = await ensureCollection(path);
@@ -88,7 +91,9 @@ const getDocumentFn = createServerFn({
88
91
  });
89
92
  const getDocumentByVersionFn = createServerFn({
90
93
  method: 'GET'
91
- }).validator((input)=>input).handler(async ({ data })=>{
94
+ }).middleware([
95
+ adminSessionMiddleware
96
+ ]).validator((input)=>input).handler(async ({ data })=>{
92
97
  const { collection: path, versionId, locale } = data;
93
98
  const resolvedLocale = locale ?? 'all';
94
99
  const logger = getLogger();