@oxyhq/services 13.3.0 → 14.0.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 (245) hide show
  1. package/lib/commonjs/index.js +11 -16
  2. package/lib/commonjs/index.js.map +1 -1
  3. package/lib/commonjs/ui/components/AccountMenu.js +103 -65
  4. package/lib/commonjs/ui/components/AccountMenu.js.map +1 -1
  5. package/lib/commonjs/ui/components/AccountSwitcher.js +84 -126
  6. package/lib/commonjs/ui/components/AccountSwitcher.js.map +1 -1
  7. package/lib/commonjs/ui/components/ProfileMenu.js +140 -153
  8. package/lib/commonjs/ui/components/ProfileMenu.js.map +1 -1
  9. package/lib/commonjs/ui/components/SignInModal.js +4 -4
  10. package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
  11. package/lib/commonjs/ui/context/OxyContext.js +506 -466
  12. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  13. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +59 -57
  14. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  15. package/lib/commonjs/ui/context/inSessionTokenRefresh.js +23 -42
  16. package/lib/commonjs/ui/context/inSessionTokenRefresh.js.map +1 -1
  17. package/lib/commonjs/ui/context/silentSessionRestore.js +12 -21
  18. package/lib/commonjs/ui/context/silentSessionRestore.js.map +1 -1
  19. package/lib/commonjs/ui/hooks/useAuth.js +4 -3
  20. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  21. package/lib/commonjs/ui/hooks/useOxyAuthSession.js +12 -7
  22. package/lib/commonjs/ui/hooks/useOxyAuthSession.js.map +1 -1
  23. package/lib/commonjs/ui/hooks/useSessionManagement.js +17 -65
  24. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  25. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js +288 -0
  26. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js.map +1 -0
  27. package/lib/commonjs/ui/hooks/useWebSSO.js +12 -191
  28. package/lib/commonjs/ui/hooks/useWebSSO.js.map +1 -1
  29. package/lib/commonjs/ui/screens/OxyAuthScreen.js +2 -2
  30. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  31. package/lib/commonjs/ui/session/createSessionClient.js +28 -0
  32. package/lib/commonjs/ui/session/createSessionClient.js.map +1 -0
  33. package/lib/commonjs/ui/session/index.js +52 -0
  34. package/lib/commonjs/ui/session/index.js.map +1 -0
  35. package/lib/commonjs/ui/session/projectSessionState.js +86 -0
  36. package/lib/commonjs/ui/session/projectSessionState.js.map +1 -0
  37. package/lib/commonjs/ui/session/sessionClientHost.js +30 -0
  38. package/lib/commonjs/ui/session/sessionClientHost.js.map +1 -0
  39. package/lib/commonjs/ui/session/tokenTransport.js +77 -0
  40. package/lib/commonjs/ui/session/tokenTransport.js.map +1 -0
  41. package/lib/commonjs/ui/utils/activeAuthuser.js +35 -79
  42. package/lib/commonjs/ui/utils/activeAuthuser.js.map +1 -1
  43. package/lib/commonjs/ui/utils/sessionHelpers.js +1 -51
  44. package/lib/commonjs/ui/utils/sessionHelpers.js.map +1 -1
  45. package/lib/commonjs/utils/deviceFlowSignIn.js +70 -15
  46. package/lib/commonjs/utils/deviceFlowSignIn.js.map +1 -1
  47. package/lib/module/index.js +5 -4
  48. package/lib/module/index.js.map +1 -1
  49. package/lib/module/ui/components/AccountMenu.js +103 -65
  50. package/lib/module/ui/components/AccountMenu.js.map +1 -1
  51. package/lib/module/ui/components/AccountSwitcher.js +85 -127
  52. package/lib/module/ui/components/AccountSwitcher.js.map +1 -1
  53. package/lib/module/ui/components/ProfileMenu.js +143 -156
  54. package/lib/module/ui/components/ProfileMenu.js.map +1 -1
  55. package/lib/module/ui/components/SignInModal.js +4 -4
  56. package/lib/module/ui/components/SignInModal.js.map +1 -1
  57. package/lib/module/ui/context/OxyContext.js +510 -470
  58. package/lib/module/ui/context/OxyContext.js.map +1 -1
  59. package/lib/module/ui/context/hooks/useAuthOperations.js +61 -60
  60. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  61. package/lib/module/ui/context/inSessionTokenRefresh.js +24 -43
  62. package/lib/module/ui/context/inSessionTokenRefresh.js.map +1 -1
  63. package/lib/module/ui/context/silentSessionRestore.js +12 -20
  64. package/lib/module/ui/context/silentSessionRestore.js.map +1 -1
  65. package/lib/module/ui/hooks/useAuth.js +4 -3
  66. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  67. package/lib/module/ui/hooks/useOxyAuthSession.js +12 -7
  68. package/lib/module/ui/hooks/useOxyAuthSession.js.map +1 -1
  69. package/lib/module/ui/hooks/useSessionManagement.js +18 -66
  70. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  71. package/lib/module/ui/hooks/useSwitchableAccounts.js +283 -0
  72. package/lib/module/ui/hooks/useSwitchableAccounts.js.map +1 -0
  73. package/lib/module/ui/hooks/useWebSSO.js +13 -192
  74. package/lib/module/ui/hooks/useWebSSO.js.map +1 -1
  75. package/lib/module/ui/screens/OxyAuthScreen.js +2 -2
  76. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  77. package/lib/module/ui/session/createSessionClient.js +25 -0
  78. package/lib/module/ui/session/createSessionClient.js.map +1 -0
  79. package/lib/module/ui/session/index.js +17 -0
  80. package/lib/module/ui/session/index.js.map +1 -0
  81. package/lib/module/ui/session/projectSessionState.js +79 -0
  82. package/lib/module/ui/session/projectSessionState.js.map +1 -0
  83. package/lib/module/ui/session/sessionClientHost.js +26 -0
  84. package/lib/module/ui/session/sessionClientHost.js.map +1 -0
  85. package/lib/module/ui/session/tokenTransport.js +74 -0
  86. package/lib/module/ui/session/tokenTransport.js.map +1 -0
  87. package/lib/module/ui/utils/activeAuthuser.js +34 -76
  88. package/lib/module/ui/utils/activeAuthuser.js.map +1 -1
  89. package/lib/module/ui/utils/sessionHelpers.js +0 -49
  90. package/lib/module/ui/utils/sessionHelpers.js.map +1 -1
  91. package/lib/module/utils/deviceFlowSignIn.js +71 -16
  92. package/lib/module/utils/deviceFlowSignIn.js.map +1 -1
  93. package/lib/typescript/commonjs/index.d.ts +2 -3
  94. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  95. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts +4 -2
  96. package/lib/typescript/commonjs/ui/components/AccountMenu.d.ts.map +1 -1
  97. package/lib/typescript/commonjs/ui/components/AccountSwitcher.d.ts +7 -8
  98. package/lib/typescript/commonjs/ui/components/AccountSwitcher.d.ts.map +1 -1
  99. package/lib/typescript/commonjs/ui/components/ProfileMenu.d.ts +12 -9
  100. package/lib/typescript/commonjs/ui/components/ProfileMenu.d.ts.map +1 -1
  101. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +16 -13
  102. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  103. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +27 -3
  104. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  105. package/lib/typescript/commonjs/ui/context/inSessionTokenRefresh.d.ts +22 -17
  106. package/lib/typescript/commonjs/ui/context/inSessionTokenRefresh.d.ts.map +1 -1
  107. package/lib/typescript/commonjs/ui/context/silentSessionRestore.d.ts +12 -18
  108. package/lib/typescript/commonjs/ui/context/silentSessionRestore.d.ts.map +1 -1
  109. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +1 -0
  110. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +1 -1
  112. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  113. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts +2 -2
  114. package/lib/typescript/commonjs/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  115. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts +162 -0
  117. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts +13 -52
  119. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
  120. package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts +15 -0
  121. package/lib/typescript/commonjs/ui/session/createSessionClient.d.ts.map +1 -0
  122. package/lib/typescript/commonjs/ui/session/index.d.ts +15 -0
  123. package/lib/typescript/commonjs/ui/session/index.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/ui/session/projectSessionState.d.ts +45 -0
  125. package/lib/typescript/commonjs/ui/session/projectSessionState.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/ui/session/sessionClientHost.d.ts +14 -0
  127. package/lib/typescript/commonjs/ui/session/sessionClientHost.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts +24 -0
  129. package/lib/typescript/commonjs/ui/session/tokenTransport.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts +21 -29
  131. package/lib/typescript/commonjs/ui/utils/activeAuthuser.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts +0 -19
  133. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts.map +1 -1
  134. package/lib/typescript/commonjs/utils/deviceFlowSignIn.d.ts +51 -19
  135. package/lib/typescript/commonjs/utils/deviceFlowSignIn.d.ts.map +1 -1
  136. package/lib/typescript/module/index.d.ts +2 -3
  137. package/lib/typescript/module/index.d.ts.map +1 -1
  138. package/lib/typescript/module/ui/components/AccountMenu.d.ts +4 -2
  139. package/lib/typescript/module/ui/components/AccountMenu.d.ts.map +1 -1
  140. package/lib/typescript/module/ui/components/AccountSwitcher.d.ts +7 -8
  141. package/lib/typescript/module/ui/components/AccountSwitcher.d.ts.map +1 -1
  142. package/lib/typescript/module/ui/components/ProfileMenu.d.ts +12 -9
  143. package/lib/typescript/module/ui/components/ProfileMenu.d.ts.map +1 -1
  144. package/lib/typescript/module/ui/context/OxyContext.d.ts +16 -13
  145. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  146. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +27 -3
  147. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  148. package/lib/typescript/module/ui/context/inSessionTokenRefresh.d.ts +22 -17
  149. package/lib/typescript/module/ui/context/inSessionTokenRefresh.d.ts.map +1 -1
  150. package/lib/typescript/module/ui/context/silentSessionRestore.d.ts +12 -18
  151. package/lib/typescript/module/ui/context/silentSessionRestore.d.ts.map +1 -1
  152. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +1 -0
  153. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  154. package/lib/typescript/module/ui/hooks/useAuth.d.ts +1 -1
  155. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  156. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts +2 -2
  157. package/lib/typescript/module/ui/hooks/useOxyAuthSession.d.ts.map +1 -1
  158. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  159. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts +162 -0
  160. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts.map +1 -0
  161. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts +13 -52
  162. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
  163. package/lib/typescript/module/ui/session/createSessionClient.d.ts +15 -0
  164. package/lib/typescript/module/ui/session/createSessionClient.d.ts.map +1 -0
  165. package/lib/typescript/module/ui/session/index.d.ts +15 -0
  166. package/lib/typescript/module/ui/session/index.d.ts.map +1 -0
  167. package/lib/typescript/module/ui/session/projectSessionState.d.ts +45 -0
  168. package/lib/typescript/module/ui/session/projectSessionState.d.ts.map +1 -0
  169. package/lib/typescript/module/ui/session/sessionClientHost.d.ts +14 -0
  170. package/lib/typescript/module/ui/session/sessionClientHost.d.ts.map +1 -0
  171. package/lib/typescript/module/ui/session/tokenTransport.d.ts +24 -0
  172. package/lib/typescript/module/ui/session/tokenTransport.d.ts.map +1 -0
  173. package/lib/typescript/module/ui/utils/activeAuthuser.d.ts +21 -29
  174. package/lib/typescript/module/ui/utils/activeAuthuser.d.ts.map +1 -1
  175. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts +0 -19
  176. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts.map +1 -1
  177. package/lib/typescript/module/utils/deviceFlowSignIn.d.ts +51 -19
  178. package/lib/typescript/module/utils/deviceFlowSignIn.d.ts.map +1 -1
  179. package/package.json +4 -4
  180. package/src/index.ts +9 -8
  181. package/src/ui/components/AccountMenu.tsx +117 -70
  182. package/src/ui/components/AccountSwitcher.tsx +88 -134
  183. package/src/ui/components/ProfileMenu.tsx +158 -162
  184. package/src/ui/components/SignInModal.tsx +5 -5
  185. package/src/ui/context/OxyContext.tsx +560 -475
  186. package/src/ui/context/hooks/useAuthOperations.ts +72 -63
  187. package/src/ui/context/inSessionTokenRefresh.ts +23 -42
  188. package/src/ui/context/silentSessionRestore.ts +12 -26
  189. package/src/ui/hooks/useAuth.ts +4 -3
  190. package/src/ui/hooks/useOxyAuthSession.ts +13 -8
  191. package/src/ui/hooks/useSessionManagement.ts +16 -87
  192. package/src/ui/hooks/useSwitchableAccounts.ts +397 -0
  193. package/src/ui/hooks/useWebSSO.ts +13 -227
  194. package/src/ui/screens/OxyAuthScreen.tsx +2 -2
  195. package/src/ui/session/__tests__/createSessionClient.test.ts +41 -0
  196. package/src/ui/session/__tests__/projectSessionState.test.ts +114 -0
  197. package/src/ui/session/__tests__/sessionClientHost.test.ts +43 -0
  198. package/src/ui/session/__tests__/tokenTransport.test.ts +142 -0
  199. package/src/ui/session/createSessionClient.ts +21 -0
  200. package/src/ui/session/index.ts +19 -0
  201. package/src/ui/session/projectSessionState.ts +85 -0
  202. package/src/ui/session/sessionClientHost.ts +27 -0
  203. package/src/ui/session/tokenTransport.ts +76 -0
  204. package/src/ui/utils/activeAuthuser.ts +34 -76
  205. package/src/ui/utils/sessionHelpers.ts +0 -66
  206. package/src/utils/__tests__/deviceFlowSignIn.test.ts +243 -34
  207. package/src/utils/deviceFlowSignIn.ts +98 -21
  208. package/lib/commonjs/ui/components/accountMenuRows.js +0 -33
  209. package/lib/commonjs/ui/components/accountMenuRows.js.map +0 -1
  210. package/lib/commonjs/ui/hooks/useDeviceAccounts.js +0 -280
  211. package/lib/commonjs/ui/hooks/useDeviceAccounts.js.map +0 -1
  212. package/lib/commonjs/ui/hooks/useSessionSocket.js +0 -203
  213. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +0 -1
  214. package/lib/commonjs/utils/silentGuardKey.js +0 -54
  215. package/lib/commonjs/utils/silentGuardKey.js.map +0 -1
  216. package/lib/module/ui/components/accountMenuRows.js +0 -29
  217. package/lib/module/ui/components/accountMenuRows.js.map +0 -1
  218. package/lib/module/ui/hooks/useDeviceAccounts.js +0 -276
  219. package/lib/module/ui/hooks/useDeviceAccounts.js.map +0 -1
  220. package/lib/module/ui/hooks/useSessionSocket.js +0 -199
  221. package/lib/module/ui/hooks/useSessionSocket.js.map +0 -1
  222. package/lib/module/utils/silentGuardKey.js +0 -49
  223. package/lib/module/utils/silentGuardKey.js.map +0 -1
  224. package/lib/typescript/commonjs/ui/components/accountMenuRows.d.ts +0 -34
  225. package/lib/typescript/commonjs/ui/components/accountMenuRows.d.ts.map +0 -1
  226. package/lib/typescript/commonjs/ui/hooks/useDeviceAccounts.d.ts +0 -133
  227. package/lib/typescript/commonjs/ui/hooks/useDeviceAccounts.d.ts.map +0 -1
  228. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts +0 -14
  229. package/lib/typescript/commonjs/ui/hooks/useSessionSocket.d.ts.map +0 -1
  230. package/lib/typescript/commonjs/utils/silentGuardKey.d.ts +0 -31
  231. package/lib/typescript/commonjs/utils/silentGuardKey.d.ts.map +0 -1
  232. package/lib/typescript/module/ui/components/accountMenuRows.d.ts +0 -34
  233. package/lib/typescript/module/ui/components/accountMenuRows.d.ts.map +0 -1
  234. package/lib/typescript/module/ui/hooks/useDeviceAccounts.d.ts +0 -133
  235. package/lib/typescript/module/ui/hooks/useDeviceAccounts.d.ts.map +0 -1
  236. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts +0 -14
  237. package/lib/typescript/module/ui/hooks/useSessionSocket.d.ts.map +0 -1
  238. package/lib/typescript/module/utils/silentGuardKey.d.ts +0 -31
  239. package/lib/typescript/module/utils/silentGuardKey.d.ts.map +0 -1
  240. package/src/ui/components/accountMenuRows.ts +0 -48
  241. package/src/ui/hooks/useDeviceAccounts.ts +0 -344
  242. package/src/ui/hooks/useSessionSocket.ts +0 -233
  243. package/src/ui/utils/__tests__/activeAuthuser.test.ts +0 -75
  244. package/src/utils/__tests__/silentGuardKey.test.ts +0 -82
  245. package/src/utils/silentGuardKey.ts +0 -46
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildSwitchableAccounts = buildSwitchableAccounts;
7
+ exports.markCurrentAccount = markCurrentAccount;
8
+ exports.useSwitchableAccounts = useSwitchableAccounts;
9
+ var _react = require("react");
10
+ var _reactQuery = require("@tanstack/react-query");
11
+ var _core = require("@oxyhq/core");
12
+ var _OxyContext = require("../context/OxyContext.js");
13
+ var _useI18n = require("./useI18n.js");
14
+ var _queryKeys = require("./queries/queryKeys.js");
15
+ /**
16
+ * The per-account user shape carried by a {@link SwitchableAccount}. The SDK's
17
+ * canonical {@link User} document — either the freshest `useOxy().user` (the
18
+ * active row), a profile resolved via `oxyServices.getUsersByIds()` (every other
19
+ * device row), or the `account` document embedded in an account-graph node.
20
+ */
21
+
22
+ /**
23
+ * One account the signed-in user can switch INTO, in the uniform switch model.
24
+ *
25
+ * A switchable account is either a device sign-in, an account-graph node (owned
26
+ * org / shared-with-you), or BOTH (an account that has been switched into
27
+ * becomes a device session while still being a graph node — the two are deduped
28
+ * into a single row). Every row carries a canonical `accountId` (the uniform
29
+ * switch key passed to `switchToAccount`); `sessionId` is present IFF the
30
+ * account is currently signed in on THIS device.
31
+ */
32
+
33
+ /** The minimal device-session shape {@link buildSwitchableAccounts} reads. */
34
+
35
+ /**
36
+ * Resolve which entries are the current account, robustly.
37
+ *
38
+ * Primary signal: `entry.sessionId === activeSessionId` — both are projected
39
+ * from the same `SessionClient` state, so this normally matches exactly.
40
+ * Fallbacks exist only to bridge the brief window between the two sequential
41
+ * `updateSessions` / `setActiveSessionId` calls in `OxyContext.syncFromClient`,
42
+ * applied only when the `sessionId` match found nothing AND the user is
43
+ * authenticated:
44
+ * 1. Match the live `user.id` against each entry's per-account user id.
45
+ * 2. If still nothing and there is exactly one account, mark that one current.
46
+ *
47
+ * At most ONE entry is ever marked current. Runs over DEVICE rows only (graph
48
+ * rows are never active — the active account is always a device session), so the
49
+ * single-account fallback counts device rows.
50
+ *
51
+ * Pure & side-effect free so it is unit-testable without rendering React.
52
+ */
53
+ function markCurrentAccount(accounts, activeSessionId, liveUserId, isAuthenticated) {
54
+ const bySession = accounts.map(account => ({
55
+ ...account,
56
+ isCurrent: Boolean(activeSessionId) && account.sessionId === activeSessionId
57
+ }));
58
+ if (bySession.some(account => account.isCurrent) || !isAuthenticated) {
59
+ return bySession;
60
+ }
61
+
62
+ // No row matched by session id: fall back to the live user's id, marking at
63
+ // most the FIRST matching entry current (never more than one).
64
+ if (liveUserId) {
65
+ let matched = false;
66
+ const byUser = bySession.map(account => {
67
+ if (!matched && account.user.id === liveUserId) {
68
+ matched = true;
69
+ return {
70
+ ...account,
71
+ isCurrent: true
72
+ };
73
+ }
74
+ return account;
75
+ });
76
+ if (matched) {
77
+ return byUser;
78
+ }
79
+ }
80
+
81
+ // Authenticated, nothing matched, but there is exactly one account → it must
82
+ // be the current one.
83
+ if (bySession.length === 1) {
84
+ return [{
85
+ ...bySession[0],
86
+ isCurrent: true
87
+ }];
88
+ }
89
+ return bySession;
90
+ }
91
+
92
+ /**
93
+ * Pure union of device sign-ins and account-graph nodes into the flat
94
+ * {@link SwitchableAccount}[] the switchers render. Extracted so the merge /
95
+ * dedup semantics are unit-testable without rendering React.
96
+ *
97
+ * Order: device rows first (in session order, current flagged), then graph-only
98
+ * rows (in graph order). An account present as BOTH a device session and a graph
99
+ * node is deduped into ONE device row enriched with the graph metadata
100
+ * (relationship / kind / parent / membership).
101
+ */
102
+ function buildSwitchableAccounts(input) {
103
+ const {
104
+ sessions,
105
+ activeSessionId,
106
+ liveUser,
107
+ isAuthenticated,
108
+ graph,
109
+ profilesById,
110
+ locale,
111
+ resolveAvatarUrl
112
+ } = input;
113
+
114
+ // Nothing is switchable when signed out — never surface a lingering device
115
+ // session or graph node once the user is unauthenticated.
116
+ if (!isAuthenticated) {
117
+ return [];
118
+ }
119
+ const toRow = (accountUser, opts) => {
120
+ const displayName = (0, _core.getAccountDisplayName)(accountUser, locale);
121
+ const handle = (0, _core.getAccountFallbackHandle)(accountUser);
122
+ const secondaryHandle = handle ? `@${handle}` : null;
123
+ return {
124
+ accountId: accountUser.id?.toString() ?? '',
125
+ sessionId: opts.sessionId,
126
+ authuser: opts.authuser,
127
+ isCurrent: Boolean(opts.sessionId) && opts.sessionId === activeSessionId,
128
+ onDevice: Boolean(opts.sessionId),
129
+ relationship: opts.relationship,
130
+ kind: opts.kind,
131
+ parentAccountId: opts.parentAccountId,
132
+ callerMembership: opts.callerMembership,
133
+ displayName,
134
+ // Real email, or the `@handle` fallback (NEVER synthesized).
135
+ email: accountUser.email ?? secondaryHandle,
136
+ avatarUrl: resolveAvatarUrl(accountUser.avatar),
137
+ color: accountUser.color ?? null,
138
+ user: accountUser
139
+ };
140
+ };
141
+
142
+ // --- Device rows ---
143
+ const built = sessions.flatMap(session => {
144
+ const isCurrent = session.sessionId === activeSessionId;
145
+ // The active row always uses the live `user` — freshest available —
146
+ // regardless of whether the batch profile fetch has resolved yet.
147
+ const accountUser = isCurrent && liveUser ? liveUser : session.userId ? profilesById.get(session.userId) : undefined;
148
+ if (!accountUser) {
149
+ return [];
150
+ }
151
+ return [toRow(accountUser, {
152
+ sessionId: session.sessionId,
153
+ authuser: session.authuser
154
+ })];
155
+ });
156
+ const flagged = markCurrentAccount(built, activeSessionId, liveUser?.id ?? null, isAuthenticated);
157
+
158
+ // The signed-in user must ALWAYS be represented, even before the device
159
+ // session set has synced (e.g. immediately after cold boot). Synthesize a
160
+ // single current row from the live `useOxy().user` in that case.
161
+ const deviceRows = flagged.length === 0 && isAuthenticated && liveUser && activeSessionId ? [toRow(liveUser, {
162
+ sessionId: activeSessionId
163
+ })] : flagged;
164
+
165
+ // --- Merge graph nodes, deduping by account id ---
166
+ const byAccountId = new Map();
167
+ const order = [];
168
+ const remember = row => {
169
+ if (!row.accountId || byAccountId.has(row.accountId)) {
170
+ return;
171
+ }
172
+ byAccountId.set(row.accountId, row);
173
+ order.push(row.accountId);
174
+ };
175
+ for (const row of deviceRows) {
176
+ remember(row);
177
+ }
178
+ for (const node of graph) {
179
+ const existing = byAccountId.get(node.accountId);
180
+ if (existing) {
181
+ // On-device account that is ALSO in the graph: enrich the device row
182
+ // with graph metadata; keep its (freshest) profile + sessionId.
183
+ byAccountId.set(node.accountId, {
184
+ ...existing,
185
+ relationship: node.relationship,
186
+ kind: node.kind,
187
+ parentAccountId: node.parentAccountId,
188
+ callerMembership: node.callerMembership
189
+ });
190
+ continue;
191
+ }
192
+ // Graph-only account (owned org / shared, not yet a device session).
193
+ remember(toRow(node.account, {
194
+ relationship: node.relationship,
195
+ kind: node.kind,
196
+ parentAccountId: node.parentAccountId,
197
+ callerMembership: node.callerMembership
198
+ }));
199
+ }
200
+ return order.flatMap(id => {
201
+ const row = byAccountId.get(id);
202
+ return row ? [row] : [];
203
+ });
204
+ }
205
+
206
+ /**
207
+ * Resolve every account the signed-in user can switch into — device sign-ins
208
+ * AND linked graph accounts (owned orgs + shared-with-you) — as one flat list
209
+ * with real per-account name / email / avatar / color, deduped by account id.
210
+ *
211
+ * ## Data sources
212
+ *
213
+ * - Device sign-ins: `useOxy().sessions` — a `ClientSession[]` projected by
214
+ * `OxyContext.syncFromClient` from the server-authoritative `SessionClient`.
215
+ * Each session carries only `sessionId` + `userId`, so this hook additionally
216
+ * fetches every device account's profile via `oxyServices.getUsersByIds()`.
217
+ * The ACTIVE row always uses `useOxy().user` directly (the freshest copy).
218
+ * - Linked accounts: `useOxy().accounts` — the `AccountNode[]` graph the context
219
+ * loads from `GET /accounts`. Each node already embeds its `account` `User`
220
+ * document, so graph-only rows need no extra fetch.
221
+ *
222
+ * An account present as BOTH a device session and a graph node is deduped into
223
+ * ONE row (see {@link buildSwitchableAccounts}). EVERY row switches the same
224
+ * way — through `useOxy().switchToAccount(row.accountId)`.
225
+ *
226
+ * ## Error handling
227
+ *
228
+ * `getUsersByIds()` resolves to `[]` on a failed chunk (logged internally)
229
+ * rather than throwing. Device accounts whose profile could not be resolved are
230
+ * omitted until a subsequent fetch succeeds (except the active one, which never
231
+ * depends on this fetch); graph accounts are unaffected.
232
+ */
233
+ function useSwitchableAccounts() {
234
+ const {
235
+ oxyServices,
236
+ sessions,
237
+ activeSessionId,
238
+ user,
239
+ isAuthenticated,
240
+ accounts: graph
241
+ } = (0, _OxyContext.useOxy)();
242
+ const {
243
+ locale
244
+ } = (0, _useI18n.useI18n)();
245
+
246
+ // Every distinct account id carried by the device's session set, sorted for
247
+ // a stable query key regardless of session ordering.
248
+ const accountIds = (0, _react.useMemo)(() => {
249
+ const ids = new Set();
250
+ for (const session of sessions ?? []) {
251
+ if (session.userId) {
252
+ ids.add(session.userId);
253
+ }
254
+ }
255
+ return Array.from(ids).sort();
256
+ }, [sessions]);
257
+ const profilesQuery = (0, _reactQuery.useQuery)({
258
+ queryKey: _queryKeys.queryKeys.users.list(accountIds),
259
+ queryFn: () => oxyServices.getUsersByIds(accountIds),
260
+ enabled: isAuthenticated && accountIds.length > 0,
261
+ staleTime: 5 * 60 * 1000,
262
+ // 5 minutes — matches useUserProfile's convention
263
+ gcTime: 30 * 60 * 1000 // 30 minutes
264
+ });
265
+ const profilesById = (0, _react.useMemo)(() => {
266
+ const map = new Map();
267
+ for (const profile of profilesQuery.data ?? []) {
268
+ map.set(profile.id, profile);
269
+ }
270
+ return map;
271
+ }, [profilesQuery.data]);
272
+ const accounts = (0, _react.useMemo)(() => buildSwitchableAccounts({
273
+ sessions: sessions ?? [],
274
+ activeSessionId: activeSessionId ?? null,
275
+ liveUser: user ?? null,
276
+ isAuthenticated,
277
+ graph: graph ?? [],
278
+ profilesById,
279
+ locale,
280
+ resolveAvatarUrl: avatar => avatar ? oxyServices.getFileDownloadUrl(avatar, 'thumb') : undefined
281
+ }), [sessions, activeSessionId, user, isAuthenticated, graph, profilesById, locale, oxyServices]);
282
+ return {
283
+ accounts,
284
+ isLoading: isAuthenticated && accountIds.length > 0 && profilesQuery.isLoading,
285
+ currentSessionId: activeSessionId ?? null
286
+ };
287
+ }
288
+ //# sourceMappingURL=useSwitchableAccounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactQuery","_core","_OxyContext","_useI18n","_queryKeys","markCurrentAccount","accounts","activeSessionId","liveUserId","isAuthenticated","bySession","map","account","isCurrent","Boolean","sessionId","some","matched","byUser","user","id","length","buildSwitchableAccounts","input","sessions","liveUser","graph","profilesById","locale","resolveAvatarUrl","toRow","accountUser","opts","displayName","getAccountDisplayName","handle","getAccountFallbackHandle","secondaryHandle","accountId","toString","authuser","onDevice","relationship","kind","parentAccountId","callerMembership","email","avatarUrl","avatar","color","built","flatMap","session","userId","get","undefined","flagged","deviceRows","byAccountId","Map","order","remember","row","has","set","push","node","existing","useSwitchableAccounts","oxyServices","useOxy","useI18n","accountIds","useMemo","ids","Set","add","Array","from","sort","profilesQuery","useQuery","queryKey","queryKeys","users","list","queryFn","getUsersByIds","enabled","staleTime","gcTime","profile","data","getFileDownloadUrl","isLoading","currentSessionId"],"sourceRoot":"../../../../src","sources":["ui/hooks/useSwitchableAccounts.ts"],"mappings":"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","ignoreList":[]}
@@ -4,204 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isWebBrowser = isWebBrowser;
7
- exports.useWebSSO = useWebSSO;
8
- var _react = require("react");
9
- var _silentGuardKey = require("../../utils/silentGuardKey.js");
10
7
  /**
11
- * Web SSO Hook
12
- *
13
- * Handles cross-domain SSO for web apps using FedCM (Federated Credential Management).
14
- *
15
- * FedCM is the modern, privacy-preserving standard for cross-domain identity federation.
16
- * It works across completely different TLDs (alia.onl, mention.earth, homiio.com, etc.)
17
- * without relying on third-party cookies.
18
- *
19
- * For browsers without FedCM support, users will need to click a sign-in button
20
- * which triggers redirect authentication.
21
- *
22
- * This is called automatically by OxyContext on web platforms.
23
- *
24
- * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API
8
+ * Platform detection helper for the web auth/session-sync surfaces.
9
+ *
10
+ * This module previously hosted a FedCM-based `useWebSSO` hook (Federated
11
+ * Credential Management — Chrome-only). It was removed: FedCM is no longer
12
+ * used anywhere in the client sign-in/cold-boot path (see `CrossDomainAuth`'s
13
+ * doc comment in `@oxyhq/core` for the production sign-in loop that motivated
14
+ * the removal). Cross-domain silent SSO is owned entirely by the
15
+ * `silent-iframe` cold-boot step (per-apex `/auth/silent`) plus the terminal
16
+ * `/sso` bounce in `OxyContext`.
17
+ *
18
+ * `isWebBrowser` is kept here (rather than moved) so every existing consumer
19
+ * import path stays valid.
25
20
  */
