@effect-auth/core 0.1.0-alpha.1 → 0.1.0-alpha.2

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 (143) hide show
  1. package/README.md +622 -61
  2. package/dist/AuditLog.d.ts.map +1 -1
  3. package/dist/AuditLog.js +1 -1
  4. package/dist/AuditLog.js.map +1 -1
  5. package/dist/AuthConfig.d.ts +51 -0
  6. package/dist/AuthConfig.d.ts.map +1 -0
  7. package/dist/AuthConfig.js +56 -0
  8. package/dist/AuthConfig.js.map +1 -0
  9. package/dist/AuthFlow.d.ts +292 -35
  10. package/dist/AuthFlow.d.ts.map +1 -1
  11. package/dist/AuthFlow.js +130 -6
  12. package/dist/AuthFlow.js.map +1 -1
  13. package/dist/AuthKernel.d.ts +3 -0
  14. package/dist/AuthKernel.d.ts.map +1 -0
  15. package/dist/AuthKernel.js +9 -0
  16. package/dist/AuthKernel.js.map +1 -0
  17. package/dist/Challenge.d.ts +19 -3
  18. package/dist/Challenge.d.ts.map +1 -1
  19. package/dist/Challenge.js +157 -1
  20. package/dist/Challenge.js.map +1 -1
  21. package/dist/Client.d.ts +36 -0
  22. package/dist/Client.d.ts.map +1 -0
  23. package/dist/Client.js +55 -0
  24. package/dist/Client.js.map +1 -0
  25. package/dist/Crypto.d.ts +6 -1
  26. package/dist/Crypto.d.ts.map +1 -1
  27. package/dist/Crypto.js +62 -1
  28. package/dist/Crypto.js.map +1 -1
  29. package/dist/D1Kysely.d.ts +6 -3
  30. package/dist/D1Kysely.d.ts.map +1 -1
  31. package/dist/D1Kysely.js +8 -5
  32. package/dist/D1Kysely.js.map +1 -1
  33. package/dist/EffectQbSqliteStorage.d.ts +183 -0
  34. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  35. package/dist/EffectQbSqliteStorage.js +446 -0
  36. package/dist/EffectQbSqliteStorage.js.map +1 -0
  37. package/dist/EmailOtp.d.ts +117 -0
  38. package/dist/EmailOtp.d.ts.map +1 -0
  39. package/dist/EmailOtp.js +279 -0
  40. package/dist/EmailOtp.js.map +1 -0
  41. package/dist/EmailVerification.d.ts +121 -0
  42. package/dist/EmailVerification.d.ts.map +1 -0
  43. package/dist/EmailVerification.js +201 -0
  44. package/dist/EmailVerification.js.map +1 -0
  45. package/dist/HttpApi/Api.d.ts +175 -0
  46. package/dist/HttpApi/Api.d.ts.map +1 -0
  47. package/dist/HttpApi/Api.js +340 -0
  48. package/dist/HttpApi/Api.js.map +1 -0
  49. package/dist/HttpApi/Endpoints.d.ts +92 -0
  50. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  51. package/dist/HttpApi/Endpoints.js +48 -0
  52. package/dist/HttpApi/Endpoints.js.map +1 -0
  53. package/dist/HttpApi/Errors.d.ts +82 -0
  54. package/dist/HttpApi/Errors.d.ts.map +1 -0
  55. package/dist/HttpApi/Errors.js +184 -0
  56. package/dist/HttpApi/Errors.js.map +1 -0
  57. package/dist/HttpApi/Schemas.d.ts +86 -0
  58. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  59. package/dist/HttpApi/Schemas.js +63 -0
  60. package/dist/HttpApi/Schemas.js.map +1 -0
  61. package/dist/HttpApi/Security.d.ts +147 -0
  62. package/dist/HttpApi/Security.d.ts.map +1 -0
  63. package/dist/HttpApi/Security.js +439 -0
  64. package/dist/HttpApi/Security.js.map +1 -0
  65. package/dist/HttpApi/Transport.d.ts +31 -0
  66. package/dist/HttpApi/Transport.d.ts.map +1 -0
  67. package/dist/HttpApi/Transport.js +169 -0
  68. package/dist/HttpApi/Transport.js.map +1 -0
  69. package/dist/HttpApi/index.d.ts +8 -0
  70. package/dist/HttpApi/index.d.ts.map +1 -0
  71. package/dist/HttpApi/index.js +7 -0
  72. package/dist/HttpApi/index.js.map +1 -0
  73. package/dist/HttpApi.d.ts +2 -0
  74. package/dist/HttpApi.d.ts.map +1 -0
  75. package/dist/HttpApi.js +2 -0
  76. package/dist/HttpApi.js.map +1 -0
  77. package/dist/Identifiers.d.ts.map +1 -1
  78. package/dist/Identifiers.js.map +1 -1
  79. package/dist/Internal.d.ts +7 -0
  80. package/dist/Internal.d.ts.map +1 -0
  81. package/dist/Internal.js +12 -0
  82. package/dist/Internal.js.map +1 -0
  83. package/dist/KyselyStorage.d.ts +28 -2
  84. package/dist/KyselyStorage.d.ts.map +1 -1
  85. package/dist/KyselyStorage.js +223 -33
  86. package/dist/KyselyStorage.js.map +1 -1
  87. package/dist/Mailer.d.ts +116 -0
  88. package/dist/Mailer.d.ts.map +1 -0
  89. package/dist/Mailer.js +101 -0
  90. package/dist/Mailer.js.map +1 -0
  91. package/dist/Password.d.ts +107 -0
  92. package/dist/Password.d.ts.map +1 -0
  93. package/dist/Password.js +252 -0
  94. package/dist/Password.js.map +1 -0
  95. package/dist/Policy.d.ts +7 -4
  96. package/dist/Policy.d.ts.map +1 -1
  97. package/dist/Policy.js +28 -5
  98. package/dist/Policy.js.map +1 -1
  99. package/dist/Privacy.d.ts +15 -0
  100. package/dist/Privacy.d.ts.map +1 -1
  101. package/dist/Privacy.js +58 -1
  102. package/dist/Privacy.js.map +1 -1
  103. package/dist/RateLimiter.d.ts +104 -0
  104. package/dist/RateLimiter.d.ts.map +1 -0
  105. package/dist/RateLimiter.js +118 -0
  106. package/dist/RateLimiter.js.map +1 -0
  107. package/dist/Sessions.d.ts +73 -11
  108. package/dist/Sessions.d.ts.map +1 -1
  109. package/dist/Sessions.js +412 -1
  110. package/dist/Sessions.js.map +1 -1
  111. package/dist/Storage.d.ts +60 -5
  112. package/dist/Storage.d.ts.map +1 -1
  113. package/dist/Storage.js +11 -1
  114. package/dist/Storage.js.map +1 -1
  115. package/dist/StorageMigrations.d.ts +2 -1
  116. package/dist/StorageMigrations.d.ts.map +1 -1
  117. package/dist/StorageMigrations.js +33 -2
  118. package/dist/StorageMigrations.js.map +1 -1
  119. package/dist/Testing.d.ts +9 -1
  120. package/dist/Testing.d.ts.map +1 -1
  121. package/dist/Testing.js +30 -2
  122. package/dist/Testing.js.map +1 -1
  123. package/dist/WaitUntil.d.ts.map +1 -1
  124. package/dist/WaitUntil.js +1 -1
  125. package/dist/WaitUntil.js.map +1 -1
  126. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  127. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  128. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  129. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  130. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  131. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  132. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  133. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  134. package/dist/index.d.ts +6 -0
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +6 -0
  137. package/dist/index.js.map +1 -1
  138. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  139. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  140. package/dist/internal/RateLimitDurableObject.js +80 -0
  141. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  142. package/migrations/0002_auth_password.sql +25 -0
  143. package/package.json +76 -20
