@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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Context, Duration, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpServerRequest } from "effect/unstable/http";
|
|
3
|
+
import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
4
|
+
import type { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi";
|
|
5
|
+
import type { EmailVerificationIssueInput } from "../EmailVerification.js";
|
|
6
|
+
import type { IpAddress } from "../Identifiers.js";
|
|
7
|
+
import type { PasswordSignInInput, PasswordSignUpInput } from "../Password.js";
|
|
8
|
+
import { Privacy } from "../Privacy.js";
|
|
9
|
+
import type { PrivacyError } from "../Privacy.js";
|
|
10
|
+
import { RateLimiter } from "../RateLimiter.js";
|
|
11
|
+
import type { RateLimitError, RateLimitPolicy as RateLimitPolicyShape } from "../RateLimiter.js";
|
|
12
|
+
import { AuthInternalError, AuthRateLimitedError, AuthRequestRejectedError } from "./Errors.js";
|
|
13
|
+
export interface AuthOriginCheckOptions {
|
|
14
|
+
readonly allowedOrigins?: string | readonly string[];
|
|
15
|
+
readonly allowMissingOrigin?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface AuthCsrfOptions {
|
|
18
|
+
readonly cookieName?: string;
|
|
19
|
+
readonly headerName?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AuthRequestMetadataOptions {
|
|
22
|
+
readonly trustProxyHeaders?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface AuthRequestMetadataShape {
|
|
25
|
+
readonly method: string;
|
|
26
|
+
readonly url: string;
|
|
27
|
+
readonly ipAddress?: IpAddress;
|
|
28
|
+
readonly userAgent?: string;
|
|
29
|
+
readonly origin?: string;
|
|
30
|
+
readonly referer?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface AuthRateLimitPolicyInput {
|
|
33
|
+
readonly metadata: AuthRequestMetadataShape;
|
|
34
|
+
readonly endpoint: HttpApiEndpoint.Any;
|
|
35
|
+
readonly group: HttpApiGroup.Any;
|
|
36
|
+
}
|
|
37
|
+
export type AuthRateLimitPolicy = (input: AuthRateLimitPolicyInput) => Effect.Effect<RateLimitPolicyShape | undefined, PrivacyError, Privacy>;
|
|
38
|
+
export interface AuthRateLimitByIpOptions {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly window: Duration.Duration;
|
|
41
|
+
readonly limit: number;
|
|
42
|
+
readonly tokens?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface AuthApiRateLimitRuleOptions {
|
|
45
|
+
readonly window?: Duration.Duration;
|
|
46
|
+
readonly limit?: number;
|
|
47
|
+
readonly tokens?: number;
|
|
48
|
+
}
|
|
49
|
+
export type AuthApiRateLimitRuleConfig = AuthApiRateLimitRuleOptions | boolean;
|
|
50
|
+
export interface AuthApiEndpointRateLimitOptions {
|
|
51
|
+
readonly byIp?: AuthApiRateLimitRuleConfig;
|
|
52
|
+
readonly byEmail?: AuthApiRateLimitRuleConfig;
|
|
53
|
+
}
|
|
54
|
+
export type AuthApiEndpointRateLimitConfig = AuthApiEndpointRateLimitOptions | boolean;
|
|
55
|
+
export interface AuthApiRateLimitOptions {
|
|
56
|
+
readonly trustProxyHeaders?: boolean;
|
|
57
|
+
readonly passwordSignIn?: AuthApiEndpointRateLimitConfig;
|
|
58
|
+
readonly passwordSignUp?: AuthApiEndpointRateLimitConfig;
|
|
59
|
+
readonly emailVerificationStart?: AuthApiEndpointRateLimitConfig;
|
|
60
|
+
}
|
|
61
|
+
export type AuthApiRateLimitConfigValue = AuthApiRateLimitOptions | boolean;
|
|
62
|
+
export interface AuthHttpApiConfigValue {
|
|
63
|
+
readonly rateLimit?: AuthApiRateLimitConfigValue;
|
|
64
|
+
readonly originCheck?: AuthOriginCheckOptions;
|
|
65
|
+
}
|
|
66
|
+
export type AuthRateLimitEndpointKey = `${string}.${string}`;
|
|
67
|
+
export type AuthRateLimitEndpointPolicyMap = Readonly<Record<AuthRateLimitEndpointKey, AuthRateLimitPolicy | undefined>>;
|
|
68
|
+
export interface AuthApiRateLimitService {
|
|
69
|
+
readonly request: (input: AuthRateLimitPolicyInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
70
|
+
readonly passwordSignIn: (input: PasswordSignInInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
71
|
+
readonly passwordSignUp: (input: PasswordSignUpInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
72
|
+
readonly emailVerificationStart: (input: EmailVerificationIssueInput) => Effect.Effect<void, RateLimitError | PrivacyError>;
|
|
73
|
+
}
|
|
74
|
+
declare const AuthApiRateLimit_base: Context.ServiceClass<AuthApiRateLimit, "auth/AuthApiRateLimit", AuthApiRateLimitService>;
|
|
75
|
+
export declare class AuthApiRateLimit extends AuthApiRateLimit_base {
|
|
76
|
+
}
|
|
77
|
+
export declare namespace AuthApiRateLimit {
|
|
78
|
+
const make: (service: AuthApiRateLimitService) => AuthApiRateLimitService;
|
|
79
|
+
}
|
|
80
|
+
declare const AuthHttpApiConfig_base: Context.ServiceClass<AuthHttpApiConfig, "auth/AuthHttpApiConfig", AuthHttpApiConfigValue>;
|
|
81
|
+
export declare class AuthHttpApiConfig extends AuthHttpApiConfig_base {
|
|
82
|
+
}
|
|
83
|
+
export declare namespace AuthHttpApiConfig {
|
|
84
|
+
const make: (config: AuthHttpApiConfigValue) => AuthHttpApiConfigValue;
|
|
85
|
+
}
|
|
86
|
+
declare const AuthRequestMetadata_base: Context.ServiceClass<AuthRequestMetadata, "auth/AuthRequestMetadata", AuthRequestMetadataShape>;
|
|
87
|
+
export declare class AuthRequestMetadata extends AuthRequestMetadata_base {
|
|
88
|
+
}
|
|
89
|
+
export declare namespace AuthRequestMetadata {
|
|
90
|
+
const make: (metadata: AuthRequestMetadataShape) => AuthRequestMetadataShape;
|
|
91
|
+
}
|
|
92
|
+
declare const AuthOriginCheckMiddleware_base: HttpApiMiddleware.ServiceClass<AuthOriginCheckMiddleware, "auth/AuthOriginCheckMiddleware", {
|
|
93
|
+
requires: never;
|
|
94
|
+
provides: never;
|
|
95
|
+
error: typeof AuthRequestRejectedError;
|
|
96
|
+
clientError: never;
|
|
97
|
+
requiredForClient: false;
|
|
98
|
+
security: never;
|
|
99
|
+
}, HttpApiMiddleware.HttpApiMiddleware<never, typeof AuthRequestRejectedError, never>>;
|
|
100
|
+
export declare class AuthOriginCheckMiddleware extends AuthOriginCheckMiddleware_base {
|
|
101
|
+
}
|
|
102
|
+
declare const AuthRequestMetadataMiddleware_base: HttpApiMiddleware.ServiceClass<AuthRequestMetadataMiddleware, "auth/AuthRequestMetadataMiddleware", {
|
|
103
|
+
requires: never;
|
|
104
|
+
provides: AuthRequestMetadata;
|
|
105
|
+
error: never;
|
|
106
|
+
clientError: never;
|
|
107
|
+
requiredForClient: false;
|
|
108
|
+
security: never;
|
|
109
|
+
}, HttpApiMiddleware.HttpApiMiddleware<AuthRequestMetadata, never, never>>;
|
|
110
|
+
export declare class AuthRequestMetadataMiddleware extends AuthRequestMetadataMiddleware_base {
|
|
111
|
+
}
|
|
112
|
+
declare const AuthRateLimitMiddleware_base: HttpApiMiddleware.ServiceClass<AuthRateLimitMiddleware, "auth/AuthRateLimitMiddleware", {
|
|
113
|
+
requires: never;
|
|
114
|
+
provides: never;
|
|
115
|
+
error: readonly [typeof AuthRateLimitedError, typeof AuthInternalError];
|
|
116
|
+
clientError: never;
|
|
117
|
+
requiredForClient: false;
|
|
118
|
+
security: never;
|
|
119
|
+
}, HttpApiMiddleware.HttpApiMiddleware<never, readonly [typeof AuthRateLimitedError, typeof AuthInternalError], never>>;
|
|
120
|
+
export declare class AuthRateLimitMiddleware extends AuthRateLimitMiddleware_base {
|
|
121
|
+
}
|
|
122
|
+
declare const AuthCsrfMiddleware_base: HttpApiMiddleware.ServiceClass<AuthCsrfMiddleware, "auth/AuthCsrfMiddleware", {
|
|
123
|
+
requires: never;
|
|
124
|
+
provides: never;
|
|
125
|
+
error: typeof AuthRequestRejectedError;
|
|
126
|
+
clientError: never;
|
|
127
|
+
requiredForClient: false;
|
|
128
|
+
security: never;
|
|
129
|
+
}, HttpApiMiddleware.HttpApiMiddleware<never, typeof AuthRequestRejectedError, never>>;
|
|
130
|
+
export declare class AuthCsrfMiddleware extends AuthCsrfMiddleware_base {
|
|
131
|
+
}
|
|
132
|
+
export declare const makeAuthRequestMetadata: (request: HttpServerRequest.HttpServerRequest, options?: AuthRequestMetadataOptions) => AuthRequestMetadataShape;
|
|
133
|
+
export declare const AuthRateLimitPolicy: {
|
|
134
|
+
readonly fixedWindowByIp: (options: AuthRateLimitByIpOptions) => AuthRateLimitPolicy;
|
|
135
|
+
readonly byEndpoint: (policies: AuthRateLimitEndpointPolicyMap) => AuthRateLimitPolicy;
|
|
136
|
+
};
|
|
137
|
+
export declare const AuthHttpApiConfigLive: (config: AuthHttpApiConfigValue) => Layer.Layer<AuthHttpApiConfig, never, never>;
|
|
138
|
+
export declare const AuthApiRateLimitMiddlewareLive: Layer.Layer<AuthRateLimitMiddleware, never, AuthApiRateLimit>;
|
|
139
|
+
export declare const AuthApiRateLimitLive: Layer.Layer<AuthApiRateLimit | AuthRateLimitMiddleware, never, Privacy | RateLimiter>;
|
|
140
|
+
export declare const AuthApiRateLimitNoopLive: Layer.Layer<AuthApiRateLimit | AuthRateLimitMiddleware>;
|
|
141
|
+
export declare const AuthOriginCheckMiddlewareLive: (options?: AuthOriginCheckOptions) => Layer.Layer<AuthOriginCheckMiddleware, never, never>;
|
|
142
|
+
export declare const AuthOriginCheckMiddlewareConfigLive: Layer.Layer<AuthOriginCheckMiddleware, never, never>;
|
|
143
|
+
export declare const AuthRequestMetadataMiddlewareLive: (options?: AuthRequestMetadataOptions) => Layer.Layer<AuthRequestMetadataMiddleware, never, never>;
|
|
144
|
+
export declare const AuthRateLimitMiddlewareLive: (policy: AuthRateLimitPolicy, metadataOptions?: AuthRequestMetadataOptions) => Layer.Layer<AuthRateLimitMiddleware, never, Privacy | RateLimiter>;
|
|
145
|
+
export declare const AuthCsrfMiddlewareLive: (options?: AuthCsrfOptions) => Layer.Layer<AuthCsrfMiddleware, never, never>;
|
|
146
|
+
export {};
|
|
147
|
+
//# sourceMappingURL=Security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Security.d.ts","sourceRoot":"","sources":["../../src/HttpApi/Security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { Context, Duration, Effect, Layer, Option } from "effect";
|
|
2
|
+
import { HttpServerRequest } from "effect/unstable/http";
|
|
3
|
+
import { HttpApiMiddleware } from "effect/unstable/httpapi";
|
|
4
|
+
import { IpAddress as makeIpAddress } from "../Identifiers.js";
|
|
5
|
+
import { Privacy } from "../Privacy.js";
|
|
6
|
+
import { RateLimitKey, RateLimiter, RateLimitPolicy } from "../RateLimiter.js";
|
|
7
|
+
import { AuthInternalError, AuthRateLimitedError, AuthRequestRejectedError, } from "./Errors.js";
|
|
8
|
+
export class AuthApiRateLimit extends Context.Service()("auth/AuthApiRateLimit") {
|
|
9
|
+
}
|
|
10
|
+
(function (AuthApiRateLimit) {
|
|
11
|
+
AuthApiRateLimit.make = (service) => AuthApiRateLimit.of(service);
|
|
12
|
+
})(AuthApiRateLimit || (AuthApiRateLimit = {}));
|
|
13
|
+
export class AuthHttpApiConfig extends Context.Service()("auth/AuthHttpApiConfig") {
|
|
14
|
+
}
|
|
15
|
+
(function (AuthHttpApiConfig) {
|
|
16
|
+
AuthHttpApiConfig.make = (config) => AuthHttpApiConfig.of(config);
|
|
17
|
+
})(AuthHttpApiConfig || (AuthHttpApiConfig = {}));
|
|
18
|
+
export class AuthRequestMetadata extends Context.Service()("auth/AuthRequestMetadata") {
|
|
19
|
+
}
|
|
20
|
+
(function (AuthRequestMetadata) {
|
|
21
|
+
AuthRequestMetadata.make = (metadata) => AuthRequestMetadata.of(metadata);
|
|
22
|
+
})(AuthRequestMetadata || (AuthRequestMetadata = {}));
|
|
23
|
+
export class AuthOriginCheckMiddleware extends HttpApiMiddleware.Service()("auth/AuthOriginCheckMiddleware", { error: AuthRequestRejectedError }) {
|
|
24
|
+
}
|
|
25
|
+
export class AuthRequestMetadataMiddleware extends HttpApiMiddleware.Service()("auth/AuthRequestMetadataMiddleware") {
|
|
26
|
+
}
|
|
27
|
+
export class AuthRateLimitMiddleware extends HttpApiMiddleware.Service()("auth/AuthRateLimitMiddleware", { error: [AuthRateLimitedError, AuthInternalError] }) {
|
|
28
|
+
}
|
|
29
|
+
export class AuthCsrfMiddleware extends HttpApiMiddleware.Service()("auth/AuthCsrfMiddleware", { error: AuthRequestRejectedError }) {
|
|
30
|
+
}
|
|
31
|
+
const unsafeMethods = new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
32
|
+
const normalizeOrigin = (value) => {
|
|
33
|
+
try {
|
|
34
|
+
return new URL(value).origin;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const allowedOriginValues = (allowedOrigins) => {
|
|
41
|
+
if (allowedOrigins === undefined) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return (Array.isArray(allowedOrigins) ? allowedOrigins : [allowedOrigins])
|
|
45
|
+
.flatMap((origin) => origin.split(","))
|
|
46
|
+
.map((origin) => origin.trim())
|
|
47
|
+
.filter((origin) => origin.length > 0);
|
|
48
|
+
};
|
|
49
|
+
const firstHeaderValue = (value) => {
|
|
50
|
+
const first = value?.split(",", 1)[0]?.trim();
|
|
51
|
+
return first === "" ? undefined : first;
|
|
52
|
+
};
|
|
53
|
+
const cookieValue = (header, name) => {
|
|
54
|
+
if (header === undefined) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
for (const part of header.split(";")) {
|
|
58
|
+
const trimmed = part.trim();
|
|
59
|
+
const separator = trimmed.indexOf("=");
|
|
60
|
+
if (separator <= 0 || trimmed.slice(0, separator) !== name) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return decodeURIComponent(trimmed.slice(separator + 1));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
};
|
|
72
|
+
const firstForwardedIp = (value) => firstHeaderValue(value)?.split(",", 1)[0]?.trim();
|
|
73
|
+
const ipFromHeaders = (headers, options) => {
|
|
74
|
+
if (!options.trustProxyHeaders) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const ip = firstHeaderValue(headers["cf-connecting-ip"]) ??
|
|
78
|
+
firstHeaderValue(headers["true-client-ip"]) ??
|
|
79
|
+
firstForwardedIp(headers["x-forwarded-for"]) ??
|
|
80
|
+
firstHeaderValue(headers["x-real-ip"]);
|
|
81
|
+
return ip === undefined || ip === "" ? undefined : makeIpAddress(ip);
|
|
82
|
+
};
|
|
83
|
+
export const makeAuthRequestMetadata = (request, options = {}) => {
|
|
84
|
+
const resolved = {
|
|
85
|
+
trustProxyHeaders: options.trustProxyHeaders ?? false,
|
|
86
|
+
};
|
|
87
|
+
return AuthRequestMetadata.make({
|
|
88
|
+
method: request.method,
|
|
89
|
+
url: request.originalUrl,
|
|
90
|
+
ipAddress: ipFromHeaders(request.headers, resolved),
|
|
91
|
+
userAgent: firstHeaderValue(request.headers["user-agent"]),
|
|
92
|
+
origin: firstHeaderValue(request.headers.origin),
|
|
93
|
+
referer: firstHeaderValue(request.headers.referer),
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
const originFromReferer = (referer) => referer === undefined ? undefined : normalizeOrigin(referer);
|
|
97
|
+
const requestOriginCandidates = (request) => {
|
|
98
|
+
const originalOrigin = normalizeOrigin(request.originalUrl);
|
|
99
|
+
if (originalOrigin !== undefined) {
|
|
100
|
+
return new Set([originalOrigin]);
|
|
101
|
+
}
|
|
102
|
+
const host = firstHeaderValue(request.headers["x-forwarded-host"]) ??
|
|
103
|
+
firstHeaderValue(request.headers.host);
|
|
104
|
+
if (host === undefined) {
|
|
105
|
+
return new Set();
|
|
106
|
+
}
|
|
107
|
+
const forwardedProto = firstHeaderValue(request.headers["x-forwarded-proto"]);
|
|
108
|
+
const protocols = forwardedProto === undefined ? ["http", "https"] : [forwardedProto];
|
|
109
|
+
return new Set(protocols.flatMap((protocol) => {
|
|
110
|
+
const origin = normalizeOrigin(`${protocol}://${host}`);
|
|
111
|
+
return origin === undefined ? [] : [origin];
|
|
112
|
+
}));
|
|
113
|
+
};
|
|
114
|
+
const originAllowed = (request, allowedOrigins, allowMissingOrigin) => {
|
|
115
|
+
if (!unsafeMethods.has(request.method)) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
const originHeader = request.headers.origin;
|
|
119
|
+
const refererHeader = request.headers.referer;
|
|
120
|
+
if (originHeader === undefined && refererHeader === undefined) {
|
|
121
|
+
return allowMissingOrigin;
|
|
122
|
+
}
|
|
123
|
+
const origin = originHeader !== undefined
|
|
124
|
+
? normalizeOrigin(originHeader)
|
|
125
|
+
: originFromReferer(refererHeader);
|
|
126
|
+
if (origin === undefined) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return (requestOriginCandidates(request).has(origin) || allowedOrigins.has(origin));
|
|
130
|
+
};
|
|
131
|
+
const csrfAllowed = (request, options) => {
|
|
132
|
+
if (!unsafeMethods.has(request.method)) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
const fromCookie = cookieValue(request.headers.cookie, options.cookieName);
|
|
136
|
+
const fromHeader = firstHeaderValue(request.headers[options.headerName.toLowerCase()]);
|
|
137
|
+
return (fromCookie !== undefined &&
|
|
138
|
+
fromCookie.length > 0 &&
|
|
139
|
+
fromCookie === fromHeader);
|
|
140
|
+
};
|
|
141
|
+
export const AuthRateLimitPolicy = {
|
|
142
|
+
fixedWindowByIp: (options) => (input) => Effect.gen(function* () {
|
|
143
|
+
const privacy = yield* Privacy;
|
|
144
|
+
const key = input.metadata.ipAddress === undefined
|
|
145
|
+
? RateLimitKey.customHash("ip", "missing")
|
|
146
|
+
: RateLimitKey.ipHash(yield* privacy.ipHash(input.metadata.ipAddress));
|
|
147
|
+
return RateLimitPolicy.fixedWindow({
|
|
148
|
+
id: options.id,
|
|
149
|
+
key,
|
|
150
|
+
limit: options.limit,
|
|
151
|
+
tokens: options.tokens,
|
|
152
|
+
window: options.window,
|
|
153
|
+
});
|
|
154
|
+
}),
|
|
155
|
+
byEndpoint: (policies) => (input) => policies[`${input.group.identifier}.${input.endpoint.name}`]?.(input) ??
|
|
156
|
+
Effect.succeed(undefined),
|
|
157
|
+
};
|
|
158
|
+
const authApiRateLimitDefaults = {
|
|
159
|
+
trustProxyHeaders: false,
|
|
160
|
+
passwordSignIn: {
|
|
161
|
+
byIp: {
|
|
162
|
+
id: "auth.password.sign_in.ip",
|
|
163
|
+
limit: 20,
|
|
164
|
+
window: Duration.minutes(10),
|
|
165
|
+
},
|
|
166
|
+
byEmail: {
|
|
167
|
+
id: "auth.password.sign_in.email",
|
|
168
|
+
limit: 5,
|
|
169
|
+
window: Duration.minutes(10),
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
passwordSignUp: {
|
|
173
|
+
byIp: {
|
|
174
|
+
id: "auth.password.sign_up.ip",
|
|
175
|
+
limit: 10,
|
|
176
|
+
window: Duration.hours(1),
|
|
177
|
+
},
|
|
178
|
+
byEmail: {
|
|
179
|
+
id: "auth.password.sign_up.email",
|
|
180
|
+
limit: 3,
|
|
181
|
+
window: Duration.hours(1),
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
emailVerificationStart: {
|
|
185
|
+
byIp: {
|
|
186
|
+
id: "auth.email_verification.start.ip",
|
|
187
|
+
limit: 10,
|
|
188
|
+
window: Duration.minutes(10),
|
|
189
|
+
},
|
|
190
|
+
byEmail: {
|
|
191
|
+
id: "auth.email_verification.start.email",
|
|
192
|
+
limit: 3,
|
|
193
|
+
window: Duration.minutes(10),
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
const resolveAuthApiRateLimitRule = (defaults, config) => {
|
|
198
|
+
if (config === false) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
if (config === undefined || config === true) {
|
|
202
|
+
return defaults;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
id: defaults.id,
|
|
206
|
+
limit: config.limit ?? defaults.limit,
|
|
207
|
+
tokens: config.tokens ?? defaults.tokens,
|
|
208
|
+
window: config.window ?? defaults.window,
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
const resolveAuthApiEndpointRateLimit = (defaults, config) => {
|
|
212
|
+
if (config === false) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
if (config === undefined || config === true) {
|
|
216
|
+
return defaults;
|
|
217
|
+
}
|
|
218
|
+
const byIp = defaults.byIp === undefined
|
|
219
|
+
? undefined
|
|
220
|
+
: resolveAuthApiRateLimitRule(defaults.byIp, config.byIp);
|
|
221
|
+
const byEmail = defaults.byEmail === undefined
|
|
222
|
+
? undefined
|
|
223
|
+
: resolveAuthApiRateLimitRule(defaults.byEmail, config.byEmail);
|
|
224
|
+
return byIp === undefined && byEmail === undefined
|
|
225
|
+
? undefined
|
|
226
|
+
: { byIp, byEmail };
|
|
227
|
+
};
|
|
228
|
+
const resolveAuthApiRateLimitConfig = (config) => {
|
|
229
|
+
if (config === false) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
if (config === true) {
|
|
233
|
+
return authApiRateLimitDefaults;
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
trustProxyHeaders: config.trustProxyHeaders ?? authApiRateLimitDefaults.trustProxyHeaders,
|
|
237
|
+
passwordSignIn: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordSignIn, config.passwordSignIn),
|
|
238
|
+
passwordSignUp: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.passwordSignUp, config.passwordSignUp),
|
|
239
|
+
emailVerificationStart: resolveAuthApiEndpointRateLimit(authApiRateLimitDefaults.emailVerificationStart, config.emailVerificationStart),
|
|
240
|
+
};
|
|
241
|
+
};
|
|
242
|
+
const makeRateLimitPolicy = (rule, key) => RateLimitPolicy.fixedWindow({
|
|
243
|
+
id: rule.id,
|
|
244
|
+
key,
|
|
245
|
+
limit: rule.limit,
|
|
246
|
+
tokens: rule.tokens,
|
|
247
|
+
window: rule.window,
|
|
248
|
+
});
|
|
249
|
+
const endpointKey = (input) => `${input.group.identifier}.${input.endpoint.name}`;
|
|
250
|
+
const requestIpRule = (config, input) => {
|
|
251
|
+
switch (endpointKey(input)) {
|
|
252
|
+
case "password.signIn": {
|
|
253
|
+
return config?.passwordSignIn?.byIp;
|
|
254
|
+
}
|
|
255
|
+
case "password.signUp": {
|
|
256
|
+
return config?.passwordSignUp?.byIp;
|
|
257
|
+
}
|
|
258
|
+
case "emailVerification.start": {
|
|
259
|
+
return config?.emailVerificationStart?.byIp;
|
|
260
|
+
}
|
|
261
|
+
default: {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const ipRateLimitKey = (privacy, metadata) => metadata.ipAddress === undefined
|
|
267
|
+
? Effect.succeed(RateLimitKey.customHash("ip", "missing"))
|
|
268
|
+
: Effect.map(privacy.ipHash(metadata.ipAddress), RateLimitKey.ipHash);
|
|
269
|
+
const consumeRule = (rateLimiter, rule, key) => rateLimiter.require(makeRateLimitPolicy(rule, key));
|
|
270
|
+
const authApiRateLimitConfig = Effect.gen(function* () {
|
|
271
|
+
const configOption = yield* Effect.serviceOption(AuthHttpApiConfig);
|
|
272
|
+
const config = Option.isSome(configOption)
|
|
273
|
+
? (configOption.value.rateLimit ?? true)
|
|
274
|
+
: true;
|
|
275
|
+
return resolveAuthApiRateLimitConfig(config);
|
|
276
|
+
});
|
|
277
|
+
const noopAuthApiRateLimit = AuthApiRateLimit.make({
|
|
278
|
+
request: () => Effect.void,
|
|
279
|
+
passwordSignIn: () => Effect.void,
|
|
280
|
+
passwordSignUp: () => Effect.void,
|
|
281
|
+
emailVerificationStart: () => Effect.void,
|
|
282
|
+
});
|
|
283
|
+
const makeAuthApiRateLimit = (config, dependencies) => {
|
|
284
|
+
if (config === undefined) {
|
|
285
|
+
return noopAuthApiRateLimit;
|
|
286
|
+
}
|
|
287
|
+
return AuthApiRateLimit.make({
|
|
288
|
+
request: (input) => Effect.gen(function* () {
|
|
289
|
+
const rule = requestIpRule(config, input);
|
|
290
|
+
if (rule === undefined) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const key = yield* ipRateLimitKey(dependencies.privacy, input.metadata);
|
|
294
|
+
yield* consumeRule(dependencies.rateLimiter, rule, key);
|
|
295
|
+
}),
|
|
296
|
+
passwordSignIn: (input) => Effect.gen(function* () {
|
|
297
|
+
const rule = config.passwordSignIn?.byEmail;
|
|
298
|
+
if (rule === undefined) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
302
|
+
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
303
|
+
}),
|
|
304
|
+
passwordSignUp: (input) => Effect.gen(function* () {
|
|
305
|
+
const rule = config.passwordSignUp?.byEmail;
|
|
306
|
+
if (rule === undefined) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
310
|
+
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
311
|
+
}),
|
|
312
|
+
emailVerificationStart: (input) => Effect.gen(function* () {
|
|
313
|
+
const rule = config.emailVerificationStart?.byEmail;
|
|
314
|
+
if (rule === undefined) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const emailHash = yield* dependencies.privacy.emailHash(input.email);
|
|
318
|
+
yield* consumeRule(dependencies.rateLimiter, rule, RateLimitKey.emailHash(emailHash));
|
|
319
|
+
}),
|
|
320
|
+
});
|
|
321
|
+
};
|
|
322
|
+
const rateLimitMiddlewareError = (effect) => effect.pipe(Effect.catchTag("RateLimitExceededError", (error) => Effect.fail(new AuthRateLimitedError({
|
|
323
|
+
code: "rate_limited",
|
|
324
|
+
message: "Too many requests",
|
|
325
|
+
retryAfter: error.retryAfter,
|
|
326
|
+
}))), Effect.catchTag("RateLimitStoreError", () => Effect.fail(new AuthInternalError({
|
|
327
|
+
code: "internal_error",
|
|
328
|
+
message: "Failed to consume rate limit",
|
|
329
|
+
}))), Effect.catchTag("PrivacyError", () => Effect.fail(new AuthInternalError({
|
|
330
|
+
code: "internal_error",
|
|
331
|
+
message: "Failed to build rate limit key",
|
|
332
|
+
}))));
|
|
333
|
+
export const AuthHttpApiConfigLive = (config) => Layer.succeed(AuthHttpApiConfig, AuthHttpApiConfig.make(config));
|
|
334
|
+
const AuthApiRateLimitServiceLive = Layer.effect(AuthApiRateLimit)(Effect.gen(function* () {
|
|
335
|
+
const config = yield* authApiRateLimitConfig;
|
|
336
|
+
if (config === undefined) {
|
|
337
|
+
return noopAuthApiRateLimit;
|
|
338
|
+
}
|
|
339
|
+
const privacy = yield* Privacy;
|
|
340
|
+
const rateLimiter = yield* RateLimiter;
|
|
341
|
+
return makeAuthApiRateLimit(config, { privacy, rateLimiter });
|
|
342
|
+
}));
|
|
343
|
+
export const AuthApiRateLimitMiddlewareLive = Layer.effect(AuthRateLimitMiddleware)(Effect.gen(function* () {
|
|
344
|
+
const config = yield* authApiRateLimitConfig;
|
|
345
|
+
const authApiRateLimit = yield* AuthApiRateLimit;
|
|
346
|
+
if (config === undefined) {
|
|
347
|
+
return (httpEffect) => httpEffect;
|
|
348
|
+
}
|
|
349
|
+
return (httpEffect, options) => Effect.gen(function* () {
|
|
350
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
351
|
+
const metadata = makeAuthRequestMetadata(request, {
|
|
352
|
+
trustProxyHeaders: config.trustProxyHeaders,
|
|
353
|
+
});
|
|
354
|
+
yield* rateLimitMiddlewareError(authApiRateLimit.request({
|
|
355
|
+
metadata,
|
|
356
|
+
endpoint: options.endpoint,
|
|
357
|
+
group: options.group,
|
|
358
|
+
}));
|
|
359
|
+
return yield* httpEffect;
|
|
360
|
+
});
|
|
361
|
+
}));
|
|
362
|
+
export const AuthApiRateLimitLive = Layer.merge(AuthApiRateLimitServiceLive, AuthApiRateLimitMiddlewareLive.pipe(Layer.provide(AuthApiRateLimitServiceLive)));
|
|
363
|
+
export const AuthApiRateLimitNoopLive = Layer.merge(Layer.succeed(AuthApiRateLimit, noopAuthApiRateLimit), Layer.succeed(AuthRateLimitMiddleware, (httpEffect) => httpEffect));
|
|
364
|
+
export const AuthOriginCheckMiddlewareLive = (options = {}) => {
|
|
365
|
+
const allowedOrigins = new Set(allowedOriginValues(options.allowedOrigins).flatMap((origin) => {
|
|
366
|
+
const normalized = normalizeOrigin(origin);
|
|
367
|
+
return normalized === undefined ? [] : [normalized];
|
|
368
|
+
}));
|
|
369
|
+
const allowMissingOrigin = options.allowMissingOrigin ?? true;
|
|
370
|
+
return Layer.succeed(AuthOriginCheckMiddleware, (httpEffect) => Effect.gen(function* () {
|
|
371
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
372
|
+
if (!originAllowed(request, allowedOrigins, allowMissingOrigin)) {
|
|
373
|
+
return yield* new AuthRequestRejectedError({
|
|
374
|
+
code: "request_rejected",
|
|
375
|
+
message: "Request origin is not allowed",
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return yield* httpEffect;
|
|
379
|
+
}));
|
|
380
|
+
};
|
|
381
|
+
export const AuthOriginCheckMiddlewareConfigLive = Layer.unwrap(Effect.gen(function* () {
|
|
382
|
+
const configOption = yield* Effect.serviceOption(AuthHttpApiConfig);
|
|
383
|
+
const options = Option.isSome(configOption)
|
|
384
|
+
? configOption.value.originCheck
|
|
385
|
+
: undefined;
|
|
386
|
+
return AuthOriginCheckMiddlewareLive(options);
|
|
387
|
+
}));
|
|
388
|
+
export const AuthRequestMetadataMiddlewareLive = (options = {}) => Layer.succeed(AuthRequestMetadataMiddleware, (httpEffect) => Effect.gen(function* () {
|
|
389
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
390
|
+
const metadata = makeAuthRequestMetadata(request, options);
|
|
391
|
+
return yield* Effect.provideService(httpEffect, AuthRequestMetadata, metadata);
|
|
392
|
+
}));
|
|
393
|
+
export const AuthRateLimitMiddlewareLive = (policy, metadataOptions = {}) => Layer.effect(AuthRateLimitMiddleware, Effect.gen(function* () {
|
|
394
|
+
const rateLimiter = yield* RateLimiter;
|
|
395
|
+
const privacy = yield* Privacy;
|
|
396
|
+
return (httpEffect, options) => Effect.gen(function* () {
|
|
397
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
398
|
+
const metadata = makeAuthRequestMetadata(request, metadataOptions);
|
|
399
|
+
const rateLimitPolicy = yield* policy({
|
|
400
|
+
metadata,
|
|
401
|
+
endpoint: options.endpoint,
|
|
402
|
+
group: options.group,
|
|
403
|
+
}).pipe(Effect.provideService(Privacy, privacy), Effect.mapError(() => new AuthInternalError({
|
|
404
|
+
code: "internal_error",
|
|
405
|
+
message: "Failed to build rate limit policy",
|
|
406
|
+
})));
|
|
407
|
+
if (rateLimitPolicy !== undefined) {
|
|
408
|
+
const decision = yield* rateLimiter.consume(rateLimitPolicy).pipe(Effect.mapError(() => new AuthInternalError({
|
|
409
|
+
code: "internal_error",
|
|
410
|
+
message: "Failed to consume rate limit",
|
|
411
|
+
})));
|
|
412
|
+
if (decision.type === "denied") {
|
|
413
|
+
return yield* new AuthRateLimitedError({
|
|
414
|
+
code: "rate_limited",
|
|
415
|
+
message: "Too many requests",
|
|
416
|
+
retryAfter: decision.retryAfter,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return yield* httpEffect;
|
|
421
|
+
});
|
|
422
|
+
}));
|
|
423
|
+
export const AuthCsrfMiddlewareLive = (options = {}) => {
|
|
424
|
+
const resolved = {
|
|
425
|
+
cookieName: options.cookieName ?? "__Host-csrf",
|
|
426
|
+
headerName: options.headerName ?? "x-csrf-token",
|
|
427
|
+
};
|
|
428
|
+
return Layer.succeed(AuthCsrfMiddleware, (httpEffect) => Effect.gen(function* () {
|
|
429
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
430
|
+
if (!csrfAllowed(request, resolved)) {
|
|
431
|
+
return yield* new AuthRequestRejectedError({
|
|
432
|
+
code: "request_rejected",
|
|
433
|
+
message: "CSRF token is invalid",
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
return yield* httpEffect;
|
|
437
|
+
}));
|
|
438
|
+
};
|
|
439
|
+
//# sourceMappingURL=Security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Security.js","sourceRoot":"","sources":["../../src/HttpApi/Security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpServerResponse } from "effect/unstable/http";
|
|
3
|
+
import type { PasswordSignInResult, PasswordSignUpResult } from "../Password.js";
|
|
4
|
+
import { SessionCookie } from "../Sessions.js";
|
|
5
|
+
import type { IssuedSession, SessionCookieService, ValidatedSession } from "../Sessions.js";
|
|
6
|
+
import { AuthInternalError, AuthInvalidCredentialsError, AuthPolicyDeniedError } from "./Errors.js";
|
|
7
|
+
export type Json = null | boolean | number | string | readonly Json[] | {
|
|
8
|
+
readonly [key: string]: Json;
|
|
9
|
+
};
|
|
10
|
+
export type PasswordSignInHttpError = AuthInvalidCredentialsError | AuthPolicyDeniedError | AuthInternalError;
|
|
11
|
+
export type PasswordSignUpHttpError = AuthPolicyDeniedError | AuthInternalError;
|
|
12
|
+
export interface AuthHttpService {
|
|
13
|
+
readonly commitPasswordSignInResult: (result: PasswordSignInResult) => Effect.Effect<HttpServerResponse.HttpServerResponse, PasswordSignInHttpError>;
|
|
14
|
+
readonly commitPasswordSignUpResult: (result: PasswordSignUpResult) => Effect.Effect<HttpServerResponse.HttpServerResponse, PasswordSignUpHttpError>;
|
|
15
|
+
readonly commitCurrentSession: (session: ValidatedSession) => Effect.Effect<HttpServerResponse.HttpServerResponse, AuthInternalError>;
|
|
16
|
+
readonly commitSessionRefreshed: (session: IssuedSession) => Effect.Effect<HttpServerResponse.HttpServerResponse, AuthInternalError>;
|
|
17
|
+
readonly commitSessionCleared: () => Effect.Effect<HttpServerResponse.HttpServerResponse, AuthInternalError>;
|
|
18
|
+
}
|
|
19
|
+
declare const AuthHttp_base: Context.ServiceClass<AuthHttp, "auth/AuthHttp", AuthHttpService>;
|
|
20
|
+
export declare class AuthHttp extends AuthHttp_base {
|
|
21
|
+
}
|
|
22
|
+
export declare namespace AuthHttp {
|
|
23
|
+
const make: (service: AuthHttpService) => AuthHttpService;
|
|
24
|
+
}
|
|
25
|
+
export interface AuthHttpDependencies {
|
|
26
|
+
readonly sessionCookie: SessionCookieService;
|
|
27
|
+
}
|
|
28
|
+
export declare const makeAuthHttp: (dependencies: AuthHttpDependencies) => AuthHttpService;
|
|
29
|
+
export declare const AuthHttpTransportLive: Layer.Layer<AuthHttp, never, SessionCookie>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=Transport.d.ts.map
|