@electr0zed/auth-gateway-cf 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 (110) hide show
  1. package/README.md +59 -0
  2. package/dist/auth/index.d.ts +84 -0
  3. package/dist/auth/index.d.ts.map +1 -0
  4. package/dist/auth/index.js +609 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/auth/pkceState.d.ts +40 -0
  7. package/dist/auth/pkceState.d.ts.map +1 -0
  8. package/dist/auth/pkceState.js +75 -0
  9. package/dist/auth/pkceState.js.map +1 -0
  10. package/dist/config.example.d.ts +2 -0
  11. package/dist/config.example.d.ts.map +1 -0
  12. package/dist/config.example.js +83 -0
  13. package/dist/config.example.js.map +1 -0
  14. package/dist/core/gateway.d.ts +11 -0
  15. package/dist/core/gateway.d.ts.map +1 -0
  16. package/dist/core/gateway.js +97 -0
  17. package/dist/core/gateway.js.map +1 -0
  18. package/dist/do/sessionDo.d.ts +11 -0
  19. package/dist/do/sessionDo.d.ts.map +1 -0
  20. package/dist/do/sessionDo.js +96 -0
  21. package/dist/do/sessionDo.js.map +1 -0
  22. package/dist/index.d.ts +7 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +16 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/providers/baseProvider.d.ts +22 -0
  27. package/dist/providers/baseProvider.d.ts.map +1 -0
  28. package/dist/providers/baseProvider.js +129 -0
  29. package/dist/providers/baseProvider.js.map +1 -0
  30. package/dist/providers/google.d.ts +9 -0
  31. package/dist/providers/google.d.ts.map +1 -0
  32. package/dist/providers/google.js +27 -0
  33. package/dist/providers/google.js.map +1 -0
  34. package/dist/providers/index.d.ts +3 -0
  35. package/dist/providers/index.d.ts.map +1 -0
  36. package/dist/providers/index.js +5 -0
  37. package/dist/providers/index.js.map +1 -0
  38. package/dist/routing/routeMatcher.d.ts +15 -0
  39. package/dist/routing/routeMatcher.d.ts.map +1 -0
  40. package/dist/routing/routeMatcher.js +83 -0
  41. package/dist/routing/routeMatcher.js.map +1 -0
  42. package/dist/sessions/durableObjectSession.d.ts +25 -0
  43. package/dist/sessions/durableObjectSession.d.ts.map +1 -0
  44. package/dist/sessions/durableObjectSession.js +90 -0
  45. package/dist/sessions/durableObjectSession.js.map +1 -0
  46. package/dist/sessions/index.d.ts +19 -0
  47. package/dist/sessions/index.d.ts.map +1 -0
  48. package/dist/sessions/index.js +32 -0
  49. package/dist/sessions/index.js.map +1 -0
  50. package/dist/sessions/jwtSession.d.ts +19 -0
  51. package/dist/sessions/jwtSession.d.ts.map +1 -0
  52. package/dist/sessions/jwtSession.js +49 -0
  53. package/dist/sessions/jwtSession.js.map +1 -0
  54. package/dist/stores/index.d.ts +3 -0
  55. package/dist/stores/index.d.ts.map +1 -0
  56. package/dist/stores/index.js +10 -0
  57. package/dist/stores/index.js.map +1 -0
  58. package/dist/stores/postgres.d.ts +74 -0
  59. package/dist/stores/postgres.d.ts.map +1 -0
  60. package/dist/stores/postgres.js +231 -0
  61. package/dist/stores/postgres.js.map +1 -0
  62. package/dist/types.d.ts +247 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +5 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/utils/csrf.d.ts +13 -0
  67. package/dist/utils/csrf.d.ts.map +1 -0
  68. package/dist/utils/csrf.js +42 -0
  69. package/dist/utils/csrf.js.map +1 -0
  70. package/dist/utils/helpers.d.ts +8 -0
  71. package/dist/utils/helpers.d.ts.map +1 -0
  72. package/dist/utils/helpers.js +22 -0
  73. package/dist/utils/helpers.js.map +1 -0
  74. package/dist/utils/http.d.ts +9 -0
  75. package/dist/utils/http.d.ts.map +1 -0
  76. package/dist/utils/http.js +23 -0
  77. package/dist/utils/http.js.map +1 -0
  78. package/dist/utils/jwt.d.ts +22 -0
  79. package/dist/utils/jwt.d.ts.map +1 -0
  80. package/dist/utils/jwt.js +96 -0
  81. package/dist/utils/jwt.js.map +1 -0
  82. package/dist/utils/passwordPolicy.d.ts +9 -0
  83. package/dist/utils/passwordPolicy.d.ts.map +1 -0
  84. package/dist/utils/passwordPolicy.js +29 -0
  85. package/dist/utils/passwordPolicy.js.map +1 -0
  86. package/dist/utils/passwords.d.ts +33 -0
  87. package/dist/utils/passwords.d.ts.map +1 -0
  88. package/dist/utils/passwords.js +139 -0
  89. package/dist/utils/passwords.js.map +1 -0
  90. package/dist/utils/propagation.d.ts +30 -0
  91. package/dist/utils/propagation.d.ts.map +1 -0
  92. package/dist/utils/propagation.js +60 -0
  93. package/dist/utils/propagation.js.map +1 -0
  94. package/dist/utils/returnTo.d.ts +2 -0
  95. package/dist/utils/returnTo.d.ts.map +1 -0
  96. package/dist/utils/returnTo.js +21 -0
  97. package/dist/utils/returnTo.js.map +1 -0
  98. package/dist/utils/roles.d.ts +3 -0
  99. package/dist/utils/roles.d.ts.map +1 -0
  100. package/dist/utils/roles.js +25 -0
  101. package/dist/utils/roles.js.map +1 -0
  102. package/dist/utils/turnstile.d.ts +12 -0
  103. package/dist/utils/turnstile.d.ts.map +1 -0
  104. package/dist/utils/turnstile.js +40 -0
  105. package/dist/utils/turnstile.js.map +1 -0
  106. package/dist/utils/verifyInternal.d.ts +8 -0
  107. package/dist/utils/verifyInternal.d.ts.map +1 -0
  108. package/dist/utils/verifyInternal.js +69 -0
  109. package/dist/utils/verifyInternal.js.map +1 -0
  110. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseProvider.js","sourceRoot":"","sources":["../../src/providers/baseProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ProviderConfig, NormalizedClaims } from '../types';
