@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
@@ -0,0 +1,94 @@
1
+ import { createMiddleware } from "@tanstack/react-start";
2
+ import { getRequest, setResponseHeader } from "@tanstack/react-start/server";
3
+ import { AuthError, ERR_ACCESS_EXPIRED, ERR_SESSION_CHANGED, ERR_UNAUTHENTICATED } from "@byline/auth";
4
+ import { getAdminRequestContext } from "@byline/client/server";
5
+ import { renewAdminSession } from "../server-fns/auth/renew.js";
6
+ import { coordinateAuthAction, flagSessionChanged, observeSession, renewSingleFlight, requireUnchanged, sessionSnapshot } from "./session-coordination.js";
7
+ import { sessionRequestKind } from "./session-request-kind.js";
8
+ const outcomeHeader = 'x-byline-auth-boundary';
9
+ const adminSessionMiddleware = createMiddleware({
10
+ type: 'function'
11
+ }).client(async ({ next })=>{
12
+ if ("u" < typeof window) return next({
13
+ sendContext: {
14
+ bylineExpectedSessionId: null
15
+ }
16
+ });
17
+ const snapshot = sessionSnapshot();
18
+ requireUnchanged(snapshot);
19
+ return next({
20
+ sendContext: {
21
+ bylineExpectedSessionId: snapshot.sessionId
22
+ },
23
+ fetch: async (input, init)=>{
24
+ const reusable = !(input instanceof Request) && !(init?.body instanceof ReadableStream);
25
+ let response = await fetch(input, init);
26
+ if ('changed' === response.headers.get(outcomeHeader)) {
27
+ flagSessionChanged();
28
+ throw ERR_SESSION_CHANGED({
29
+ message: 'session changed'
30
+ });
31
+ }
32
+ if ('renew' === response.headers.get(outcomeHeader)) {
33
+ requireUnchanged(snapshot);
34
+ await renewSingleFlight(()=>coordinateAuthAction(async ()=>{
35
+ const result = await renewAdminSession({
36
+ data: {
37
+ expectedSessionId: snapshot.sessionId ?? void 0
38
+ }
39
+ }).catch((error)=>{
40
+ if (error?.code === 'ERR_SESSION_CHANGED') flagSessionChanged();
41
+ throw error;
42
+ });
43
+ if (snapshot.sessionId && result.sessionId !== snapshot.sessionId) {
44
+ flagSessionChanged();
45
+ throw ERR_SESSION_CHANGED({
46
+ message: 'session changed during renewal'
47
+ });
48
+ }
49
+ observeSession(result.sessionId);
50
+ }));
51
+ requireUnchanged(snapshot);
52
+ if (!reusable) throw ERR_ACCESS_EXPIRED({
53
+ message: 'Session renewed. Please retry the operation.'
54
+ });
55
+ response = await fetch(input, init);
56
+ if ('changed' === response.headers.get(outcomeHeader)) flagSessionChanged();
57
+ }
58
+ requireUnchanged(snapshot);
59
+ return response;
60
+ }
61
+ });
62
+ }).server(async ({ next, context, method })=>{
63
+ const kind = sessionRequestKind(getRequest());
64
+ if (!kind) throw new Error('sessionRequestMiddleware is not configured');
65
+ let auth;
66
+ try {
67
+ auth = await getAdminRequestContext();
68
+ } catch (error) {
69
+ if (error instanceof AuthError && 'ERR_ACCESS_EXPIRED' === error.code) setResponseHeader(outcomeHeader, 'renew');
70
+ throw error;
71
+ }
72
+ const expected = context.bylineExpectedSessionId;
73
+ if (('serverFn' === kind || 'GET' !== method) && (!expected || expected !== auth.sessionId)) {
74
+ setResponseHeader(outcomeHeader, 'changed');
75
+ throw ERR_SESSION_CHANGED({
76
+ message: 'session changed before operation'
77
+ });
78
+ }
79
+ if (!auth.sessionId) throw ERR_UNAUTHENTICATED({
80
+ message: 'provider omitted login identity'
81
+ });
82
+ try {
83
+ const result = await next();
84
+ const response = result.result;
85
+ if (response instanceof Response) response.headers.delete(outcomeHeader);
86
+ return result;
87
+ } catch (error) {
88
+ if (error instanceof Response) error.headers.delete(outcomeHeader);
89
+ throw error;
90
+ } finally{
91
+ setResponseHeader(outcomeHeader, 'handled');
92
+ }
93
+ });
94
+ export { adminSessionMiddleware };
@@ -0,0 +1,9 @@
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 function recordSessionRequestKind(request: object, kind: string): void;
9
+ export declare function sessionRequestKind(request: object): string | undefined;
@@ -0,0 +1,10 @@
1
+ const key = Symbol.for('byline.sessionRequestKinds');
2
+ const kinds = globalThis[key] ?? new WeakMap();
3
+ globalThis[key] = kinds;
4
+ function recordSessionRequestKind(request, kind) {
5
+ kinds.set(request, kind);
6
+ }
7
+ function sessionRequestKind(request) {
8
+ return kinds.get(request);
9
+ }
10
+ export { recordSessionRequestKind, sessionRequestKind };
@@ -0,0 +1,9 @@
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
+ /** Register after CSRF. Classifies SSR separately from remotely invoked business functions. */
9
+ export declare const sessionRequestMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
@@ -0,0 +1,7 @@
1
+ import { createMiddleware } from "@tanstack/react-start";
2
+ import { recordSessionRequestKind } from "./session-request-kind.js";
3
+ const sessionRequestMiddleware = createMiddleware().server(async (ctx)=>{
4
+ recordSessionRequestKind(ctx.request, ctx.handlerType);
5
+ return ctx.next();
6
+ });
7
+ export { sessionRequestMiddleware };
@@ -0,0 +1,12 @@
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
+ /** Limit the serialized RPC envelope, not just its eventual credential fields. */
9
+ export declare const SIGN_IN_MAX_BODY_BYTES: number;
10
+ export declare function wasSignInBodyChecked(request: Request): boolean;
11
+ /** Read a bounded clone before Start parses the original. Never await tee cancellation. */
12
+ export declare function checkSignInBody(request: Request): Promise<Response | undefined>;
@@ -0,0 +1,52 @@
1
+ const SIGN_IN_MAX_BODY_BYTES = 16384;
2
+ const checked = new WeakSet();
3
+ function wasSignInBodyChecked(request) {
4
+ return checked.has(request);
5
+ }
6
+ async function checkSignInBody(request) {
7
+ if ('POST' !== request.method) return new Response('Method not allowed', {
8
+ status: 405,
9
+ headers: {
10
+ Allow: 'POST'
11
+ }
12
+ });
13
+ if (!request.headers.get('content-type')?.toLowerCase().startsWith('application/json')) return new Response('Expected JSON', {
14
+ status: 415
15
+ });
16
+ const declared = request.headers.get('content-length');
17
+ if (null !== declared && (!/^\d+$/.test(declared) || Number(declared) > SIGN_IN_MAX_BODY_BYTES)) return new Response('Payload too large', {
18
+ status: 413
19
+ });
20
+ const reader = request.clone().body?.getReader();
21
+ if (!reader) return new Response('Missing body', {
22
+ status: 400
23
+ });
24
+ let timer;
25
+ const deadline = new Promise((_, reject)=>{
26
+ timer = setTimeout(()=>reject(new Error('Body timeout')), 5000);
27
+ });
28
+ try {
29
+ let size = 0;
30
+ while(true){
31
+ const { value, done } = await Promise.race([
32
+ reader.read(),
33
+ deadline
34
+ ]);
35
+ if (done) break;
36
+ size += value.byteLength;
37
+ if (size > SIGN_IN_MAX_BODY_BYTES) return new Response('Payload too large', {
38
+ status: 413
39
+ });
40
+ }
41
+ checked.add(request);
42
+ return;
43
+ } catch {
44
+ return new Response('Incomplete request body', {
45
+ status: 408
46
+ });
47
+ } finally{
48
+ clearTimeout(timer);
49
+ reader.cancel().catch(()=>{});
50
+ }
51
+ }
52
+ export { SIGN_IN_MAX_BODY_BYTES, checkSignInBody, wasSignInBodyChecked };
@@ -0,0 +1,9 @@
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
+ /** Register after CSRF in Start's global requestMiddleware, before RPC deserialization. */
9
+ export declare const passwordSignInMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
@@ -0,0 +1,10 @@
1
+ import { createMiddleware } from "@tanstack/react-start";
2
+ import { adminSignIn } from "../server-fns/auth/sign-in.js";
3
+ import { checkSignInBody } from "./sign-in-body.js";
4
+ const passwordSignInMiddleware = createMiddleware().server(async (ctx)=>{
5
+ const endpoint = new URL(adminSignIn.url, ctx.request.url).pathname.replace(/\/$/, '');
6
+ if ('serverFn' !== ctx.handlerType || ctx.pathname !== endpoint && !ctx.pathname.startsWith(`${endpoint}/`)) return ctx.next();
7
+ const rejected = await checkSignInBody(ctx.request);
8
+ return rejected ?? ctx.next();
9
+ });
10
+ export { passwordSignInMiddleware };
@@ -14,10 +14,12 @@ import { AdminMenuProvider } from "../admin-shell/chrome/admin-menu-provider.js"
14
14
  import { Content } from "../admin-shell/chrome/content.js";