26
21
 
27
- /**
28
- * Module-level guard tracking which (origin + API) signatures have already
29
- * had a silent SSO attempt this page load.
30
- *
31
- * A per-component `useRef` guard resets whenever the provider remounts (route
32
- * churn, StrictMode double-invoke, error-boundary recovery), which previously
33
- * allowed silent SSO to re-fire and — combined with a routing redirect loop —
34
- * produced an accelerating `navigator.credentials.get` retry storm. Keying the
35
- * guard on a stable signature instead of the component instance makes silent
36
- * SSO fire EXACTLY ONCE per page load regardless of how many times the
37
- * provider mounts. The set is intentionally never cleared: a fresh page load
38
- * (the only thing that can change the answer) starts a fresh module scope.
39
- */
40
- const silentSSOAttempted = new Set();
41
-
42
- /**
43
- * Build a stable signature for the silent-SSO run-once guard. Two providers
44
- * pointed at the same API from the same origin share one attempt.
45
- */
46
- function ssoSignature(oxyServices) {
47
- // Shared with `OxyContext.silentColdBootKey`. `buildSilentGuardKey` reads
48
- // `window.location.origin` behind a guard that also verifies
49
- // `window.location` exists — React Native aliases a global `window` with NO
50
- // `window.location`, so a `typeof window`-only check would throw
51
- // `Cannot read property 'origin' of undefined` off-browser.
52
- return (0, _silentGuardKey.buildSilentGuardKey)(() => oxyServices.getBaseURL?.());
53
- }
54
-
55
22
  /**
56
23
  * Check if we're running in a web browser environment (not React Native)
57
24
  */
