@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
@@ -14,7 +14,9 @@ export interface UpdateAdminRoleInput {
14
14
  order?: number;
15
15
  };
16
16
  }
17
- export declare const updateAdminRole: import("@tanstack/react-start").RequiredFetcher<undefined, (input: UpdateAdminRoleInput) => UpdateAdminRoleInput, Promise<{
17
+ export declare const updateAdminRole: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
18
+ bylineExpectedSessionId: string | null;
19
+ }, undefined, undefined>], (input: UpdateAdminRoleInput) => UpdateAdminRoleInput, Promise<{
18
20
  id: string;
19
21
  vid: number;
20
22
  name: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { updateAdminRoleCommand } from "@byline/admin/admin-roles";
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 updateAdminRole = 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 updateAdminRoleCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -15,7 +15,9 @@ export interface CreateAdminUserInput {
15
15
  is_enabled?: boolean;
16
16
  is_email_verified?: boolean;
17
17
  }
18
- export declare const createAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: CreateAdminUserInput) => CreateAdminUserInput, Promise<{
18
+ export declare const createAdminUser: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
19
+ bylineExpectedSessionId: string | null;
20
+ }, undefined, undefined>], (input: CreateAdminUserInput) => CreateAdminUserInput, Promise<{
19
21
  id: string;
20
22
  vid: number;
21
23
  email: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { createAdminUserCommand } from "@byline/admin/admin-users";
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 createAdminUser = 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 createAdminUserCommand(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 deleteAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const deleteAdminUser: 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
  vid: number;
11
13
  }) => {
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { deleteAdminUserCommand } from "@byline/admin/admin-users";
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 deleteAdminUser = 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 deleteAdminUserCommand(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 disableAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const disableAdminUser: 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 { disableAdminUserCommand } from "@byline/admin/admin-users";
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 disableAdminUser = 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 disableAdminUserCommand(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 enableAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const enableAdminUser: 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 { enableAdminUserCommand } from "@byline/admin/admin-users";
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 enableAdminUser = 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 enableAdminUserCommand(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 getUserRoles: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const getUserRoles: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
9
11
  userId: string;
10
12
  }) => {
11
13
  userId: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getRolesForUserCommand } from "@byline/admin/admin-roles";
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 getUserRoles = 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 getRolesForUserCommand(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 getAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const getAdminUser: 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 { getAdminUserCommand } from "@byline/admin/admin-users";
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 getAdminUser = 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 getAdminUserCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -15,13 +15,13 @@
15
15
  */
16
16
  export type { UserRolesResponse } from '@byline/admin/admin-roles';
17
17
  export type { AdminUserListOrder, AdminUserListResponse, AdminUserResponse, OkResponse, } from '@byline/admin/admin-users';
18
- export { type CreateAdminUserInput, createAdminUser } from './create';
19
- export { deleteAdminUser } from './delete';
20
- export { disableAdminUser } from './disable';
21
- export { enableAdminUser } from './enable';
22
- export { getAdminUser } from './get';
23
- export { getUserRoles } from './get-user-roles';
24
- export { type ListAdminUsersInput, listAdminUsers } from './list';
25
- export { type SetAdminUserPasswordInput, setAdminUserPassword } from './set-password';
26
- export { type SetUserRolesInput, setUserRoles } from './set-user-roles';
27
- export { type UpdateAdminUserInput, updateAdminUser } from './update';
18
+ export { type CreateAdminUserInput, createAdminUser } from './create.js';
19
+ export { deleteAdminUser } from './delete.js';
20
+ export { disableAdminUser } from './disable.js';
21
+ export { enableAdminUser } from './enable.js';
22
+ export { getAdminUser } from './get.js';
23
+ export { getUserRoles } from './get-user-roles.js';
24
+ export { type ListAdminUsersInput, listAdminUsers } from './list.js';
25
+ export { type SetAdminUserPasswordInput, setAdminUserPassword } from './set-password.js';
26
+ export { type SetUserRolesInput, setUserRoles } from './set-user-roles.js';
27
+ export { type UpdateAdminUserInput, updateAdminUser } from './update.js';
@@ -20,7 +20,9 @@ export interface ListAdminUsersInput {
20
20
  * cookies, pass the `AdminStore` in, and let errors propagate to the
21
21
  * TanStack Start transport layer for the client to branch on.
22
22
  */
23
- export declare const listAdminUsers: import("@tanstack/react-start").RequiredFetcher<undefined, (input: ListAdminUsersInput) => ListAdminUsersInput, Promise<{
23
+ export declare const listAdminUsers: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
24
+ bylineExpectedSessionId: string | null;
25
+ }, undefined, undefined>], (input: ListAdminUsersInput) => ListAdminUsersInput, Promise<{
24
26
  users: {
25
27
  id: string;
26
28
  vid: number;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { listAdminUsersCommand } from "@byline/admin/admin-users";
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 listAdminUsers = 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 listAdminUsersCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -10,7 +10,9 @@ export interface SetAdminUserPasswordInput {
10
10
  vid: number;
11
11
  password: string;
12
12
  }
13
- export declare const setAdminUserPassword: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SetAdminUserPasswordInput) => SetAdminUserPasswordInput, Promise<{
13
+ export declare const setAdminUserPassword: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
14
+ bylineExpectedSessionId: string | null;
15
+ }, undefined, undefined>], (input: SetAdminUserPasswordInput) => SetAdminUserPasswordInput, Promise<{
14
16
  id: string;
15
17
  vid: number;
16
18
  email: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { setAdminUserPasswordCommand } from "@byline/admin/admin-users";
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 setAdminUserPassword = 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 setAdminUserPasswordCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -9,7 +9,9 @@ export interface SetUserRolesInput {
9
9
  userId: string;
10
10
  roleIds: string[];
11
11
  }
12
- export declare const setUserRoles: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SetUserRolesInput) => SetUserRolesInput, Promise<{
12
+ export declare const setUserRoles: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
13
+ bylineExpectedSessionId: string | null;
14
+ }, undefined, undefined>], (input: SetUserRolesInput) => SetUserRolesInput, Promise<{
13
15
  userId: string;
14
16
  roles: {
15
17
  id: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { setRolesForUserCommand } from "@byline/admin/admin-roles";
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 setUserRoles = 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 setRolesForUserCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -17,7 +17,9 @@ export interface UpdateAdminUserInput {
17
17
  is_email_verified?: boolean;
18
18
  };
19
19
  }
20
- export declare const updateAdminUser: import("@tanstack/react-start").RequiredFetcher<undefined, (input: UpdateAdminUserInput) => UpdateAdminUserInput, Promise<{
20
+ export declare const updateAdminUser: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
21
+ bylineExpectedSessionId: string | null;
22
+ }, undefined, undefined>], (input: UpdateAdminUserInput) => UpdateAdminUserInput, Promise<{
21
23
  id: string;
22
24
  vid: number;
23
25
  email: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { updateAdminUserCommand } from "@byline/admin/admin-users";
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 updateAdminUser = 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 updateAdminUserCommand(context, data, {
10
13
  store: bylineCore().adminStore
@@ -15,5 +15,7 @@ type ExecuteAiInstructionInput = {
15
15
  params: ExecuteInstructionParams;
16
16
  options?: Omit<ExecuteInstructionOptions, 'signal'>;
17
17
  };
18
- export declare const executeAiInstruction: import("@tanstack/react-start").RequiredFetcher<undefined, (input: ExecuteAiInstructionInput) => ExecuteAiInstructionInput, Promise<Response>>;
18
+ export declare const executeAiInstruction: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
19
+ bylineExpectedSessionId: string | null;
20
+ }, undefined, undefined>], (input: ExecuteAiInstructionInput) => ExecuteAiInstructionInput, Promise<Response>>;
19
21
  export {};
@@ -1,9 +1,12 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { executeInstruction, executeInstructionStreaming } from "@byline/ai/server";
3
3
  import { getAdminRequestContext } from "@byline/client/server";
4
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
4
5
  const executeAiInstruction = createServerFn({
5
6
  method: 'POST'
6
- }).validator((input)=>input).handler(async ({ data })=>{
7
+ }).middleware([
8
+ adminSessionMiddleware
9
+ ]).validator((input)=>input).handler(async ({ data })=>{
7
10
  await getAdminRequestContext();
8
11
  if (data.options?.streaming) {
9
12
  const streamResult = executeInstructionStreaming(data.params, data.options);
@@ -12,4 +12,4 @@
12
12
  * `aiFetchAdapter` in `@byline/host-tanstack-start/integrations/byline-ai`
13
13
  * that wraps `executeAiInstruction` so the plugins remain transport-agnostic.
14
14
  */
15
- export { executeAiInstruction } from './execute';
15
+ export { executeAiInstruction } from './execute.js';
@@ -10,10 +10,14 @@ export interface DeleteAnalyticsEventsInput {
10
10
  to: string;
11
11
  visitorHash?: string;
12
12
  }
13
- export declare const deleteAnalyticsEvents: import("@tanstack/react-start").RequiredFetcher<undefined, (input: DeleteAnalyticsEventsInput) => DeleteAnalyticsEventsInput, Promise<{
13
+ export declare const deleteAnalyticsEvents: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
14
+ bylineExpectedSessionId: string | null;
15
+ }, undefined, undefined>], (input: DeleteAnalyticsEventsInput) => DeleteAnalyticsEventsInput, Promise<{
14
16
  deleted: number;
15
17
  }>>;
16
- export declare const rebuildAnalyticsDay: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
18
+ export declare const rebuildAnalyticsDay: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
19
+ bylineExpectedSessionId: string | null;
20
+ }, undefined, undefined>], (input: {
17
21
  day: string;
18
22
  }) => {
19
23
  day: string;
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { assertAdminActor } 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 deleteAnalyticsEvents = 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
  await assertAnalyticsMaintenance();
9
12
  const { getAnalytics } = await import("@byline/analytics");
10
13
  const from = parseInstant(data.from, 'from');
@@ -22,7 +25,9 @@ const deleteAnalyticsEvents = createServerFn({
22
25
  });
23
26
  const rebuildAnalyticsDay = createServerFn({
24
27
  method: 'POST'
25
- }).validator((input)=>input).handler(async ({ data })=>{
28
+ }).middleware([
29
+ adminSessionMiddleware
30
+ ]).validator((input)=>input).handler(async ({ data })=>{
26
31
  await assertAnalyticsMaintenance();
27
32
  const { getAnalytics } = await import("@byline/analytics");
28
33
  await getAnalytics().rebuildDay(data.day);
@@ -13,13 +13,25 @@ export interface AnalyticsTopInput extends AnalyticsDateRange {
13
13
  export interface AnalyticsRuntimeState {
14
14
  enabled: boolean;
15
15
  }
16
- export declare const getAnalyticsRuntime: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<AnalyticsRuntimeState>>;
17
- export declare const getAnalyticsSummary: import("@tanstack/react-start").RequiredFetcher<undefined, (input: AnalyticsDateRange) => AnalyticsDateRange, Promise<AnalyticsSummary>>;
18
- export declare const getAnalyticsReportCoverage: import("@tanstack/react-start").OptionalFetcher<undefined, undefined, Promise<AnalyticsReportCoverage>>;
19
- export declare const getAnalyticsTop: import("@tanstack/react-start").RequiredFetcher<undefined, (input: AnalyticsTopInput) => AnalyticsTopInput, Promise<AnalyticsRankedTotals<AnalyticsPathTotal>>>;
20
- export declare const getAnalyticsReferrers: import("@tanstack/react-start").RequiredFetcher<undefined, (input: AnalyticsDateRange & {
16
+ export declare const getAnalyticsRuntime: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
17
+ bylineExpectedSessionId: string | null;
18
+ }, undefined, undefined>], undefined, Promise<AnalyticsRuntimeState>>;
19
+ export declare const getAnalyticsSummary: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
20
+ bylineExpectedSessionId: string | null;
21
+ }, undefined, undefined>], (input: AnalyticsDateRange) => AnalyticsDateRange, Promise<AnalyticsSummary>>;
22
+ export declare const getAnalyticsReportCoverage: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
23
+ bylineExpectedSessionId: string | null;
24
+ }, undefined, undefined>], undefined, Promise<AnalyticsReportCoverage>>;
25
+ export declare const getAnalyticsTop: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
26
+ bylineExpectedSessionId: string | null;
27
+ }, undefined, undefined>], (input: AnalyticsTopInput) => AnalyticsTopInput, Promise<AnalyticsRankedTotals<AnalyticsPathTotal>>>;
28
+ export declare const getAnalyticsReferrers: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
29
+ bylineExpectedSessionId: string | null;
30
+ }, undefined, undefined>], (input: AnalyticsDateRange & {
21
31
  limit?: number;
22
32
  }) => AnalyticsDateRange & {
23
33
  limit?: number;
24
34
  }, Promise<AnalyticsRankedTotals<AnalyticsReferrerTotal>>>;
25
- export declare const getAnalyticsCountries: import("@tanstack/react-start").RequiredFetcher<undefined, (input: AnalyticsDateRange) => AnalyticsDateRange, Promise<AnalyticsCountryTotal[]>>;
35
+ export declare const getAnalyticsCountries: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
36
+ bylineExpectedSessionId: string | null;
37
+ }, undefined, undefined>], (input: AnalyticsDateRange) => AnalyticsDateRange, Promise<AnalyticsCountryTotal[]>>;
@@ -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>>;