@robelest/convex-auth 0.0.4-preview.13 → 0.0.4-preview.15

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 (323) hide show
  1. package/README.md +140 -9
  2. package/dist/bin.cjs +5957 -5478
  3. package/dist/client/index.d.ts +3 -7
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +27 -26
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/component/_generated/api.d.ts +14 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -1
  9. package/dist/component/_generated/api.js.map +1 -1
  10. package/dist/component/_generated/component.d.ts +1513 -3
  11. package/dist/component/_generated/component.d.ts.map +1 -1
  12. package/dist/component/convex.config.d.ts +2 -2
  13. package/dist/component/convex.config.d.ts.map +1 -1
  14. package/dist/component/model.d.ts +153 -0
  15. package/dist/component/model.d.ts.map +1 -0
  16. package/dist/component/model.js +327 -0
  17. package/dist/component/model.js.map +1 -0
  18. package/dist/component/providers/sso.d.ts +1 -1
  19. package/dist/component/public/enterprise.d.ts +49 -0
  20. package/dist/component/public/enterprise.d.ts.map +1 -0
  21. package/dist/component/public/enterprise.js +450 -0
  22. package/dist/component/public/enterprise.js.map +1 -0
  23. package/dist/component/public/factors.d.ts +52 -0
  24. package/dist/component/public/factors.d.ts.map +1 -0
  25. package/dist/component/public/factors.js +285 -0
  26. package/dist/component/public/factors.js.map +1 -0
  27. package/dist/component/public/groups.d.ts +118 -0
  28. package/dist/component/public/groups.d.ts.map +1 -0
  29. package/dist/component/public/groups.js +599 -0
  30. package/dist/component/public/groups.js.map +1 -0
  31. package/dist/component/public/identity.d.ts +93 -0
  32. package/dist/component/public/identity.d.ts.map +1 -0
  33. package/dist/component/public/identity.js +426 -0
  34. package/dist/component/public/identity.js.map +1 -0
  35. package/dist/component/public/keys.d.ts +41 -0
  36. package/dist/component/public/keys.d.ts.map +1 -0
  37. package/dist/component/public/keys.js +157 -0
  38. package/dist/component/public/keys.js.map +1 -0
  39. package/dist/component/public/shared.d.ts +26 -0
  40. package/dist/component/public/shared.d.ts.map +1 -0
  41. package/dist/component/public/shared.js +32 -0
  42. package/dist/component/public/shared.js.map +1 -0
  43. package/dist/component/public.d.ts +9 -321
  44. package/dist/component/public.d.ts.map +1 -1
  45. package/dist/component/public.js +6 -2145
  46. package/dist/component/schema.d.ts +368 -258
  47. package/dist/component/schema.js +23 -27
  48. package/dist/component/schema.js.map +1 -1
  49. package/dist/component/server/auth.d.ts +42 -7
  50. package/dist/component/server/auth.d.ts.map +1 -1
  51. package/dist/component/server/auth.js +70 -6
  52. package/dist/component/server/auth.js.map +1 -1
  53. package/dist/component/server/cookies.js +3 -0
  54. package/dist/component/server/cookies.js.map +1 -1
  55. package/dist/component/server/db.js +1 -0
  56. package/dist/component/server/db.js.map +1 -1
  57. package/dist/component/server/device.js +3 -1
  58. package/dist/component/server/device.js.map +1 -1
  59. package/dist/component/server/domains/core.js +466 -0
  60. package/dist/component/server/domains/core.js.map +1 -0
  61. package/dist/component/server/domains/sso.js +689 -0
  62. package/dist/component/server/domains/sso.js.map +1 -0
  63. package/dist/component/server/factory.d.ts +136 -0
  64. package/dist/component/server/factory.d.ts.map +1 -0
  65. package/dist/component/server/factory.js +1128 -0
  66. package/dist/component/server/factory.js.map +1 -0
  67. package/dist/component/server/fx.js +2 -1
  68. package/dist/component/server/fx.js.map +1 -1
  69. package/dist/component/server/http.js +287 -0
  70. package/dist/component/server/http.js.map +1 -0
  71. package/dist/component/server/identity.js +13 -0
  72. package/dist/component/server/identity.js.map +1 -0
  73. package/dist/component/server/keys.js +4 -0
  74. package/dist/component/server/keys.js.map +1 -1
  75. package/dist/component/server/mutations/account.js +1 -1
  76. package/dist/component/server/mutations/index.js +2 -2
  77. package/dist/component/server/mutations/index.js.map +1 -1
  78. package/dist/component/server/mutations/invalidate.js +1 -1
  79. package/dist/component/server/mutations/oauth.js +10 -7
  80. package/dist/component/server/mutations/oauth.js.map +1 -1
  81. package/dist/component/server/mutations/refresh.js +1 -1
  82. package/dist/component/server/mutations/register.js +1 -1
  83. package/dist/component/server/mutations/retrieve.js +1 -1
  84. package/dist/component/server/mutations/signature.js +1 -1
  85. package/dist/component/server/mutations/store.js +6 -3
  86. package/dist/component/server/mutations/store.js.map +1 -1
  87. package/dist/component/server/mutations/verify.js +1 -1
  88. package/dist/component/server/oauth.js +3 -0
  89. package/dist/component/server/oauth.js.map +1 -1
  90. package/dist/component/server/passkey.js +3 -2
  91. package/dist/component/server/passkey.js.map +1 -1
  92. package/dist/component/server/provider.js +2 -0
  93. package/dist/component/server/provider.js.map +1 -1
  94. package/dist/component/server/providers.js +3 -0
  95. package/dist/component/server/providers.js.map +1 -1
  96. package/dist/component/server/ratelimit.js +3 -0
  97. package/dist/component/server/ratelimit.js.map +1 -1
  98. package/dist/component/server/redirects.js +2 -0
  99. package/dist/component/server/redirects.js.map +1 -1
  100. package/dist/component/server/refresh.js +5 -0
  101. package/dist/component/server/refresh.js.map +1 -1
  102. package/dist/component/server/sessions.js +5 -0
  103. package/dist/component/server/sessions.js.map +1 -1
  104. package/dist/component/server/signin.js +2 -1
  105. package/dist/component/server/signin.js.map +1 -1
  106. package/dist/component/server/sso.js +166 -19
  107. package/dist/component/server/sso.js.map +1 -1
  108. package/dist/component/server/tokens.js +1 -0
  109. package/dist/component/server/tokens.js.map +1 -1
  110. package/dist/component/server/totp.js +4 -2
  111. package/dist/component/server/totp.js.map +1 -1
  112. package/dist/component/server/types.d.ts +50 -35
  113. package/dist/component/server/types.d.ts.map +1 -1
  114. package/dist/component/server/types.js.map +1 -1
  115. package/dist/component/server/users.js +1 -0
  116. package/dist/component/server/users.js.map +1 -1
  117. package/dist/component/server/utils.js +44 -2
  118. package/dist/component/server/utils.js.map +1 -1
  119. package/dist/providers/anonymous.d.ts +1 -1
  120. package/dist/providers/credentials.d.ts +1 -1
  121. package/dist/providers/password.d.ts +1 -1
  122. package/dist/providers/sso.d.ts +1 -1
  123. package/dist/providers/sso.js.map +1 -1
  124. package/dist/server/auth.d.ts +44 -9
  125. package/dist/server/auth.d.ts.map +1 -1
  126. package/dist/server/auth.js +70 -6
  127. package/dist/server/auth.js.map +1 -1
  128. package/dist/server/cookies.d.ts +1 -38
  129. package/dist/server/cookies.js +3 -0
  130. package/dist/server/cookies.js.map +1 -1
  131. package/dist/server/db.d.ts +1 -125
  132. package/dist/server/db.js +1 -0
  133. package/dist/server/db.js.map +1 -1
  134. package/dist/server/device.d.ts +1 -24
  135. package/dist/server/device.js +3 -1
  136. package/dist/server/device.js.map +1 -1
  137. package/dist/server/domains/core.d.ts +320 -0
  138. package/dist/server/domains/core.d.ts.map +1 -0
  139. package/dist/server/domains/core.js +466 -0
  140. package/dist/server/domains/core.js.map +1 -0
  141. package/dist/server/domains/sso.d.ts +340 -0
  142. package/dist/server/domains/sso.d.ts.map +1 -0
  143. package/dist/server/domains/sso.js +689 -0
  144. package/dist/server/domains/sso.js.map +1 -0
  145. package/dist/server/enterpriseValidators.d.ts +1 -0
  146. package/dist/server/enterpriseValidators.js +56 -0
  147. package/dist/server/enterpriseValidators.js.map +1 -0
  148. package/dist/server/factory.d.ts +136 -0
  149. package/dist/server/factory.d.ts.map +1 -0
  150. package/dist/server/factory.js +1128 -0
  151. package/dist/server/factory.js.map +1 -0
  152. package/dist/server/fx.d.ts +1 -16
  153. package/dist/server/fx.d.ts.map +1 -1
  154. package/dist/server/fx.js +1 -0
  155. package/dist/server/fx.js.map +1 -1
  156. package/dist/server/http.d.ts +59 -0
  157. package/dist/server/http.d.ts.map +1 -0
  158. package/dist/server/http.js +287 -0
  159. package/dist/server/http.js.map +1 -0
  160. package/dist/server/identity.d.ts +1 -0
  161. package/dist/server/identity.js +13 -0
  162. package/dist/server/identity.js.map +1 -0
  163. package/dist/server/index.d.ts +432 -1
  164. package/dist/server/index.d.ts.map +1 -1
  165. package/dist/server/index.js +486 -36
  166. package/dist/server/index.js.map +1 -1
  167. package/dist/server/keys.d.ts +1 -57
  168. package/dist/server/keys.js +4 -0
  169. package/dist/server/keys.js.map +1 -1
  170. package/dist/server/mutations/account.d.ts +7 -7
  171. package/dist/server/mutations/account.d.ts.map +1 -1
  172. package/dist/server/mutations/code.d.ts +13 -13
  173. package/dist/server/mutations/index.d.ts +107 -107
  174. package/dist/server/mutations/index.d.ts.map +1 -1
  175. package/dist/server/mutations/index.js +1 -1
  176. package/dist/server/mutations/index.js.map +1 -1
  177. package/dist/server/mutations/invalidate.d.ts +5 -5
  178. package/dist/server/mutations/oauth.d.ts +10 -10
  179. package/dist/server/mutations/oauth.d.ts.map +1 -1
  180. package/dist/server/mutations/oauth.js +9 -6
  181. package/dist/server/mutations/oauth.js.map +1 -1
  182. package/dist/server/mutations/refresh.d.ts +4 -4
  183. package/dist/server/mutations/register.d.ts +12 -12
  184. package/dist/server/mutations/register.d.ts.map +1 -1
  185. package/dist/server/mutations/retrieve.d.ts +1 -1
  186. package/dist/server/mutations/signature.d.ts +5 -5
  187. package/dist/server/mutations/signature.d.ts.map +1 -1
  188. package/dist/server/mutations/signin.d.ts +1 -1
  189. package/dist/server/mutations/signout.d.ts +1 -1
  190. package/dist/server/mutations/store.d.ts +3 -2
  191. package/dist/server/mutations/store.d.ts.map +1 -1
  192. package/dist/server/mutations/store.js +6 -3
  193. package/dist/server/mutations/store.js.map +1 -1
  194. package/dist/server/mutations/verifier.d.ts +1 -1
  195. package/dist/server/mutations/verify.d.ts +4 -4
  196. package/dist/server/oauth.d.ts +1 -59
  197. package/dist/server/oauth.js +3 -0
  198. package/dist/server/oauth.js.map +1 -1
  199. package/dist/server/passkey.d.ts.map +1 -1
  200. package/dist/server/passkey.js +3 -2
  201. package/dist/server/passkey.js.map +1 -1
  202. package/dist/server/provider.d.ts +1 -14
  203. package/dist/server/provider.d.ts.map +1 -1
  204. package/dist/server/provider.js +2 -0
  205. package/dist/server/provider.js.map +1 -1
  206. package/dist/server/providers.js +3 -0
  207. package/dist/server/providers.js.map +1 -1
  208. package/dist/server/ratelimit.d.ts +1 -22
  209. package/dist/server/ratelimit.js +3 -0
  210. package/dist/server/ratelimit.js.map +1 -1
  211. package/dist/server/redirects.d.ts +1 -10
  212. package/dist/server/redirects.js +2 -0
  213. package/dist/server/redirects.js.map +1 -1
  214. package/dist/server/refresh.d.ts +1 -37
  215. package/dist/server/refresh.js +5 -0
  216. package/dist/server/refresh.js.map +1 -1
  217. package/dist/server/sessions.d.ts +1 -28
  218. package/dist/server/sessions.js +5 -0
  219. package/dist/server/sessions.js.map +1 -1
  220. package/dist/server/signin.d.ts +1 -55
  221. package/dist/server/signin.js +2 -1
  222. package/dist/server/signin.js.map +1 -1
  223. package/dist/server/sso.d.ts +1 -348
  224. package/dist/server/sso.js +165 -18
  225. package/dist/server/sso.js.map +1 -1
  226. package/dist/server/templates.d.ts +1 -21
  227. package/dist/server/templates.js +1 -0
  228. package/dist/server/templates.js.map +1 -1
  229. package/dist/server/tokens.d.ts +1 -11
  230. package/dist/server/tokens.js +1 -0
  231. package/dist/server/tokens.js.map +1 -1
  232. package/dist/server/totp.d.ts +1 -23
  233. package/dist/server/totp.js +4 -2
  234. package/dist/server/totp.js.map +1 -1
  235. package/dist/server/types.d.ts +55 -71
  236. package/dist/server/types.d.ts.map +1 -1
  237. package/dist/server/types.js.map +1 -1
  238. package/dist/server/users.d.ts +1 -31
  239. package/dist/server/users.js +1 -0
  240. package/dist/server/users.js.map +1 -1
  241. package/dist/server/utils.d.ts +1 -27
  242. package/dist/server/utils.js +44 -2
  243. package/dist/server/utils.js.map +1 -1
  244. package/dist/server/version.d.ts +1 -1
  245. package/dist/server/version.js +1 -1
  246. package/dist/server/version.js.map +1 -1
  247. package/package.json +4 -5
  248. package/src/cli/bin.ts +5 -0
  249. package/src/cli/index.ts +22 -9
  250. package/src/cli/keys.ts +3 -0
  251. package/src/client/index.ts +36 -37
  252. package/src/component/_generated/api.ts +14 -0
  253. package/src/component/_generated/component.ts +1920 -3
  254. package/src/component/index.ts +2 -0
  255. package/src/component/model.ts +424 -0
  256. package/src/component/public/enterprise.ts +654 -0
  257. package/src/component/public/factors.ts +332 -0
  258. package/src/component/public/groups.ts +951 -0
  259. package/src/component/public/identity.ts +566 -0
  260. package/src/component/public/keys.ts +209 -0
  261. package/src/component/public/shared.ts +117 -0
  262. package/src/component/public.ts +5 -2965
  263. package/src/component/schema.ts +47 -57
  264. package/src/providers/sso.ts +1 -1
  265. package/src/server/auth.ts +192 -9
  266. package/src/server/cookies.ts +3 -0
  267. package/src/server/db.ts +3 -0
  268. package/src/server/device.ts +3 -1
  269. package/src/server/domains/core.ts +916 -0
  270. package/src/server/domains/sso.ts +1462 -0
  271. package/src/server/enterpriseValidators.ts +88 -0
  272. package/src/server/factory.ts +2168 -0
  273. package/src/server/fx.ts +1 -0
  274. package/src/server/http.ts +529 -0
  275. package/src/server/identity.ts +18 -0
  276. package/src/server/index.ts +712 -40
  277. package/src/server/keys.ts +4 -0
  278. package/src/server/mutations/index.ts +1 -1
  279. package/src/server/mutations/oauth.ts +36 -8
  280. package/src/server/mutations/store.ts +6 -3
  281. package/src/server/oauth.ts +6 -0
  282. package/src/server/passkey.ts +3 -2
  283. package/src/server/provider.ts +2 -0
  284. package/src/server/providers.ts +3 -0
  285. package/src/server/ratelimit.ts +3 -0
  286. package/src/server/redirects.ts +2 -0
  287. package/src/server/refresh.ts +5 -0
  288. package/src/server/sessions.ts +5 -0
  289. package/src/server/signin.ts +1 -0
  290. package/src/server/sso.ts +251 -17
  291. package/src/server/templates.ts +1 -0
  292. package/src/server/tokens.ts +1 -0
  293. package/src/server/totp.ts +4 -2
  294. package/src/server/types.ts +85 -77
  295. package/src/server/users.ts +1 -0
  296. package/src/server/utils.ts +71 -1
  297. package/src/server/version.ts +1 -1
  298. package/dist/component/public.js.map +0 -1
  299. package/dist/component/server/implementation.d.ts +0 -1264
  300. package/dist/component/server/implementation.d.ts.map +0 -1
  301. package/dist/component/server/implementation.js +0 -2365
  302. package/dist/component/server/implementation.js.map +0 -1
  303. package/dist/server/cookies.d.ts.map +0 -1
  304. package/dist/server/db.d.ts.map +0 -1
  305. package/dist/server/device.d.ts.map +0 -1
  306. package/dist/server/implementation.d.ts +0 -1264
  307. package/dist/server/implementation.d.ts.map +0 -1
  308. package/dist/server/implementation.js +0 -2365
  309. package/dist/server/implementation.js.map +0 -1
  310. package/dist/server/keys.d.ts.map +0 -1
  311. package/dist/server/oauth.d.ts.map +0 -1
  312. package/dist/server/ratelimit.d.ts.map +0 -1
  313. package/dist/server/redirects.d.ts.map +0 -1
  314. package/dist/server/refresh.d.ts.map +0 -1
  315. package/dist/server/sessions.d.ts.map +0 -1
  316. package/dist/server/signin.d.ts.map +0 -1
  317. package/dist/server/sso.d.ts.map +0 -1
  318. package/dist/server/templates.d.ts.map +0 -1
  319. package/dist/server/tokens.d.ts.map +0 -1
  320. package/dist/server/totp.d.ts.map +0 -1
  321. package/dist/server/users.d.ts.map +0 -1
  322. package/dist/server/utils.d.ts.map +0 -1
  323. package/src/server/implementation.ts +0 -5336