2
+ import { AuthProvider } from './baseProvider';
3
+ export declare class GoogleProvider extends AuthProvider {
4
+ constructor();
5
+ /** Providers must supply a normalize() — no `any` needed. */
6
+ protected normalize(claims: unknown): NormalizedClaims;
7
+ protected getDefaultScope(cfg: ProviderConfig): string;
8
+ }
9
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,qBAAa,cAAe,SAAQ,YAAY;;IAa/C,6DAA6D;IAC7D,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;cAWnC,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAG/D"}
@@ -0,0 +1,27 @@
1
+ import { AuthProvider } from './baseProvider';
2
+ export class GoogleProvider extends AuthProvider {
3
+ constructor() {
4
+ super({
5
+ id: 'google',
6
+ authorizeEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
7
+ tokenEndpoint: 'https://oauth2.googleapis.com/token',
8
+ defaultIssuer: 'https://accounts.google.com',
9
+ defaultScope: 'openid email profile',
10
+ userInfoEndpoint: 'https://openidconnect.googleapis.com/v1/userinfo',
11
+ claimsMode: 'userinfo',
12
+ });
13
+ }
14
+ /** Providers must supply a normalize() — no `any` needed. */
15
+ normalize(claims) {
16
+ // We accept either ID token payload or userinfo payload
17
+ const c = claims;
18
+ const subject = typeof c?.sub === 'string' ? c.sub : '';
19
+ const email = typeof c?.email === 'string' ? c.email : '';
20
+ return { email, subject };
21
+ }
22
+ // (Optional) If you need provider-specific scope overrides per cfg:
23
+ getDefaultScope(cfg) {
24
+ return cfg.scope ?? 'openid email profile';
25
+ }
26
+ }
27
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC/C;QACC,KAAK,CAAC;YACL,EAAE,EAAE,QAAQ;YACZ,iBAAiB,EAAE,8CAA8C;YACjE,aAAa,EAAE,qCAAqC;YACpD,aAAa,EAAE,6BAA6B;YAC5C,YAAY,EAAE,sBAAsB;YACpC,gBAAgB,EAAE,kDAAkD;YACpE,UAAU,EAAE,UAAU;SACtB,CAAC,CAAC;IACJ,CAAC;IAED,6DAA6D;IACnD,SAAS,CAAC,MAAe;QAClC,wDAAwD;QACxD,MAAM,CAAC,GAAG,MAAsE,CAAC;QAEjF,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACjD,eAAe,CAAC,GAAmB;QACrD,OAAO,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC;IAC5C,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ import type { AuthProvider } from './baseProvider';
2
+ export declare const ProviderRegistry: Record<string, AuthProvider>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAEzD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { GoogleProvider } from './google';
2
+ export const ProviderRegistry = {
3
+ google: new GoogleProvider(),
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAiC;IAC7D,MAAM,EAAE,IAAI,cAAc,EAAE;CAC5B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { RouteRule } from '../types';
2
+ /**
3
+ * Ordered, short-circuit route matcher.
4
+ * - First matching rule wins (stop on first hit).
5
+ * - String paths are globbed ("**" any depth, "*" segment); trailing slash optional.
6
+ * - RegExp paths are used as-is.
7
+ * - Methods are case-insensitive; empty = any method.
8
+ */
9
+ export declare class RouteMatcher {
10
+ private compiled;
11
+ constructor(rules: RouteRule[]);
12
+ /** Returns the FIRST matching rule, or undefined. */
13
+ match(url: URL, method: string): RouteRule | undefined;
14
+ }
15
+ //# sourceMappingURL=routeMatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeMatcher.d.ts","sourceRoot":"","sources":["../../src/routing/routeMatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;;GAMG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAOb;gBAES,KAAK,EAAE,SAAS,EAAE;IAY9B,qDAAqD;IACrD,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAoBtD"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Ordered, short-circuit route matcher.
3
+ * - First matching rule wins (stop on first hit).
4
+ * - String paths are globbed ("**" any depth, "*" segment); trailing slash optional.
5
+ * - RegExp paths are used as-is.
6
+ * - Methods are case-insensitive; empty = any method.
7
+ */
8
+ export class RouteMatcher {
9
+ compiled;
10
+ constructor(rules) {
11
+ this.compiled = rules.map((rule) => {
12
+ const arr = Array.isArray(rule.match) ? rule.match : [rule.match];
13
+ const tests = arr.map((m) => ({
14
+ pathRe: toPathRegex(m.path),
15
+ hostRe: m.host ? toHostRegex(m.host) : undefined,
16
+ methods: m.methods?.map(up),
17
+ }));
18
+ return { rule, tests };
19
+ });
20
+ }
21
+ /** Returns the FIRST matching rule, or undefined. */
22
+ match(url, method) {
23
+ const path = normalizePath(url.pathname);
24
+ const host = normalizeHost(url.hostname);
25
+ const m = up(method);
26
+ for (const entry of this.compiled) {
27
+ for (const t of entry.tests) {
28
+ const methodOk = !t.methods || t.methods.includes(m);
29
+ if (!methodOk)
30
+ continue;
31
+ const hostOk = !t.hostRe || t.hostRe.test(host);
32
+ if (!hostOk)
33
+ continue;
34
+ if (t.pathRe.test(path)) {
35
+ return entry.rule;
36
+ }
37
+ }
38
+ }
39
+ return undefined;
40
+ }
41
+ }
42
+ /** Normalizes path: removes trailing slash except for "/" */
43
+ function normalizePath(p) {
44
+ return p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p;
45
+ }
46
+ function normalizeHost(h) {
47
+ return h.toLowerCase().replace(/\.$/, '');
48
+ }
49
+ function up(s) {
50
+ return s.toUpperCase();
51
+ }
52
+ /**
53
+ * Converts a string glob to a RegExp with optional trailing slash.
54
+ * - "**" -> ".*" (any depth)
55
+ * - "*" -> "[^/]*" (single segment portion)
56
+ * If input is already RegExp, return as-is (no trailing-slash tweak).
57
+ */
58
+ function toPathRegex(path) {
59
+ if (path instanceof RegExp)
60
+ return path;
61
+ // normalize pattern's trailing slash too (except root)
62
+ let pat = path;
63
+ if (pat.length > 1 && pat.endsWith('/'))
64
+ pat = pat.slice(0, -1);
65
+ pat = globToRegexSource(pat, '/');
66
+ const optSlash = pat === '/' ? '' : '(?:/)?';
67
+ return new RegExp(`^${pat}${optSlash}$`);
68
+ }
69
+ function toHostRegex(host) {
70
+ if (host instanceof RegExp)
71
+ return host;
72
+ const pat = globToRegexSource(normalizeHost(host), '.');
73
+ return new RegExp(`^${pat}$`, 'i');
74
+ }
75
+ function globToRegexSource(input, segmentSeparator) {
76
+ const segmentPattern = segmentSeparator === '/' ? '[^/]*' : '[^.]*';
77
+ return input
78
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
79
+ .replace(/\*\\\*/g, '**')
80
+ .replace(/\*\*/g, '.*')
81
+ .replace(/\*/g, segmentPattern);
82
+ }
83
+ //# sourceMappingURL=routeMatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeMatcher.js","sourceRoot":"","sources":["../../src/routing/routeMatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { SessionStrategy, Session, SessionStrategyCfg } from '../types';
2
+ export declare class DurableObjectSessionStrategy implements SessionStrategy {
3
+ private cfg;
4
+ constructor(cfg: (SessionStrategyCfg & {
5
+ kind: 'durableObject';
6
+ }) & {
7
+ issuer?: string;
8
+ audience?: string;
9
+ });
10
+ resolve(request: Request, env: Env): Promise<{
11
+ session: null;
12
+ accessJwt?: undefined;
13
+ } | {
14
+ session: Session;
15
+ accessJwt: string;
16
+ }>;
17
+ issue(session: Session, env: Env): Promise<{
18
+ cookie: string;
19
+ accessJwt: string;
20
+ }>;
21
+ clear(request: Request, _env: Env): Promise<{
22
+ cookie: string;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=durableObjectSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durableObjectSession.d.ts","sourceRoot":"","sources":["../../src/sessions/durableObjectSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIxE,qBAAa,4BAA6B,YAAW,eAAe;IAElE,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,CAAC,kBAAkB,GAAG;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,GAAG;QAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB;IAGI,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;;iBA+BL,OAAO;;;IAGpC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;;IAqChC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;;;CAuBvC"}
@@ -0,0 +1,90 @@
1
+ import { signJwtHS256 } from '../utils/jwt';
2
+ import { getCookie } from '.';
3
+ export class DurableObjectSessionStrategy {
4
+ cfg;
5
+ constructor(cfg) {
6
+ this.cfg = cfg;
7
+ }
8
+ async resolve(request, env) {
9
+ const sid = getCookie(request, this.cfg.cookieName ?? '__Host-sid');
10
+ if (!sid)
11
+ return { session: null };
12
+ const stub = this.cfg.doName.getByName(sid);
13
+ const res = await stub.fetch('https://do/session', {
14
+ method: 'POST',
15
+ headers: { 'content-type': 'application/json' },
16
+ body: JSON.stringify({ op: 'get' }),
17
+ });
18
+ if (!res.ok)
19
+ return { session: null };
20
+ const data = (await res.json().catch(() => null));
21
+ if (!data?.session)
22
+ return { session: null };
23
+ const now = Math.floor(Date.now() / 1000);
24
+ const exp = now + 15 * 60;
25
+ const accessJwt = await signJwtHS256({
26
+ iss: this.cfg.issuer ?? 'auth-gateway',
27
+ aud: this.cfg.audience ?? 'internal-services',
28
+ sub: data.session.userId,
29
+ email: data.session.email,
30
+ iat: now,
31
+ nbf: now - 30,
32
+ exp,
33
+ jti: crypto.randomUUID(),
34
+ }, env[this.cfg.jwtSecretEnv]);
35
+ return { session: data.session, accessJwt };
36
+ }
37
+ async issue(session, env) {
38
+ const sid = crypto.randomUUID();
39
+ const stub = this.cfg.doName.getByName(sid);
40
+ const idleTtlSec = this.cfg.idleTtlSec ?? 14 * 24 * 60 * 60;
41
+ const absoluteTtlSec = this.cfg.absoluteTtlSec ?? 30 * 24 * 60 * 60;
42
+ const res = await stub.fetch('https://do/session', {
43
+ method: 'POST',
44
+ headers: { 'content-type': 'application/json' },
45
+ body: JSON.stringify({ op: 'put', session, idleTtlSec, absoluteTtlSec }),
46
+ });
47
+ if (!res.ok)
48
+ throw new Error('session create failed');
49
+ const now = Math.floor(Date.now() / 1000);
50
+ const exp = now + 15 * 60;
51
+ const accessJwt = await signJwtHS256({
52
+ iss: this.cfg.issuer ?? 'auth-gateway',
53
+ aud: this.cfg.audience ?? 'internal-services',
54
+ sub: session.userId,
55
+ email: session.email,
56
+ iat: now,
57
+ nbf: now - 30,
58
+ exp,
59
+ jti: crypto.randomUUID(),
60
+ }, env[this.cfg.jwtSecretEnv]);
61
+ const cookieName = this.cfg.cookieName ?? '__Host-sid';
62
+ return {
63
+ cookie: `${cookieName}=${sid}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=${idleTtlSec}; Priority=Medium`,
64
+ accessJwt,
65
+ };
66
+ }
67
+ async clear(request, _env) {
68
+ // Get the session ID from the cookie
69
+ const sid = getCookie(request, this.cfg.cookieName ?? '__Host-sid');
70
+ // If there's a session ID, inform the Durable Object to delete the session data
71
+ if (sid) {
72
+ try {
73
+ const stub = this.cfg.doName.getByName(sid);
74
+ await stub.fetch('https://do/session', {
75
+ method: 'POST',
76
+ headers: { 'content-type': 'application/json' },
77
+ body: JSON.stringify({ op: 'delete' }),
78
+ });
79
+ }
80
+ catch (_) {
81
+ // Silently fail if we can't delete from the DO - still clear the cookie
82
+ }
83
+ }
84
+ // Invalidate the cookie by setting it to expire immediately
85
+ return {
86
+ cookie: `${this.cfg.cookieName ?? '__Host-sid'}=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=Lax`,
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=durableObjectSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durableObjectSession.js","sourceRoot":"","sources":["../../src/sessions/durableObjectSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAE9B,MAAM,OAAO,4BAA4B;IAE/B;IADT,YACS,GAGP;QAHO,QAAG,GAAH,GAAG,CAGV;IACC,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAgB,EAAE,GAAQ;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;SACnC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEtC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAwC,CAAC;QACzF,IAAI,CAAC,IAAI,EAAE,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,YAAY,CACnC;YACC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,cAAc;YACtC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;YAC7C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YACxB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG;YACH,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB,EACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAC3B,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAkB,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAEpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;SACxE,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAEtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,MAAM,YAAY,CACnC;YACC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,cAAc;YACtC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,mBAAmB;YAC7C,GAAG,EAAE,OAAO,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG;YACH,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB,EACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAC3B,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC;QACvD,OAAO;YACN,MAAM,EAAE,GAAG,UAAU,IAAI,GAAG,qDAAqD,UAAU,mBAAmB;YAC9G,SAAS;SACT,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,IAAS;QACtC,qCAAqC;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;QAEpE,gFAAgF;QAChF,IAAI,GAAG,EAAE,CAAC;YACT,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;oBACtC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;iBACtC,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,wEAAwE;YACzE,CAAC;QACF,CAAC;QAED,4DAA4D;QAC5D,OAAO;YACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,sDAAsD;SACpG,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,19 @@
1
+ import type { SessionStrategy, SessionStrategyCfg } from '../types';
2
+ /**
3
+ * Gets a cookie value from a request
4
+ *
5
+ * @export
6
+ * @param {Request} req
7
+ * @param {string} name
8
+ * @returns {string | null}
9
+ */
10
+ export declare function getCookie(req: Request, name: string): string | null;
11
+ /**
12
+ * Creates a session strategy based on configuration
13
+ *
14
+ * @export
15
+ * @param {SessionStrategyCfg} sessionCfg
16
+ * @returns {SessionStrategy}
17
+ */
18
+ export declare function makeSessionStrategy(sessionCfg: SessionStrategyCfg): SessionStrategy;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIpE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,CAKnF"}
@@ -0,0 +1,32 @@
1
+ import { JwtSessionStrategy } from './jwtSession';
2
+ import { DurableObjectSessionStrategy } from './durableObjectSession';
3
+ /**
4
+ * Gets a cookie value from a request
5
+ *
6
+ * @export
7
+ * @param {Request} req
8
+ * @param {string} name
9
+ * @returns {string | null}
10
+ */
11
+ export function getCookie(req, name) {
12
+ const h = req.headers.get('cookie');
13
+ if (!h)
14
+ return null;
15
+ const m = h.match(new RegExp(`(?:^|; )${name}=([^;]*)`));
16
+ return m ? decodeURIComponent(m[1]) : null;
17
+ }
18
+ /**
19
+ * Creates a session strategy based on configuration
20
+ *
21
+ * @export
22
+ * @param {SessionStrategyCfg} sessionCfg
23
+ * @returns {SessionStrategy}
24
+ */
25
+ export function makeSessionStrategy(sessionCfg) {
26
+ if (sessionCfg.kind === 'jwt')
27
+ return new JwtSessionStrategy(sessionCfg);
28
+ if (sessionCfg.kind === 'durableObject')
29
+ return new DurableObjectSessionStrategy(sessionCfg);
30
+ throw new Error(`unknown session strategy kind: ${sessionCfg.kind}`);
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA8B;IACjE,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAE7F,MAAM,IAAI,KAAK,CAAC,kCAAmC,UAAiC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { SessionStrategy, Session, SessionStrategyCfg } from '../types';
2
+ export declare class JwtSessionStrategy implements SessionStrategy {
3
+ private cfg;
4
+ constructor(cfg: SessionStrategyCfg & {
5
+ kind: 'jwt';
6
+ });
7
+ resolve(request: Request, env: Env): Promise<{
8
+ session: null;
9
+ } | {
10
+ session: Session;
11
+ }>;
12
+ issue(session: Session, env: Env): Promise<{
13
+ cookie: string;
14
+ }>;
15
+ clear(_request: Request, _env: Env): Promise<{
16
+ cookie: string;
17
+ }>;
18
+ }
19
+ //# sourceMappingURL=jwtSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtSession.d.ts","sourceRoot":"","sources":["../../src/sessions/jwtSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAKxE,qBAAa,kBAAmB,YAAW,eAAe;IAC7C,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,kBAAkB,GAAG;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE;IAEvD,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;iBAWhC,OAAO;;IAOT,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;IAoBhC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;;;CAKxC"}
@@ -0,0 +1,49 @@
1
+ import { signJwtHS256, verifyJwtHS256 } from '../utils/jwt';
2
+ import { getCookie } from '.';
3
+ // Stateless cookie that IS the JWT
4
+ export class JwtSessionStrategy {
5
+ cfg;
6
+ constructor(cfg) {
7
+ this.cfg = cfg;
8
+ }
9
+ async resolve(request, env) {
10
+ const token = getCookie(request, this.cfg.cookieName ?? '__Host-session');
11
+ if (!token)
12
+ return { session: null };
13
+ try {
14
+ const payload = await verifyJwtHS256(token, env[this.cfg.jwtSecretEnv]);
15
+ return {
16
+ session: {
17
+ userId: payload.sub,
18
+ email: payload.email,
19
+ systemRoles: payload.systemRoles,
20
+ },
21
+ };
22
+ }
23
+ catch {
24
+ return { session: null };
25
+ }
26
+ }
27
+ async issue(session, env) {
28
+ const expMinutes = this.cfg.expMinutes ?? 15;
29
+ const now = Math.floor(Date.now() / 1000);
30
+ const jwt = await signJwtHS256({
31
+ sub: session.userId,
32
+ email: session.email,
33
+ systemRoles: session.systemRoles,
34
+ iat: now,
35
+ nbf: now - 30,
36
+ exp: now + expMinutes * 60,
37
+ jti: crypto.randomUUID(),
38
+ }, env[this.cfg.jwtSecretEnv]);
39
+ return {
40
+ cookie: `${this.cfg.cookieName ?? '__Host-session'}=${jwt}; Path=/; HttpOnly; Secure; SameSite=Lax`,
41
+ };
42
+ }
43
+ async clear(_request, _env) {
44
+ return {
45
+ cookie: `${this.cfg.cookieName ?? '__Host-session'}=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=Lax`,
46
+ };
47
+ }
48
+ }
49
+ //# sourceMappingURL=jwtSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtSession.js","sourceRoot":"","sources":["../../src/sessions/jwtSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAE9B,mCAAmC;AACnC,MAAM,OAAO,kBAAkB;IACV;IAApB,YAAoB,GAAyC;QAAzC,QAAG,GAAH,GAAG,CAAsC;IAAG,CAAC;IAEjE,KAAK,CAAC,OAAO,CAAC,OAAgB,EAAE,GAAQ;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,CAAC;YACzE,OAAO;gBACN,OAAO,EAAE;oBACR,MAAM,EAAE,OAAO,CAAC,GAAG;oBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;iBACrB;aACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,CAC7B;YACC,GAAG,EAAE,OAAO,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,EAAE;YAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB,EACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAC3B,CAAC;QACF,OAAO;YACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,IAAI,GAAG,0CAA0C;SACnG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAiB,EAAE,IAAS;QACvC,OAAO;YACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,sDAAsD;SACxG,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ import type { UserStoreCfg, UserStore } from '../types';
2
+ export declare function makeUserStore(cfg: UserStoreCfg): UserStore;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGxD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,CAO1D"}
@@ -0,0 +1,10 @@
1
+ import { PostgresUserStore } from './postgres';
2
+ export function makeUserStore(cfg) {
3
+ switch (cfg.kind) {
4
+ case 'postgres':
5
+ return new PostgresUserStore(cfg.hyperdrive);
6
+ default:
7
+ throw new Error('UserStore kind not supported in this build');
8
+ }
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC9C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,UAAU;YACd,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C;YACC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACF,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { UserStore } from '../types';
2
+ import { type Transaction, type Generated } from 'kysely';
3
+ export interface DB {
4
+ users: {
5
+ id: Generated<string>;
6
+ username: string | null;
7
+ email: string;
8
+ system_roles: Generated<string[]>;
9
+ created_at: Generated<Date>;
10
+ last_login_at: Date | null;
11
+ };
12
+ user_states: {
13
+ user_id: string;
14
+ is_disabled: boolean;
15
+ disabled_at: Date | null;
16
+ disabled_by: string | null;
17
+ is_approved: boolean;
18
+ approved_at: Date | null;
19
+ approved_by: string | null;
20
+ is_email_verified: boolean;
21
+ email_verified_at: Date | null;
22
+ email_verification_token_hash: string | null;
23
+ created_at: Date;
24
+ updated_at: Date;
25
+ };
26
+ user_identities: {
27
+ id: Generated<number>;
28
+ user_id: string;
29
+ provider: string;
30
+ issuer: string;
31
+ subject: string;
32
+ created_at: Generated<Date>;
33
+ };
34
+ user_passwords: {
35
+ user_id: string;
36
+ password_hash: string;
37
+ created_at: Generated<Date>;
38
+ updated_at: Generated<Date>;
39
+ };
40
+ }
41
+ export declare class PostgresUserStore implements UserStore {
42
+ private pool;
43
+ private db;
44
+ constructor(hyperdrive: Hyperdrive);
45
+ findUserIdByIdentity(issuer: string, subject: string): Promise<string | null>;
46
+ findUserIdByEmail(email: string): Promise<string | null>;
47
+ createUserWithIdentity(email: string, identity: {
48
+ provider: string;
49
+ issuer: string;
50
+ subject: string;
51
+ }, generateUsernameFunc?: (email: string) => string): Promise<string>;
52
+ addIdentityToUser(userId: string, identity: {
53
+ provider: string;
54
+ issuer: string;
55
+ subject: string;
56
+ }): Promise<void>;
57
+ getUserRoles(userId: string): Promise<string[]>;
58
+ getUserStates(userId: string): Promise<DB['user_states'] | null>;
59
+ createUser(trx: Transaction<DB>, email: string, username?: string | null): Promise<{
60
+ id: string;
61
+ } | undefined>;
62
+ createUserStates(trx: Transaction<DB>, userId: string): Promise<void>;
63
+ createUserWithPassword(email: string, passwordHash: string, username?: string | null): Promise<string>;
64
+ getUserIdByEmailForPassword(email: string): Promise<{
65
+ userId: string;
66
+ passwordHash: string;
67
+ } | null>;
68
+ getPasswordHashByUserId(userId: string): Promise<string | null>;
69
+ setPasswordHash(userId: string, passwordHash: string): Promise<void>;
70
+ checkUsernameExists(username: string): Promise<boolean>;
71
+ checkEmailExists(email: string): Promise<boolean>;
72
+ destroy(): Promise<void>;
73
+ }
74
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/stores/postgres.ts"],"names":[],"mappings":"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"}