@gauts/auth 0.2.1 → 0.3.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 (63) hide show
  1. package/README.md +592 -186
  2. package/SECURITY.md +44 -1
  3. package/dist/adapters/hono/index.d.ts +40 -18
  4. package/dist/adapters/hono/index.d.ts.map +1 -1
  5. package/dist/adapters/hono/index.js +151 -54
  6. package/dist/adapters/hono/index.js.map +1 -1
  7. package/dist/adapters/next/index.d.ts +24 -0
  8. package/dist/adapters/next/index.d.ts.map +1 -0
  9. package/dist/adapters/next/index.js +90 -0
  10. package/dist/adapters/next/index.js.map +1 -0
  11. package/dist/adapters/prisma/index.d.ts +39 -0
  12. package/dist/adapters/prisma/index.d.ts.map +1 -0
  13. package/dist/adapters/prisma/index.js +205 -0
  14. package/dist/adapters/prisma/index.js.map +1 -0
  15. package/dist/auth.d.ts +9 -7
  16. package/dist/auth.d.ts.map +1 -1
  17. package/dist/auth.js +11 -13
  18. package/dist/auth.js.map +1 -1
  19. package/dist/client/index.d.ts +8 -3
  20. package/dist/client/index.d.ts.map +1 -1
  21. package/dist/client/index.js +23 -7
  22. package/dist/client/index.js.map +1 -1
  23. package/dist/config.d.ts +3 -3
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +12 -18
  26. package/dist/config.js.map +1 -1
  27. package/dist/errors.d.ts +2 -2
  28. package/dist/errors.d.ts.map +1 -1
  29. package/dist/errors.js +7 -5
  30. package/dist/errors.js.map +1 -1
  31. package/dist/index.d.ts +2 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/password/index.d.ts.map +1 -1
  34. package/dist/password/index.js +2 -4
  35. package/dist/password/index.js.map +1 -1
  36. package/dist/session/cache.d.ts +32 -0
  37. package/dist/session/cache.d.ts.map +1 -0
  38. package/dist/session/cache.js +136 -0
  39. package/dist/session/cache.js.map +1 -0
  40. package/dist/session/cookie.d.ts +15 -0
  41. package/dist/session/cookie.d.ts.map +1 -0
  42. package/dist/session/cookie.js +31 -0
  43. package/dist/session/cookie.js.map +1 -0
  44. package/dist/session/guards.d.ts +6 -0
  45. package/dist/session/guards.d.ts.map +1 -0
  46. package/dist/session/guards.js +23 -0
  47. package/dist/session/guards.js.map +1 -0
  48. package/dist/session/service.d.ts +3 -4
  49. package/dist/session/service.d.ts.map +1 -1
  50. package/dist/session/service.js +148 -187
  51. package/dist/session/service.js.map +1 -1
  52. package/dist/session/token.js.map +1 -1
  53. package/dist/session/types.d.ts +65 -74
  54. package/dist/session/types.d.ts.map +1 -1
  55. package/package.json +91 -92
  56. package/dist/adapters/redis/index.d.ts +0 -11
  57. package/dist/adapters/redis/index.d.ts.map +0 -1
  58. package/dist/adapters/redis/index.js +0 -62
  59. package/dist/adapters/redis/index.js.map +0 -1
  60. package/dist/session/schema.d.ts +0 -5
  61. package/dist/session/schema.d.ts.map +0 -1
  62. package/dist/session/schema.js +0 -56
  63. package/dist/session/schema.js.map +0 -1
