@arch-cadre/core 0.0.23 → 0.0.24

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 (90) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +1 -29
  2. package/dist/_virtual/_rolldown/runtime.mjs +1 -18
  3. package/dist/core/auth/augment.cjs +1 -71
  4. package/dist/core/auth/augment.d.cts.map +1 -1
  5. package/dist/core/auth/augment.d.mts.map +1 -1
  6. package/dist/core/auth/augment.mjs +1 -65
  7. package/dist/core/auth/augment.mjs.map +1 -1
  8. package/dist/core/auth/email-verification.cjs +1 -99
  9. package/dist/core/auth/email-verification.mjs +1 -91
  10. package/dist/core/auth/email-verification.mjs.map +1 -1
  11. package/dist/core/auth/logic.cjs +1 -224
  12. package/dist/core/auth/logic.mjs +1 -212
  13. package/dist/core/auth/logic.mjs.map +1 -1
  14. package/dist/core/auth/password-reset.cjs +1 -118
  15. package/dist/core/auth/password-reset.mjs +1 -110
  16. package/dist/core/auth/password-reset.mjs.map +1 -1
  17. package/dist/core/auth/rbac.cjs +1 -118
  18. package/dist/core/auth/rbac.mjs +1 -103
  19. package/dist/core/auth/rbac.mjs.map +1 -1
  20. package/dist/core/auth/session.cjs +1 -154
  21. package/dist/core/auth/session.mjs +1 -142
  22. package/dist/core/auth/session.mjs.map +1 -1
  23. package/dist/core/auth/types.d.cts.map +1 -1
  24. package/dist/core/auth/types.d.mts.map +1 -1
  25. package/dist/core/auth/utils/encode.cjs +1 -27
  26. package/dist/core/auth/utils/encode.mjs +1 -25
  27. package/dist/core/auth/utils/encode.mjs.map +1 -1
  28. package/dist/core/auth/utils/encryption.cjs +1 -67
  29. package/dist/core/auth/utils/encryption.mjs +1 -63
  30. package/dist/core/auth/utils/encryption.mjs.map +1 -1
  31. package/dist/core/auth/validation.cjs +1 -39
  32. package/dist/core/auth/validation.mjs +1 -30
  33. package/dist/core/auth/validation.mjs.map +1 -1
  34. package/dist/core/bootstrap.cjs +1 -39
  35. package/dist/core/bootstrap.mjs +1 -39
  36. package/dist/core/bootstrap.mjs.map +1 -1
  37. package/dist/core/config.cjs +1 -6
  38. package/dist/core/config.mjs +1 -5
  39. package/dist/core/config.mjs.map +1 -1
  40. package/dist/core/config.server.cjs +1 -60
  41. package/dist/core/config.server.mjs +1 -56
  42. package/dist/core/config.server.mjs.map +1 -1
  43. package/dist/core/event-bus.cjs +1 -48
  44. package/dist/core/event-bus.d.cts.map +1 -1
  45. package/dist/core/event-bus.d.mts.map +1 -1
  46. package/dist/core/event-bus.mjs +1 -47
  47. package/dist/core/event-bus.mjs.map +1 -1
  48. package/dist/core/filesystem/index.cjs +1 -11
  49. package/dist/core/filesystem/index.mjs +1 -12
  50. package/dist/core/filesystem/index.mjs.map +1 -1
  51. package/dist/core/filesystem/providers/local.cjs +1 -43
  52. package/dist/core/filesystem/providers/local.mjs +1 -40
  53. package/dist/core/filesystem/providers/local.mjs.map +1 -1
  54. package/dist/core/filesystem/service.cjs +1 -43
  55. package/dist/core/filesystem/service.mjs +1 -42
  56. package/dist/core/filesystem/service.mjs.map +1 -1
  57. package/dist/core/notifications/actions.cjs +1 -36
  58. package/dist/core/notifications/actions.mjs +1 -32
  59. package/dist/core/notifications/actions.mjs.map +1 -1
  60. package/dist/core/notifications/index.cjs +1 -2
  61. package/dist/core/notifications/index.mjs +1 -4
  62. package/dist/core/notifications/service.cjs +1 -30
  63. package/dist/core/notifications/service.mjs +1 -30
  64. package/dist/core/notifications/service.mjs.map +1 -1
  65. package/dist/core/setup.cjs +1 -25
  66. package/dist/core/setup.mjs +1 -24
  67. package/dist/core/setup.mjs.map +1 -1
  68. package/dist/index.cjs +1 -30
  69. package/dist/index.mjs +1 -6
  70. package/dist/server/auth/email.cjs +1 -24
  71. package/dist/server/auth/email.mjs +1 -22
  72. package/dist/server/auth/email.mjs.map +1 -1
  73. package/dist/server/auth/password.cjs +1 -37
  74. package/dist/server/auth/password.mjs +1 -33
  75. package/dist/server/auth/password.mjs.map +1 -1
  76. package/dist/server/auth/user.cjs +1 -165
  77. package/dist/server/auth/user.mjs +1 -152
  78. package/dist/server/auth/user.mjs.map +1 -1
  79. package/dist/server/database/inject.cjs +1 -24
  80. package/dist/server/database/inject.mjs +1 -22
  81. package/dist/server/database/inject.mjs.map +1 -1
  82. package/dist/server/database/schema.cjs +1 -163
  83. package/dist/server/database/schema.mjs +1 -150
  84. package/dist/server/database/schema.mjs.map +1 -1
  85. package/dist/server/emails/index.cjs +1 -32
  86. package/dist/server/emails/index.mjs +1 -28
  87. package/dist/server/emails/index.mjs.map +1 -1
  88. package/dist/server.cjs +1 -145
  89. package/dist/server.mjs +1 -23
  90. package/package.json +1 -1
