@byline/host-tanstack-start 5.0.0 → 5.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 (252) 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/session-change-boundary.d.ts +14 -0
  4. package/dist/admin-shell/chrome/session-change-boundary.js +87 -0
  5. package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
  6. package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
  7. package/dist/admin-shell/chrome/sign-in-page.js +60 -3
  8. package/dist/integrations/byline-admin-services.js +7 -1
  9. package/dist/integrations/client-ip.d.ts +19 -0
  10. package/dist/integrations/client-ip.js +34 -0
  11. package/dist/integrations/session-coordination.d.ts +24 -0
  12. package/dist/integrations/session-coordination.js +85 -0
  13. package/dist/integrations/session-middleware.d.ts +11 -0
  14. package/dist/integrations/session-middleware.js +94 -0
  15. package/dist/integrations/session-request-kind.d.ts +9 -0
  16. package/dist/integrations/session-request-kind.js +10 -0
  17. package/dist/integrations/session-request-middleware.d.ts +9 -0
  18. package/dist/integrations/session-request-middleware.js +7 -0
  19. package/dist/integrations/sign-in-body.d.ts +12 -0
  20. package/dist/integrations/sign-in-body.js +52 -0
  21. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  22. package/dist/integrations/sign-in-middleware.js +10 -0
  23. package/dist/routes/create-admin-layout-route.js +46 -31
  24. package/dist/routes/create-sign-in-route.js +4 -2
  25. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  26. package/dist/server-fns/admin-account/change-password.js +9 -3
  27. package/dist/server-fns/admin-account/get.d.ts +3 -1
  28. package/dist/server-fns/admin-account/get.js +4 -1
  29. package/dist/server-fns/admin-account/index.d.ts +5 -5
  30. package/dist/server-fns/admin-account/update.d.ts +3 -1
  31. package/dist/server-fns/admin-account/update.js +4 -1
  32. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  33. package/dist/server-fns/admin-activity/get.js +4 -1
  34. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  35. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  36. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  37. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  38. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  39. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  40. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  41. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  42. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  43. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  44. package/dist/server-fns/admin-roles/create.js +4 -1
  45. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  46. package/dist/server-fns/admin-roles/delete.js +4 -1
  47. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  48. package/dist/server-fns/admin-roles/get.js +4 -1
  49. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  50. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  51. package/dist/server-fns/admin-roles/list.js +4 -1
  52. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  53. package/dist/server-fns/admin-roles/reorder.js +4 -1
  54. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  55. package/dist/server-fns/admin-roles/update.js +4 -1
  56. package/dist/server-fns/admin-users/create.d.ts +3 -1
  57. package/dist/server-fns/admin-users/create.js +4 -1
  58. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  59. package/dist/server-fns/admin-users/delete.js +4 -1
  60. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  61. package/dist/server-fns/admin-users/disable.js +4 -1
  62. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  63. package/dist/server-fns/admin-users/enable.js +4 -1
  64. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  65. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  66. package/dist/server-fns/admin-users/get.d.ts +3 -1
  67. package/dist/server-fns/admin-users/get.js +4 -1
  68. package/dist/server-fns/admin-users/index.d.ts +10 -10
  69. package/dist/server-fns/admin-users/list.d.ts +3 -1
  70. package/dist/server-fns/admin-users/list.js +4 -1
  71. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  72. package/dist/server-fns/admin-users/set-password.js +4 -1
  73. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  74. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  75. package/dist/server-fns/admin-users/update.d.ts +3 -1
  76. package/dist/server-fns/admin-users/update.js +4 -1
  77. package/dist/server-fns/ai/execute.d.ts +3 -1
  78. package/dist/server-fns/ai/execute.js +4 -1
  79. package/dist/server-fns/ai/index.d.ts +1 -1
  80. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  81. package/dist/server-fns/analytics/maintenance.js +7 -2
  82. package/dist/server-fns/analytics/queries.d.ts +18 -6
  83. package/dist/server-fns/analytics/queries.js +19 -6
  84. package/dist/server-fns/auth/current-user.d.ts +1 -0
  85. package/dist/server-fns/auth/current-user.js +5 -2
  86. package/dist/server-fns/auth/renew.d.ts +13 -0
  87. package/dist/server-fns/auth/renew.js +45 -0
  88. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  89. package/dist/server-fns/auth/sign-in.js +88 -17
  90. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  91. package/dist/server-fns/auth/sign-out.js +38 -6
  92. package/dist/server-fns/collections/audit.d.ts +3 -1
  93. package/dist/server-fns/collections/audit.js +4 -1
  94. package/dist/server-fns/collections/copy-to-locale.d.ts +10 -1
  95. package/dist/server-fns/collections/copy-to-locale.js +5 -2
  96. package/dist/server-fns/collections/create.d.ts +10 -1
  97. package/dist/server-fns/collections/create.js +5 -2
  98. package/dist/server-fns/collections/delete-locale.d.ts +10 -1
  99. package/dist/server-fns/collections/delete-locale.js +5 -2
  100. package/dist/server-fns/collections/delete.d.ts +10 -1
  101. package/dist/server-fns/collections/delete.js +5 -2
  102. package/dist/server-fns/collections/duplicate.d.ts +10 -1
  103. package/dist/server-fns/collections/duplicate.js +5 -2
  104. package/dist/server-fns/collections/get.d.ts +7 -0
  105. package/dist/server-fns/collections/get.js +8 -3
  106. package/dist/server-fns/collections/history.d.ts +3 -1
  107. package/dist/server-fns/collections/history.js +4 -1
  108. package/dist/server-fns/collections/index.d.ts +21 -21
  109. package/dist/server-fns/collections/list.d.ts +10 -1
  110. package/dist/server-fns/collections/list.js +5 -2
  111. package/dist/server-fns/collections/reindex.d.ts +3 -1
  112. package/dist/server-fns/collections/reindex.js +4 -1
  113. package/dist/server-fns/collections/reorder.d.ts +10 -1
  114. package/dist/server-fns/collections/reorder.js +5 -2
  115. package/dist/server-fns/collections/restore-version.d.ts +10 -1
  116. package/dist/server-fns/collections/restore-version.js +5 -2
  117. package/dist/server-fns/collections/scheduled-publication.d.ts +22 -5
  118. package/dist/server-fns/collections/scheduled-publication.js +17 -6
  119. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  120. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  121. package/dist/server-fns/collections/stats.js +4 -1
  122. package/dist/server-fns/collections/status.d.ts +13 -2
  123. package/dist/server-fns/collections/status.js +8 -3
  124. package/dist/server-fns/collections/tree.d.ts +22 -5
  125. package/dist/server-fns/collections/tree.js +17 -6
  126. package/dist/server-fns/collections/update.d.ts +13 -2
  127. package/dist/server-fns/collections/update.js +8 -3
  128. package/dist/server-fns/collections/upload.d.ts +10 -1
  129. package/dist/server-fns/collections/upload.js +4 -1
  130. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  131. package/dist/server-fns/i18n/set-locale.js +18 -3
  132. package/dist/server-fns/preview/disable.d.ts +3 -1
  133. package/dist/server-fns/preview/disable.js +4 -1
  134. package/dist/server-fns/preview/enable.d.ts +3 -1
  135. package/dist/server-fns/preview/enable.js +4 -1
  136. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +10 -1
  137. package/dist/server-fns/singletons/cancel-scheduled-publish.js +5 -2
  138. package/dist/server-fns/singletons/change-status.d.ts +10 -1
  139. package/dist/server-fns/singletons/change-status.js +5 -2
  140. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +10 -1
  141. package/dist/server-fns/singletons/confirm-scheduled-publish.js +5 -2
  142. package/dist/server-fns/singletons/copy-to-locale.d.ts +10 -1
  143. package/dist/server-fns/singletons/copy-to-locale.js +5 -2
  144. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  145. package/dist/server-fns/singletons/find-by-version.js +4 -1
  146. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  147. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  148. package/dist/server-fns/singletons/get.d.ts +3 -1
  149. package/dist/server-fns/singletons/get.js +4 -1
  150. package/dist/server-fns/singletons/history.d.ts +3 -1
  151. package/dist/server-fns/singletons/history.js +4 -1
  152. package/dist/server-fns/singletons/restore-version.d.ts +10 -1
  153. package/dist/server-fns/singletons/restore-version.js +5 -2
  154. package/dist/server-fns/singletons/schedule-publish.d.ts +10 -1
  155. package/dist/server-fns/singletons/schedule-publish.js +5 -2
  156. package/dist/server-fns/singletons/unpublish.d.ts +10 -1
  157. package/dist/server-fns/singletons/unpublish.js +5 -2
  158. package/dist/server-fns/singletons/update.d.ts +10 -1
  159. package/dist/server-fns/singletons/update.js +5 -2
  160. package/package.json +19 -19
  161. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  162. package/src/admin-shell/chrome/session-change-boundary.test.tsx +78 -0
  163. package/src/admin-shell/chrome/session-change-boundary.tsx +94 -0
  164. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  165. package/src/integrations/byline-admin-services.ts +7 -1
  166. package/src/integrations/client-ip.test.node.ts +45 -0
  167. package/src/integrations/client-ip.ts +54 -0
  168. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  169. package/src/integrations/session-client.test.node.ts +121 -0
  170. package/src/integrations/session-coordination.test.node.ts +77 -0
  171. package/src/integrations/session-coordination.ts +96 -0
  172. package/src/integrations/session-middleware.test.node.ts +87 -0
  173. package/src/integrations/session-middleware.ts +107 -0
  174. package/src/integrations/session-request-kind.ts +18 -0
  175. package/src/integrations/session-request-middleware.ts +17 -0
  176. package/src/integrations/sign-in-body.test.node.ts +59 -0
  177. package/src/integrations/sign-in-body.ts +50 -0
  178. package/src/integrations/sign-in-middleware.ts +24 -0
  179. package/src/routes/create-admin-layout-route.tsx +48 -30
  180. package/src/routes/create-sign-in-route.tsx +10 -2
  181. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  182. package/src/server-fns/admin-account/change-password.ts +13 -2
  183. package/src/server-fns/admin-account/get.ts +2 -0
  184. package/src/server-fns/admin-account/update.ts +2 -0
  185. package/src/server-fns/admin-activity/get.ts +2 -0
  186. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  187. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  188. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  189. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  190. package/src/server-fns/admin-roles/create.ts +2 -0
  191. package/src/server-fns/admin-roles/delete.ts +2 -0
  192. package/src/server-fns/admin-roles/get.ts +2 -0
  193. package/src/server-fns/admin-roles/list.ts +5 -4
  194. package/src/server-fns/admin-roles/reorder.ts +2 -0
  195. package/src/server-fns/admin-roles/update.ts +2 -0
  196. package/src/server-fns/admin-users/create.ts +2 -0
  197. package/src/server-fns/admin-users/delete.ts +2 -0
  198. package/src/server-fns/admin-users/disable.ts +2 -0
  199. package/src/server-fns/admin-users/enable.ts +2 -0
  200. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  201. package/src/server-fns/admin-users/get.ts +2 -0
  202. package/src/server-fns/admin-users/list.ts +2 -0
  203. package/src/server-fns/admin-users/set-password.ts +2 -0
  204. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  205. package/src/server-fns/admin-users/update.ts +2 -0
  206. package/src/server-fns/ai/execute.ts +3 -0
  207. package/src/server-fns/analytics/maintenance.ts +4 -0
  208. package/src/server-fns/analytics/queries.ts +14 -8
  209. package/src/server-fns/auth/current-user.ts +7 -3
  210. package/src/server-fns/auth/renew.test.node.ts +85 -0
  211. package/src/server-fns/auth/renew.ts +54 -0
  212. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  213. package/src/server-fns/auth/sign-in.ts +80 -27
  214. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  215. package/src/server-fns/auth/sign-out.ts +44 -19
  216. package/src/server-fns/collections/audit.ts +2 -0
  217. package/src/server-fns/collections/copy-to-locale.ts +3 -1
  218. package/src/server-fns/collections/create.ts +3 -1
  219. package/src/server-fns/collections/delete-locale.ts +3 -1
  220. package/src/server-fns/collections/delete.ts +3 -1
  221. package/src/server-fns/collections/duplicate.ts +3 -1
  222. package/src/server-fns/collections/get.ts +4 -1
  223. package/src/server-fns/collections/history.ts +2 -0
  224. package/src/server-fns/collections/list.ts +3 -1
  225. package/src/server-fns/collections/reindex.ts +2 -0
  226. package/src/server-fns/collections/reorder.ts +3 -1
  227. package/src/server-fns/collections/restore-version.ts +3 -1
  228. package/src/server-fns/collections/revision-input.test.node.ts +14 -0
  229. package/src/server-fns/collections/scheduled-publication.ts +14 -7
  230. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  231. package/src/server-fns/collections/stats.ts +2 -0
  232. package/src/server-fns/collections/status.ts +4 -1
  233. package/src/server-fns/collections/tree.ts +7 -1
  234. package/src/server-fns/collections/update.ts +4 -1
  235. package/src/server-fns/collections/upload-singleton.test.node.ts +8 -1
  236. package/src/server-fns/collections/upload.ts +10 -0
  237. package/src/server-fns/i18n/set-locale.ts +19 -3
  238. package/src/server-fns/preview/disable.ts +8 -4
  239. package/src/server-fns/preview/enable.ts +9 -5
  240. package/src/server-fns/singletons/cancel-scheduled-publish.ts +3 -1
  241. package/src/server-fns/singletons/change-status.ts +3 -1
  242. package/src/server-fns/singletons/confirm-scheduled-publish.ts +3 -1
  243. package/src/server-fns/singletons/copy-to-locale.ts +3 -1
  244. package/src/server-fns/singletons/find-by-version.ts +2 -0
  245. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  246. package/src/server-fns/singletons/get.ts +2 -0
  247. package/src/server-fns/singletons/history.ts +2 -0
  248. package/src/server-fns/singletons/restore-version.ts +3 -1
  249. package/src/server-fns/singletons/schedule-publish.ts +3 -1
  250. package/src/server-fns/singletons/singletons.test.node.ts +6 -0
  251. package/src/server-fns/singletons/unpublish.ts +3 -1
  252. package/src/server-fns/singletons/update.ts +3 -1