58
25
  function isWebBrowser() {
59
26
  return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.documentElement !== 'undefined';
60
27
  }
61
-
62
- /**
63
- * Check if we're on the identity provider domain (where FedCM would authenticate against itself)
64
- * Compares against config.authWebUrl if set, otherwise defaults to auth.oxy.so
65
- */
66
- function isIdentityProvider(authWebUrl) {
67
- if (!isWebBrowser()) return false;
68
- const hostname = window.location.hostname;
69
- let idpHostname = 'auth.oxy.so';
70
- if (authWebUrl) {
71
- try {
72
- idpHostname = new URL(authWebUrl).hostname;
73
- } catch {/* malformed URL, use default */}
74
- }
75
- return hostname === idpHostname;
76
- }
77
-
78
- /**
79
- * Hook for automatic cross-domain web SSO
80
- *
81
- * Uses FedCM (Federated Credential Management) - the modern browser-native
82
- * identity federation API. This is the same technology that powers
83
- * Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).
84
- *
85
- * Key benefits:
86
- * - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)
87
- * - No third-party cookies required
88
- * - Privacy-preserving (browser mediates identity, IdP can't track)
89
- * - Automatic silent sign-in after initial authentication
90
- *
91
- * For browsers without FedCM (Firefox, older browsers), automatic SSO
92
- * is not possible. Users will see a sign-in button instead.
93
- */
94
- function useWebSSO({
95
- oxyServices,
96
- onSessionFound,
97
- onSSOUnavailable,
98
- onError,
99
- enabled = true
100
- }) {
101
- const isCheckingRef = (0, _react.useRef)(false);
102
- const hasCheckedRef = (0, _react.useRef)(false);
103
-
104
- // Check FedCM support once
105
- const fedCMSupported = isWebBrowser() && oxyServices.isFedCMSupported?.();
106
- const authWebUrl = oxyServices.config?.authWebUrl;
107
- const checkSSO = (0, _react.useCallback)(async () => {
108
- if (!isWebBrowser() || isCheckingRef.current) {
109
- return null;
110
- }
111
-
112
- // Don't use FedCM on the auth domain itself - it would authenticate against itself
113
- if (isIdentityProvider(authWebUrl)) {
114
- onSSOUnavailable?.();
115
- return null;
116
- }
117
-
118
- // FedCM is the only reliable cross-domain SSO mechanism
119
- if (!fedCMSupported) {
120
- onSSOUnavailable?.();
121
- return null;
122
- }
123
- isCheckingRef.current = true;
124
- try {
125
- const session = await oxyServices.silentSignInWithFedCM?.();
126
- if (session) {
127
- await onSessionFound(session);
128
- return session;
129
- }
130
- onSSOUnavailable?.();
131
- return null;
132
- } catch (error) {
133
- onSSOUnavailable?.();
134
- onError?.(error instanceof Error ? error : new Error(String(error)));
135
- return null;
136
- } finally {
137
- isCheckingRef.current = false;
138
- }
139
- }, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported, authWebUrl]);
140
-
141
- /**
142
- * Trigger interactive FedCM sign-in
143
- * This shows the browser's native "Sign in with Oxy" prompt.
144
- * Use this when silent mediation fails (user hasn't previously consented).
145
- */
146
- const signInWithFedCM = (0, _react.useCallback)(async () => {
147
- if (!isWebBrowser() || isCheckingRef.current) {
148
- return null;
149
- }
150
- if (!fedCMSupported) {
151
- onError?.(new Error('FedCM is not supported in this browser'));
152
- return null;
153
- }
154
- isCheckingRef.current = true;
155
- try {
156
- const session = await oxyServices.signInWithFedCM?.();
157
- if (session) {
158
- await onSessionFound(session);
159
- return session;
160
- }
161
- return null;
162
- } catch (error) {
163
- onError?.(error instanceof Error ? error : new Error(String(error)));
164
- return null;
165
- } finally {
166
- isCheckingRef.current = false;
167
- }
168
- }, [oxyServices, onSessionFound, onError, fedCMSupported]);
169
-
170
- // Auto-check SSO on mount (web only, FedCM only, not on auth domain).
171
- //
172
- // Run-once is enforced by TWO guards:
173
- // 1. `hasCheckedRef` — cheap per-instance fast-path so effect re-runs
174
- // (from changing deps) within one mount never re-fire.
175
- // 2. `silentSSOAttempted` — module-level, survives remounts/StrictMode so
176
- // silent SSO fires exactly once per page load even if the provider
177
- // unmounts and remounts.
178
- (0, _react.useEffect)(() => {
179
- if (!enabled || !isWebBrowser() || hasCheckedRef.current || isIdentityProvider(authWebUrl)) {
180
- if (isIdentityProvider(authWebUrl)) {
181
- onSSOUnavailable?.();
182
- }
183
- return;
184
- }
185
- const signature = ssoSignature(oxyServices);
186
- if (silentSSOAttempted.has(signature)) {
187
- // Already attempted this page load (e.g. before a remount) — do not
188
- // re-fire. Mark the local fast-path too so subsequent re-renders skip.
189
- hasCheckedRef.current = true;
190
- return;
191
- }
192
- hasCheckedRef.current = true;
193
- silentSSOAttempted.add(signature);
194
- if (fedCMSupported) {
195
- checkSSO();
196
- } else {
197
- onSSOUnavailable?.();
198
- }
199
- }, [enabled, checkSSO, fedCMSupported, onSSOUnavailable, oxyServices, authWebUrl]);
200
- return {
201
- checkSSO,
202
- signInWithFedCM,
203
- isChecking: isCheckingRef.current,
204
- isFedCMSupported: fedCMSupported
205
- };
206
- }
207
28
  //# sourceMappingURL=useWebSSO.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_silentGuardKey","silentSSOAttempted","Set","ssoSignature","oxyServices","buildSilentGuardKey","getBaseURL","isWebBrowser","window","document","documentElement","isIdentityProvider","authWebUrl","hostname","location","idpHostname","URL","useWebSSO","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","useRef","hasCheckedRef","fedCMSupported","isFedCMSupported","config","checkSSO","useCallback","current","session","silentSignInWithFedCM","error","Error","String","signInWithFedCM","useEffect","signature","has","add","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["isWebBrowser","window","document","documentElement"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO,SAASA,YAAYA,CAAA,EAAY;EACtC,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD","ignoreList":[]}
