@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.
- package/README.md +622 -61
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +1 -1
- package/dist/AuditLog.js.map +1 -1
- package/dist/AuthConfig.d.ts +51 -0
- package/dist/AuthConfig.d.ts.map +1 -0
- package/dist/AuthConfig.js +56 -0
- package/dist/AuthConfig.js.map +1 -0
- package/dist/AuthFlow.d.ts +292 -35
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +130 -6
- package/dist/AuthFlow.js.map +1 -1
- package/dist/AuthKernel.d.ts +3 -0
- package/dist/AuthKernel.d.ts.map +1 -0
- package/dist/AuthKernel.js +9 -0
- package/dist/AuthKernel.js.map +1 -0
- package/dist/Challenge.d.ts +19 -3
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +157 -1
- package/dist/Challenge.js.map +1 -1
- package/dist/Client.d.ts +36 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +55 -0
- package/dist/Client.js.map +1 -0
- package/dist/Crypto.d.ts +6 -1
- package/dist/Crypto.d.ts.map +1 -1
- package/dist/Crypto.js +62 -1
- package/dist/Crypto.js.map +1 -1
- package/dist/D1Kysely.d.ts +6 -3
- package/dist/D1Kysely.d.ts.map +1 -1
- package/dist/D1Kysely.js +8 -5
- package/dist/D1Kysely.js.map +1 -1
- package/dist/EffectQbSqliteStorage.d.ts +183 -0
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
- package/dist/EffectQbSqliteStorage.js +446 -0
- package/dist/EffectQbSqliteStorage.js.map +1 -0
- package/dist/EmailOtp.d.ts +117 -0
- package/dist/EmailOtp.d.ts.map +1 -0
- package/dist/EmailOtp.js +279 -0
- package/dist/EmailOtp.js.map +1 -0
- package/dist/EmailVerification.d.ts +121 -0
- package/dist/EmailVerification.d.ts.map +1 -0
- package/dist/EmailVerification.js +201 -0
- package/dist/EmailVerification.js.map +1 -0
- package/dist/HttpApi/Api.d.ts +175 -0
- package/dist/HttpApi/Api.d.ts.map +1 -0
- package/dist/HttpApi/Api.js +340 -0
- package/dist/HttpApi/Api.js.map +1 -0
- package/dist/HttpApi/Endpoints.d.ts +92 -0
- package/dist/HttpApi/Endpoints.d.ts.map +1 -0
- package/dist/HttpApi/Endpoints.js +48 -0
- package/dist/HttpApi/Endpoints.js.map +1 -0
- package/dist/HttpApi/Errors.d.ts +82 -0
- package/dist/HttpApi/Errors.d.ts.map +1 -0
- package/dist/HttpApi/Errors.js +184 -0
- package/dist/HttpApi/Errors.js.map +1 -0
- package/dist/HttpApi/Schemas.d.ts +86 -0
- package/dist/HttpApi/Schemas.d.ts.map +1 -0
- package/dist/HttpApi/Schemas.js +63 -0
- package/dist/HttpApi/Schemas.js.map +1 -0
- package/dist/HttpApi/Security.d.ts +147 -0
- package/dist/HttpApi/Security.d.ts.map +1 -0
- package/dist/HttpApi/Security.js +439 -0
- package/dist/HttpApi/Security.js.map +1 -0
- package/dist/HttpApi/Transport.d.ts +31 -0
- package/dist/HttpApi/Transport.d.ts.map +1 -0
- package/dist/HttpApi/Transport.js +169 -0
- package/dist/HttpApi/Transport.js.map +1 -0
- package/dist/HttpApi/index.d.ts +8 -0
- package/dist/HttpApi/index.d.ts.map +1 -0
- package/dist/HttpApi/index.js +7 -0
- package/dist/HttpApi/index.js.map +1 -0
- package/dist/HttpApi.d.ts +2 -0
- package/dist/HttpApi.d.ts.map +1 -0
- package/dist/HttpApi.js +2 -0
- package/dist/HttpApi.js.map +1 -0
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js.map +1 -1
- package/dist/Internal.d.ts +7 -0
- package/dist/Internal.d.ts.map +1 -0
- package/dist/Internal.js +12 -0
- package/dist/Internal.js.map +1 -0
- package/dist/KyselyStorage.d.ts +28 -2
- package/dist/KyselyStorage.d.ts.map +1 -1
- package/dist/KyselyStorage.js +223 -33
- package/dist/KyselyStorage.js.map +1 -1
- package/dist/Mailer.d.ts +116 -0
- package/dist/Mailer.d.ts.map +1 -0
- package/dist/Mailer.js +101 -0
- package/dist/Mailer.js.map +1 -0
- package/dist/Password.d.ts +107 -0
- package/dist/Password.d.ts.map +1 -0
- package/dist/Password.js +252 -0
- package/dist/Password.js.map +1 -0
- package/dist/Policy.d.ts +7 -4
- package/dist/Policy.d.ts.map +1 -1
- package/dist/Policy.js +28 -5
- package/dist/Policy.js.map +1 -1
- package/dist/Privacy.d.ts +15 -0
- package/dist/Privacy.d.ts.map +1 -1
- package/dist/Privacy.js +58 -1
- package/dist/Privacy.js.map +1 -1
- package/dist/RateLimiter.d.ts +104 -0
- package/dist/RateLimiter.d.ts.map +1 -0
- package/dist/RateLimiter.js +118 -0
- package/dist/RateLimiter.js.map +1 -0
- package/dist/Sessions.d.ts +73 -11
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +412 -1
- package/dist/Sessions.js.map +1 -1
- package/dist/Storage.d.ts +60 -5
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js +11 -1
- package/dist/Storage.js.map +1 -1
- package/dist/StorageMigrations.d.ts +2 -1
- package/dist/StorageMigrations.d.ts.map +1 -1
- package/dist/StorageMigrations.js +33 -2
- package/dist/StorageMigrations.js.map +1 -1
- package/dist/Testing.d.ts +9 -1
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js +30 -2
- package/dist/Testing.js.map +1 -1
- package/dist/WaitUntil.d.ts.map +1 -1
- package/dist/WaitUntil.js +1 -1
- package/dist/WaitUntil.js.map +1 -1
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
- package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
- package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/cloudflare/RateLimitDurableObject.js +51 -0
- package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/RateLimitDurableObject.d.ts +32 -0
- package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/internal/RateLimitDurableObject.js +80 -0
- package/dist/internal/RateLimitDurableObject.js.map +1 -0
- package/migrations/0002_auth_password.sql +25 -0
- package/package.json +76 -20
package/dist/Privacy.js.map
CHANGED
|
@@ -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,
|
|
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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"}
|
package/dist/Sessions.d.ts
CHANGED
|
@@ -1,18 +1,31 @@
|
|
|
1
|
-
import { Context, Effect } from "effect";
|
|
2
|
-
import type * as
|
|
3
|
-
import
|
|
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
|
|
8
|
-
readonly
|
|
9
|
-
readonly
|
|
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:
|
|
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:
|
|
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:
|
|
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<
|
|
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
|
}
|
package/dist/Sessions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"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"}
|