@@ -1,143 +1,2 @@
1
- "use server";
2
-
3
- import { db } from "../../server/database/inject.mjs";
4
- import { sessionTable, userTable } from "../../server/database/schema.mjs";
5
- import { augmentSession } from "./augment.mjs";
6
- import { performFullUserAugmentation } from "./logic.mjs";
7
- import { and, eq, ne } from "drizzle-orm";
8
- import { sha256 } from "@oslojs/crypto/sha2";
9
- import { encodeBase32LowerCaseNoPadding, encodeHexLowerCase } from "@oslojs/encoding";
10
- import { addDays } from "date-fns";
11
- import { cookies, headers } from "next/headers";
12
- import { redirect } from "next/navigation";
13
-
14
- //#region src/core/auth/session.ts
15
- /**
16
- * Returns the user's IP address.
17
- */
18
- async function getIPAddress() {
19
- return (await headers()).get("x-forwarded-for");
20
- }
21
- /**
22
- * Validates the session token.
23
- */
24
- async function validateSessionToken(token) {
25
- const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));
26
- const [row] = await db.select({
27
- session: sessionTable,
28
- user: userTable
29
- }).from(sessionTable).innerJoin(userTable, eq(sessionTable.userId, userTable.id)).where(eq(sessionTable.id, sessionId));
30
- if (!row || !row.user) return {
31
- session: null,
32
- user: null
33
- };
34
- const { session: baseSession, user: baseUser } = row;
35
- const { password, recovery_code, ...safeUser } = baseUser;
36
- if (/* @__PURE__ */ new Date() > baseSession.expiresAt) {
37
- await db.delete(sessionTable).where(eq(sessionTable.id, baseSession.id));
38
- return {
39
- session: null,
40
- user: null
41
- };
42
- }
43
- const augmentedUser = await performFullUserAugmentation(safeUser);
44
- const augmentedSession = await augmentSession(baseSession);
45
- return {
46
- session: augmentedSession ? { ...augmentedSession } : null,
47
- user: augmentedUser ? { ...augmentedUser } : null
48
- };
49
- }
50
- /**
51
- * Returns the current user session from cookies.
52
- */
53
- const getCurrentSession = async () => {
54
- const token = (await cookies()).get("session")?.value ?? null;
55
- if (token === null) return {
56
- session: null,
57
- user: null
58
- };
59
- return await validateSessionToken(token);
60
- };
61
- /**
62
- * Invalidates a single session.
63
- */
64
- async function invalidateSession(sessionId) {
65
- await db.delete(sessionTable).where(eq(sessionTable.id, sessionId));
66
- }
67
- /**
68
- * Invalidates all user sessions.
69
- */
70
- async function invalidateUserSessions(userId) {
71
- await db.delete(sessionTable).where(eq(sessionTable.userId, userId));
72
- }
73
- /**
74
- * Sets the session token in a cookie.
75
- */
76
- async function setSessionTokenCookie(token, expiresAt) {
77
- (await cookies()).set("session", token, {
78
- httpOnly: true,
79
- path: "/",
80
- secure: process.env.NODE_ENV === "production",
81
- sameSite: "lax",
82
- expires: expiresAt
83
- });
84
- }
85
- /**
86
- * Removes the session token cookie.
87
- */
88
- async function deleteSessionTokenCookie() {
89
- (await cookies()).delete("session");
90
- }
91
- /**
92
- * Generates a new random session token.
93
- */
94
- async function generateSessionToken() {
95
- const tokenBytes = new Uint8Array(20);
96
- crypto.getRandomValues(tokenBytes);
97
- return encodeBase32LowerCaseNoPadding(tokenBytes).toLowerCase();
98
- }
99
- /**
100
- * Creates a new session in the database.
101
- */
102
- async function createSession(token, userId, flags) {
103
- const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));
104
- const [session] = await db.insert(sessionTable).values({
105
- id: sessionId,
106
- expiresAt: new Date(addDays(/* @__PURE__ */ new Date(), 7)),
107
- active_organization_id: flags.activeOrganizationId,
108
- userId
109
- }).returning();
110
- return session;
111
- }
112
- /**
113
- * Signs the user out and redirects to the sign-in page.
114
- */
115
- async function sessionSignOut() {
116
- const { session } = await getCurrentSession();
117
- if (session) {
118
- await invalidateSession(session.id);
119
- await deleteSessionTokenCookie();
120
- }
121
- redirect("/signin");
122
- }
123
- /**
124
- * Get all active sessions for a user.
125
- */
126
- async function getUserSessions(userId, currentSessionId) {
127
- return (await db.select().from(sessionTable).where(eq(sessionTable.userId, userId))).map((session) => ({
128
- id: session.id,
129
- createdAt: session.createdAt,
130
- expiresAt: session.expiresAt,
131
- isCurrent: session.id === currentSessionId
132
- }));
133
- }
134
- /**
135
- * Invalidate all sessions for a user except the specified current one.
136
- */
137
- async function invalidateOtherSessions(userId, currentSessionId) {
138
- await db.delete(sessionTable).where(and(eq(sessionTable.userId, userId), ne(sessionTable.id, currentSessionId)));
139
- }
140
-
141
- //#endregion
142
- export { createSession, deleteSessionTokenCookie, generateSessionToken, getCurrentSession, getIPAddress, getUserSessions, invalidateOtherSessions, invalidateSession, invalidateUserSessions, sessionSignOut, setSessionTokenCookie, validateSessionToken };
1
+ "use server";import{db as e}from"../../server/database/inject.mjs";import{sessionTable as t,userTable as n}from"../../server/database/schema.mjs";import{augmentSession as r}from"./augment.mjs";import{performFullUserAugmentation as i}from"./logic.mjs";import{and as a,eq as o,ne as s}from"drizzle-orm";import{sha256 as c}from"@oslojs/crypto/sha2";import{encodeBase32LowerCaseNoPadding as l,encodeHexLowerCase as u}from"@oslojs/encoding";import{addDays as d}from"date-fns";import{cookies as f,headers as p}from"next/headers";import{redirect as m}from"next/navigation";async function h(){return(await p()).get(`x-forwarded-for`)}async function g(a){let s=u(c(new TextEncoder().encode(a))),[l]=await e.select({session:t,user:n}).from(t).innerJoin(n,o(t.userId,n.id)).where(o(t.id,s));if(!l||!l.user)return{session:null,user:null};let{session:d,user:f}=l,{password:p,recovery_code:m,...h}=f;if(new Date>d.expiresAt)return await e.delete(t).where(o(t.id,d.id)),{session:null,user:null};let g=await i(h),_=await r(d);return{session:_?{..._}:null,user:g?{...g}:null}}const _=async()=>{let e=(await f()).get(`session`)?.value??null;return e===null?{session:null,user:null}:await g(e)};async function v(n){await e.delete(t).where(o(t.id,n))}async function y(n){await e.delete(t).where(o(t.userId,n))}async function b(e,t){(await f()).set(`session`,e,{httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`,sameSite:`lax`,expires:t})}async function x(){(await f()).delete(`session`)}async function S(){let e=new Uint8Array(20);return crypto.getRandomValues(e),l(e).toLowerCase()}async function C(n,r,i){let a=u(c(new TextEncoder().encode(n))),[o]=await e.insert(t).values({id:a,expiresAt:new Date(d(new Date,7)),active_organization_id:i.activeOrganizationId,userId:r}).returning();return o}async function w(){let{session:e}=await _();e&&(await v(e.id),await x()),m(`/signin`)}async function T(n,r){return(await e.select().from(t).where(o(t.userId,n))).map(e=>({id:e.id,createdAt:e.createdAt,expiresAt:e.expiresAt,isCurrent:e.id===r}))}async function E(n,r){await e.delete(t).where(a(o(t.userId,n),s(t.id,r)))}export{C as createSession,x as deleteSessionTokenCookie,S as generateSessionToken,_ as getCurrentSession,h as getIPAddress,T as getUserSessions,E as invalidateOtherSessions,v as invalidateSession,y as invalidateUserSessions,w as sessionSignOut,b as setSessionTokenCookie,g as validateSessionToken};
143
2
  //# sourceMappingURL=session.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.mjs","names":[],"sources":["../../../src/core/auth/session.ts"],"sourcesContent":["\"use server\";\n\nimport { sha256 } from \"@oslojs/crypto/sha2\";\nimport {\n encodeBase32LowerCaseNoPadding,\n encodeHexLowerCase,\n} from \"@oslojs/encoding\";\nimport { addDays } from \"date-fns\";\nimport { and, eq, ne } from \"drizzle-orm\";\nimport { cookies, headers } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport { db } from \"../../server/database/inject\";\nimport { sessionTable, userTable } from \"../../server/database/schema\";\nimport { augmentSession } from \"./augment\";\nimport { performFullUserAugmentation } from \"./logic\";\n\nimport type {\n AuthSession,\n Session,\n SessionFlags,\n User,\n UserSession,\n} from \"./types\";\n\n/**\n * Returns the user's IP address.\n */\nexport async function getIPAddress(): Promise<string | null> {\n return (await headers()).get(\"x-forwarded-for\");\n}\n\n/**\n * Validates the session token.\n */\nexport async function validateSessionToken(\n token: string,\n): Promise<AuthSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [row] = await db\n .select({\n session: sessionTable,\n user: userTable,\n })\n .from(sessionTable)\n .innerJoin(userTable, eq(sessionTable.userId, userTable.id))\n .where(eq(sessionTable.id, sessionId));\n\n if (!row || !row.user) {\n return { session: null, user: null };\n }\n\n const { session: baseSession, user: baseUser } = row;\n\n // STRICTLY remove non-serializable and sensitive fields\n const { password, recovery_code, ...safeUser } = baseUser;\n\n // Check if session is expired\n if (new Date() > baseSession.expiresAt) {\n await db.delete(sessionTable).where(eq(sessionTable.id, baseSession.id));\n return { session: null, user: null };\n }\n\n // AUGMENT (EXTENSIBILITY POINTS)\n const augmentedUser = await performFullUserAugmentation(safeUser as User);\n const augmentedSession = await augmentSession(baseSession as Session);\n\n // ENSURE PLAIN OBJECTS for Client Components\n return {\n session: augmentedSession ? { ...augmentedSession } : null,\n user: augmentedUser ? { ...augmentedUser } : null,\n };\n}\n\n/**\n * Returns the current user session from cookies.\n */\nexport const getCurrentSession = async (): Promise<AuthSession> => {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"session\")?.value ?? null;\n\n if (token === null) {\n return { session: null, user: null };\n }\n\n return await validateSessionToken(token);\n};\n\n/**\n * Invalidates a single session.\n */\nexport async function invalidateSession(sessionId: string): Promise<void> {\n await db.delete(sessionTable).where(eq(sessionTable.id, sessionId));\n}\n\n/**\n * Invalidates all user sessions.\n */\nexport async function invalidateUserSessions(userId: string): Promise<void> {\n await db.delete(sessionTable).where(eq(sessionTable.userId, userId));\n}\n\n/**\n * Sets the session token in a cookie.\n */\nexport async function setSessionTokenCookie(\n token: string,\n expiresAt: Date,\n): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(\"session\", token, {\n httpOnly: true,\n path: \"/\",\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\",\n expires: expiresAt,\n });\n}\n\n/**\n * Removes the session token cookie.\n */\nexport async function deleteSessionTokenCookie(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.delete(\"session\");\n}\n\n/**\n * Generates a new random session token.\n */\nexport async function generateSessionToken(): Promise<string> {\n const tokenBytes = new Uint8Array(20);\n crypto.getRandomValues(tokenBytes);\n return encodeBase32LowerCaseNoPadding(tokenBytes).toLowerCase();\n}\n\n/**\n * Creates a new session in the database.\n */\nexport async function createSession(\n token: string,\n userId: string,\n flags: SessionFlags,\n): Promise<Session> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [session] = await db\n .insert(sessionTable)\n .values({\n id: sessionId,\n expiresAt: new Date(addDays(new Date(), 7)),\n active_organization_id: flags.activeOrganizationId,\n userId: userId,\n })\n .returning();\n\n return session;\n}\n\n/**\n * Signs the user out and redirects to the sign-in page.\n */\nexport async function sessionSignOut() {\n const { session } = await getCurrentSession();\n\n if (session) {\n await invalidateSession(session.id);\n await deleteSessionTokenCookie();\n }\n\n redirect(\"/signin\");\n}\n\n/**\n * Get all active sessions for a user.\n */\nexport async function getUserSessions(\n userId: string,\n currentSessionId: string,\n): Promise<UserSession[]> {\n const sessions = await db\n .select()\n .from(sessionTable)\n .where(eq(sessionTable.userId, userId));\n\n return sessions.map((session) => ({\n id: session.id,\n createdAt: session.createdAt,\n expiresAt: session.expiresAt,\n isCurrent: session.id === currentSessionId,\n }));\n}\n\n/**\n * Invalidate all sessions for a user except the specified current one.\n */\nexport async function invalidateOtherSessions(\n userId: string,\n currentSessionId: string,\n): Promise<void> {\n await db\n .delete(sessionTable)\n .where(\n and(\n eq(sessionTable.userId, userId),\n ne(sessionTable.id, currentSessionId),\n ),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.mjs","names":[],"sources":["../../../src/core/auth/session.ts"],"sourcesContent":["\"use server\";\n\nimport { sha256 } from \"@oslojs/crypto/sha2\";\nimport {\n encodeBase32LowerCaseNoPadding,\n encodeHexLowerCase,\n} from \"@oslojs/encoding\";\nimport { addDays } from \"date-fns\";\nimport { and, eq, ne } from \"drizzle-orm\";\nimport { cookies, headers } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport { db } from \"../../server/database/inject.js\";\nimport { sessionTable, userTable } from \"../../server/database/schema.js\";\nimport { augmentSession } from \"./augment.js\";\nimport { performFullUserAugmentation } from \"./logic.js\";\n\nimport type {\n AuthSession,\n Session,\n SessionFlags,\n User,\n UserSession,\n} from \"./types.js\";\n\n/**\n * Returns the user's IP address.\n */\nexport async function getIPAddress(): Promise<string | null> {\n return (await headers()).get(\"x-forwarded-for\");\n}\n\n/**\n * Validates the session token.\n */\nexport async function validateSessionToken(\n token: string,\n): Promise<AuthSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [row] = await db\n .select({\n session: sessionTable,\n user: userTable,\n })\n .from(sessionTable)\n .innerJoin(userTable, eq(sessionTable.userId, userTable.id))\n .where(eq(sessionTable.id, sessionId));\n\n if (!row || !row.user) {\n return { session: null, user: null };\n }\n\n const { session: baseSession, user: baseUser } = row;\n\n // STRICTLY remove non-serializable and sensitive fields\n const { password, recovery_code, ...safeUser } = baseUser;\n\n // Check if session is expired\n if (new Date() > baseSession.expiresAt) {\n await db.delete(sessionTable).where(eq(sessionTable.id, baseSession.id));\n return { session: null, user: null };\n }\n\n // AUGMENT (EXTENSIBILITY POINTS)\n const augmentedUser = await performFullUserAugmentation(safeUser as User);\n const augmentedSession = await augmentSession(baseSession as Session);\n\n // ENSURE PLAIN OBJECTS for Client Components\n return {\n session: augmentedSession ? { ...augmentedSession } : null,\n user: augmentedUser ? { ...augmentedUser } : null,\n };\n}\n\n/**\n * Returns the current user session from cookies.\n */\nexport const getCurrentSession = async (): Promise<AuthSession> => {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"session\")?.value ?? null;\n\n if (token === null) {\n return { session: null, user: null };\n }\n\n return await validateSessionToken(token);\n};\n\n/**\n * Invalidates a single session.\n */\nexport async function invalidateSession(sessionId: string): Promise<void> {\n await db.delete(sessionTable).where(eq(sessionTable.id, sessionId));\n}\n\n/**\n * Invalidates all user sessions.\n */\nexport async function invalidateUserSessions(userId: string): Promise<void> {\n await db.delete(sessionTable).where(eq(sessionTable.userId, userId));\n}\n\n/**\n * Sets the session token in a cookie.\n */\nexport async function setSessionTokenCookie(\n token: string,\n expiresAt: Date,\n): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.set(\"session\", token, {\n httpOnly: true,\n path: \"/\",\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\",\n expires: expiresAt,\n });\n}\n\n/**\n * Removes the session token cookie.\n */\nexport async function deleteSessionTokenCookie(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.delete(\"session\");\n}\n\n/**\n * Generates a new random session token.\n */\nexport async function generateSessionToken(): Promise<string> {\n const tokenBytes = new Uint8Array(20);\n crypto.getRandomValues(tokenBytes);\n return encodeBase32LowerCaseNoPadding(tokenBytes).toLowerCase();\n}\n\n/**\n * Creates a new session in the database.\n */\nexport async function createSession(\n token: string,\n userId: string,\n flags: SessionFlags,\n): Promise<Session> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [session] = await db\n .insert(sessionTable)\n .values({\n id: sessionId,\n expiresAt: new Date(addDays(new Date(), 7)),\n active_organization_id: flags.activeOrganizationId,\n userId: userId,\n })\n .returning();\n\n return session;\n}\n\n/**\n * Signs the user out and redirects to the sign-in page.\n */\nexport async function sessionSignOut() {\n const { session } = await getCurrentSession();\n\n if (session) {\n await invalidateSession(session.id);\n await deleteSessionTokenCookie();\n }\n\n redirect(\"/signin\");\n}\n\n/**\n * Get all active sessions for a user.\n */\nexport async function getUserSessions(\n userId: string,\n currentSessionId: string,\n): Promise<UserSession[]> {\n const sessions = await db\n .select()\n .from(sessionTable)\n .where(eq(sessionTable.userId, userId));\n\n return sessions.map((session) => ({\n id: session.id,\n createdAt: session.createdAt,\n expiresAt: session.expiresAt,\n isCurrent: session.id === currentSessionId,\n }));\n}\n\n/**\n * Invalidate all sessions for a user except the specified current one.\n */\nexport async function invalidateOtherSessions(\n userId: string,\n currentSessionId: string,\n): Promise<void> {\n await db\n .delete(sessionTable)\n .where(\n and(\n eq(sessionTable.userId, userId),\n ne(sessionTable.id, currentSessionId),\n ),\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/core/auth/types.ts"],"mappings":";;;;KASY,IAAA,UAAc,SAAA,CAAU,YAAA;AAAA,KACxB,OAAA,UAAiB,YAAA,CAAa,YAAA,GAAe,MAAA;AAAA,KAC7C,oBAAA,UACH,yBAAA,CAA0B,YAAA,GAAe,MAAA;;;;AAFlD;KAQY,QAAA,GAAW,IAAA,GACrB,MAAA;EACE,KAAA,EAAO,QAAA;EACP,WAAA,EAAa,cAAA;AAAA;;;;UAMA,WAAA;EACf,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,QAAA;AAAA;AAAA,UAGS,YAAA;EAAA,CACd,GAAA;AAAA;AAAA,KAGS,WAAA;EACV,EAAA;EACA,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;EACX,SAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,YAAA;EACN,MAAA;EAAmB,OAAA,EAAS,OAAA;EAAS,IAAA,EAAM,QAAA;EAAU,QAAA;AAAA;EAErD,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;AAAA;EAEA,MAAA;EAAiB,OAAA;EAAiB,QAAA;AAAA;AAAA,UAEvB,wBAAA;EACf,OAAA,EAAS,oBAAA;EACT,IAAA,EAAM,QAAA;AAAA"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/core/auth/types.ts"],"mappings":";;;;KASY,IAAA,UAAc,SAAA,CAAU,YAAA;AAAA,KACxB,OAAA,UAAiB,YAAA,CAAa,YAAA,GAAe,MAAA;AAAA,KAC7C,oBAAA,UACH,yBAAA,CAA0B,YAAA,GAAe,MAAA;;;;AAFlD;KAQY,QAAA,GAAW,IAAA,GACrB,MAAA;EACE,KAAA,EAAO,QAAA;EACP,WAAA,EAAa,cAAA;AAAA;;;;UAMA,WAAA;EACf,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,QAAA;AAAA;AAAA,UAGS,YAAA;EAAA,CACd,GAAA;AAAA;AAAA,KAGS,WAAA;EACV,EAAA;EACA,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;EACX,SAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,YAAA;EACN,MAAA;EAAmB,OAAA,EAAS,OAAA;EAAS,IAAA,EAAM,QAAA;EAAU,QAAA;AAAA;EAEvD,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;AAAA;EAEE,MAAA;EAAiB,OAAA;EAAiB,QAAA;AAAA;AAAA,UAEvB,wBAAA;EACf,OAAA,EAAS,oBAAA;EACT,IAAA,EAAM,QAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/core/auth/types.ts"],"mappings":";;;;KASY,IAAA,UAAc,SAAA,CAAU,YAAA;AAAA,KACxB,OAAA,UAAiB,YAAA,CAAa,YAAA,GAAe,MAAA;AAAA,KAC7C,oBAAA,UACH,yBAAA,CAA0B,YAAA,GAAe,MAAA;;;;AAFlD;KAQY,QAAA,GAAW,IAAA,GACrB,MAAA;EACE,KAAA,EAAO,QAAA;EACP,WAAA,EAAa,cAAA;AAAA;;;;UAMA,WAAA;EACf,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,QAAA;AAAA;AAAA,UAGS,YAAA;EAAA,CACd,GAAA;AAAA;AAAA,KAGS,WAAA;EACV,EAAA;EACA,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;EACX,SAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,YAAA;EACN,MAAA;EAAmB,OAAA,EAAS,OAAA;EAAS,IAAA,EAAM,QAAA;EAAU,QAAA;AAAA;EAErD,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;AAAA;EAEA,MAAA;EAAiB,OAAA;EAAiB,QAAA;AAAA;AAAA,UAEvB,wBAAA;EACf,OAAA,EAAS,oBAAA;EACT,IAAA,EAAM,QAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/core/auth/types.ts"],"mappings":";;;;KASY,IAAA,UAAc,SAAA,CAAU,YAAA;AAAA,KACxB,OAAA,UAAiB,YAAA,CAAa,YAAA,GAAe,MAAA;AAAA,KAC7C,oBAAA,UACH,yBAAA,CAA0B,YAAA,GAAe,MAAA;;;;AAFlD;KAQY,QAAA,GAAW,IAAA,GACrB,MAAA;EACE,KAAA,EAAO,QAAA;EACP,WAAA,EAAa,cAAA;AAAA;;;;UAMA,WAAA;EACf,OAAA,EAAS,OAAA;EACT,IAAA,EAAM,QAAA;AAAA;AAAA,UAGS,YAAA;EAAA,CACd,GAAA;AAAA;AAAA,KAGS,WAAA;EACV,EAAA;EACA,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;EACX,SAAA;EAAA,CACC,GAAA;AAAA;AAAA,KAGS,YAAA;EACN,MAAA;EAAmB,OAAA,EAAS,OAAA;EAAS,IAAA,EAAM,QAAA;EAAU,QAAA;AAAA;EAEvD,MAAA;EACA,IAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;AAAA;EAEE,MAAA;EAAiB,OAAA;EAAiB,QAAA;AAAA;AAAA,UAEvB,wBAAA;EACf,OAAA,EAAS,oBAAA;EACT,IAAA,EAAM,QAAA;AAAA"}
@@ -1,27 +1 @@
1
- const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
2
- let _oslojs_encoding = require("@oslojs/encoding");
3
-
4
- //#region src/core/auth/utils/encode.ts
5
- /**
6
- * Generates a random one-time code (OTP).
7
- * @param length Length of the generated code (default 6).
8
- * @returns A random uppercase base32 string.
9
- */
10
- function generateRandomOTP(length = 6) {
11
- const bytes = new Uint8Array(5);
12
- crypto.getRandomValues(bytes);
13
- return (0, _oslojs_encoding.encodeBase32UpperCaseNoPadding)(bytes).substring(0, length);
14
- }
15
- /**
16
- * Generates a random recovery code.
17
- * @returns A random uppercase base32 string.
18
- */
19
- function generateRandomRecoveryCode() {
20
- const recoveryCodeBytes = new Uint8Array(10);
21
- crypto.getRandomValues(recoveryCodeBytes);
22
- return (0, _oslojs_encoding.encodeBase32UpperCaseNoPadding)(recoveryCodeBytes);
23
- }
24
-
25
- //#endregion
26
- exports.generateRandomOTP = generateRandomOTP;
27
- exports.generateRandomRecoveryCode = generateRandomRecoveryCode;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@oslojs/encoding`);function t(t=6){let n=new Uint8Array(5);return crypto.getRandomValues(n),(0,e.encodeBase32UpperCaseNoPadding)(n).substring(0,t)}function n(){let t=new Uint8Array(10);return crypto.getRandomValues(t),(0,e.encodeBase32UpperCaseNoPadding)(t)}exports.generateRandomOTP=t,exports.generateRandomRecoveryCode=n;
@@ -1,26 +1,2 @@
1
- import { encodeBase32UpperCaseNoPadding } from "@oslojs/encoding";
2
-
3
- //#region src/core/auth/utils/encode.ts
4
- /**
5
- * Generates a random one-time code (OTP).
6
- * @param length Length of the generated code (default 6).
7
- * @returns A random uppercase base32 string.
8
- */
9
- function generateRandomOTP(length = 6) {
10
- const bytes = new Uint8Array(5);
11
- crypto.getRandomValues(bytes);
12
- return encodeBase32UpperCaseNoPadding(bytes).substring(0, length);
13
- }
14
- /**
15
- * Generates a random recovery code.
16
- * @returns A random uppercase base32 string.
17
- */
18
- function generateRandomRecoveryCode() {
19
- const recoveryCodeBytes = new Uint8Array(10);
20
- crypto.getRandomValues(recoveryCodeBytes);
21
- return encodeBase32UpperCaseNoPadding(recoveryCodeBytes);
22
- }
23
-
24
- //#endregion
25
- export { generateRandomOTP, generateRandomRecoveryCode };
1
+ import{encodeBase32UpperCaseNoPadding as e}from"@oslojs/encoding";function t(t=6){let n=new Uint8Array(5);return crypto.getRandomValues(n),e(n).substring(0,t)}function n(){let t=new Uint8Array(10);return crypto.getRandomValues(t),e(t)}export{t as generateRandomOTP,n as generateRandomRecoveryCode};
26
2
  //# sourceMappingURL=encode.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"encode.mjs","names":[],"sources":["../../../../src/core/auth/utils/encode.ts"],"sourcesContent":["import { encodeBase32UpperCaseNoPadding } from \"@oslojs/encoding\";\n\n/**\n * Generates a random one-time code (OTP).\n * @param length Length of the generated code (default 6).\n * @returns A random uppercase base32 string.\n */\nexport function generateRandomOTP(length = 6): string {\n const bytes = new Uint8Array(5);\n crypto.getRandomValues(bytes);\n return encodeBase32UpperCaseNoPadding(bytes).substring(0, length);\n}\n\n/**\n * Generates a random recovery code.\n * @returns A random uppercase base32 string.\n */\nexport function generateRandomRecoveryCode(): string {\n const recoveryCodeBytes = new Uint8Array(10);\n crypto.getRandomValues(recoveryCodeBytes);\n return encodeBase32UpperCaseNoPadding(recoveryCodeBytes);\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,kBAAkB,SAAS,GAAW;CACpD,MAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,QAAO,gBAAgB,MAAM;AAC7B,QAAO,+BAA+B,MAAM,CAAC,UAAU,GAAG,OAAO;;;;;;AAOnE,SAAgB,6BAAqC;CACnD,MAAM,oBAAoB,IAAI,WAAW,GAAG;AAC5C,QAAO,gBAAgB,kBAAkB;AACzC,QAAO,+BAA+B,kBAAkB"}
1
+ {"version":3,"file":"encode.mjs","names":[],"sources":["../../../../src/core/auth/utils/encode.ts"],"sourcesContent":["import { encodeBase32UpperCaseNoPadding } from \"@oslojs/encoding\";\n\n/**\n * Generates a random one-time code (OTP).\n * @param length Length of the generated code (default 6).\n * @returns A random uppercase base32 string.\n */\nexport function generateRandomOTP(length = 6): string {\n const bytes = new Uint8Array(5);\n crypto.getRandomValues(bytes);\n return encodeBase32UpperCaseNoPadding(bytes).substring(0, length);\n}\n\n/**\n * Generates a random recovery code.\n * @returns A random uppercase base32 string.\n */\nexport function generateRandomRecoveryCode(): string {\n const recoveryCodeBytes = new Uint8Array(10);\n crypto.getRandomValues(recoveryCodeBytes);\n return encodeBase32UpperCaseNoPadding(recoveryCodeBytes);\n}\n"],"mappings":"kEAOA,SAAgB,EAAkB,EAAS,EAAW,CACpD,IAAM,EAAQ,IAAI,WAAW,EAAE,CAE/B,OADA,OAAO,gBAAgB,EAAM,CACtB,EAA+B,EAAM,CAAC,UAAU,EAAG,EAAO,CAOnE,SAAgB,GAAqC,CACnD,IAAM,EAAoB,IAAI,WAAW,GAAG,CAE5C,OADA,OAAO,gBAAgB,EAAkB,CAClC,EAA+B,EAAkB"}
@@ -1,67 +1 @@
1
- const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
2
- let _oslojs_encoding = require("@oslojs/encoding");
3
- let node_crypto = require("node:crypto");
4
- let _oslojs_binary = require("@oslojs/binary");
5
-
6
- //#region src/core/auth/utils/encryption.ts
7
- const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY;
8
- if (!ENCRYPTION_KEY) throw new Error("ENCRYPTION_KEY environment variable is not set");
9
- /**
10
- * The encryption key decoded from base64.
11
- */
12
- const key = (0, _oslojs_encoding.decodeBase64)(ENCRYPTION_KEY);
13
- /**
14
- * Encrypts data using AES-128-GCM.
15
- * @param data Data to be encrypted.
16
- * @returns Encrypted data including IV and auth tag.
17
- */
18
- function encrypt(data) {
19
- const iv = new Uint8Array(16);
20
- crypto.getRandomValues(iv);
21
- const cipher = (0, node_crypto.createCipheriv)("aes-128-gcm", key, iv);
22
- const encrypted = new _oslojs_binary.DynamicBuffer(0);
23
- encrypted.write(iv);
24
- encrypted.write(cipher.update(data));
25
- encrypted.write(cipher.final());
26
- encrypted.write(cipher.getAuthTag());
27
- return encrypted.bytes();
28
- }
29
- /**
30
- * Encrypts a string.
31
- * @param data String to be encrypted.
32
- * @returns Encrypted data as Uint8Array.
33
- */
34
- function encryptString(data) {
35
- return encrypt(new TextEncoder().encode(data));
36
- }
37
- /**
38
- * Decrypts data using AES-128-GCM.
39
- * @param encrypted Encrypted data (IV + content + auth tag).
40
- * @returns Decrypted data.
41
- */
42
- function decrypt(encrypted) {
43
- if (encrypted.byteLength < 33) throw new Error("Invalid encrypted data length");
44
- const iv = encrypted.slice(0, 16);
45
- const authTag = encrypted.slice(encrypted.byteLength - 16);
46
- const content = encrypted.slice(16, encrypted.byteLength - 16);
47
- const decipher = (0, node_crypto.createDecipheriv)("aes-128-gcm", key, iv);
48
- decipher.setAuthTag(authTag);
49
- const decrypted = new _oslojs_binary.DynamicBuffer(0);
50
- decrypted.write(decipher.update(content));
51
- decrypted.write(decipher.final());
52
- return decrypted.bytes();
53
- }
54
- /**
55
- * Decrypts data to a string.
56
- * @param data Encrypted data.
57
- * @returns Odszyfrowany ciąg znaków.
58
- */
59
- function decryptToString(data) {
60
- return new TextDecoder().decode(decrypt(data));
61
- }
62
-
63
- //#endregion
64
- exports.decrypt = decrypt;
65
- exports.decryptToString = decryptToString;
66
- exports.encrypt = encrypt;
67
- exports.encryptString = encryptString;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@oslojs/encoding`),t=require(`node:crypto`),n=require(`@oslojs/binary`);const r=process.env.ENCRYPTION_KEY;if(!r)throw Error(`ENCRYPTION_KEY environment variable is not set`);const i=(0,e.decodeBase64)(r);function a(e){let r=new Uint8Array(16);crypto.getRandomValues(r);let a=(0,t.createCipheriv)(`aes-128-gcm`,i,r),o=new n.DynamicBuffer(0);return o.write(r),o.write(a.update(e)),o.write(a.final()),o.write(a.getAuthTag()),o.bytes()}function o(e){return a(new TextEncoder().encode(e))}function s(e){if(e.byteLength<33)throw Error(`Invalid encrypted data length`);let r=e.slice(0,16),a=e.slice(e.byteLength-16),o=e.slice(16,e.byteLength-16),s=(0,t.createDecipheriv)(`aes-128-gcm`,i,r);s.setAuthTag(a);let c=new n.DynamicBuffer(0);return c.write(s.update(o)),c.write(s.final()),c.bytes()}function c(e){return new TextDecoder().decode(s(e))}exports.decrypt=s,exports.decryptToString=c,exports.encrypt=a,exports.encryptString=o;
@@ -1,64 +1,2 @@
1
- import { decodeBase64 } from "@oslojs/encoding";
2
- import { createCipheriv, createDecipheriv } from "node:crypto";
3
- import { DynamicBuffer } from "@oslojs/binary";
4
-
5
- //#region src/core/auth/utils/encryption.ts
6
- const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY;
7
- if (!ENCRYPTION_KEY) throw new Error("ENCRYPTION_KEY environment variable is not set");
8
- /**
9
- * The encryption key decoded from base64.
10
- */
11
- const key = decodeBase64(ENCRYPTION_KEY);
12
- /**
13
- * Encrypts data using AES-128-GCM.
14
- * @param data Data to be encrypted.
15
- * @returns Encrypted data including IV and auth tag.
16
- */
17
- function encrypt(data) {
18
- const iv = new Uint8Array(16);
19
- crypto.getRandomValues(iv);
20
- const cipher = createCipheriv("aes-128-gcm", key, iv);
21
- const encrypted = new DynamicBuffer(0);
22
- encrypted.write(iv);
23
- encrypted.write(cipher.update(data));
24
- encrypted.write(cipher.final());
25
- encrypted.write(cipher.getAuthTag());
26
- return encrypted.bytes();
27
- }
28
- /**
29
- * Encrypts a string.
30
- * @param data String to be encrypted.
31
- * @returns Encrypted data as Uint8Array.
32
- */
33
- function encryptString(data) {
34
- return encrypt(new TextEncoder().encode(data));
35
- }
36
- /**
37
- * Decrypts data using AES-128-GCM.
38
- * @param encrypted Encrypted data (IV + content + auth tag).
39
- * @returns Decrypted data.
40
- */
41
- function decrypt(encrypted) {
42
- if (encrypted.byteLength < 33) throw new Error("Invalid encrypted data length");
43
- const iv = encrypted.slice(0, 16);
44
- const authTag = encrypted.slice(encrypted.byteLength - 16);
45
- const content = encrypted.slice(16, encrypted.byteLength - 16);
46
- const decipher = createDecipheriv("aes-128-gcm", key, iv);
47
- decipher.setAuthTag(authTag);
48
- const decrypted = new DynamicBuffer(0);
49
- decrypted.write(decipher.update(content));
50
- decrypted.write(decipher.final());
51
- return decrypted.bytes();
52
- }
53
- /**
54
- * Decrypts data to a string.
55
- * @param data Encrypted data.
56
- * @returns Odszyfrowany ciąg znaków.
57
- */
58
- function decryptToString(data) {
59
- return new TextDecoder().decode(decrypt(data));
60
- }
61
-
62
- //#endregion
63
- export { decrypt, decryptToString, encrypt, encryptString };
1
+ import{decodeBase64 as e}from"@oslojs/encoding";import{createCipheriv as t,createDecipheriv as n}from"node:crypto";import{DynamicBuffer as r}from"@oslojs/binary";const i=process.env.ENCRYPTION_KEY;if(!i)throw Error(`ENCRYPTION_KEY environment variable is not set`);const a=e(i);function o(e){let n=new Uint8Array(16);crypto.getRandomValues(n);let i=t(`aes-128-gcm`,a,n),o=new r(0);return o.write(n),o.write(i.update(e)),o.write(i.final()),o.write(i.getAuthTag()),o.bytes()}function s(e){return o(new TextEncoder().encode(e))}function c(e){if(e.byteLength<33)throw Error(`Invalid encrypted data length`);let t=e.slice(0,16),i=e.slice(e.byteLength-16),o=e.slice(16,e.byteLength-16),s=n(`aes-128-gcm`,a,t);s.setAuthTag(i);let c=new r(0);return c.write(s.update(o)),c.write(s.final()),c.bytes()}function l(e){return new TextDecoder().decode(c(e))}export{c as decrypt,l as decryptToString,o as encrypt,s as encryptString};
64
2
  //# sourceMappingURL=encryption.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.mjs","names":[],"sources":["../../../../src/core/auth/utils/encryption.ts"],"sourcesContent":["import { createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { DynamicBuffer } from \"@oslojs/binary\";\nimport { decodeBase64 } from \"@oslojs/encoding\";\n\nconst ENCRYPTION_KEY = process.env.ENCRYPTION_KEY;\n\nif (!ENCRYPTION_KEY) {\n throw new Error(\"ENCRYPTION_KEY environment variable is not set\");\n}\n\n/**\n * The encryption key decoded from base64.\n */\nconst key = decodeBase64(ENCRYPTION_KEY);\n\n/**\n * Encrypts data using AES-128-GCM.\n * @param data Data to be encrypted.\n * @returns Encrypted data including IV and auth tag.\n */\nexport function encrypt(data: Uint8Array): Uint8Array {\n const iv = new Uint8Array(16);\n crypto.getRandomValues(iv);\n const cipher = createCipheriv(\"aes-128-gcm\", key, iv);\n const encrypted = new DynamicBuffer(0);\n encrypted.write(iv);\n encrypted.write(cipher.update(data));\n encrypted.write(cipher.final());\n encrypted.write(cipher.getAuthTag());\n return encrypted.bytes();\n}\n\n/**\n * Encrypts a string.\n * @param data String to be encrypted.\n * @returns Encrypted data as Uint8Array.\n */\nexport function encryptString(data: string): Uint8Array {\n return encrypt(new TextEncoder().encode(data));\n}\n\n/**\n * Decrypts data using AES-128-GCM.\n * @param encrypted Encrypted data (IV + content + auth tag).\n * @returns Decrypted data.\n */\nexport function decrypt(encrypted: Uint8Array): Uint8Array {\n if (encrypted.byteLength < 33) {\n throw new Error(\"Invalid encrypted data length\");\n }\n const iv = encrypted.slice(0, 16);\n const authTag = encrypted.slice(encrypted.byteLength - 16);\n const content = encrypted.slice(16, encrypted.byteLength - 16);\n\n const decipher = createDecipheriv(\"aes-128-gcm\", key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = new DynamicBuffer(0);\n decrypted.write(decipher.update(content));\n decrypted.write(decipher.final());\n return decrypted.bytes();\n}\n\n/**\n * Decrypts data to a string.\n * @param data Encrypted data.\n * @returns Odszyfrowany ciąg znaków.\n */\nexport function decryptToString(data: Uint8Array): string {\n return new TextDecoder().decode(decrypt(data));\n}\n"],"mappings":";;;;;AAIA,MAAM,iBAAiB,QAAQ,IAAI;AAEnC,IAAI,CAAC,eACH,OAAM,IAAI,MAAM,iDAAiD;;;;AAMnE,MAAM,MAAM,aAAa,eAAe;;;;;;AAOxC,SAAgB,QAAQ,MAA8B;CACpD,MAAM,KAAK,IAAI,WAAW,GAAG;AAC7B,QAAO,gBAAgB,GAAG;CAC1B,MAAM,SAAS,eAAe,eAAe,KAAK,GAAG;CACrD,MAAM,YAAY,IAAI,cAAc,EAAE;AACtC,WAAU,MAAM,GAAG;AACnB,WAAU,MAAM,OAAO,OAAO,KAAK,CAAC;AACpC,WAAU,MAAM,OAAO,OAAO,CAAC;AAC/B,WAAU,MAAM,OAAO,YAAY,CAAC;AACpC,QAAO,UAAU,OAAO;;;;;;;AAQ1B,SAAgB,cAAc,MAA0B;AACtD,QAAO,QAAQ,IAAI,aAAa,CAAC,OAAO,KAAK,CAAC;;;;;;;AAQhD,SAAgB,QAAQ,WAAmC;AACzD,KAAI,UAAU,aAAa,GACzB,OAAM,IAAI,MAAM,gCAAgC;CAElD,MAAM,KAAK,UAAU,MAAM,GAAG,GAAG;CACjC,MAAM,UAAU,UAAU,MAAM,UAAU,aAAa,GAAG;CAC1D,MAAM,UAAU,UAAU,MAAM,IAAI,UAAU,aAAa,GAAG;CAE9D,MAAM,WAAW,iBAAiB,eAAe,KAAK,GAAG;AACzD,UAAS,WAAW,QAAQ;CAE5B,MAAM,YAAY,IAAI,cAAc,EAAE;AACtC,WAAU,MAAM,SAAS,OAAO,QAAQ,CAAC;AACzC,WAAU,MAAM,SAAS,OAAO,CAAC;AACjC,QAAO,UAAU,OAAO;;;;;;;AAQ1B,SAAgB,gBAAgB,MAA0B;AACxD,QAAO,IAAI,aAAa,CAAC,OAAO,QAAQ,KAAK,CAAC"}
1
+ {"version":3,"file":"encryption.mjs","names":[],"sources":["../../../../src/core/auth/utils/encryption.ts"],"sourcesContent":["import { createCipheriv, createDecipheriv } from \"node:crypto\";\nimport { DynamicBuffer } from \"@oslojs/binary\";\nimport { decodeBase64 } from \"@oslojs/encoding\";\n\nconst ENCRYPTION_KEY = process.env.ENCRYPTION_KEY;\n\nif (!ENCRYPTION_KEY) {\n throw new Error(\"ENCRYPTION_KEY environment variable is not set\");\n}\n\n/**\n * The encryption key decoded from base64.\n */\nconst key = decodeBase64(ENCRYPTION_KEY);\n\n/**\n * Encrypts data using AES-128-GCM.\n * @param data Data to be encrypted.\n * @returns Encrypted data including IV and auth tag.\n */\nexport function encrypt(data: Uint8Array): Uint8Array {\n const iv = new Uint8Array(16);\n crypto.getRandomValues(iv);\n const cipher = createCipheriv(\"aes-128-gcm\", key, iv);\n const encrypted = new DynamicBuffer(0);\n encrypted.write(iv);\n encrypted.write(cipher.update(data));\n encrypted.write(cipher.final());\n encrypted.write(cipher.getAuthTag());\n return encrypted.bytes();\n}\n\n/**\n * Encrypts a string.\n * @param data String to be encrypted.\n * @returns Encrypted data as Uint8Array.\n */\nexport function encryptString(data: string): Uint8Array {\n return encrypt(new TextEncoder().encode(data));\n}\n\n/**\n * Decrypts data using AES-128-GCM.\n * @param encrypted Encrypted data (IV + content + auth tag).\n * @returns Decrypted data.\n */\nexport function decrypt(encrypted: Uint8Array): Uint8Array {\n if (encrypted.byteLength < 33) {\n throw new Error(\"Invalid encrypted data length\");\n }\n const iv = encrypted.slice(0, 16);\n const authTag = encrypted.slice(encrypted.byteLength - 16);\n const content = encrypted.slice(16, encrypted.byteLength - 16);\n\n const decipher = createDecipheriv(\"aes-128-gcm\", key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = new DynamicBuffer(0);\n decrypted.write(decipher.update(content));\n decrypted.write(decipher.final());\n return decrypted.bytes();\n}\n\n/**\n * Decrypts data to a string.\n * @param data Encrypted data.\n * @returns Odszyfrowany ciąg znaków.\n */\nexport function decryptToString(data: Uint8Array): string {\n return new TextDecoder().decode(decrypt(data));\n}\n"],"mappings":"kKAIA,MAAM,EAAiB,QAAQ,IAAI,eAEnC,GAAI,CAAC,EACH,MAAU,MAAM,iDAAiD,CAMnE,MAAM,EAAM,EAAa,EAAe,CAOxC,SAAgB,EAAQ,EAA8B,CACpD,IAAM,EAAK,IAAI,WAAW,GAAG,CAC7B,OAAO,gBAAgB,EAAG,CAC1B,IAAM,EAAS,EAAe,cAAe,EAAK,EAAG,CAC/C,EAAY,IAAI,EAAc,EAAE,CAKtC,OAJA,EAAU,MAAM,EAAG,CACnB,EAAU,MAAM,EAAO,OAAO,EAAK,CAAC,CACpC,EAAU,MAAM,EAAO,OAAO,CAAC,CAC/B,EAAU,MAAM,EAAO,YAAY,CAAC,CAC7B,EAAU,OAAO,CAQ1B,SAAgB,EAAc,EAA0B,CACtD,OAAO,EAAQ,IAAI,aAAa,CAAC,OAAO,EAAK,CAAC,CAQhD,SAAgB,EAAQ,EAAmC,CACzD,GAAI,EAAU,WAAa,GACzB,MAAU,MAAM,gCAAgC,CAElD,IAAM,EAAK,EAAU,MAAM,EAAG,GAAG,CAC3B,EAAU,EAAU,MAAM,EAAU,WAAa,GAAG,CACpD,EAAU,EAAU,MAAM,GAAI,EAAU,WAAa,GAAG,CAExD,EAAW,EAAiB,cAAe,EAAK,EAAG,CACzD,EAAS,WAAW,EAAQ,CAE5B,IAAM,EAAY,IAAI,EAAc,EAAE,CAGtC,OAFA,EAAU,MAAM,EAAS,OAAO,EAAQ,CAAC,CACzC,EAAU,MAAM,EAAS,OAAO,CAAC,CAC1B,EAAU,OAAO,CAQ1B,SAAgB,EAAgB,EAA0B,CACxD,OAAO,IAAI,aAAa,CAAC,OAAO,EAAQ,EAAK,CAAC"}
@@ -1,39 +1 @@
1
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
- let zod = require("zod");
3
-
4
- //#region src/core/auth/validation.ts
5
- const loginSchema = zod.z.object({
6
- email: zod.z.string().email("Invalid email address"),
7
- password: zod.z.string().min(8),
8
- remember: zod.z.boolean().optional()
9
- });
10
- const registerSchema = zod.z.object({
11
- username: zod.z.string().min(2, "Name must be at least 2 characters"),
12
- email: zod.z.string().email("Invalid email address"),
13
- password: zod.z.string().min(8, "Password must be at least 8 characters"),
14
- terms: zod.z.boolean().refine((val) => val === true, "You must accept the terms")
15
- });
16
- const forgotPasswordSchema = zod.z.object({ email: zod.z.string().email("Invalid email address") });
17
- const resetPasswordSchema = zod.z.object({
18
- password: zod.z.string().min(8, "Password must be at least 8 characters"),
19
- confirm: zod.z.string()
20
- }).refine((data) => data.password === data.confirm, {
21
- message: "Passwords do not match",
22
- path: ["confirm"]
23
- });
24
- const verifyEmailSchema = zod.z.object({ code: zod.z.string().min(6).max(6) });
25
- const totpSetupSchema = zod.z.object({ code: zod.z.string().regex(/^\d{6}$/, "Code must be 6 digits") });
26
- const totpVerifySchema = zod.z.object({ code: zod.z.string().regex(/^\d{6}$/, "Code must be 6 digits") });
27
- const passkeysSetupSchema = zod.z.object({ name: zod.z.string().min(1, "Passkey name is required") });
28
- const recoveryCodeVerifySchema = zod.z.object({ code: zod.z.string().min(16, "Recovery code is required").max(16) });
29
-
30
- //#endregion
31
- exports.forgotPasswordSchema = forgotPasswordSchema;
32
- exports.loginSchema = loginSchema;
33
- exports.passkeysSetupSchema = passkeysSetupSchema;
34
- exports.recoveryCodeVerifySchema = recoveryCodeVerifySchema;
35
- exports.registerSchema = registerSchema;
36
- exports.resetPasswordSchema = resetPasswordSchema;
37
- exports.totpSetupSchema = totpSetupSchema;
38
- exports.totpVerifySchema = totpVerifySchema;
39
- exports.verifyEmailSchema = verifyEmailSchema;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`zod`);const t=e.z.object({email:e.z.string().email(`Invalid email address`),password:e.z.string().min(8),remember:e.z.boolean().optional()}),n=e.z.object({username:e.z.string().min(2,`Name must be at least 2 characters`),email:e.z.string().email(`Invalid email address`),password:e.z.string().min(8,`Password must be at least 8 characters`),terms:e.z.boolean().refine(e=>e===!0,`You must accept the terms`)}),r=e.z.object({email:e.z.string().email(`Invalid email address`)}),i=e.z.object({password:e.z.string().min(8,`Password must be at least 8 characters`),confirm:e.z.string()}).refine(e=>e.password===e.confirm,{message:`Passwords do not match`,path:[`confirm`]}),a=e.z.object({code:e.z.string().min(6).max(6)}),o=e.z.object({code:e.z.string().regex(/^\d{6}$/,`Code must be 6 digits`)}),s=e.z.object({code:e.z.string().regex(/^\d{6}$/,`Code must be 6 digits`)}),c=e.z.object({name:e.z.string().min(1,`Passkey name is required`)}),l=e.z.object({code:e.z.string().min(16,`Recovery code is required`).max(16)});exports.forgotPasswordSchema=r,exports.loginSchema=t,exports.passkeysSetupSchema=c,exports.recoveryCodeVerifySchema=l,exports.registerSchema=n,exports.resetPasswordSchema=i,exports.totpSetupSchema=o,exports.totpVerifySchema=s,exports.verifyEmailSchema=a;
@@ -1,31 +1,2 @@
1
- import { z } from "zod";
2
-
3
- //#region src/core/auth/validation.ts
4
- const loginSchema = z.object({
5
- email: z.string().email("Invalid email address"),
6
- password: z.string().min(8),
7
- remember: z.boolean().optional()
8
- });
9
- const registerSchema = z.object({
10
- username: z.string().min(2, "Name must be at least 2 characters"),
11
- email: z.string().email("Invalid email address"),
12
- password: z.string().min(8, "Password must be at least 8 characters"),
13
- terms: z.boolean().refine((val) => val === true, "You must accept the terms")
14
- });
15
- const forgotPasswordSchema = z.object({ email: z.string().email("Invalid email address") });
16
- const resetPasswordSchema = z.object({
17
- password: z.string().min(8, "Password must be at least 8 characters"),
18
- confirm: z.string()
19
- }).refine((data) => data.password === data.confirm, {
20
- message: "Passwords do not match",
21
- path: ["confirm"]
22
- });
23
- const verifyEmailSchema = z.object({ code: z.string().min(6).max(6) });
24
- const totpSetupSchema = z.object({ code: z.string().regex(/^\d{6}$/, "Code must be 6 digits") });
25
- const totpVerifySchema = z.object({ code: z.string().regex(/^\d{6}$/, "Code must be 6 digits") });
26
- const passkeysSetupSchema = z.object({ name: z.string().min(1, "Passkey name is required") });
27
- const recoveryCodeVerifySchema = z.object({ code: z.string().min(16, "Recovery code is required").max(16) });
28
-
29
- //#endregion
30
- export { forgotPasswordSchema, loginSchema, passkeysSetupSchema, recoveryCodeVerifySchema, registerSchema, resetPasswordSchema, totpSetupSchema, totpVerifySchema, verifyEmailSchema };
1
+ import{z as e}from"zod";const t=e.object({email:e.string().email(`Invalid email address`),password:e.string().min(8),remember:e.boolean().optional()}),n=e.object({username:e.string().min(2,`Name must be at least 2 characters`),email:e.string().email(`Invalid email address`),password:e.string().min(8,`Password must be at least 8 characters`),terms:e.boolean().refine(e=>e===!0,`You must accept the terms`)}),r=e.object({email:e.string().email(`Invalid email address`)}),i=e.object({password:e.string().min(8,`Password must be at least 8 characters`),confirm:e.string()}).refine(e=>e.password===e.confirm,{message:`Passwords do not match`,path:[`confirm`]}),a=e.object({code:e.string().min(6).max(6)}),o=e.object({code:e.string().regex(/^\d{6}$/,`Code must be 6 digits`)}),s=e.object({code:e.string().regex(/^\d{6}$/,`Code must be 6 digits`)}),c=e.object({name:e.string().min(1,`Passkey name is required`)}),l=e.object({code:e.string().min(16,`Recovery code is required`).max(16)});export{r as forgotPasswordSchema,t as loginSchema,c as passkeysSetupSchema,l as recoveryCodeVerifySchema,n as registerSchema,i as resetPasswordSchema,o as totpSetupSchema,s as totpVerifySchema,a as verifyEmailSchema};
31
2
  //# sourceMappingURL=validation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","names":[],"sources":["../../../src/core/auth/validation.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// Auth validation schemas - CLEAN (No DB dependencies for client-side)\nexport const loginSchema = z.object({\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(8),\n remember: z.boolean().optional(),\n});\n\nexport const registerSchema = z.object({\n username: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n terms: z.boolean().refine((val) => val === true, \"You must accept the terms\"),\n});\n\nexport const forgotPasswordSchema = z.object({\n email: z.string().email(\"Invalid email address\"),\n});\n\nexport const resetPasswordSchema = z\n .object({\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n confirm: z.string(),\n })\n .refine((data) => data.password === data.confirm, {\n message: \"Passwords do not match\",\n path: [\"confirm\"],\n });\n\nexport const verifyEmailSchema = z.object({\n code: z.string().min(6).max(6),\n});\n\n// mfa validation schemas\nexport const totpSetupSchema = z.object({\n code: z.string().regex(/^\\d{6}$/, \"Code must be 6 digits\"),\n});\n\nexport const totpVerifySchema = z.object({\n code: z.string().regex(/^\\d{6}$/, \"Code must be 6 digits\"),\n});\n\nexport const passkeysSetupSchema = z.object({\n name: z.string().min(1, \"Passkey name is required\"),\n});\n\nexport const recoveryCodeVerifySchema = z.object({\n code: z.string().min(16, \"Recovery code is required\").max(16),\n});\n\n// Type exports for use in components\nexport type LoginInput = z.infer<typeof loginSchema>;\nexport type RegisterInput = z.infer<typeof registerSchema>;\nexport type ForgotPasswordInput = z.infer<typeof forgotPasswordSchema>;\nexport type ResetPasswordInput = z.infer<typeof resetPasswordSchema>;\nexport type TOTPSetupInput = z.infer<typeof totpSetupSchema>;\nexport type TOTPVerifyInput = z.infer<typeof totpVerifySchema>;\nexport type PasskeysSetupInput = z.infer<typeof passkeysSetupSchema>;\nexport type VerifyEmailInput = z.infer<typeof verifyEmailSchema>;\nexport type RecoveryVerifyInput = z.infer<typeof recoveryCodeVerifySchema>;\n"],"mappings":";;;AAGA,MAAa,cAAc,EAAE,OAAO;CAClC,OAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB;CAChD,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE;CAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;CACjC,CAAC;AAEF,MAAa,iBAAiB,EAAE,OAAO;CACrC,UAAU,EAAE,QAAQ,CAAC,IAAI,GAAG,qCAAqC;CACjE,OAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB;CAChD,UAAU,EAAE,QAAQ,CAAC,IAAI,GAAG,yCAAyC;CACrE,OAAO,EAAE,SAAS,CAAC,QAAQ,QAAQ,QAAQ,MAAM,4BAA4B;CAC9E,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO,EAC3C,OAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB,EACjD,CAAC;AAEF,MAAa,sBAAsB,EAChC,OAAO;CACN,UAAU,EAAE,QAAQ,CAAC,IAAI,GAAG,yCAAyC;CACrE,SAAS,EAAE,QAAQ;CACpB,CAAC,CACD,QAAQ,SAAS,KAAK,aAAa,KAAK,SAAS;CAChD,SAAS;CACT,MAAM,CAAC,UAAU;CAClB,CAAC;AAEJ,MAAa,oBAAoB,EAAE,OAAO,EACxC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAC/B,CAAC;AAGF,MAAa,kBAAkB,EAAE,OAAO,EACtC,MAAM,EAAE,QAAQ,CAAC,MAAM,WAAW,wBAAwB,EAC3D,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO,EACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,WAAW,wBAAwB,EAC3D,CAAC;AAEF,MAAa,sBAAsB,EAAE,OAAO,EAC1C,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,2BAA2B,EACpD,CAAC;AAEF,MAAa,2BAA2B,EAAE,OAAO,EAC/C,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,4BAA4B,CAAC,IAAI,GAAG,EAC9D,CAAC"}
1
+ {"version":3,"file":"validation.mjs","names":[],"sources":["../../../src/core/auth/validation.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// Auth validation schemas - CLEAN (No DB dependencies for client-side)\nexport const loginSchema = z.object({\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(8),\n remember: z.boolean().optional(),\n});\n\nexport const registerSchema = z.object({\n username: z.string().min(2, \"Name must be at least 2 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n terms: z.boolean().refine((val) => val === true, \"You must accept the terms\"),\n});\n\nexport const forgotPasswordSchema = z.object({\n email: z.string().email(\"Invalid email address\"),\n});\n\nexport const resetPasswordSchema = z\n .object({\n password: z.string().min(8, \"Password must be at least 8 characters\"),\n confirm: z.string(),\n })\n .refine((data) => data.password === data.confirm, {\n message: \"Passwords do not match\",\n path: [\"confirm\"],\n });\n\nexport const verifyEmailSchema = z.object({\n code: z.string().min(6).max(6),\n});\n\n// mfa validation schemas\nexport const totpSetupSchema = z.object({\n code: z.string().regex(/^\\d{6}$/, \"Code must be 6 digits\"),\n});\n\nexport const totpVerifySchema = z.object({\n code: z.string().regex(/^\\d{6}$/, \"Code must be 6 digits\"),\n});\n\nexport const passkeysSetupSchema = z.object({\n name: z.string().min(1, \"Passkey name is required\"),\n});\n\nexport const recoveryCodeVerifySchema = z.object({\n code: z.string().min(16, \"Recovery code is required\").max(16),\n});\n\n// Type exports for use in components\nexport type LoginInput = z.infer<typeof loginSchema>;\nexport type RegisterInput = z.infer<typeof registerSchema>;\nexport type ForgotPasswordInput = z.infer<typeof forgotPasswordSchema>;\nexport type ResetPasswordInput = z.infer<typeof resetPasswordSchema>;\nexport type TOTPSetupInput = z.infer<typeof totpSetupSchema>;\nexport type TOTPVerifyInput = z.infer<typeof totpVerifySchema>;\nexport type PasskeysSetupInput = z.infer<typeof passkeysSetupSchema>;\nexport type VerifyEmailInput = z.infer<typeof verifyEmailSchema>;\nexport type RecoveryVerifyInput = z.infer<typeof recoveryCodeVerifySchema>;\n"],"mappings":"wBAGA,MAAa,EAAc,EAAE,OAAO,CAClC,MAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB,CAChD,SAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAC3B,SAAU,EAAE,SAAS,CAAC,UAAU,CACjC,CAAC,CAEW,EAAiB,EAAE,OAAO,CACrC,SAAU,EAAE,QAAQ,CAAC,IAAI,EAAG,qCAAqC,CACjE,MAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB,CAChD,SAAU,EAAE,QAAQ,CAAC,IAAI,EAAG,yCAAyC,CACrE,MAAO,EAAE,SAAS,CAAC,OAAQ,GAAQ,IAAQ,GAAM,4BAA4B,CAC9E,CAAC,CAEW,EAAuB,EAAE,OAAO,CAC3C,MAAO,EAAE,QAAQ,CAAC,MAAM,wBAAwB,CACjD,CAAC,CAEW,EAAsB,EAChC,OAAO,CACN,SAAU,EAAE,QAAQ,CAAC,IAAI,EAAG,yCAAyC,CACrE,QAAS,EAAE,QAAQ,CACpB,CAAC,CACD,OAAQ,GAAS,EAAK,WAAa,EAAK,QAAS,CAChD,QAAS,yBACT,KAAM,CAAC,UAAU,CAClB,CAAC,CAES,EAAoB,EAAE,OAAO,CACxC,KAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAC/B,CAAC,CAGW,EAAkB,EAAE,OAAO,CACtC,KAAM,EAAE,QAAQ,CAAC,MAAM,UAAW,wBAAwB,CAC3D,CAAC,CAEW,EAAmB,EAAE,OAAO,CACvC,KAAM,EAAE,QAAQ,CAAC,MAAM,UAAW,wBAAwB,CAC3D,CAAC,CAEW,EAAsB,EAAE,OAAO,CAC1C,KAAM,EAAE,QAAQ,CAAC,IAAI,EAAG,2BAA2B,CACpD,CAAC,CAEW,EAA2B,EAAE,OAAO,CAC/C,KAAM,EAAE,QAAQ,CAAC,IAAI,GAAI,4BAA4B,CAAC,IAAI,GAAG,CAC9D,CAAC"}
@@ -1,39 +1 @@
1
- const require_event_bus = require('./event-bus.cjs');
2
- const require_inject = require('../server/database/inject.cjs');
3
- const require_email_verification = require('./auth/email-verification.cjs');
4
- const require_service = require('./notifications/service.cjs');
5
- const require_local = require('./filesystem/providers/local.cjs');
6
- const require_service$1 = require('./filesystem/service.cjs');
7
- require('./filesystem/index.cjs');
8
- const require_setup = require('./setup.cjs');
9
-
10
- //#region src/core/bootstrap.ts
11
- async function ensureSystemInitialized(providedDb) {
12
- if (typeof window !== "undefined") return;
13
- const g = globalThis;
14
- if (providedDb) require_inject.injectDb(providedDb);
15
- if (g.__KRYO_INITIALIZED__) return;
16
- if (g.__KRYO_INITIALIZING__) return;
17
- g.__KRYO_INITIALIZING__ = true;
18
- try {
19
- console.log("[Kryo:Bootstrap] Starting system initialization...");
20
- if (!g.__KRYO_DB__) console.warn("[Kryo:Bootstrap] DB not detected during bootstrap start. Trying to continue...");
21
- if (await require_setup.isSystemInstalled()) {
22
- require_service.notificationService.init();
23
- await require_email_verification.initEmailVerification();
24
- const local = new require_local.LocalFileProvider();
25
- require_service$1.filesystemService.registerProvider(local);
26
- require_service$1.filesystemService.setDefaultProvider(local.id);
27
- } else console.log("[Kryo:Bootstrap] System not installed. Skipping module initialization.");
28
- await require_event_bus.eventBus.publish("system:start", { runtime: "nodejs" });
29
- console.log("[Kryo:Bootstrap] System initialized successfully.");
30
- g.__KRYO_INITIALIZED__ = true;
31
- } catch (error) {
32
- console.error("[Kryo:Bootstrap] Initialization failed:", error);
33
- } finally {
34
- g.__KRYO_INITIALIZING__ = false;
35
- }
36
- }
37
-
38
- //#endregion
39
- exports.ensureSystemInitialized = ensureSystemInitialized;
1
+ const e=require(`./event-bus.cjs`),t=require(`../server/database/inject.cjs`),n=require(`./auth/email-verification.cjs`),r=require(`./notifications/service.cjs`),i=require(`./filesystem/providers/local.cjs`),a=require(`./filesystem/service.cjs`);require(`./filesystem/index.cjs`);const o=require(`./setup.cjs`);async function s(s){if(typeof window<`u`)return;let c=globalThis;if(s&&t.injectDb(s),!c.__KRYO_INITIALIZED__&&!c.__KRYO_INITIALIZING__){c.__KRYO_INITIALIZING__=!0;try{if(console.log(`[Kryo:Bootstrap] Starting system initialization...`),c.__KRYO_DB__||console.warn(`[Kryo:Bootstrap] DB not detected during bootstrap start. Trying to continue...`),await o.isSystemInstalled()){r.notificationService.init(),await n.initEmailVerification();let e=new i.LocalFileProvider;a.filesystemService.registerProvider(e),a.filesystemService.setDefaultProvider(e.id)}else console.log(`[Kryo:Bootstrap] System not installed. Skipping module initialization.`);await e.eventBus.publish(`system:start`,{runtime:`nodejs`}),console.log(`[Kryo:Bootstrap] System initialized successfully.`),c.__KRYO_INITIALIZED__=!0}catch(e){console.error(`[Kryo:Bootstrap] Initialization failed:`,e)}finally{c.__KRYO_INITIALIZING__=!1}}}exports.ensureSystemInitialized=s;
@@ -1,40 +1,2 @@
1
- import { eventBus } from "./event-bus.mjs";
2
- import { injectDb } from "../server/database/inject.mjs";
3
- import { initEmailVerification } from "./auth/email-verification.mjs";
4
- import { notificationService } from "./notifications/service.mjs";
5
- import { LocalFileProvider } from "./filesystem/providers/local.mjs";
6
- import { filesystemService } from "./filesystem/service.mjs";
7
- import "./filesystem/index.mjs";
8
- import { isSystemInstalled } from "./setup.mjs";
9
-
10
- //#region src/core/bootstrap.ts
11
- async function ensureSystemInitialized(providedDb) {
12
- if (typeof window !== "undefined") return;
13
- const g = globalThis;
14
- if (providedDb) injectDb(providedDb);
15
- if (g.__KRYO_INITIALIZED__) return;
16
- if (g.__KRYO_INITIALIZING__) return;
17
- g.__KRYO_INITIALIZING__ = true;
18
- try {
19
- console.log("[Kryo:Bootstrap] Starting system initialization...");
20
- if (!g.__KRYO_DB__) console.warn("[Kryo:Bootstrap] DB not detected during bootstrap start. Trying to continue...");
21
- if (await isSystemInstalled()) {
22
- notificationService.init();
23
- await initEmailVerification();
24
- const local = new LocalFileProvider();
25
- filesystemService.registerProvider(local);
26
- filesystemService.setDefaultProvider(local.id);
27
- } else console.log("[Kryo:Bootstrap] System not installed. Skipping module initialization.");
28
- await eventBus.publish("system:start", { runtime: "nodejs" });
29
- console.log("[Kryo:Bootstrap] System initialized successfully.");
30
- g.__KRYO_INITIALIZED__ = true;
31
- } catch (error) {
32
- console.error("[Kryo:Bootstrap] Initialization failed:", error);
33
- } finally {
34
- g.__KRYO_INITIALIZING__ = false;
35
- }
36
- }
37
-
38
- //#endregion
39
- export { ensureSystemInitialized };
1
+ import{eventBus as e}from"./event-bus.mjs";import{injectDb as t}from"../server/database/inject.mjs";import{initEmailVerification as n}from"./auth/email-verification.mjs";import{notificationService as r}from"./notifications/service.mjs";import{LocalFileProvider as i}from"./filesystem/providers/local.mjs";import{filesystemService as a}from"./filesystem/service.mjs";import"./filesystem/index.mjs";import{isSystemInstalled as o}from"./setup.mjs";async function s(s){if(typeof window<`u`)return;let c=globalThis;if(s&&t(s),!c.__KRYO_INITIALIZED__&&!c.__KRYO_INITIALIZING__){c.__KRYO_INITIALIZING__=!0;try{if(console.log(`[Kryo:Bootstrap] Starting system initialization...`),c.__KRYO_DB__||console.warn(`[Kryo:Bootstrap] DB not detected during bootstrap start. Trying to continue...`),await o()){r.init(),await n();let e=new i;a.registerProvider(e),a.setDefaultProvider(e.id)}else console.log(`[Kryo:Bootstrap] System not installed. Skipping module initialization.`);await e.publish(`system:start`,{runtime:`nodejs`}),console.log(`[Kryo:Bootstrap] System initialized successfully.`),c.__KRYO_INITIALIZED__=!0}catch(e){console.error(`[Kryo:Bootstrap] Initialization failed:`,e)}finally{c.__KRYO_INITIALIZING__=!1}}}export{s as ensureSystemInitialized};
40
2
  //# sourceMappingURL=bootstrap.mjs.map