@@ -44,7 +44,7 @@ const OxyAuthScreen = ({
44
44
  const bloomTheme = (0, _theme.useTheme)();
45
45
  const {
46
46
  oxyServices,
47
- switchSession,
47
+ handleWebSession,
48
48
  clientId
49
49
  } = (0, _OxyContext.useOxy)();
50
50
  const {
@@ -56,7 +56,7 @@ const OxyAuthScreen = ({
56
56
  openAuthApproval,
57
57
  openSameDeviceApproval,
58
58
  retry
59
- } = (0, _useOxyAuthSession.useOxyAuthSession)(oxyServices, clientId, switchSession, {
59
+ } = (0, _useOxyAuthSession.useOxyAuthSession)(oxyServices, clientId, handleWebSession, {
60
60
  onSignedIn: onAuthenticated
61
61
  });
62
62
 
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_theme","_button","_loading","_typography","_iconCircle","Icons","_interopRequireWildcard","_OxyContext","_OxyLogo","_interopRequireDefault","_AnotherDeviceQR","_LoadingState","_useOxyAuthSession","_crossApex","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","OxyAuthScreen","goBack","onAuthenticated","bloomTheme","useTheme","oxyServices","switchSession","clientId","useOxy","qrData","qrPayload","isLoading","error","isWaiting","openAuthApproval","openSameDeviceApproval","retry","useOxyAuthSession","onSignedIn","crossApexWeb","isCrossApexWeb","jsx","View","className","children","size","color","colors","primary","message","jsxs","IconCircle","icon","Warning_Stroke2_Corner0_Rounded","Text","Button","variant","fullWidth","onPress","ArrowRotateClockwise_Stroke2_Corner0_Rounded","style","primaryForeground","H4","fillColor","text","Loading","Linking","openURL","OXY_ACCOUNTS_WEB_URL","accessibilityLabel","_default","exports"],"sourceRoot":"../../../../src","sources":["ui/screens/OxyAuthScreen.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_theme","_button","_loading","_typography","_iconCircle","Icons","_interopRequireWildcard","_OxyContext","_OxyLogo","_interopRequireDefault","_AnotherDeviceQR","_LoadingState","_useOxyAuthSession","_crossApex","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","OxyAuthScreen","goBack","onAuthenticated","bloomTheme","useTheme","oxyServices","handleWebSession","clientId","useOxy","qrData","qrPayload","isLoading","error","isWaiting","openAuthApproval","openSameDeviceApproval","retry","useOxyAuthSession","onSignedIn","crossApexWeb","isCrossApexWeb","jsx","View","className","children","size","color","colors","primary","message","jsxs","IconCircle","icon","Warning_Stroke2_Corner0_Rounded","Text","Button","variant","fullWidth","onPress","ArrowRotateClockwise_Stroke2_Corner0_Rounded","style","primaryForeground","H4","fillColor","text","Loading","Linking","openURL","OXY_ACCOUNTS_WEB_URL","accessibilityLabel","_default","exports"],"sourceRoot":"../../../../src","sources":["ui/screens/OxyAuthScreen.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createSessionClient = createSessionClient;
7
+ var _core = require("@oxyhq/core");
8
+ var _sessionClientHost = require("./sessionClientHost.js");
9
+ var _tokenTransport = require("./tokenTransport.js");
10
+ /**
11
+ * Wires a `SessionClient` for `@oxyhq/services`: builds the `SessionClientHost`
12
+ * adapter (Task 1) and the platform `TokenTransport` (Task 3) over the given
13
+ * `OxyServices` instance, and returns both the client and the host — the host
14
+ * is returned (not just the client) so `OxyContext` (Fase 3-B) can call
15
+ * `host.setCurrentAccountId(...)` as the active account changes.
16
+ */
17
+ function createSessionClient(oxyServices) {
18
+ const host = (0, _sessionClientHost.createSessionClientHost)(oxyServices);
19
+ const transport = (0, _tokenTransport.createTokenTransport)(oxyServices);
20
+ const client = new _core.SessionClient(host, {
21
+ transport
22
+ });
23
+ return {
24
+ client,
25
+ host
26
+ };
27
+ }
28
+ //# sourceMappingURL=createSessionClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_core","require","_sessionClientHost","_tokenTransport","createSessionClient","oxyServices","host","createSessionClientHost","transport","createTokenTransport","client","SessionClient"],"sourceRoot":"../../../../src","sources":["ui/session/createSessionClient.ts"],"mappings":";;;;;;AACA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,mBAAmBA,CAACC,WAAwB,EAG1D;EACA,MAAMC,IAAI,GAAG,IAAAC,0CAAuB,EAACF,WAAW,CAAC;EACjD,MAAMG,SAAS,GAAG,IAAAC,oCAAoB,EAACJ,WAAW,CAAC;EACnD,MAAMK,MAAM,GAAG,IAAIC,mBAAa,CAACL,IAAI,EAAE;IAAEE;EAAU,CAAC,CAAC;EACrD,OAAO;IAAEE,MAAM;IAAEJ;EAAK,CAAC;AACzB","ignoreList":[]}