@gauts/auth 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/SECURITY.md +5 -0
  4. package/dist/adapters/hono/index.d.ts +30 -0
  5. package/dist/adapters/hono/index.d.ts.map +1 -0
  6. package/dist/adapters/hono/index.js +87 -0
  7. package/dist/adapters/hono/index.js.map +1 -0
  8. package/dist/adapters/redis/index.d.ts +7 -0
  9. package/dist/adapters/redis/index.d.ts.map +1 -0
  10. package/dist/adapters/redis/index.js +53 -0
  11. package/dist/adapters/redis/index.js.map +1 -0
  12. package/dist/auth.d.ts +17 -0
  13. package/dist/auth.d.ts.map +1 -0
  14. package/dist/auth.js +34 -0
  15. package/dist/auth.js.map +1 -0
  16. package/dist/client/index.d.ts +19 -0
  17. package/dist/client/index.d.ts.map +1 -0
  18. package/dist/client/index.js +36 -0
  19. package/dist/client/index.js.map +1 -0
  20. package/dist/config.d.ts +39 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +67 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/errors.d.ts +7 -0
  25. package/dist/errors.d.ts.map +1 -0
  26. package/dist/errors.js +11 -0
  27. package/dist/errors.js.map +1 -0
  28. package/dist/index.d.ts +10 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +4 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/password/index.d.ts +8 -0
  33. package/dist/password/index.d.ts.map +1 -0
  34. package/dist/password/index.js +46 -0
  35. package/dist/password/index.js.map +1 -0
  36. package/dist/session/schema.d.ts +5 -0
  37. package/dist/session/schema.d.ts.map +1 -0
  38. package/dist/session/schema.js +47 -0
  39. package/dist/session/schema.js.map +1 -0
  40. package/dist/session/service.d.ts +11 -0
  41. package/dist/session/service.d.ts.map +1 -0
  42. package/dist/session/service.js +211 -0
  43. package/dist/session/service.js.map +1 -0
  44. package/dist/session/token.d.ts +4 -0
  45. package/dist/session/token.d.ts.map +1 -0
  46. package/dist/session/token.js +5 -0
  47. package/dist/session/token.js.map +1 -0
  48. package/dist/session/types.d.ts +78 -0
  49. package/dist/session/types.d.ts.map +1 -0
  50. package/dist/session/types.js +2 -0
  51. package/dist/session/types.js.map +1 -0
  52. package/package.json +98 -0