15
15
  import { RouteError, RouteNotFound } from "../admin-shell/chrome/route-error.js";
16
16
  import { RouteProgressBar } from "../admin-shell/chrome/route-progress-bar.js";
17
+ import { SessionChangeBoundary } from "../admin-shell/chrome/session-change-boundary.js";
17
18
  import { buildLocaleDefinitions } from "../i18n/locale-definitions.js";
18
19
  import { bylineAdminServices } from "../integrations/byline-admin-services.js";
19
20
  import { BylineAiAdminProvider } from "../integrations/byline-ai.js";
20
21
  import { bylineFieldServices } from "../integrations/byline-field-services.js";
22
+ import { observeSession, sessionIsChanged } from "../integrations/session-coordination.js";
21
23
  import { getAnalyticsRuntime } from "../server-fns/analytics/index.js";
22
24
  import { getCurrentAdminUser } from "../server-fns/auth/index.js";
23
25
  import { getScheduledPublicationRuntime } from "../server-fns/collections/index.js";
@@ -29,6 +31,7 @@ function createAdminLayoutRoute(path) {
29
31
  const signInPath = getSignInRoutePath();
30
32
  try {
31
33
  const user = await getCurrentAdminUser();
34
+ if ("u" > typeof window) observeSession(user.sessionId);
32
35
  const [activeLocale, scheduledPublicationRuntime, analyticsRuntime] = await Promise.all([
33
36
  getActiveLocaleFn(),
34
37
  getScheduledPublicationRuntime(),
@@ -40,7 +43,16 @@ function createAdminLayoutRoute(path) {
40
43
  scheduledPublicationRuntime,
41
44
  analyticsRuntime
42
45
  };
43
- } catch {
46
+ } catch (error) {
47
+ const code = error?.code;
48
+ if (!("u" > typeof window && sessionIsChanged()) && ![
49
+ 'ERR_UNAUTHENTICATED',
50
+ 'ERR_ACCESS_EXPIRED',
51
+ 'ERR_INVALID_TOKEN',
52
+ 'ERR_REVOKED_TOKEN',
53
+ 'ERR_ACCOUNT_DISABLED',
54
+ 'ERR_SESSION_CHANGED'
55
+ ].includes(code ?? '')) throw error;
44
56
  throw redirect({
45
57
  to: signInPath,
46
58
  search: {
@@ -64,36 +76,39 @@ function createAdminLayoutRoute(path) {
64
76
  });
65
77
  window.location.reload();
66
78
  };
67
- return /*#__PURE__*/ jsx(I18nProvider, {
68
- bundle: i18n.translations ?? {},
69
- activeLocale: activeLocale,
70
- defaultLocale: i18n.admin.defaultLocale,
71
- localeDefinitions: localeDefinitions,
72
- setLocale: handleSetLocale,
73
- children: /*#__PURE__*/ jsx(BylineAdminServicesProvider, {
74
- services: bylineAdminServices,
75
- children: /*#__PURE__*/ jsx(BylineFieldServicesProvider, {
76
- services: bylineFieldServices,
77
- children: /*#__PURE__*/ jsx(BylineAiAdminProvider, {
78
- children: /*#__PURE__*/ jsxs(AdminMenuProvider, {
79
- children: [
80
- /*#__PURE__*/ jsx(RouteProgressBar, {}),
81
- /*#__PURE__*/ jsx(AdminAppBar, {
82
- user: user
83
- }),
84
- /*#__PURE__*/ jsxs("main", {
85
- className: clsx('byline-admin-layout-main', admin_layout_module.main),
86
- children: [
87
- /*#__PURE__*/ jsx(AdminMenuDrawer, {
88
- analyticsEnabled: analyticsRuntime.enabled,
89
- scheduledPublicationEnabled: scheduledPublicationRuntime.enabled
90
- }),
91
- /*#__PURE__*/ jsx(Content, {
92
- children: /*#__PURE__*/ jsx(Outlet, {})
93
- })
94
- ]
95
- })
96
- ]
79
+ return /*#__PURE__*/ jsx(SessionChangeBoundary, {
80
+ user: user,
81
+ children: /*#__PURE__*/ jsx(I18nProvider, {
82
+ bundle: i18n.translations ?? {},
83
+ activeLocale: activeLocale,
84
+ defaultLocale: i18n.admin.defaultLocale,
85
+ localeDefinitions: localeDefinitions,
86
+ setLocale: handleSetLocale,
87
+ children: /*#__PURE__*/ jsx(BylineAdminServicesProvider, {
88
+ services: bylineAdminServices,
89
+ children: /*#__PURE__*/ jsx(BylineFieldServicesProvider, {
90
+ services: bylineFieldServices,
91
+ children: /*#__PURE__*/ jsx(BylineAiAdminProvider, {
92
+ children: /*#__PURE__*/ jsxs(AdminMenuProvider, {
93
+ children: [
94
+ /*#__PURE__*/ jsx(RouteProgressBar, {}),
95
+ /*#__PURE__*/ jsx(AdminAppBar, {
96
+ user: user
97
+ }),
98
+ /*#__PURE__*/ jsxs("main", {
99
+ className: clsx('byline-admin-layout-main', admin_layout_module.main),
100
+ children: [
101
+ /*#__PURE__*/ jsx(AdminMenuDrawer, {
102
+ analyticsEnabled: analyticsRuntime.enabled,
103
+ scheduledPublicationEnabled: scheduledPublicationRuntime.enabled
104
+ }),
105
+ /*#__PURE__*/ jsx(Content, {
106
+ children: /*#__PURE__*/ jsx(Outlet, {})
107
+ })
108
+ ]
109
+ })
110
+ ]
111
+ })
97
112
  })
98
113
  })
99
114
  })
@@ -10,7 +10,8 @@ function createSignInRoute(path, { homeUrl } = {}) {
10
10
  validateSearch: (search)=>{
11
11
  const callbackUrl = resolveAdminCallbackPath(search.callbackUrl);
12
12
  return {
13
- callbackUrl
13
+ callbackUrl,
14
+ reauthenticate: '1' === search.reauthenticate || 1 === search.reauthenticate || true === search.reauthenticate
14
15
  };
15
16
  },
16
17
  beforeLoad: async ()=>{
@@ -20,10 +21,11 @@ function createSignInRoute(path, { homeUrl } = {}) {
20
21
  };
21
22
  },
22
23
  component: function() {
23
- const { callbackUrl } = Route.useSearch();
24
+ const { callbackUrl, reauthenticate } = Route.useSearch();
24
25
  const { activeLocale } = Route.useRouteContext();
25
26
  return /*#__PURE__*/ jsx(SignInPage, {
26
27
  redirectTo: resolveAdminSignInRedirect(callbackUrl),
28
+ reauthenticate: reauthenticate,
27
29
  activeLocale: activeLocale,
28
30
  homeUrl: resolvedHomeUrl
29
31
  });
@@ -10,7 +10,9 @@ export interface ChangeAccountPasswordInput {
10
10
  currentPassword: string;
11
11
  newPassword: string;
12
12
  }
13
- export declare const changeAccountPassword: import("@tanstack/react-start").RequiredFetcher<undefined, (input: ChangeAccountPasswordInput) => ChangeAccountPasswordInput, Promise<{
13
+ export declare const changeAccountPassword: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
14
+ bylineExpectedSessionId: string | null;
15
+ }, undefined, undefined>], (input: ChangeAccountPasswordInput) => ChangeAccountPasswordInput, Promise<{
14
16
  id: string;
15
17
  vid: number;
16
18
  email: string;
@@ -1,13 +1,19 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { changeAccountPasswordCommand } from "@byline/admin/admin-account";
3
- import { getAdminRequestContext } from "@byline/client/server";
3
+ import { clearPreviewCookie, clearSessionCookies, getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const changeAccountPassword = 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 context = await getAdminRequestContext();
9
- return changeAccountPasswordCommand(context, data, {
12
+ const account = await changeAccountPasswordCommand(context, data, {
10
13
  store: bylineCore().adminStore
11
14
  });
15
+ clearSessionCookies();
16
+ clearPreviewCookie();
17
+ return account;
12
18
  });
13
19
  export { changeAccountPassword };
@@ -11,7 +11,9 @@
11
11
  * status fields that the slim `CurrentAdminUser` on route context
12
12
  * doesn't carry.
13
13
  */
14
- export declare const getAccount: import("@tanstack/react-start").OptionalFetcher<undefined, (input?: Record<string, never>) => Record<string, never>, Promise<{
14
+ export declare const getAccount: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
15
+ bylineExpectedSessionId: string | null;
16
+ }, undefined, undefined>], (input?: Record<string, never>) => Record<string, never>, Promise<{
15
17
  id: string;
16
18
  vid: number;
17
19
  email: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAccountCommand } from "@byline/admin/admin-account";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const getAccount = createServerFn({
6
7
  method: 'GET'
7
- }).validator((input)=>input ?? {}).handler(async ({ data })=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input ?? {}).handler(async ({ data })=>{
8
11
  const context = await getAdminRequestContext();
9
12
  return getAccountCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -14,8 +14,8 @@
14
14
  * actor is the target — none of these accept an `id`.
15
15
  */
16
16
  export type { AccountResponse } from '@byline/admin/admin-account';
17
- export { changeAccountPassword } from './change-password';
18
- export { getAccount } from './get';
19
- export { updateAccount } from './update';
20
- export type { ChangeAccountPasswordInput } from './change-password';
21
- export type { UpdateAccountInput } from './update';
17
+ export { changeAccountPassword } from './change-password.js';
18
+ export { getAccount } from './get.js';
19
+ export { updateAccount } from './update.js';
20
+ export type { ChangeAccountPasswordInput } from './change-password.js';
21
+ export type { UpdateAccountInput } from './update.js';
@@ -14,7 +14,9 @@ export interface UpdateAccountInput {
14
14
  username?: string | null;
15
15
  };
16
16
  }
17
- export declare const updateAccount: import("@tanstack/react-start").RequiredFetcher<undefined, (input: UpdateAccountInput) => UpdateAccountInput, Promise<{
17
+ export declare const updateAccount: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
18
+ bylineExpectedSessionId: string | null;
19
+ }, undefined, undefined>], (input: UpdateAccountInput) => UpdateAccountInput, Promise<{
18
20
  id: string;
19
21
  vid: number;
20
22
  email: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { updateAccountCommand } from "@byline/admin/admin-account";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const updateAccount = 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 context = await getAdminRequestContext();
9
12
  return updateAccountCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -47,4 +47,6 @@ export interface SystemActivityResponse {
47
47
  * queries directly and is gated system-wide by `admin.activity.read` rather
48
48
  * than by any document's own read gate.
49
49
  */
50
- export declare const getSystemActivityLog: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SystemActivitySearchParams) => SystemActivitySearchParams, Promise<SystemActivityResponse>>;
50
+ export declare const getSystemActivityLog: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
51
+ bylineExpectedSessionId: string | null;
52
+ }, undefined, undefined>], (input: SystemActivitySearchParams) => SystemActivitySearchParams, Promise<SystemActivityResponse>>;
@@ -3,10 +3,13 @@ import { assertAdminActor } from "@byline/admin";
3
3
  import { ADMIN_ACTIVITY_ABILITIES } from "@byline/admin/admin-activity";
4
4
  import { getAdminRequestContext } from "@byline/client/server";
5
5
  import { ERR_AUDIT_UNSUPPORTED, getLogger, getServerConfig } from "@byline/core";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
6
7
  import { resolveActorLabels } from "../collections/actors.js";
7
8
  const getSystemActivityLog = 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 context = await getAdminRequestContext();
11
14
  assertAdminActor(context, ADMIN_ACTIVITY_ABILITIES.read);
12
15
  const queries = getServerConfig().db.queries;
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const getRoleAbilities: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const getRoleAbilities: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
9
11
  id: string;
10
12
  }) => {
11
13
  id: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getRoleAbilitiesCommand } from "@byline/admin/admin-permissions";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const getRoleAbilities = createServerFn({
6
7
  method: 'GET'
7
- }).validator((input)=>input).handler(async ({ data })=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(async ({ data })=>{
8
11
  const context = await getAdminRequestContext();
9
12
  return getRoleAbilitiesCommand(context, data, {
10
13
  store: bylineCore().adminStore,
@@ -18,7 +18,7 @@
18
18
  * mounts on the admin-roles role detail page.
19
19
  */
20
20
  export type { AbilityDescriptorResponse, AbilityGroupResponse, AbilityHolderRole, AbilityHolderUser, GetRoleAbilitiesResponse, ListRegisteredAbilitiesResponse, SetRoleAbilitiesResponse, WhoHasAbilityResponse, } from '@byline/admin/admin-permissions';
21
- export { getRoleAbilities } from './get-role-abilities';
22
- export { listRegisteredAbilities } from './list-registered';
23
- export { type SetRoleAbilitiesInput, setRoleAbilities } from './set-role-abilities';
24
- export { whoHasAbility } from './who-has';
21
+ export { getRoleAbilities } from './get-role-abilities.js';
22
+ export { listRegisteredAbilities } from './list-registered.js';
23
+ export { type SetRoleAbilitiesInput, setRoleAbilities } from './set-role-abilities.js';
24
+ export { whoHasAbility } from './who-has.js';
@@ -10,7 +10,9 @@
10
10
  * populated at init time by collection auto-registration plus
11
11
  * `registerAdminAbilities`. No DB read.
12
12
  */
13
- export declare const listRegisteredAbilities: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<{
13
+ export declare const listRegisteredAbilities: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
14
+ bylineExpectedSessionId: string | null;
15
+ }, undefined, undefined>], undefined, Promise<{
14
16
  abilities: {
15
17
  key: string;
16
18
  label: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { listRegisteredAbilitiesCommand } from "@byline/admin/admin-permissions";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const listRegisteredAbilities = createServerFn({
6
7
  method: 'GET'
7
- }).handler(async ()=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).handler(async ()=>{
8
11
  const context = await getAdminRequestContext();
9
12
  return listRegisteredAbilitiesCommand(context, {}, {
10
13
  store: bylineCore().adminStore,
@@ -9,7 +9,9 @@ export interface SetRoleAbilitiesInput {
9
9
  id: string;
10
10
  abilities: string[];
11
11
  }
12
- export declare const setRoleAbilities: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SetRoleAbilitiesInput) => SetRoleAbilitiesInput, Promise<{
12
+ export declare const setRoleAbilities: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
13
+ bylineExpectedSessionId: string | null;
14
+ }, undefined, undefined>], (input: SetRoleAbilitiesInput) => SetRoleAbilitiesInput, Promise<{
13
15
  roleId: string;
14
16
  abilities: string[];
15
17
  }>>;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { setRoleAbilitiesCommand } from "@byline/admin/admin-permissions";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const setRoleAbilities = 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 context = await getAdminRequestContext();
9
12
  return setRoleAbilitiesCommand(context, data, {
10
13
  store: bylineCore().adminStore,
@@ -5,7 +5,9 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const whoHasAbility: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const whoHasAbility: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
9
11
  ability: string;
10
12
  }) => {
11
13
  ability: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { whoHasAbilityCommand } from "@byline/admin/admin-permissions";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { bylineCore } from "../../integrations/byline-core.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
5
6
  const whoHasAbility = createServerFn({
6
7
  method: 'GET'
7
- }).validator((input)=>input).handler(async ({ data })=>{
8
+ }).middleware([
9
+ adminSessionMiddleware
10
+ ]).validator((input)=>input).handler(async ({ data })=>{
8
11
  const context = await getAdminRequestContext();
9
12
  return whoHasAbilityCommand(context, data, {
10
13
  store: bylineCore().adminStore,
@@ -11,7 +11,9 @@ export interface CreateAdminRoleInput {
11
11
  description?: string | null;
12
12
  order?: number;
13
13
  }
14
- export declare const createAdminRole: import("@tanstack/react-start").RequiredFetcher<undefined, (input: CreateAdminRoleInput) => CreateAdminRoleInput, Promise<{
14
+ export declare const createAdminRole: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
15
+ bylineExpectedSessionId: string | null;
16
+ }, undefined, undefined>], (input: CreateAdminRoleInput) => CreateAdminRoleInput, Promise<{
15
17
  id: string;
16
18
  vid: number;
17
19
  name: string;