@@ -1 +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,EACvB,QAAQ,EACR,QAAQ,GAIT,EAAE,EAAE;IACH,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,CAAC;YAChB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,uCAAuC,MAAM,CAAC,QAAQ,CAAC,SAAS;SAC1E,CAAC,CAAC;IACL,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,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,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,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QACzC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,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,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QACzC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/D,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,CAC5B,MAA8B,EACb,EAAE;IACnB,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QAClC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC,CAAC"}
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;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAa3C,MAAM,cAAc,GAAG,sCAAsC,CAAC;AAE9D,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAwB,EAAE,EAAE;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QAChC,MAAM,WAAW,CAAC;YACd,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,uCAAuC,MAAM,CAAC,QAAQ,CAAC,SAAS;SAC5E,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,MAAkE,EACnD,EAAE,CAAC,CAAC;IACnB,SAAS,EAAE,UAAU;IAErB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACrB,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YACzB,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;SACxB,CAAC,CAAC;IACP,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QACvC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CACjB,MAAgE,EACjD,EAAE,CAAC,CAAC;IACnB,SAAS,EAAE,QAAQ;IAEnB,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACrB,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QACvC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA8B,EAAmB,EAAE;IAC9E,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AACzF,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type SessionClientInput } from "../client/index.js";
2
+ import type { ResolvedSessionConfig } from "../config.js";
3
+ import type { ResolvedSession } from "./types.js";
4
+ export type SessionCacheConfig = {
5
+ ttl: number;
6
+ };
7
+ type SessionCacheDeps = {
8
+ config: SessionCacheConfig;
9
+ now?: () => Date;
10
+ secret: string;
11
+ session: ResolvedSessionConfig;
12
+ };
13
+ type CacheInput = {
14
+ client: SessionClientInput;
15
+ token: string;
16
+ value: string | null | undefined;
17
+ };
18
+ type CreateCacheInput = {
19
+ resolved: ResolvedSession;
20
+ token: string;
21
+ };
22
+ type SessionCacheValue = {
23
+ expires_at: Date;
24
+ value: string;
25
+ };
26
+ export type SessionCache = {
27
+ create(input: CreateCacheInput): SessionCacheValue;
28
+ resolve(input: CacheInput): ResolvedSession | null;
29
+ };
30
+ export declare const createSessionCache: ({ config, now, secret, session: sessionConfig, }: SessionCacheDeps) => SessionCache;
31
+ export {};
32
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/session/cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAW,MAAM,YAAY,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAEF,KAAK,UAAU,GAAG;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACpC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACrB,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAeF,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAAC;IACnD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAAC;CACtD,CAAC;AAuFF,eAAO,MAAM,kBAAkB,GAAI,kDAKhC,gBAAgB,KAAG,YAwFrB,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ import { matchesClient, normalizeClient } from "../client/index.js";
3
+ import { createError } from "../errors.js";
4
+ import { isAuthAccount, isNullableString, isRecord } from "./guards.js";
5
+ const signaturePattern = /^[A-Za-z0-9_-]{43}$/;
6
+ const CACHE_CONTEXT = "auth/session-cache";
7
+ const MIN_SECRET_BYTES = 32;
8
+ const getSignature = ({ body, secret, token }) => {
9
+ return createHmac("sha256", secret)
10
+ .update(CACHE_CONTEXT)
11
+ .update("\0")
12
+ .update(token)
13
+ .update("\0")
14
+ .update(body)
15
+ .digest("base64url");
16
+ };
17
+ const matchesSignature = ({ body, secret, signature, token }) => {
18
+ if (!signaturePattern.test(signature)) {
19
+ return false;
20
+ }
21
+ const expected = Buffer.from(getSignature({ body, secret, token }), "ascii");
22
+ const received = Buffer.from(signature, "ascii");
23
+ return expected.byteLength === received.byteLength && timingSafeEqual(expected, received);
24
+ };
25
+ const isStoredSession = (value) => {
26
+ return (isRecord(value) &&
27
+ typeof value.account_id === "string" &&
28
+ isRecord(value.client) &&
29
+ isNullableString(value.client.agent) &&
30
+ isNullableString(value.client.ip) &&
31
+ isNullableString(value.client.platform) &&
32
+ typeof value.created_at === "number" &&
33
+ Number.isSafeInteger(value.created_at) &&
34
+ typeof value.expires_at === "number" &&
35
+ Number.isSafeInteger(value.expires_at) &&
36
+ typeof value.id === "string" &&
37
+ typeof value.renew_at === "number" &&
38
+ Number.isSafeInteger(value.renew_at));
39
+ };
40
+ const isCachePayload = (value) => {
41
+ return (isRecord(value) &&
42
+ value.version === 1 &&
43
+ isAuthAccount(value.account) &&
44
+ typeof value.cache_expires_at === "number" &&
45
+ Number.isSafeInteger(value.cache_expires_at) &&
46
+ isStoredSession(value.session) &&
47
+ value.session.account_id === value.account.id);
48
+ };
49
+ const parsePayload = (body) => {
50
+ try {
51
+ const value = JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
52
+ return isCachePayload(value) ? value : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ };
58
+ const toSession = (stored) => ({
59
+ ...stored,
60
+ created_at: new Date(stored.created_at),
61
+ expires_at: new Date(stored.expires_at),
62
+ renew_at: new Date(stored.renew_at),
63
+ });
64
+ const toStoredSession = (session) => ({
65
+ ...session,
66
+ created_at: session.created_at.getTime(),
67
+ expires_at: session.expires_at.getTime(),
68
+ renew_at: session.renew_at.getTime(),
69
+ });
70
+ export const createSessionCache = ({ config, now = () => new Date(), secret, session: sessionConfig, }) => {
71
+ if (!Number.isInteger(config.ttl) || config.ttl < 1 || config.ttl > sessionConfig.ttl) {
72
+ throw createError({
73
+ code: "AUTH_CONFIG_INVALID",
74
+ message: "Session cache TTL must be an integer between 1 and the session TTL.",
75
+ });
76
+ }
77
+ if (Buffer.byteLength(secret, "utf8") < MIN_SECRET_BYTES) {
78
+ throw createError({
79
+ code: "AUTH_CONFIG_INVALID",
80
+ message: "Authentication secret must contain at least 32 bytes.",
81
+ });
82
+ }
83
+ return {
84
+ create: ({ resolved, token }) => {
85
+ const max_expires_at = resolved.session.created_at.getTime() + sessionConfig.maxLifetime * 1000;
86
+ const expires_at = new Date(Math.min(now().getTime() + config.ttl * 1000, resolved.session.expires_at.getTime(), max_expires_at));
87
+ const payload = {
88
+ account: resolved.account,
89
+ cache_expires_at: expires_at.getTime(),
90
+ session: toStoredSession(resolved.session),
91
+ version: 1,
92
+ };
93
+ const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
94
+ const signature = getSignature({ body, secret, token });
95
+ return {
96
+ expires_at,
97
+ value: `${body}.${signature}`,
98
+ };
99
+ },
100
+ resolve: ({ client, token, value }) => {
101
+ const [body, signature, extra] = value?.trim().split(".") ?? [];
102
+ if (!body ||
103
+ !signature ||
104
+ extra !== undefined ||
105
+ !matchesSignature({ body, secret, signature, token })) {
106
+ return null;
107
+ }
108
+ const payload = parsePayload(body);
109
+ if (!payload) {
110
+ return null;
111
+ }
112
+ const current = now().getTime();
113
+ const resolvedSession = toSession(payload.session);
114
+ const max_expires_at = resolvedSession.created_at.getTime() + sessionConfig.maxLifetime * 1000;
115
+ if (payload.cache_expires_at <= current ||
116
+ resolvedSession.expires_at.getTime() <= current ||
117
+ max_expires_at <= current ||
118
+ payload.cache_expires_at > resolvedSession.expires_at.getTime() ||
119
+ payload.cache_expires_at > max_expires_at ||
120
+ resolvedSession.expires_at.getTime() > max_expires_at ||
121
+ !matchesClient({
122
+ current: normalizeClient(client),
123
+ stored: resolvedSession.client,
124
+ validation: sessionConfig.validation,
125
+ })) {
126
+ return null;
127
+ }
128
+ return {
129
+ account: payload.account,
130
+ session: resolvedSession,
131
+ user: payload.account.user,
132
+ };
133
+ },
134
+ };
135
+ };
136
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/session/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAA2B,MAAM,oBAAoB,CAAC;AAE7F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAuDxE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAC3C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAmD,EAAE,EAAE;IAC9F,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC9B,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAoB,EAAW,EAAE;IACvF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9F,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAA0B,EAAE;IAC/D,OAAO,CACH,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACtB,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QACpC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QACtC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QACtC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CACvC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE;IAC7D,OAAO,CACH,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;QAC1C,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC5C,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAChD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAuB,EAAE;IACvD,IAAI,CAAC;QACD,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACnF,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,MAAqB,EAAW,EAAE,CAAC,CAAC;IACnD,GAAG,MAAM;IACT,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IACvC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IACvC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAiB,EAAE,CAAC,CAAC;IAC1D,GAAG,OAAO;IACV,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;IACxC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;IACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EAC/B,MAAM,EACN,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EACtB,MAAM,EACN,OAAO,EAAE,aAAa,GACP,EAAgB,EAAE;IACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;QACpF,MAAM,WAAW,CAAC;YACd,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,qEAAqE;SACjF,CAAC,CAAC;IACP,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC;QACvD,MAAM,WAAW,CAAC;YACd,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,uDAAuD;SACnE,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACH,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;YAC5B,MAAM,cAAc,GAChB,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;YAC7E,MAAM,UAAU,GAAG,IAAI,IAAI,CACvB,IAAI,CAAC,GAAG,CACJ,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,EACnC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EACrC,cAAc,CACjB,CACJ,CAAC;YAEF,MAAM,OAAO,GAAiB;gBAC1B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,gBAAgB,EAAE,UAAU,CAAC,OAAO,EAAE;gBACtC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1C,OAAO,EAAE,CAAC;aACb,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAExD,OAAO;gBACH,UAAU;gBACV,KAAK,EAAE,GAAG,IAAI,IAAI,SAAS,EAAE;aAChC,CAAC;QACN,CAAC;QAED,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;YAClC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAEhE,IACI,CAAC,IAAI;gBACL,CAAC,SAAS;gBACV,KAAK,KAAK,SAAS;gBACnB,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EACvD,CAAC;gBACC,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,cAAc,GAChB,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;YAE5E,IACI,OAAO,CAAC,gBAAgB,IAAI,OAAO;gBACnC,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,OAAO;gBAC/C,cAAc,IAAI,OAAO;gBACzB,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE;gBAC/D,OAAO,CAAC,gBAAgB,GAAG,cAAc;gBACzC,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,cAAc;gBACrD,CAAC,aAAa,CAAC;oBACX,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;oBAChC,MAAM,EAAE,eAAe,CAAC,MAAM;oBAC9B,UAAU,EAAE,aAAa,CAAC,UAAU;iBACvC,CAAC,EACJ,CAAC;gBACC,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO;gBACH,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,eAAe;gBACxB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;aAC7B,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type SessionCookieNamesInput = {
2
+ cacheName?: string;
3
+ name?: string;
4
+ renewName?: string;
5
+ };
6
+ export type SessionCookieNames = {
7
+ cacheName: string;
8
+ name: string;
9
+ renewName: string;
10
+ };
11
+ export declare const RENEW_COOKIE_VALUE = "1";
12
+ export declare const resolveSessionCookieName: (input?: string) => string;
13
+ export declare const resolveSessionCookieNames: (input?: SessionCookieNamesInput) => SessionCookieNames;
14
+ export declare const parseSessionToken: (value?: string | null) => string | null;
15
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/session/cookie.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,uBAAuB,GAAG;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAItC,eAAO,MAAM,wBAAwB,GAAI,QAAQ,MAAM,KAAG,MAWzD,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAClC,QAAO,uBAA4B,KACpC,kBAaF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAGlE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { createError } from "../errors.js";
2
+ import { tokenPattern } from "./token.js";
3
+ export const RENEW_COOKIE_VALUE = "1";
4
+ const cookieNamePattern = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
5
+ export const resolveSessionCookieName = (input) => {
6
+ const name = input ?? "__sec";
7
+ if (!cookieNamePattern.test(name)) {
8
+ throw createError({
9
+ code: "AUTH_CONFIG_INVALID",
10
+ message: "Session cookie name is invalid.",
11
+ });
12
+ }
13
+ return name;
14
+ };
15
+ export const resolveSessionCookieNames = (input = {}) => {
16
+ const name = resolveSessionCookieName(input.name);
17
+ const cacheName = resolveSessionCookieName(input.cacheName ?? "__cac");
18
+ const renewName = resolveSessionCookieName(input.renewName ?? "__ren");
19
+ if (new Set([name, cacheName, renewName]).size !== 3) {
20
+ throw createError({
21
+ code: "AUTH_CONFIG_INVALID",
22
+ message: "Session cookie names must be unique.",
23
+ });
24
+ }
25
+ return { cacheName, name, renewName };
26
+ };
27
+ export const parseSessionToken = (value) => {
28
+ const token = value?.trim();
29
+ return token && tokenPattern.test(token) ? token : null;
30
+ };
31
+ //# sourceMappingURL=cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../src/session/cookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,CAAC;IAE9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,WAAW,CAAC;YACd,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,iCAAiC;SAC7C,CAAC,CAAC;IACP,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACrC,QAAiC,EAAE,EACjB,EAAE;IACpB,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;IAEvE,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,WAAW,CAAC;YACd,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,sCAAsC;SAClD,CAAC,CAAC;IACP,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAqB,EAAiB,EAAE;IACtE,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AuthAccount, AuthUser } from "./types.js";
2
+ export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
3
+ export declare const isNullableString: (value: unknown) => value is string | null;
4
+ export declare const isAuthUser: (value: unknown) => value is AuthUser;
5
+ export declare const isAuthAccount: (value: unknown) => value is AuthAccount;
6
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/session/guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAExE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,GAAG,IAEnE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,QAOpD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,WAWvD,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const isRecord = (value) => {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ };
4
+ export const isNullableString = (value) => {
5
+ return typeof value === "string" || value === null;
6
+ };
7
+ export const isAuthUser = (value) => {
8
+ return (isRecord(value) &&
9
+ typeof value.id === "string" &&
10
+ typeof value.role === "string" &&
11
+ typeof value.status === "string");
12
+ };
13
+ export const isAuthAccount = (value) => {
14
+ return (isRecord(value) &&
15
+ typeof value.email === "string" &&
16
+ typeof value.id === "string" &&
17
+ typeof value.name === "string" &&
18
+ typeof value.role === "string" &&
19
+ typeof value.status === "string" &&
20
+ isNullableString(value.timezone) &&
21
+ isAuthUser(value.user));
22
+ };
23
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/session/guards.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE;IACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA0B,EAAE;IACvE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE;IAC5D,OAAO,CACH,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACnC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE;IAClE,OAAO,CACH,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CACzB,CAAC;AACN,CAAC,CAAC"}
@@ -1,11 +1,10 @@
1
1
  import type { ResolvedSessionConfig } from "../config.js";
2
- import type { RedisSessionStore, SessionRecords, SessionService } from "./types.js";
2
+ import type { DbAdapter, SessionService } from "./types.js";
3
3
  type SessionDeps = {
4
4
  config: ResolvedSessionConfig;
5
+ db: DbAdapter;
5
6
  now?: () => Date;
6
- records: SessionRecords;
7
- redis: RedisSessionStore;
8
7
  };
9
- export declare const createSessionService: <TData extends object>({ config, now, records, redis, }: SessionDeps) => SessionService<TData>;
8
+ export declare const createSessionService: ({ config, db, now, }: SessionDeps) => SessionService;
10
9
  export {};
11
10
  //# sourceMappingURL=service.d.ts.map
@@ -1 +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,EAEV,iBAAiB,EAGjB,cAAc,EACd,cAAc,EAEf,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAuBF,eAAO,MAAM,oBAAoB,GAAI,KAAK,SAAS,MAAM,EAAE,kCAKxD,WAAW,KAAG,cAAc,CAAC,KAAK,CAiWpC,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/session/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAGR,SAAS,EAIT,cAAc,EACjB,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,EAAE,EAAE,SAAS,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAwBF,eAAO,MAAM,oBAAoB,GAAI,sBAIlC,WAAW,KAAG,cAsShB,CAAC"}