@@ -12,8 +12,17 @@ import {
12
12
  RegisteredQuery,
13
13
  TableNamesInDataModel,
14
14
  } from "convex/server";
15
+ import type { Infer } from "convex/values";
15
16
  import { GenericId, Value } from "convex/values";
16
17
 
18
+ import {
19
+ vApiKeyDoc,
20
+ vAuthVerifierDoc,
21
+ vDeviceCodeDoc,
22
+ vPasskeyDoc,
23
+ vTotpFactorDoc,
24
+ vUserDoc,
25
+ } from "../component/model";
17
26
  import schema from "../component/schema";
18
27
  import { CredentialsUserConfig } from "../providers/credentials";
19
28
 
@@ -282,6 +291,62 @@ export interface SSOProviderConfig {
282
291
  type: "sso";
283
292
  }
284
293
 
294
+ export type EnterpriseAccountLinkingPolicy = "verifiedEmail" | "none";
295
+
296
+ export type EnterpriseScimReuseUserPolicy = "externalId" | "none";
297
+
298
+ export type EnterpriseJitProvisioningMode =
299
+ | "off"
300
+ | "createUser"
301
+ | "createUserAndMembership";
302
+
303
+ export type EnterpriseDeprovisionMode = "soft" | "hard";
304
+
305
+ export interface EnterprisePolicy {
306
+ version: 1;
307
+ identity: {
308
+ accountLinking: {
309
+ oidc: EnterpriseAccountLinkingPolicy;
310
+ saml: EnterpriseAccountLinkingPolicy;
311
+ };
312
+ };
313
+ provisioning: {
314
+ scimReuse: {
315
+ user: EnterpriseScimReuseUserPolicy;
316
+ };
317
+ jit: {
318
+ mode: EnterpriseJitProvisioningMode;
319
+ defaultRole: string;
320
+ };
321
+ deprovision: {
322
+ mode: EnterpriseDeprovisionMode;
323
+ };
324
+ };
325
+ extend?: Record<string, unknown>;
326
+ }
327
+
328
+ export interface EnterprisePolicyPatch {
329
+ identity?: {
330
+ accountLinking?: {
331
+ oidc?: EnterpriseAccountLinkingPolicy;
332
+ saml?: EnterpriseAccountLinkingPolicy;
333
+ };
334
+ };
335
+ provisioning?: {
336
+ scimReuse?: {
337
+ user?: EnterpriseScimReuseUserPolicy;
338
+ };
339
+ jit?: {
340
+ mode?: EnterpriseJitProvisioningMode;
341
+ defaultRole?: string;
342
+ };
343
+ deprovision?: {
344
+ mode?: EnterpriseDeprovisionMode;
345
+ };
346
+ };
347
+ extend?: Record<string, unknown>;
348
+ }
349
+
285
350
  /**
286
351
  * Email provider config for magic link / OTP sign-in.
287
352
  */
