@effect-auth/core 0.1.0-alpha.0 → 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 +679 -36
- package/dist/AuditLog.d.ts +3 -0
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +6 -3
- 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 +295 -35
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +133 -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 +22 -3
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +160 -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 +9 -1
- package/dist/Crypto.d.ts.map +1 -1
- package/dist/Crypto.js +65 -1
- package/dist/Crypto.js.map +1 -1
- package/dist/D1Kysely.d.ts +43 -0
- package/dist/D1Kysely.d.ts.map +1 -0
- package/dist/D1Kysely.js +78 -0
- package/dist/D1Kysely.js.map +1 -0
- 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 +67 -0
- package/dist/KyselyStorage.d.ts.map +1 -0
- package/dist/KyselyStorage.js +366 -0
- package/dist/KyselyStorage.js.map +1 -0
- 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 +18 -0
- package/dist/Privacy.d.ts.map +1 -1
- package/dist/Privacy.js +63 -3
- 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 +85 -11
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +424 -1
- package/dist/Sessions.js.map +1 -1
- package/dist/Storage.d.ts +162 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +27 -0
- package/dist/Storage.js.map +1 -0
- package/dist/StorageMigrations.d.ts +8 -0
- package/dist/StorageMigrations.d.ts.map +1 -0
- package/dist/StorageMigrations.js +68 -0
- package/dist/StorageMigrations.js.map +1 -0
- 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 +3 -0
- package/dist/WaitUntil.d.ts.map +1 -1
- package/dist/WaitUntil.js +6 -3
- 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 +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -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/0001_auth_storage.sql +32 -0
- package/migrations/0002_auth_password.sql +25 -0
- package/package.json +97 -16
- package/LICENSE +0 -21
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":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,WAAW,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAOpF,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,EAAqB,CAAC;AAGjE,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,EAAgB,CAAC;AAIvD,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE9E,MAAM,YAAY,GAAG,CAAC,GAAG,QAA2B,EAAgB,EAAE,CACpE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7D,MAAM,mBAAmB,GAAG,CAC1B,IAAsB,EACtB,KAAmB,EACnB,GAAG,IAA6B,EAClB,EAAE,CAChB,gBAAgB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC;IAC9B,SAAS,EAAE,CAAC,SAAoB,EAAgB,EAAE,CAChD,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC;IAClC,MAAM,EAAE,CAAC,MAAc,EAAgB,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;IACpE,aAAa,EAAE,CAAC,aAA4B,EAAgB,EAAE,CAC5D,YAAY,CAAC,YAAY,EAAE,aAAa,CAAC;IAC3C,UAAU,EAAE,CAAC,IAAsB,EAAE,IAAY,EAAgB,EAAE,CACjE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;IAC1B,OAAO,EAAE,mBAAmB;CACpB,CAAC;AA+BX,MAAM,UAAU,GAAG,CAAC,IAAmB,EAAmB,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,CAAC,IAAI,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,KAAuB,EAAsB,EAAE,CAAC,CAAC;IAC3E,EAAE,EAAE,KAAK,CAAC,EAAE;IACZ,GAAG,EAAE,KAAK,CAAC,EAAE;IACb,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,MAAM,EAAE,KAAK,CAAC,MAAM;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,CAAC,KAAyB,EAAmB,EAAE,CAC1D,UAAU,CAAC;QACT,GAAG,KAAK;QACR,EAAE,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,SAAS,EAAE,cAAc;KAC1B,CAAC;IACJ,aAAa,EAAE,CAAC,KAAuB,EAAmB,EAAE,CAC1D,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxD,WAAW,EAAE,CAAC,KAAyB,EAAmB,EAAE,CAC1D,UAAU,CAAC;QACT,GAAG,KAAK;QACR,EAAE,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,SAAS,EAAE,cAAc;KAC1B,CAAC;IACJ,aAAa,EAAE,CAAC,KAAuB,EAAmB,EAAE,CAC1D,eAAe,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxD,GAAG,EAAE,CAAC,GAAG,QAAoC,EAAmB,EAAE,CAAC,CAAC;QAClE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;KAClD,CAAC;CACM,CAAC;AAsBX,MAAM,OAAO,sBAAuB,SAAQ,IAAI,CAAC,WAAW,CAC1D,wBAAwB,CAMxB;CAAG;AAEL,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CACvD,qBAAqB,CAIrB;CAAG;AAaL,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,OAAO,EAG7C,CAAC,kBAAkB,CAAC;CAAG;AAE1B,WAAiB,WAAW;IACb,gBAAI,GAAG,CAAC,OAA2B,EAAsB,EAAE,CACtE,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC,EAHgB,WAAW,KAAX,WAAW,QAG3B;AAMD,MAAM,UAAU,GAAG,CAAC,IAAmB,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7E,MAAM,UAAU,GAAG,CAAC,KAAc,EAAuB,EAAE,CACzD,IAAI,mBAAmB,CAAC;IACtB,OAAO,EAAE,8BAA8B;IACvC,KAAK;CACN,CAAC,CAAC;AAEL,MAAM,cAAc,GAAG,CACrB,IAAmB,EACnB,MAAgD,EACS,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,IAAI,CAAC,EAAE;IACjB,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,SAAS,EAAE,MAAM,CAAC,SAAS;CAC5B,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,YAAqC,EACjB,EAAE;IACtB,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EACpE,MAAuB;QAEvB,MAAM,OAAO,GAA6B,EAAE,CAAC;QAE7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO;iBAC3C,OAAO,CAAC;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,MAAM;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;iBACD,IAAI,CACH,MAAM,CAAC,WAAW,CAAC;gBACjB,SAAS,EAAE,CAAC,MAAM,EAAoC,EAAE,CACtD,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;gBAC7C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,mBAAmB;oBACvC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBACpD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aACrC,CAAC,CACH,CAAC;YAEJ,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;gBAC9B,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,SAAS;gBACtC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU;aACzC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAW,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,CAAC;QACtB,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EACvD,MAAuB;YAEvB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAE9C,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,CAAC,IAAI,sBAAsB,CAAC;oBACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAuB,EAC6C,EAAE,CACtE,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAuB,EAC2B,EAAE,CACpD,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,MAAuB,EAAE,EAAE,CAC5B,CACE,MAA8B,EACyB,EAAE,CACzD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAIxB,KAAK,CAAC,MAAM,CACd,WAAW,EACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC;IAE1D,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAChC,eAAe,CAAC,IAAI,CAClB,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAC3C,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CACvD,CAAC"}
|
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,31 +119,77 @@ 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
|
}
|
|
103
132
|
declare const Sessions_base: Context.ServiceClass<Sessions, "auth/Sessions", SessionsService>;
|
|
104
133
|
export declare class Sessions extends Sessions_base {
|
|
105
134
|
}
|
|
135
|
+
export declare namespace Sessions {
|
|
136
|
+
const make: (service: SessionsService) => SessionsService;
|
|
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>;
|
|
106
151
|
export interface SessionCookieService {
|
|
107
|
-
readonly read: (request: Request) => Effect.Effect<
|
|
152
|
+
readonly read: (request: Request) => Effect.Effect<OptionTypes.Option<SessionToken>, SessionValidateError>;
|
|
108
153
|
readonly commit: (issued: IssuedSession) => Effect.Effect<string, SessionCreateError>;
|
|
109
154
|
readonly clear: Effect.Effect<string, SessionRevokeError>;
|
|
110
155
|
}
|
|
111
156
|
declare const SessionCookie_base: Context.ServiceClass<SessionCookie, "auth/SessionCookie", SessionCookieService>;
|
|
112
157
|
export declare class SessionCookie extends SessionCookie_base {
|
|
113
158
|
}
|
|
159
|
+
export declare namespace SessionCookie {
|
|
160
|
+
const make: (service: SessionCookieService) => SessionCookieService;
|
|
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>;
|
|
114
182
|
declare const CurrentSession_base: Context.ServiceClass<CurrentSession, "auth/CurrentSession", CurrentSessionShape>;
|
|
115
183
|
export declare class CurrentSession extends CurrentSession_base {
|
|
116
184
|
}
|
|
185
|
+
export declare namespace CurrentSession {
|
|
186
|
+
const make: (service: CurrentSessionShape) => CurrentSessionShape;
|
|
187
|
+
}
|
|
117
188
|
declare const CurrentActor_base: Context.ServiceClass<CurrentActor, "auth/CurrentActor", CurrentActorShape>;
|
|
118
189
|
export declare class CurrentActor extends CurrentActor_base {
|
|
119
190
|
}
|
|
191
|
+
export declare namespace CurrentActor {
|
|
192
|
+
const make: (service: CurrentActorShape) => CurrentActorShape;
|
|
193
|
+
}
|
|
120
194
|
export {};
|
|
121
195
|
//# sourceMappingURL=Sessions.d.ts.map
|
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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"}
|