@@ -1 +1 @@
1
- {"version":3,"file":"Privacy.js","sourceRoot":"","sources":["../src/Privacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAKnE,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAI/D;CAAG;AAQL,MAAM,OAAO,OAAQ,SAAQ,OAAO,CAAC,OAAO,EAA2B,CAAC,cAAc,CAAC;CAAG;AAE1F,WAAiB,OAAO;IACT,YAAI,GAAG,CAAC,OAAuB,EAAkB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACtF,CAAC,EAFgB,OAAO,KAAP,OAAO,QAEvB;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACjE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvD,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;CAC5F,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Privacy.js","sourceRoot":"","sources":["../src/Privacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { Duration } from "effect";
2
+ import { Brand, Context, Effect, Layer } from "effect";
3
+ import { RateLimiter as PersistenceRateLimiter } from "effect/unstable/persistence";
4
+ import type { EmailHash, IpHash, UserAgentHash } from "./Identifiers.js";
5
+ export type RateLimitAlgorithm = "fixed-window" | "token-bucket";
6
+ export type RateLimitPolicyId = Brand.Branded<string, "auth/RateLimitPolicyId">;
7
+ export type RateLimitKey = Brand.Branded<string, "auth/RateLimitKey">;
8
+ export type RateLimitKeyKind = string;
9
+ export declare const RateLimitKey: {
10
+ readonly global: RateLimitKey;
11
+ readonly emailHash: (emailHash: EmailHash) => RateLimitKey;
12
+ readonly ipHash: (ipHash: IpHash) => RateLimitKey;
13
+ readonly userAgentHash: (userAgentHash: UserAgentHash) => RateLimitKey;
14
+ readonly customHash: (kind: RateLimitKeyKind, hash: string) => RateLimitKey;
15
+ readonly combine: (kind: RateLimitKeyKind, first: RateLimitKey, ...rest: readonly RateLimitKey[]) => RateLimitKey;
16
+ };
17
+ export interface RateLimitRule {
18
+ readonly id: RateLimitPolicyId;
19
+ readonly key: RateLimitKey;
20
+ readonly algorithm: RateLimitAlgorithm;
21
+ readonly window: Duration.Duration;
22
+ readonly limit: number;
23
+ readonly tokens?: number;
24
+ }
25
+ export interface RateLimitPolicy {
26
+ readonly rules: readonly RateLimitRule[];
27
+ }
28
+ interface RateLimitRuleInput {
29
+ readonly id: string;
30
+ readonly key: RateLimitKey;
31
+ readonly window: Duration.Duration;
32
+ readonly limit: number;
33
+ readonly tokens?: number;
34
+ }
35
+ interface RateLimitByInput {
36
+ readonly id: string;
37
+ readonly by: RateLimitKey;
38
+ readonly window: Duration.Duration;
39
+ readonly limit: number;
40
+ readonly tokens?: number;
41
+ }
42
+ export declare const RateLimitPolicy: {
43
+ readonly fixedWindow: (input: RateLimitRuleInput) => RateLimitPolicy;
44
+ readonly fixedWindowBy: (input: RateLimitByInput) => RateLimitPolicy;
45
+ readonly tokenBucket: (input: RateLimitRuleInput) => RateLimitPolicy;
46
+ readonly tokenBucketBy: (input: RateLimitByInput) => RateLimitPolicy;
47
+ readonly all: (...policies: readonly RateLimitPolicy[]) => RateLimitPolicy;
48
+ };
49
+ export interface RateLimitConsumeResult {
50
+ readonly policyId: RateLimitPolicyId;
51
+ readonly limit: number;
52
+ readonly remaining: number;
53
+ readonly resetAfter: Duration.Duration;
54
+ }
55
+ export type RateLimitDecision = {
56
+ readonly type: "allowed";
57
+ readonly results: readonly RateLimitConsumeResult[];
58
+ } | {
59
+ readonly type: "denied";
60
+ readonly policyId: RateLimitPolicyId;
61
+ readonly retryAfter: Duration.Duration;
62
+ readonly limit: number;
63
+ readonly remaining: number;
64
+ };
65
+ declare const RateLimitExceededError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
66
+ readonly _tag: "RateLimitExceededError";
67
+ } & Readonly<A>;
68
+ export declare class RateLimitExceededError extends RateLimitExceededError_base<{
69
+ readonly policyId: RateLimitPolicyId;
70
+ readonly retryAfter: Duration.Duration;
71
+ readonly limit: number;
72
+ readonly remaining: number;
73
+ }> {
74
+ }
75
+ declare const RateLimitStoreError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
76
+ readonly _tag: "RateLimitStoreError";
77
+ } & Readonly<A>;
78
+ export declare class RateLimitStoreError extends RateLimitStoreError_base<{
79
+ readonly message: string;
80
+ readonly cause?: unknown;
81
+ }> {
82
+ }
83
+ export type RateLimitError = RateLimitExceededError | RateLimitStoreError;
84
+ export interface RateLimiterService {
85
+ readonly consume: (policy: RateLimitPolicy) => Effect.Effect<RateLimitDecision, RateLimitStoreError>;
86
+ readonly require: (policy: RateLimitPolicy) => Effect.Effect<void, RateLimitError>;
87
+ }
88
+ declare const RateLimiter_base: Context.ServiceClass<RateLimiter, "auth/RateLimiter", RateLimiterService>;
89
+ export declare class RateLimiter extends RateLimiter_base {
90
+ }
91
+ export declare namespace RateLimiter {
92
+ const make: (service: RateLimiterService) => RateLimiterService;
93
+ }
94
+ export interface RateLimiterDependencies {
95
+ readonly limiter: PersistenceRateLimiter.RateLimiter;
96
+ }
97
+ export declare const makeRateLimiter: (dependencies: RateLimiterDependencies) => RateLimiterService;
98
+ export declare const consume: (policy: RateLimitPolicy) => Effect.Effect<RateLimitDecision, RateLimitStoreError, RateLimiter>;
99
+ export declare const require: (policy: RateLimitPolicy) => Effect.Effect<void, RateLimitError, RateLimiter>;
100
+ export declare const withRateLimit: (policy: RateLimitPolicy) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | RateLimitError, R | RateLimiter>;
101
+ export declare const RateLimiterLive: Layer.Layer<RateLimiter, never, PersistenceRateLimiter.RateLimiter>;
102
+ export declare const RateLimiterMemoryLive: Layer.Layer<RateLimiter>;
103
+ export {};
104
+ //# sourceMappingURL=RateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../src/RateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { Brand, Context, Data, Effect, Layer } from "effect";
2
+ import { RateLimiter as PersistenceRateLimiter } from "effect/unstable/persistence";
3
+ const makeRateLimitPolicyId = Brand.nominal();
4
+ const makeRateLimitKey = Brand.nominal();
5
+ const encodeKeySegment = (value) => encodeURIComponent(value);
6
+ const rateLimitKey = (...segments) => makeRateLimitKey(segments.map(encodeKeySegment).join(":"));
7
+ const combineRateLimitKey = (kind, first, ...rest) => makeRateLimitKey([encodeKeySegment(kind), first, ...rest].join(":"));
8
+ export const RateLimitKey = {
9
+ global: rateLimitKey("global"),
10
+ emailHash: (emailHash) => rateLimitKey("email", emailHash),
11
+ ipHash: (ipHash) => rateLimitKey("ip", ipHash),
12
+ userAgentHash: (userAgentHash) => rateLimitKey("user-agent", userAgentHash),
13
+ customHash: (kind, hash) => rateLimitKey(kind, hash),
14
+ combine: combineRateLimitKey,
15
+ };
16
+ const makePolicy = (rule) => ({
17
+ rules: [rule],
18
+ });
19
+ const byInputToRuleInput = (input) => ({
20
+ id: input.id,
21
+ key: input.by,
22
+ limit: input.limit,
23
+ tokens: input.tokens,
24
+ window: input.window,
25
+ });
26
+ export const RateLimitPolicy = {
27
+ fixedWindow: (input) => makePolicy({
28
+ ...input,
29
+ id: makeRateLimitPolicyId(input.id),
30
+ algorithm: "fixed-window",
31
+ }),
32
+ fixedWindowBy: (input) => RateLimitPolicy.fixedWindow(byInputToRuleInput(input)),
33
+ tokenBucket: (input) => makePolicy({
34
+ ...input,
35
+ id: makeRateLimitPolicyId(input.id),
36
+ algorithm: "token-bucket",
37
+ }),
38
+ tokenBucketBy: (input) => RateLimitPolicy.tokenBucket(byInputToRuleInput(input)),
39
+ all: (...policies) => ({
40
+ rules: policies.flatMap((policy) => policy.rules),
41
+ }),
42
+ };
43
+ export class RateLimitExceededError extends Data.TaggedError("RateLimitExceededError") {
44
+ }
45
+ export class RateLimitStoreError extends Data.TaggedError("RateLimitStoreError") {
46
+ }
47
+ export class RateLimiter extends Context.Service()("auth/RateLimiter") {
48
+ }
49
+ (function (RateLimiter) {
50
+ RateLimiter.make = (service) => RateLimiter.of(service);
51
+ })(RateLimiter || (RateLimiter = {}));
52
+ const storageKey = (rule) => `${rule.id}:${rule.key}`;
53
+ const storeError = (cause) => new RateLimitStoreError({
54
+ message: "Failed to consume rate limit",
55
+ cause,
56
+ });
57
+ const deniedDecision = (rule, reason) => ({
58
+ type: "denied",
59
+ policyId: rule.id,
60
+ retryAfter: reason.retryAfter,
61
+ limit: reason.limit,
62
+ remaining: reason.remaining,
63
+ });
64
+ export const makeRateLimiter = (dependencies) => {
65
+ const consumePolicy = Effect.fn("auth.rate_limiter.consume")(function* (policy) {
66
+ const results = [];
67
+ for (const rule of policy.rules) {
68
+ const ruleResult = yield* dependencies.limiter
69
+ .consume({
70
+ algorithm: rule.algorithm,
71
+ key: storageKey(rule),
72
+ limit: rule.limit,
73
+ onExceeded: "fail",
74
+ tokens: rule.tokens,
75
+ window: rule.window,
76
+ })
77
+ .pipe(Effect.matchEffect({
78
+ onSuccess: (result) => Effect.succeed({ type: "allowed", result }),
79
+ onFailure: (error) => error.reason._tag === "RateLimitExceeded"
80
+ ? Effect.succeed(deniedDecision(rule, error.reason))
81
+ : Effect.fail(storeError(error)),
82
+ }));
83
+ if (ruleResult.type === "denied") {
84
+ return ruleResult;
85
+ }
86
+ results.push({
87
+ policyId: rule.id,
88
+ limit: ruleResult.result.limit,
89
+ remaining: ruleResult.result.remaining,
90
+ resetAfter: ruleResult.result.resetAfter,
91
+ });
92
+ }
93
+ return { type: "allowed", results };
94
+ });
95
+ return RateLimiter.make({
96
+ consume: consumePolicy,
97
+ require: Effect.fn("auth.rate_limiter.require")(function* (policy) {
98
+ const decision = yield* consumePolicy(policy);
99
+ if (decision.type === "denied") {
100
+ return yield* new RateLimitExceededError({
101
+ policyId: decision.policyId,
102
+ retryAfter: decision.retryAfter,
103
+ limit: decision.limit,
104
+ remaining: decision.remaining,
105
+ });
106
+ }
107
+ }),
108
+ });
109
+ };
110
+ export const consume = (policy) => RateLimiter.use((rateLimiter) => rateLimiter.consume(policy));
111
+ export const require = (policy) => RateLimiter.use((rateLimiter) => rateLimiter.require(policy));
112
+ export const withRateLimit = (policy) => (effect) => Effect.flatMap(require(policy), () => effect);
113
+ export const RateLimiterLive = Layer.effect(RateLimiter, Effect.gen(function* () {
114
+ const limiter = yield* PersistenceRateLimiter.RateLimiter;
115
+ return makeRateLimiter({ limiter });
116
+ }));
117
+ export const RateLimiterMemoryLive = RateLimiterLive.pipe(Layer.provide(PersistenceRateLimiter.layer), Layer.provide(PersistenceRateLimiter.layerStoreMemory));
118
+ //# sourceMappingURL=RateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../src/RateLimiter.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,31 @@
1
- import { Context, Effect } from "effect";
2
- import type * as Option from "effect/Option";
3
- import type { SessionId, SessionToken, UnixMillis, UserId } from "./Identifiers.js";
1
+ import { Context, Duration, Effect, Layer } from "effect";
2
+ import type * as OptionTypes from "effect/Option";
3
+ import { AuthSecrets } from "./AuthConfig.js";
4
+ import { Crypto } from "./Crypto.js";
5
+ import type { CryptoKey, CryptoService } from "./Crypto.js";
6
+ import { SessionId, SessionToken, UnixMillis } from "./Identifiers.js";
7
+ import type { UserId } from "./Identifiers.js";
8
+ import { SessionStore } from "./Storage.js";
9
+ import type { SessionStoreService } from "./Storage.js";
4
10
  export type AuthAssuranceLevel = "aal1" | "aal2" | "aal3";
5
11
  export type AuthMethodReference = "pwd" | "otp" | "email" | "magic_link" | "passkey" | "oauth" | "totp" | "backup_code" | (string & {});
12
+ export type SessionRequirement = "email_verification" | (string & {});
13
+ export interface SessionClaims {
14
+ readonly emailVerified?: boolean;
15
+ readonly requirements?: readonly SessionRequirement[];
16
+ }
6
17
  export interface SessionTtlPolicy {
7
- readonly idleTtlMillis: number;
8
- readonly absoluteTtlMillis: number;
9
- readonly refreshAfterMillis: number;
18
+ readonly idleTtl: Duration.Duration;
19
+ readonly absoluteTtl: Duration.Duration;
20
+ readonly refreshAfter: Duration.Duration;
10
21
  }
22
+ export declare const defaultSessionTtlPolicy: SessionTtlPolicy;
11
23
  export interface SessionCreateInput {
12
24
  readonly userId: UserId;
13
25
  readonly method: string;
14
- readonly amr: ReadonlyArray<AuthMethodReference>;
26
+ readonly amr: readonly AuthMethodReference[];
15
27
  readonly aal: AuthAssuranceLevel;
28
+ readonly claims?: SessionClaims;
16
29
  readonly now?: UnixMillis;
17
30
  readonly ttl?: SessionTtlPolicy;
18
31
  readonly metadata?: Readonly<Record<string, unknown>>;
@@ -24,7 +37,8 @@ export interface IssuedSession {
24
37
  readonly authTime: UnixMillis;
25
38
  readonly expiresAt: UnixMillis;
26
39
  readonly aal: AuthAssuranceLevel;
27
- readonly amr: ReadonlyArray<AuthMethodReference>;
40
+ readonly amr: readonly AuthMethodReference[];
41
+ readonly claims?: SessionClaims;
28
42
  }
29
43
  export interface CurrentSessionShape {
30
44
  readonly sessionId: SessionId;
@@ -32,7 +46,8 @@ export interface CurrentSessionShape {
32
46
  readonly authTime: UnixMillis;
33
47
  readonly expiresAt: UnixMillis;
34
48
  readonly aal: AuthAssuranceLevel;
35
- readonly amr: ReadonlyArray<AuthMethodReference>;
49
+ readonly amr: readonly AuthMethodReference[];
50
+ readonly claims?: SessionClaims;
36
51
  }
37
52
  export interface CurrentActorShape {
38
53
  readonly userId: UserId;
@@ -47,6 +62,11 @@ export interface SessionRotateInput {
47
62
  readonly sessionId: SessionId;
48
63
  readonly reason: string;
49
64
  }
65
+ export interface SessionUpdateClaimsInput {
66
+ readonly sessionId: SessionId;
67
+ readonly claims: SessionClaims;
68
+ readonly reason?: string;
69
+ }
50
70
  export interface SessionRevokeInput {
51
71
  readonly sessionId: SessionId;
52
72
  readonly reason: string;
@@ -83,6 +103,14 @@ export declare class SessionRotateError extends SessionRotateError_base<{
83
103
  readonly cause?: unknown;
84
104
  }> {
85
105
  }
106
+ declare const SessionUpdateClaimsError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
107
+ readonly _tag: "SessionUpdateClaimsError";
108
+ } & Readonly<A>;
109
+ export declare class SessionUpdateClaimsError extends SessionUpdateClaimsError_base<{
110
+ readonly message: string;
111
+ readonly cause?: unknown;
112
+ }> {
113
+ }
86
114
  declare const SessionRevokeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
87
115
  readonly _tag: "SessionRevokeError";
88
116
  } & Readonly<A>;
@@ -91,12 +119,13 @@ export declare class SessionRevokeError extends SessionRevokeError_base<{
91
119
  readonly cause?: unknown;
92
120
  }> {
93
121
  }
94
- export type SessionError = SessionCreateError | SessionValidateError | SessionRefreshError | SessionRotateError | SessionRevokeError;
122
+ export type SessionError = SessionCreateError | SessionValidateError | SessionRefreshError | SessionRotateError | SessionUpdateClaimsError | SessionRevokeError;
95
123
  export interface SessionsService {
96
124
  readonly create: (input: SessionCreateInput) => Effect.Effect<IssuedSession, SessionCreateError>;
97
125
  readonly validate: (token: SessionToken) => Effect.Effect<ValidatedSession, SessionValidateError>;
98
126
  readonly refresh: (token: SessionToken) => Effect.Effect<IssuedSession, SessionRefreshError>;
99
127
  readonly rotate: (input: SessionRotateInput) => Effect.Effect<IssuedSession, SessionRotateError>;
128
+ readonly updateClaims: (input: SessionUpdateClaimsInput) => Effect.Effect<CurrentSessionShape, SessionUpdateClaimsError>;
100
129
  readonly revoke: (input: SessionRevokeInput) => Effect.Effect<void, SessionRevokeError>;
101
130
  readonly revokeAllForUser: (userId: UserId) => Effect.Effect<void, SessionRevokeError>;
102
131
  }
@@ -106,8 +135,21 @@ export declare class Sessions extends Sessions_base {
106
135
  export declare namespace Sessions {
107
136
  const make: (service: SessionsService) => SessionsService;
108
137
  }
138
+ export interface SessionsOptions {
139
+ readonly secret: CryptoKey;
140
+ readonly ttl?: SessionTtlPolicy;
141
+ readonly sessionIdBytes?: number;
142
+ readonly sessionSecretBytes?: number;
143
+ }
144
+ export interface SessionsDependencies extends SessionsOptions {
145
+ readonly crypto: CryptoService;
146
+ readonly sessionStore: SessionStoreService;
147
+ }
148
+ export declare const makeSessions: (dependencies: SessionsDependencies) => SessionsService;
149
+ export declare function SessionsLive(options: SessionsOptions): Layer.Layer<Sessions, never, Crypto | SessionStore>;
150
+ export declare function SessionsLive(): Layer.Layer<Sessions, never, Crypto | SessionStore | AuthSecrets>;
109
151
  export interface SessionCookieService {
110
- readonly read: (request: Request) => Effect.Effect<Option.Option<SessionToken>, SessionValidateError>;
152
+ readonly read: (request: Request) => Effect.Effect<OptionTypes.Option<SessionToken>, SessionValidateError>;
111
153
  readonly commit: (issued: IssuedSession) => Effect.Effect<string, SessionCreateError>;
112
154
  readonly clear: Effect.Effect<string, SessionRevokeError>;
113
155
  }
@@ -117,6 +159,26 @@ export declare class SessionCookie extends SessionCookie_base {
117
159
  export declare namespace SessionCookie {
118
160
  const make: (service: SessionCookieService) => SessionCookieService;
119
161
  }
162
+ export type SessionCookieSameSite = "lax" | "strict" | "none";
163
+ export interface SessionCookieOptions {
164
+ readonly name?: string;
165
+ readonly secure?: boolean;
166
+ readonly httpOnly?: boolean;
167
+ readonly sameSite?: SessionCookieSameSite;
168
+ readonly path?: string;
169
+ readonly domain?: string;
170
+ }
171
+ export interface ResolvedSessionCookieOptions {
172
+ readonly name: string;
173
+ readonly secure: boolean;
174
+ readonly httpOnly: boolean;
175
+ readonly sameSite: SessionCookieSameSite;
176
+ readonly path: string;
177
+ readonly domain?: string;
178
+ }
179
+ export declare const defaultSessionCookieOptions: ResolvedSessionCookieOptions;
180
+ export declare const makeSessionCookie: (options?: SessionCookieOptions) => SessionCookieService;
181
+ export declare const SessionCookieLive: (options?: SessionCookieOptions) => Layer.Layer<SessionCookie, never, never>;
120
182
  declare const CurrentSession_base: Context.ServiceClass<CurrentSession, "auth/CurrentSession", CurrentSessionShape>;
121
183
  export declare class CurrentSession extends CurrentSession_base {
122
184
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"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"}