@@ -1055,6 +1120,9 @@ export type AuthComponentApi = {
1055
1120
  enterpriseDomainAdd: FunctionReference<"mutation", "internal", any, any>;
1056
1121
  enterpriseDomainList: FunctionReference<"query", "internal", any, any>;
1057
1122
  enterpriseDomainDelete: FunctionReference<"mutation", "internal", any, any>;
1123
+ enterpriseSecretUpsert: FunctionReference<"mutation", "internal", any, any>;
1124
+ enterpriseSecretGet: FunctionReference<"query", "internal", any, any>;
1125
+ enterpriseSecretDelete: FunctionReference<"mutation", "internal", any, any>;
1058
1126
  enterpriseScimConfigUpsert: FunctionReference<
1059
1127
  "mutation",
1060
1128
  "internal",
@@ -1080,6 +1148,12 @@ export type AuthComponentApi = {
1080
1148
  any,
1081
1149
  any
1082
1150
  >;
1151
+ enterpriseScimIdentityGetByEnterpriseAndUser: FunctionReference<
1152
+ "query",
1153
+ "internal",
1154
+ any,
1155
+ any
1156
+ >;
1083
1157
  enterpriseScimIdentityGetByMappedGroup: FunctionReference<
1084
1158
  "query",
1085
1159
  "internal",
@@ -1243,80 +1317,25 @@ export type SessionInfoWithTokens = {
1243
1317
  // code can work with typed results from cross-component queries/mutations
1244
1318
  // instead of casting to `any` at every field access.
1245
1319
 
1246
- export interface TotpDoc {
1247
- _id: string;
1248
- _creationTime: number;
1249
- userId: string;
1250
- secret: ArrayBuffer;
1251
- digits: number;
1252
- period: number;
1253
- verified: boolean;
1254
- name?: string;
1255
- createdAt: number;
1256
- lastUsedAt?: number;
1257
- }
1320
+ export type TotpDoc = Infer<typeof vTotpFactorDoc>;
1258
1321
 
1259
- export interface PasskeyDoc {
1260
- _id: string;
1261
- _creationTime: number;
1262
- userId: string;
1263
- credentialId: string;
1264
- publicKey: ArrayBuffer;
1265
- algorithm: number;
1266
- counter: number;
1267
- transports?: string[];
1268
- deviceType: string;
1269
- backedUp: boolean;
1270
- name?: string;
1271
- createdAt: number;
1272
- lastUsedAt?: number;
1273
- }
1322
+ export type PasskeyDoc = Infer<typeof vPasskeyDoc>;
1274
1323
 
1275
- export interface VerifierDoc {
1276
- _id: string;
1277
- _creationTime: number;
1278
- signature?: string;
1279
- sessionId?: string;
1280
- }
1324
+ export type VerifierDoc = Infer<typeof vAuthVerifierDoc>;
1281
1325
 
1282
1326
  /**
1283
- * Plain cross-component user document shape with `string` IDs.
1327
+ * Cross-component user document shape inferred from the component validator.
1284
1328
  *
1285
- * Used by internal typed wrappers (`queryUserById`, etc.) that operate
1286
- * across the component boundary where Convex `Id<"User">` is erased
1287
- * to a plain string. Not intended for consumer use consumers should
1288
- * use `UserDoc` (exported from `@robelest/convex-auth/component`)
1289
- * which preserves typed `Id<"User">`.
1329
+ * Used by internal typed wrappers (`queryUserById`, etc.) so server code stays
1330
+ * aligned with the component runtime contract. Not intended for consumer use —
1331
+ * consumers should use `UserDoc` (exported from
1332
+ * `@robelest/convex-auth/component`).
1290
1333
  *
1291
1334
  * @internal
1292
1335
  */
1293
- export interface CrossComponentUserDoc {
1294
- _id: string;
1295
- _creationTime: number;
1296
- email?: string;
1297
- emailVerificationTime?: number;
1298
- phone?: string;
1299
- phoneVerificationTime?: number;
1300
- name?: string;
1301
- image?: string;
1302
- isAnonymous?: boolean;
1303
- }
1336
+ export type CrossComponentUserDoc = Infer<typeof vUserDoc>;
1304
1337
 
1305
- export interface KeyDoc {
1306
- _id: string;
1307
- _creationTime: number;
1308
- userId: string;
1309
- prefix: string;
1310
- hashedKey: string;
1311
- name: string;
1312
- scopes: Array<{ resource: string; actions: string[] }>;
1313
- rateLimit?: { maxRequests: number; windowMs: number };
1314
- rateLimitState?: { attemptsLeft: number; lastAttemptTime: number };
1315
- expiresAt?: number;
1316
- lastUsedAt?: number;
1317
- createdAt: number;
1318
- revoked: boolean;
1319
- }
1338
+ export type KeyDoc = Infer<typeof vApiKeyDoc>;
1320
1339
 
1321
1340
  // ---------------------------------------------------------------------------
1322
1341
  // Cross-component wrapper context
@@ -1555,18 +1574,7 @@ export async function mutateKeyDelete(
1555
1574
 
1556
1575
  // -- Device authorization queries / mutations --
1557
1576
 
1558
- export interface DeviceDoc {
1559
- _id: string;
1560
- _creationTime: number;
1561
- deviceCodeHash: string;
1562
- userCode: string;
1563
- expiresAt: number;
1564
- interval: number;
1565
- status: "pending" | "authorized" | "denied";
1566
- userId?: string;
1567
- sessionId?: string;
1568
- lastPolledAt?: number;
1569
- }
1577
+ export type DeviceDoc = Infer<typeof vDeviceCodeDoc>;
1570
1578
 
1571
1579
  export async function mutateDeviceInsert(
1572
1580
  ctx: ComponentCallCtx,
@@ -37,6 +37,7 @@ function mergeExtend(
37
37
  return existingRecord ? { ...existingRecord, ...incoming } : incoming;
38
38
  }
39
39
 
40
+ /** @internal */
40
41
  export async function upsertUserAndAccount(
41
42
  ctx: MutationCtx,
42
43
  sessionId: GenericId<"Session"> | null,
@@ -3,7 +3,11 @@ import {
3
3
  generateRandomString as osloGenerateRandomString,
4
4
  } from "@oslojs/crypto/random";
5
5
  import { sha256 as rawSha256 } from "@oslojs/crypto/sha2";
6
- import { encodeHexLowerCase } from "@oslojs/encoding";
6
+ import {
7
+ decodeBase64urlIgnorePadding,
8
+ encodeBase64urlNoPadding,
9
+ encodeHexLowerCase,
10
+ } from "@oslojs/encoding";
7
11
 
8
12
  import { AuthError } from "./fx";
9
13
 
@@ -13,6 +17,7 @@ import { AuthError } from "./fx";
13
17
  * Uses `AuthError.toConvexError()` directly since this is a synchronous guard
14
18
  * called inline in many expressions — not suitable for Fx pipeline wrapping.
15
19
  */
20
+ /** @internal */
16
21
  export function requireEnv(name: string) {
17
22
  const value = process.env[name];
18
23
  if (value === undefined) {
@@ -25,6 +30,7 @@ export function requireEnv(name: string) {
25
30
  return value;
26
31
  }
27
32
 
33
+ /** @internal */
28
34
  export function isLocalHost(host?: string) {
29
35
  if (host === undefined) {
30
36
  return false;
@@ -45,13 +51,17 @@ export function isLocalHost(host?: string) {
45
51
 
46
52
  // Internal server utilities (merged from former internalUtils.ts)
47
53
 
54
+ /** @internal */
48
55
  export const TOKEN_SUB_CLAIM_DIVIDER = "|";
56
+ /** @internal */
49
57
  export const REFRESH_TOKEN_DIVIDER = "|";
50
58
 
59
+ /** @internal */
51
60
  export async function sha256(input: string) {
52
61
  return encodeHexLowerCase(rawSha256(new TextEncoder().encode(input)));
53
62
  }
54
63
 
64
+ /** @internal */
55
65
  export function generateRandomString(length: number, alphabet: string) {
56
66
  const random: RandomReader = {
57
67
  read(bytes) {
@@ -62,10 +72,12 @@ export function generateRandomString(length: number, alphabet: string) {
62
72
  return osloGenerateRandomString(random, alphabet, length);
63
73
  }
64
74
 
75
+ /** @internal */
65
76
  export function errorMessage(error: unknown) {
66
77
  return error instanceof Error ? error.message : String(error);
67
78
  }
68
79
 
80
+ /** @internal */
69
81
  export function logError(error: unknown) {
70
82
  logWithLevel(
71
83
  LOG_LEVELS.ERROR,
@@ -75,6 +87,7 @@ export function logError(error: unknown) {
75
87
  );
76
88
  }
77
89
 
90
+ /** @internal */
78
91
  export const LOG_LEVELS = {
79
92
  ERROR: "ERROR",
80
93
  WARN: "WARN",
@@ -83,6 +96,7 @@ export const LOG_LEVELS = {
83
96
  } as const;
84
97
  type LogLevel = keyof typeof LOG_LEVELS;
85
98
 
99
+ /** @internal */
86
100
  export function logWithLevel(level: LogLevel, ...args: unknown[]) {
87
101
  const configuredLogLevel =
88
102
  LOG_LEVELS[
@@ -111,6 +125,7 @@ export function logWithLevel(level: LogLevel, ...args: unknown[]) {
111
125
  }
112
126
 
113
127
  const UNREDACTED_LENGTH = 5;
128
+ /** @internal */
114
129
  export function maybeRedact(value: string) {
115
130
  if (value === "") {
116
131
  return "";
@@ -129,3 +144,58 @@ export function maybeRedact(value: string) {
129
144
  return value;
130
145
  }
131
146
  }
147
+
148
+ const SECRET_KEY_ENV = "AUTH_SECRET_ENCRYPTION_KEY";
149
+ const SECRET_IV_LENGTH = 12;
150
+
151
+ function toArrayBuffer(bytes: Uint8Array) {
152
+ return bytes.buffer.slice(
153
+ bytes.byteOffset,
154
+ bytes.byteOffset + bytes.byteLength,
155
+ ) as ArrayBuffer;
156
+ }
157
+
158
+ async function getSecretCryptoKey() {
159
+ const material = requireEnv(SECRET_KEY_ENV);
160
+ const rawKey = rawSha256(new TextEncoder().encode(material));
161
+ return await crypto.subtle.importKey(
162
+ "raw",
163
+ toArrayBuffer(rawKey),
164
+ { name: "AES-GCM" },
165
+ false,
166
+ ["encrypt", "decrypt"],
167
+ );
168
+ }
169
+
170
+ /** @internal */
171
+ export async function encryptSecret(value: string) {
172
+ const key = await getSecretCryptoKey();
173
+ const iv = crypto.getRandomValues(new Uint8Array(SECRET_IV_LENGTH));
174
+ const encrypted = await crypto.subtle.encrypt(
175
+ { name: "AES-GCM", iv: toArrayBuffer(iv) },
176
+ key,
177
+ toArrayBuffer(new TextEncoder().encode(value)),
178
+ );
179
+ return `${encodeBase64urlNoPadding(iv)}.${encodeBase64urlNoPadding(new Uint8Array(encrypted))}`;
180
+ }
181
+
182
+ /** @internal */
183
+ export async function decryptSecret(ciphertext: string) {
184
+ const [ivEncoded, payloadEncoded] = ciphertext.split(".");
185
+ if (!ivEncoded || !payloadEncoded) {
186
+ throw new AuthError(
187
+ "INVALID_PARAMETERS",
188
+ "Stored enterprise secret is malformed.",
189
+ ).toConvexError();
190
+ }
191
+ const key = await getSecretCryptoKey();
192
+ const decrypted = await crypto.subtle.decrypt(
193
+ {
194
+ name: "AES-GCM",
195
+ iv: toArrayBuffer(decodeBase64urlIgnorePadding(ivEncoded)),
196
+ },
197
+ key,
198
+ toArrayBuffer(decodeBase64urlIgnorePadding(payloadEncoded)),
199
+ );
200
+ return new TextDecoder().decode(decrypted);
201
+ }
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by scripts/generate-version.js — do not edit.
2
- export const AUTH_VERSION = "0.0.4-preview.13";
2
+ export const AUTH_VERSION = "0.0.4-preview.15";