package/dist/config.js ADDED
@@ -0,0 +1,67 @@
1
+ import { createError } from "./errors.js";
2
+ const ARGON_DEFAULTS = {
3
+ algorithm: "argon2id",
4
+ hashLength: 32,
5
+ maxBytes: 1024,
6
+ memoryCost: 65_536,
7
+ parallelism: 4,
8
+ timeCost: 3,
9
+ };
10
+ const BCRYPT_DEFAULTS = {
11
+ algorithm: "bcrypt",
12
+ maxBytes: 72,
13
+ rounds: 12,
14
+ };
15
+ const SESSION_DEFAULTS = {
16
+ max: 10,
17
+ touchAfter: 60 * 60 * 24,
18
+ ttl: 60 * 60 * 24 * 7,
19
+ };
20
+ const requireInteger = (name, value, min, max) => {
21
+ if (!Number.isInteger(value) || value < min || value > max) {
22
+ throw createError("AUTH_CONFIG_INVALID", `${name} must be an integer between ${String(min)} and ${String(max)}.`);
23
+ }
24
+ return value;
25
+ };
26
+ export const resolvePasswordConfig = (config = {}) => {
27
+ const input = config;
28
+ if (typeof input !== "object" || input === null) {
29
+ throw createError("AUTH_CONFIG_INVALID", "Password configuration is invalid.");
30
+ }
31
+ const algorithm = config.algorithm;
32
+ if (algorithm !== undefined && algorithm !== "argon2id" && algorithm !== "bcrypt") {
33
+ throw createError("AUTH_CONFIG_INVALID", "Password algorithm is invalid.");
34
+ }
35
+ if (config.algorithm === "bcrypt") {
36
+ const resolved = { ...BCRYPT_DEFAULTS, ...config };
37
+ return {
38
+ algorithm: "bcrypt",
39
+ maxBytes: requireInteger("password.maxBytes", resolved.maxBytes, 1, 72),
40
+ rounds: requireInteger("password.rounds", resolved.rounds, 4, 31),
41
+ };
42
+ }
43
+ const resolved = { ...ARGON_DEFAULTS, ...config };
44
+ return {
45
+ algorithm: "argon2id",
46
+ hashLength: requireInteger("password.hashLength", resolved.hashLength, 16, 64),
47
+ maxBytes: requireInteger("password.maxBytes", resolved.maxBytes, 1, 1_048_576),
48
+ memoryCost: requireInteger("password.memoryCost", resolved.memoryCost, 8_192, 1_048_576),
49
+ parallelism: requireInteger("password.parallelism", resolved.parallelism, 1, 16),
50
+ timeCost: requireInteger("password.timeCost", resolved.timeCost, 1, 10),
51
+ };
52
+ };
53
+ export const resolveSessionConfig = (config = {}) => {
54
+ const input = config;
55
+ if (typeof input !== "object" || input === null) {
56
+ throw createError("AUTH_CONFIG_INVALID", "Session configuration is invalid.");
57
+ }
58
+ const resolved = { ...SESSION_DEFAULTS, ...config };
59
+ const ttl = requireInteger("session.ttl", resolved.ttl, 60, 60 * 60 * 24 * 365);
60
+ const touchAfter = requireInteger("session.touchAfter", resolved.touchAfter, 1, ttl - 1);
61
+ return {
62
+ max: requireInteger("session.max", resolved.max, 1, 10_000),
63
+ touchAfter,
64
+ ttl,
65
+ };
66
+ };
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type AuthErrorCode = "AUTH_CONFIG_INVALID" | "PASSWORD_INPUT_INVALID" | "SESSION_CLIENT_MISMATCH" | "SESSION_DATA_INVALID" | "SESSION_INVALID" | "SESSION_LIMIT_REACHED" | "SESSION_NOT_FOUND" | "REDIS_UNAVAILABLE" | "AUDIT_UNAVAILABLE";
2
+ export type AuthError = Error & {
3
+ code: AuthErrorCode;
4
+ };
5
+ export declare const createError: (code: AuthErrorCode, message: string, cause?: unknown) => AuthError;
6
+ export declare const isAuthError: (error: unknown) => error is AuthError;
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,qBAAqB,GACrB,wBAAwB,GACxB,yBAAyB,GACzB,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,aAAa,EAAE,SAAS,MAAM,EAAE,QAAQ,OAAO,KAAG,SAOnF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAItB,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ export const createError = (code, message, cause) => {
2
+ const error = new Error(message, cause === undefined ? undefined : { cause });
3
+ error.name = "AuthError";
4
+ error.code = code;
5
+ return error;
6
+ };
7
+ export const isAuthError = (error) => error instanceof Error &&
8
+ error.name === "AuthError" &&
9
+ "code" in error &&
10
+ typeof error.code === "string";
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAmB,EAAE,OAAe,EAAE,KAAe,EAAa,EAAE;IAC9F,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAc,CAAC;IAE3F,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC;IACzB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAElB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE,CAChE,KAAK,YAAY,KAAK;IACtB,KAAK,CAAC,IAAI,KAAK,WAAW;IAC1B,MAAM,IAAI,KAAK;IACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { createAuth } from "./auth.js";
2
+ export type { Auth, AuthConfig, AuthDeps } from "./auth.js";
3
+ export type { BcryptConfig, Argon2idConfig, PasswordConfig, SessionConfig } from "./config.js";
4
+ export { createError, isAuthError } from "./errors.js";
5
+ export type { AuthError, AuthErrorCode } from "./errors.js";
6
+ export type { PasswordService } from "./password/index.js";
7
+ export { hashToken, tokenPattern } from "./session/token.js";
8
+ export type { ActiveSession, AuditSession, CreateAuditSession, CreatedSession, RedisSessionStore, ResolvedSession, Session, SessionAudit, SessionService, } from "./session/types.js";
9
+ export type { SessionClient, SessionClientInput, SessionIdentity, SessionIdentityInput, } from "./client/index.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,YAAY,EACZ,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { createAuth } from "./auth.js";
2
+ export { createError, isAuthError } from "./errors.js";
3
+ export { hashToken, tokenPattern } from "./session/token.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ResolvedPasswordConfig } from "../config.js";
2
+ export type PasswordService = {
3
+ algorithm: "argon2id" | "bcrypt";
4
+ hash(password: string): Promise<string>;
5
+ verify(password: string, storedHash: string): Promise<boolean>;
6
+ };
7
+ export declare const createPassword: (config: ResolvedPasswordConfig) => PasswordService;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/password/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAG3D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE,CAAC;AAiEF,eAAO,MAAM,cAAc,GAAI,QAAQ,sBAAsB,KAAG,eACe,CAAC"}
@@ -0,0 +1,46 @@
1
+ import * as argon2 from "argon2";
2
+ import { compare as compareBcrypt, hash as hashBcrypt } from "bcryptjs";
3
+ import { createError } from "../errors.js";
4
+ const BCRYPT_PATTERN = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
5
+ const requirePassword = (password, maxBytes) => {
6
+ const bytes = Buffer.byteLength(password, "utf8");
7
+ if (bytes < 1 || bytes > maxBytes) {
8
+ throw createError("PASSWORD_INPUT_INVALID", `Password must contain between 1 and ${String(maxBytes)} bytes.`);
9
+ }
10
+ };
11
+ const createArgon2id = (config) => ({
12
+ algorithm: "argon2id",
13
+ hash: async (password) => {
14
+ requirePassword(password, config.maxBytes);
15
+ return argon2.hash(password, {
16
+ hashLength: config.hashLength,
17
+ memoryCost: config.memoryCost,
18
+ parallelism: config.parallelism,
19
+ timeCost: config.timeCost,
20
+ type: argon2.argon2id,
21
+ });
22
+ },
23
+ verify: async (password, storedHash) => {
24
+ requirePassword(password, config.maxBytes);
25
+ if (!storedHash.startsWith("$argon2id$")) {
26
+ return false;
27
+ }
28
+ return argon2.verify(storedHash, password);
29
+ },
30
+ });
31
+ const createBcrypt = (config) => ({
32
+ algorithm: "bcrypt",
33
+ hash: async (password) => {
34
+ requirePassword(password, config.maxBytes);
35
+ return hashBcrypt(password, config.rounds);
36
+ },
37
+ verify: async (password, storedHash) => {
38
+ requirePassword(password, config.maxBytes);
39
+ if (!BCRYPT_PATTERN.test(storedHash)) {
40
+ return false;
41
+ }
42
+ return compareBcrypt(password, storedHash);
43
+ },
44
+ });
45
+ export const createPassword = (config) => config.algorithm === "bcrypt" ? createBcrypt(config) : createArgon2id(config);
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/password/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQ3C,MAAM,cAAc,GAAG,sCAAsC,CAAC;AAE9D,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAClC,MAAM,WAAW,CACf,wBAAwB,EACxB,uCAAuC,MAAM,CAAC,QAAQ,CAAC,SAAS,CACjE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,MAAkE,EACjD,EAAE,CAAC,CAAC;IACrB,SAAS,EAAE,UAAU;IAErB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE3C,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,QAAQ;SACtB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;QACrC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CACnB,MAAgE,EAC/C,EAAE,CAAC,CAAC;IACrB,SAAS,EAAE,QAAQ;IAEnB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE3C,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;QACrC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA8B,EAAmB,EAAE,CAChF,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Session, StoredSession } from "./types.js";
2
+ export declare const encodeSession: <TData extends object>(session: StoredSession<TData>) => string;
3
+ export declare const parseSession: <TData extends object>(raw: string) => StoredSession<TData> | null;
4
+ export declare const toSession: <TData extends object>(stored: StoredSession<TData>) => Session<TData>;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/session/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkBzD,eAAO,MAAM,aAAa,GAAI,KAAK,SAAS,MAAM,EAAE,SAAS,aAAa,CAAC,KAAK,CAAC,KAAG,MAMnF,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,KAAK,SAAS,MAAM,EAAE,KAAK,MAAM,KAAG,aAAa,CAAC,KAAK,CAAC,GAAG,IAuBvF,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,KAAK,SAAS,MAAM,EAAE,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAG,OAAO,CAAC,KAAK,CAQ1F,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { createError } from "../errors.js";
2
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
+ const isNullableString = (value) => typeof value === "string" || value === null;
4
+ const isDateString = (value) => typeof value === "string" && Number.isFinite(Date.parse(value));
5
+ const isClient = (value) => isRecord(value) &&
6
+ isNullableString(value.country) &&
7
+ isNullableString(value.ip) &&
8
+ isNullableString(value.platform) &&
9
+ isNullableString(value.userAgent);
10
+ export const encodeSession = (session) => {
11
+ try {
12
+ return JSON.stringify(session);
13
+ }
14
+ catch (error) {
15
+ throw createError("SESSION_DATA_INVALID", "Session data must be JSON serializable.", error);
16
+ }
17
+ };
18
+ export const parseSession = (raw) => {
19
+ let value;
20
+ try {
21
+ value = JSON.parse(raw);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ if (!isRecord(value) ||
27
+ typeof value.id !== "string" ||
28
+ typeof value.subjectId !== "string" ||
29
+ !isRecord(value.data) ||
30
+ !isClient(value.client) ||
31
+ !isDateString(value.createdAt) ||
32
+ !isDateString(value.touchedAt) ||
33
+ !isDateString(value.expiresAt)) {
34
+ return null;
35
+ }
36
+ return value;
37
+ };
38
+ export const toSession = (stored) => ({
39
+ client: stored.client,
40
+ createdAt: new Date(stored.createdAt),
41
+ data: stored.data,
42
+ expiresAt: new Date(stored.expiresAt),
43
+ id: stored.id,
44
+ subjectId: stored.subjectId,
45
+ touchedAt: new Date(stored.touchedAt),
46
+ });
47
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/session/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA0B,EAAE,CAClE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAE9C,MAAM,YAAY,GAAG,CAAC,KAAc,EAAmB,EAAE,CACvD,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAElE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAA0B,EAAE,CAC1D,QAAQ,CAAC,KAAK,CAAC;IACf,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;IAC/B,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1B,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC;IAChC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAuB,OAA6B,EAAU,EAAE;IAC3F,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,sBAAsB,EAAE,yCAAyC,EAAE,KAAK,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAuB,GAAW,EAA+B,EAAE;IAC7F,IAAI,KAAc,CAAC;IAEnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACrB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACvB,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9B,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9B,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAA6B,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuB,MAA4B,EAAkB,EAAE,CAAC,CAAC;IAChG,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IACrC,EAAE,EAAE,MAAM,CAAC,EAAE;IACb,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;CACtC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ResolvedSessionConfig } from "../config.js";
2
+ import type { RedisSessionStore, SessionAudit, SessionService } from "./types.js";
3
+ type SessionDeps = {
4
+ audit: SessionAudit;
5
+ config: ResolvedSessionConfig;
6
+ now?: () => Date;
7
+ redis: RedisSessionStore;
8
+ };
9
+ export declare const createSessionService: <TData extends object>({ audit, config, now, redis, }: SessionDeps) => SessionService<TData>;
10
+ export {};
11
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/session/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAGV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAYF,eAAO,MAAM,oBAAoB,GAAI,KAAK,SAAS,MAAM,EAAE,gCAKxD,WAAW,KAAG,cAAc,CAAC,KAAK,CA0QpC,CAAC"}
@@ -0,0 +1,211 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { matchesClient, normalizeClient, normalizeIdentity } from "../client/index.js";
3
+ import { createError, isAuthError } from "../errors.js";
4
+ import { encodeSession, parseSession, toSession } from "./schema.js";
5
+ import { createToken, hashToken, tokenPattern } from "./token.js";
6
+ const toActiveSession = (session) => ({
7
+ client: session.client,
8
+ createdAt: session.createdAt,
9
+ expiresAt: session.expiresAt,
10
+ id: session.id,
11
+ revokedAt: session.revokedAt,
12
+ subjectId: session.subjectId,
13
+ updatedAt: session.updatedAt,
14
+ });
15
+ export const createSessionService = ({ audit, config, now = () => new Date(), redis, }) => {
16
+ const runRedis = async (operation) => {
17
+ try {
18
+ return await operation();
19
+ }
20
+ catch (error) {
21
+ if (isAuthError(error)) {
22
+ throw error;
23
+ }
24
+ throw createError("REDIS_UNAVAILABLE", "Authentication service unavailable.", error);
25
+ }
26
+ };
27
+ const runAudit = async (operation) => {
28
+ try {
29
+ return await operation();
30
+ }
31
+ catch (error) {
32
+ if (isAuthError(error)) {
33
+ throw error;
34
+ }
35
+ throw createError("AUDIT_UNAVAILABLE", "Session audit service unavailable.", error);
36
+ }
37
+ };
38
+ const getActive = async (subjectId) => {
39
+ const current = now();
40
+ const rows = await runAudit(() => audit.findActive(subjectId, current));
41
+ const valid = rows.filter((row) => row.revokedAt === null && row.expiresAt.getTime() > current.getTime());
42
+ if (valid.length === 0) {
43
+ return [];
44
+ }
45
+ const active = await runRedis(() => redis.exists(valid.map((row) => row.tokenHash)));
46
+ if (active.length !== valid.length) {
47
+ throw createError("REDIS_UNAVAILABLE", "Authentication service returned invalid data.");
48
+ }
49
+ return valid.filter((_, index) => active[index]);
50
+ };
51
+ const revokeRows = async (rows, revokedAt) => {
52
+ if (rows.length === 0) {
53
+ return [];
54
+ }
55
+ await runRedis(() => redis.delete(rows.map((row) => row.tokenHash)));
56
+ const ids = rows.map((row) => row.id);
57
+ await runAudit(() => audit.revoke(ids, revokedAt));
58
+ return ids;
59
+ };
60
+ return {
61
+ create: async (input) => {
62
+ if (!input.subjectId) {
63
+ throw createError("SESSION_DATA_INVALID", "Session subject ID is required.");
64
+ }
65
+ const client = normalizeClient(input.client);
66
+ const createdAt = now();
67
+ const expiresAt = new Date(createdAt.getTime() + config.ttl * 1000);
68
+ const token = createToken();
69
+ const tokenHash = hashToken(token);
70
+ const id = randomUUID();
71
+ const stored = {
72
+ client,
73
+ createdAt: createdAt.toISOString(),
74
+ data: input.data,
75
+ expiresAt: expiresAt.toISOString(),
76
+ id,
77
+ subjectId: input.subjectId,
78
+ touchedAt: createdAt.toISOString(),
79
+ };
80
+ const value = encodeSession(stored);
81
+ const active = await getActive(input.subjectId);
82
+ if (active.length >= config.max) {
83
+ throw createError("SESSION_LIMIT_REACHED", `Maximum active sessions reached (${String(config.max)}).`);
84
+ }
85
+ await runAudit(() => audit.create({
86
+ client,
87
+ createdAt,
88
+ expiresAt,
89
+ id,
90
+ subjectId: input.subjectId,
91
+ tokenHash,
92
+ }));
93
+ try {
94
+ await runRedis(() => redis.create(tokenHash, value, config.ttl));
95
+ }
96
+ catch (error) {
97
+ try {
98
+ await runAudit(() => audit.revoke([id], now()));
99
+ }
100
+ catch (auditError) {
101
+ throw createError("AUDIT_UNAVAILABLE", "Session creation and audit compensation failed.", new AggregateError([error, auditError]));
102
+ }
103
+ throw error;
104
+ }
105
+ return {
106
+ session: toSession(stored),
107
+ token,
108
+ };
109
+ },
110
+ resolve: async (input) => {
111
+ if (!tokenPattern.test(input.token)) {
112
+ return null;
113
+ }
114
+ const tokenHash = hashToken(input.token);
115
+ const raw = await runRedis(() => redis.get(tokenHash));
116
+ if (!raw) {
117
+ return null;
118
+ }
119
+ const stored = parseSession(raw);
120
+ if (!stored) {
121
+ await runRedis(() => redis.delete([tokenHash]));
122
+ return null;
123
+ }
124
+ const current = now();
125
+ if (Date.parse(stored.expiresAt) <= current.getTime()) {
126
+ await runRedis(() => redis.delete([tokenHash]));
127
+ return null;
128
+ }
129
+ const identity = normalizeIdentity(input.client);
130
+ if (!matchesClient(stored.client, identity)) {
131
+ await runRedis(() => redis.delete([tokenHash]));
132
+ try {
133
+ await runAudit(() => audit.revoke([stored.id], current));
134
+ }
135
+ catch (error) {
136
+ throw createError("SESSION_CLIENT_MISMATCH", "Session client identity changed and the session was revoked.", error);
137
+ }
138
+ throw createError("SESSION_CLIENT_MISMATCH", "Session client identity changed and the session was revoked.");
139
+ }
140
+ const due = current.getTime() - Date.parse(stored.touchedAt) >= config.touchAfter * 1000;
141
+ if (!due) {
142
+ return { renewed: false, session: toSession(stored) };
143
+ }
144
+ const expiresAt = new Date(current.getTime() + config.ttl * 1000);
145
+ const renewed = {
146
+ ...stored,
147
+ expiresAt: expiresAt.toISOString(),
148
+ touchedAt: current.toISOString(),
149
+ };
150
+ await runAudit(() => audit.touch(stored.id, expiresAt, current));
151
+ const updated = await runRedis(() => redis.update(tokenHash, encodeSession(renewed), config.ttl));
152
+ return updated ? { renewed: true, session: toSession(renewed) } : null;
153
+ },
154
+ revokeToken: async (token) => {
155
+ if (!tokenPattern.test(token)) {
156
+ return [];
157
+ }
158
+ const tokenHash = hashToken(token);
159
+ const raw = await runRedis(() => redis.get(tokenHash));
160
+ if (!raw) {
161
+ return [];
162
+ }
163
+ const stored = parseSession(raw);
164
+ await runRedis(() => redis.delete([tokenHash]));
165
+ if (!stored) {
166
+ return [];
167
+ }
168
+ await runAudit(() => audit.revoke([stored.id], now()));
169
+ return [stored.id];
170
+ },
171
+ revoke: async ({ sessionId, subjectId }) => {
172
+ const row = await runAudit(() => audit.findForRevoke(subjectId, sessionId));
173
+ if (row?.revokedAt !== null) {
174
+ throw createError("SESSION_NOT_FOUND", "Session not found.");
175
+ }
176
+ return revokeRows([row], now());
177
+ },
178
+ revokeSubject: async (subjectId) => {
179
+ return revokeRows(await getActive(subjectId), now());
180
+ },
181
+ list: async (subjectId) => {
182
+ return (await getActive(subjectId)).map(toActiveSession);
183
+ },
184
+ sync: async (subjectId, data) => {
185
+ const rows = await getActive(subjectId);
186
+ if (rows.length === 0) {
187
+ return;
188
+ }
189
+ const hashes = rows.map((row) => row.tokenHash);
190
+ const values = await runRedis(() => redis.getMany(hashes));
191
+ if (values.length !== hashes.length) {
192
+ throw createError("REDIS_UNAVAILABLE", "Authentication service returned invalid data.");
193
+ }
194
+ await Promise.all(values.map(async (raw, index) => {
195
+ if (!raw) {
196
+ return;
197
+ }
198
+ const stored = parseSession(raw);
199
+ const tokenHash = hashes[index];
200
+ if (!stored || !tokenHash || stored.subjectId !== subjectId) {
201
+ if (tokenHash) {
202
+ await runRedis(() => redis.delete([tokenHash]));
203
+ }
204
+ return;
205
+ }
206
+ await runRedis(() => redis.keep(tokenHash, encodeSession({ ...stored, data })));
207
+ }));
208
+ },
209
+ };
210
+ };
211
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/session/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const tokenPattern: RegExp;
2
+ export declare const createToken: () => string;
3
+ export declare const hashToken: (token: string) => string;
4
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/session/token.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,QAAwB,CAAC;AAElD,eAAO,MAAM,WAAW,QAAO,MAA+C,CAAC;AAE/E,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MACQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ export const tokenPattern = /^[A-Za-z0-9_-]{43}$/;
3
+ export const createToken = () => randomBytes(32).toString("base64url");
4
+ export const hashToken = (token) => createHash("sha256").update(token).digest("hex");
5
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/session/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CACjD,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { SessionClient, SessionClientInput, SessionIdentityInput } from "../client/index.js";
2
+ export type SessionData = Record<string, unknown>;
3
+ export type StoredSession<TData extends object> = {
4
+ client: SessionClient;
5
+ createdAt: string;
6
+ data: TData;
7
+ expiresAt: string;
8
+ id: string;
9
+ subjectId: string;
10
+ touchedAt: string;
11
+ };
12
+ export type Session<TData extends object> = {
13
+ client: SessionClient;
14
+ createdAt: Date;
15
+ data: TData;
16
+ expiresAt: Date;
17
+ id: string;
18
+ subjectId: string;
19
+ touchedAt: Date;
20
+ };
21
+ export type CreatedSession<TData extends object> = {
22
+ session: Session<TData>;
23
+ token: string;
24
+ };
25
+ export type ResolvedSession<TData extends object> = {
26
+ renewed: boolean;
27
+ session: Session<TData>;
28
+ };
29
+ export type CreateSession<TData extends object> = {
30
+ client: SessionClientInput;
31
+ data: TData;
32
+ subjectId: string;
33
+ };
34
+ export type ResolveSession = {
35
+ client: SessionIdentityInput;
36
+ token: string;
37
+ };
38
+ export type AuditSession = {
39
+ client: SessionClient;
40
+ createdAt: Date;
41
+ expiresAt: Date;
42
+ id: string;
43
+ revokedAt: Date | null;
44
+ subjectId: string;
45
+ tokenHash: string;
46
+ updatedAt: Date | null;
47
+ };
48
+ export type CreateAuditSession = Omit<AuditSession, "revokedAt" | "updatedAt">;
49
+ export type ActiveSession = Omit<AuditSession, "tokenHash">;
50
+ export type SessionAudit = {
51
+ create(session: CreateAuditSession): Promise<void>;
52
+ findActive(subjectId: string, now: Date): Promise<AuditSession[]>;
53
+ findForRevoke(subjectId: string, sessionId: string): Promise<AuditSession | null>;
54
+ revoke(sessionIds: string[], revokedAt: Date): Promise<void>;
55
+ touch(sessionId: string, expiresAt: Date, updatedAt: Date): Promise<void>;
56
+ };
57
+ export type RedisSessionStore = {
58
+ create(tokenHash: string, value: string, ttl: number): Promise<void>;
59
+ delete(tokenHashes: string[]): Promise<void>;
60
+ exists(tokenHashes: string[]): Promise<boolean[]>;
61
+ get(tokenHash: string): Promise<string | null>;
62
+ getMany(tokenHashes: string[]): Promise<(string | null)[]>;
63
+ keep(tokenHash: string, value: string): Promise<boolean>;
64
+ update(tokenHash: string, value: string, ttl: number): Promise<boolean>;
65
+ };
66
+ export type SessionService<TData extends object> = {
67
+ create(input: CreateSession<TData>): Promise<CreatedSession<TData>>;
68
+ list(subjectId: string): Promise<ActiveSession[]>;
69
+ resolve(input: ResolveSession): Promise<ResolvedSession<TData> | null>;
70
+ revoke(input: {
71
+ sessionId: string;
72
+ subjectId: string;
73
+ }): Promise<string[]>;
74
+ revokeSubject(subjectId: string): Promise<string[]>;
75
+ revokeToken(token: string): Promise<string[]>;
76
+ sync(subjectId: string, data: TData): Promise<void>;
77
+ };
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":""}