@@ -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();
@@ -13,7 +13,9 @@ export interface HistorySearchParams {
13
13
  desc?: boolean;
14
14
  locale?: string;
15
15
  }
16
- export declare const getCollectionDocumentHistory: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
16
+ export declare const getCollectionDocumentHistory: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
17
+ bylineExpectedSessionId: string | null;
18
+ }, undefined, undefined>], (input: {
17
19
  collection: string;
18
20
  id: string;
19
21
  params: HistorySearchParams;
@@ -2,11 +2,14 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
3
  import { ERR_NOT_FOUND, getCollectionSchemasForPath, 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
  import { serialise } from "./utils.js";
7
8
  const getCollectionDocumentHistory = createServerFn({
8
9
  method: 'GET'
9
- }).validator((input)=>input).handler(async ({ data })=>{
10
+ }).middleware([
11
+ adminSessionMiddleware
12
+ ]).validator((input)=>input).handler(async ({ data })=>{
10
13
  const { collection: path, id, params } = data;
11
14
  const config = await ensureCollection(path);
12
15
  if (!config) throw ERR_NOT_FOUND({
@@ -4,24 +4,24 @@
4
4
  * Each module is self-contained: it defines the TanStack Start server
5
5
  * function and exports a clean public API.
6
6
  */
7
- export * from './audit';
8
- export * from './copy-to-locale';
9
- export * from './create';
10
- export * from './delete';
11
- export * from './delete-locale';
12
- export * from './delete-outcome';
13
- export * from './duplicate';
14
- export * from './get';
15
- export * from './history';
16
- export * from './list';
17
- export * from './reindex';
18
- export * from './reorder';
19
- export * from './restore-version';
20
- export * from './save-outcome';
21
- export * from './scheduled-publication';
22
- export * from './set-list-view-preference';
23
- export * from './stats';
24
- export * from './status';
25
- export * from './tree';
26
- export * from './update';
27
- export * from './upload';
7
+ export * from './audit.js';
8
+ export * from './copy-to-locale.js';
9
+ export * from './create.js';
10
+ export * from './delete.js';
11
+ export * from './delete-locale.js';
12
+ export * from './delete-outcome.js';
13
+ export * from './duplicate.js';
14
+ export * from './get.js';
15
+ export * from './history.js';
16
+ export * from './list.js';
17
+ export * from './reindex.js';
18
+ export * from './reorder.js';
19
+ export * from './restore-version.js';
20
+ export * from './save-outcome.js';
21
+ export * from './scheduled-publication.js';
22
+ export * from './set-list-view-preference.js';
23
+ export * from './stats.js';
24
+ export * from './status.js';
25
+ export * from './tree.js';
26
+ export * from './update.js';
27
+ export * from './upload.js';
@@ -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
  export interface CollectionSearchParams {
2
9
  page?: number;
3
10
  page_size?: number;
@@ -8,7 +15,9 @@ export interface CollectionSearchParams {
8
15
  status?: string;
9
16
  fields?: string[];
10
17
  }
11
- export declare const getCollectionDocuments: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
18
+ export declare const getCollectionDocuments: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
19
+ bylineExpectedSessionId: string | null;
20
+ }, undefined, undefined>], (input: {
12
21
  collection: string;
13
22
  params: CollectionSearchParams;
14
23
  }) => {
@@ -1,15 +1,18 @@
1
- import { withEditableRevision } from "../editable-revision.js";
2
1
  import { createServerFn } from "@tanstack/react-start";
3
2
  import { getPreferenceCommand } from "@byline/admin/admin-preferences";
4
3
  import { getAdminBylineClient, getAdminRequestContext } from "@byline/client/server";
5
4
  import { ERR_NOT_FOUND, buildRelationSummaryPopulateMap, getCollectionAdminConfig, getCollectionDefinition, getCollectionSchemasForPath, getLogger, getServerConfig } from "@byline/core";
6
5
  import { ensureCollection } from "../../integrations/api-utils.js";
7
6
  import { bylineCore } from "../../integrations/byline-core.js";
7
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
8
+ import { withEditableRevision } from "../editable-revision.js";
8
9
  import { resolveListViewState, sortableFieldNames } from "./list-view-state.js";
9
10
  import { serialise } from "./utils.js";
10
11
  const getCollectionDocuments = createServerFn({
11
12
  method: 'GET'
12
- }).validator((input)=>input).handler(async ({ data })=>{
13
+ }).middleware([
14
+ adminSessionMiddleware
15
+ ]).validator((input)=>input).handler(async ({ data })=>{
13
16
  const { collection: path, params } = data;
14
17
  const config = await ensureCollection(path);
15
18
  if (!config) throw ERR_NOT_FOUND({
@@ -7,7 +7,9 @@
7
7
  */
8
8
  import type { ReindexResult } from '@byline/client';
9
9
  export type { ReindexResult };
10
- export declare const reindexCollection: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
10
+ export declare const reindexCollection: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
11
+ bylineExpectedSessionId: string | null;
12
+ }, undefined, undefined>], (input: {
11
13
  collection: string;
12
14
  }) => {
13
15
  collection: string;
@@ -2,9 +2,12 @@ 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
  const reindexCollection = createServerFn({
6
7
  method: 'POST'
7
- }).validator((input)=>input).handler(async ({ data })=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(async ({ data })=>{
8
11
  const { collection } = data;
9
12
  const config = await ensureCollection(collection);
10
13
  if (!config) throw ERR_NOT_FOUND({
@@ -1,4 +1,13 @@
1
- export declare const reorderCollectionDocument: 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 reorderCollectionDocument: 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
  documentId: string;