@effect-auth/core 0.1.0-alpha.1 → 0.1.0-alpha.3
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 +186 -0
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
- package/dist/EffectQbSqliteStorage.js +439 -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
|
@@ -31,7 +31,38 @@ create table if not exists auth_verification (
|
|
|
31
31
|
);
|
|
32
32
|
|
|
33
33
|
create index if not exists auth_verification_type_subject_idx on auth_verification (type, subject);
|
|
34
|
-
create index if not exists auth_verification_expires_at_idx on auth_verification (expires_at)
|
|
34
|
+
create index if not exists auth_verification_expires_at_idx on auth_verification (expires_at);`,
|
|
35
35
|
};
|
|
36
|
-
export const
|
|
36
|
+
export const authStorageMigration002 = {
|
|
37
|
+
id: "0002_auth_password",
|
|
38
|
+
sql: `create table if not exists auth_user (
|
|
39
|
+
id text primary key,
|
|
40
|
+
email text not null,
|
|
41
|
+
email_verified integer not null,
|
|
42
|
+
created_at integer not null,
|
|
43
|
+
updated_at integer not null,
|
|
44
|
+
disabled_at integer,
|
|
45
|
+
metadata text
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
create unique index if not exists auth_user_email_idx on auth_user (email);
|
|
49
|
+
|
|
50
|
+
create table if not exists auth_credential (
|
|
51
|
+
id text primary key,
|
|
52
|
+
user_id text not null,
|
|
53
|
+
type text not null,
|
|
54
|
+
password_hash text,
|
|
55
|
+
created_at integer not null,
|
|
56
|
+
updated_at integer not null,
|
|
57
|
+
revoked_at integer,
|
|
58
|
+
metadata text
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
create index if not exists auth_credential_user_id_idx on auth_credential (user_id);
|
|
62
|
+
create unique index if not exists auth_credential_user_type_idx on auth_credential (user_id, type);`,
|
|
63
|
+
};
|
|
64
|
+
export const authStorageMigrations = [
|
|
65
|
+
authStorageMigration001,
|
|
66
|
+
authStorageMigration002,
|
|
67
|
+
];
|
|
37
68
|
//# sourceMappingURL=StorageMigrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageMigrations.js","sourceRoot":"","sources":["../src/StorageMigrations.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC3D,EAAE,EAAE,mBAAmB;IACvB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+FA+BwF;CAC9F,
|
|
1
|
+
{"version":3,"file":"StorageMigrations.js","sourceRoot":"","sources":["../src/StorageMigrations.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC3D,EAAE,EAAE,mBAAmB;IACvB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+FA+BwF;CAC9F,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC3D,EAAE,EAAE,oBAAoB;IACxB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;oGAwB6F;CACnG,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,uBAAuB;IACvB,uBAAuB;CACf,CAAC"}
|
package/dist/Testing.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import { Layer } from "effect";
|
|
2
|
-
|
|
2
|
+
import { Crypto } from "./Crypto.js";
|
|
3
|
+
import type { CryptoService } from "./Crypto.js";
|
|
4
|
+
import { PasswordHasher } from "./Password.js";
|
|
5
|
+
import type { PasswordHasherService } from "./Password.js";
|
|
6
|
+
export declare const makeTestCrypto: () => CryptoService;
|
|
7
|
+
export declare const CryptoTestLive: Layer.Layer<Crypto, never, never>;
|
|
8
|
+
export declare const makeTestPasswordHasher: () => PasswordHasherService;
|
|
9
|
+
export declare const PasswordHasherTestLive: Layer.Layer<PasswordHasher, never, never>;
|
|
10
|
+
export declare const CoreTestingLive: Layer.Layer<import("./AuditLog.js").AuditLog | Crypto | PasswordHasher | import("./Privacy.js").Privacy | import("./WaitUntil.js").WaitUntil, never, never>;
|
|
3
11
|
//# sourceMappingURL=Testing.d.ts.map
|
package/dist/Testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Testing.d.ts","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Testing.d.ts","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAY,MAAM,QAAQ,CAAC;AAGjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAY3D,eAAO,MAAM,cAAc,QAAO,aA+BjC,CAAC;AAEF,eAAO,MAAM,cAAc,mCAA0C,CAAC;AAEtE,eAAO,MAAM,sBAAsB,QAAO,qBAQtC,CAAC;AAEL,eAAO,MAAM,sBAAsB,2CAElC,CAAC;AAEF,eAAO,MAAM,eAAe,6JAM3B,CAAC"}
|
package/dist/Testing.js
CHANGED
|
@@ -1,6 +1,34 @@
|
|
|
1
|
-
import { Layer } from "effect";
|
|
1
|
+
import { Effect, Layer, Redacted } from "effect";
|
|
2
2
|
import { AuditLogNoopLive } from "./AuditLog.js";
|
|
3
|
+
import { Crypto } from "./Crypto.js";
|
|
4
|
+
import { PasswordHasher } from "./Password.js";
|
|
3
5
|
import { PrivacyTestLive } from "./Privacy.js";
|
|
4
6
|
import { WaitUntilNoopLive } from "./WaitUntil.js";
|
|
5
|
-
|
|
7
|
+
const bytesToString = (bytes) => [...bytes].join(",");
|
|
8
|
+
const valueToString = (value) => typeof value === "string" ? value : bytesToString(value);
|
|
9
|
+
const keyToString = (key) => key instanceof Uint8Array ? bytesToString(key) : Redacted.value(key);
|
|
10
|
+
export const makeTestCrypto = () => {
|
|
11
|
+
let counter = 0;
|
|
12
|
+
return Crypto.make({
|
|
13
|
+
randomBytes: (byteLength) => Effect.sync(() => {
|
|
14
|
+
counter += 1;
|
|
15
|
+
return Uint8Array.from({ length: byteLength }, (_, index) => (counter + index) % 256);
|
|
16
|
+
}),
|
|
17
|
+
randomToken: (byteLength = 32) => Effect.sync(() => {
|
|
18
|
+
counter += 1;
|
|
19
|
+
return `test-token-${byteLength}-${counter}`;
|
|
20
|
+
}),
|
|
21
|
+
digestSha256: (input) => Effect.succeed(`test-digest:${valueToString(input.data)}`),
|
|
22
|
+
hmacSha256: (input) => Effect.succeed(`test-hmac:${keyToString(input.key)}:${valueToString(input.data)}`),
|
|
23
|
+
timingSafeEqual: (input) => Effect.succeed(input.left.length === input.right.length &&
|
|
24
|
+
input.left.every((value, index) => value === input.right[index])),
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
export const CryptoTestLive = Layer.succeed(Crypto)(makeTestCrypto());
|
|
28
|
+
export const makeTestPasswordHasher = () => PasswordHasher.make({
|
|
29
|
+
hash: (input) => Effect.succeed(`test-hash:${Redacted.value(input.password)}`),
|
|
30
|
+
verify: (input) => Effect.succeed(input.hash === `test-hash:${Redacted.value(input.password)}`),
|
|
31
|
+
});
|
|
32
|
+
export const PasswordHasherTestLive = Layer.succeed(PasswordHasher)(makeTestPasswordHasher());
|
|
33
|
+
export const CoreTestingLive = Layer.mergeAll(AuditLogNoopLive, CryptoTestLive, PasswordHasherTestLive, PrivacyTestLive, WaitUntilNoopLive);
|
|
6
34
|
//# sourceMappingURL=Testing.js.map
|
package/dist/Testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Testing.js","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"Testing.js","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"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"}
|
package/dist/WaitUntil.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaitUntil.d.ts","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"WaitUntil.d.ts","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;;;;AAEtD,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;CAC7C;;AAED,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ,yBAAiB,SAAS,CAAC;IAClB,MAAM,IAAI,GAAI,SAAS,gBAAgB,KAAG,gBAC1B,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,sCAK7B,CAAC"}
|
package/dist/WaitUntil.js
CHANGED
|
@@ -7,6 +7,6 @@ export class WaitUntil extends Context.Service()("runtime/WaitUntil") {
|
|
|
7
7
|
WaitUntil.make = (service) => WaitUntil.of(service);
|
|
8
8
|
})(WaitUntil || (WaitUntil = {}));
|
|
9
9
|
export const WaitUntilNoopLive = Layer.succeed(WaitUntil)(WaitUntil.make({
|
|
10
|
-
waitUntil: (_effect) => Effect.asVoid(Effect.context())
|
|
10
|
+
waitUntil: (_effect) => Effect.asVoid(Effect.context()),
|
|
11
11
|
}));
|
|
12
12
|
//# sourceMappingURL=WaitUntil.js.map
|
package/dist/WaitUntil.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaitUntil.js","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"WaitUntil.js","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEtD,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAQL,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAC3E,mBAAmB,CACpB;CAAG;AAEJ,WAAiB,SAAS;IACX,cAAI,GAAG,CAAC,OAAyB,EAAoB,EAAE,CAClE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC,EAHgB,SAAS,KAAT,SAAS,QAGzB;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CACvD,SAAS,CAAC,IAAI,CAAC;IACb,SAAS,EAAE,CAAU,OAA+B,EAAE,EAAE,CACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAK,CAAC;CACrC,CAAC,CACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as Cloudflare from "alchemy/Cloudflare";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import * as Internal from "../../internal/RateLimitDurableObject.js";
|
|
4
|
+
export interface RateLimitDurableObjectFixedWindowInput {
|
|
5
|
+
readonly tokens: number;
|
|
6
|
+
readonly refillMillis: number;
|
|
7
|
+
readonly limit: number | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface RateLimitDurableObjectTokenBucketInput {
|
|
10
|
+
readonly tokens: number;
|
|
11
|
+
readonly limit: number;
|
|
12
|
+
readonly refillMillis: number;
|
|
13
|
+
readonly allowOverflow: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface RateLimitDurableObjectApi {
|
|
16
|
+
readonly fixedWindow: (input: RateLimitDurableObjectFixedWindowInput) => Effect.Effect<readonly [count: number, ttl: number], unknown>;
|
|
17
|
+
readonly tokenBucket: (input: RateLimitDurableObjectTokenBucketInput) => Effect.Effect<number, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface AlchemyRateLimitDurableObjectNamespace {
|
|
20
|
+
readonly getByName: (name: string) => RateLimitDurableObjectApi;
|
|
21
|
+
}
|
|
22
|
+
export interface RateLimitStoreDurableObjectLayerOptions {
|
|
23
|
+
readonly namespace: AlchemyRateLimitDurableObjectNamespace;
|
|
24
|
+
readonly prefix?: string;
|
|
25
|
+
}
|
|
26
|
+
declare const EffectAuthRateLimitDurableObject_base: Effect.Effect<Cloudflare.DurableObjectNamespace<EffectAuthRateLimitDurableObject>, never, Cloudflare.Worker> & (new (_: never) => Internal.RateLimitDurableObjectApi);
|
|
27
|
+
export declare class EffectAuthRateLimitDurableObject extends EffectAuthRateLimitDurableObject_base {
|
|
28
|
+
}
|
|
29
|
+
export declare const RateLimitDurableObject: Effect.Effect<AlchemyRateLimitDurableObjectNamespace>;
|
|
30
|
+
export declare const RateLimitStoreDurableObject: {
|
|
31
|
+
readonly layer: (options: RateLimitStoreDurableObjectLayerOptions) => import("effect/Layer").Layer<import("effect/unstable/persistence/RateLimiter").RateLimiterStore, never, never>;
|
|
32
|
+
};
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=RateLimitDurableObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.d.ts","sourceRoot":"","sources":["../../../src/alchemy/cloudflare/RateLimitDurableObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,QAAQ,MAAM,0CAA0C,CAAC;AAErE,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,sCAAsC,KAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,sCAAsC,KAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,yBAAyB,CAAC;CACjE;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,SAAS,EAAE,sCAAsC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;;AAiCD,qBAAa,gCAAiC,SAAQ,qCAWrD;CAAG;AAEJ,eAAO,MAAM,sBAAsB,EACc,MAAM,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;AAEvG,eAAO,MAAM,2BAA2B;8BACrB,uCAAuC;CAKhD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Cloudflare from "alchemy/Cloudflare";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import * as Internal from "../../internal/RateLimitDurableObject.js";
|
|
4
|
+
const fromAlchemyStorageOperations = (operations) => {
|
|
5
|
+
const storage = {
|
|
6
|
+
get: (key) => operations.get(key),
|
|
7
|
+
put: (key, value) => operations.put(key, value),
|
|
8
|
+
transaction: (body) => body(storage),
|
|
9
|
+
};
|
|
10
|
+
return storage;
|
|
11
|
+
};
|
|
12
|
+
const fromAlchemyDurableObjectStorage = (durableObjectStorage) => ({
|
|
13
|
+
...fromAlchemyStorageOperations(durableObjectStorage),
|
|
14
|
+
transaction: (body) => durableObjectStorage.transaction((transaction) => body(fromAlchemyStorageOperations(transaction)).pipe(Effect.orDie)),
|
|
15
|
+
});
|
|
16
|
+
export class EffectAuthRateLimitDurableObject extends Cloudflare.DurableObjectNamespace()("EffectAuthRateLimitDurableObject", Effect.gen(function* () {
|
|
17
|
+
return Effect.gen(function* () {
|
|
18
|
+
const state = yield* Cloudflare.DurableObjectState;
|
|
19
|
+
return Internal.makeRateLimitDurableObjectApi(fromAlchemyDurableObjectStorage(state.storage));
|
|
20
|
+
});
|
|
21
|
+
})) {
|
|
22
|
+
}
|
|
23
|
+
export const RateLimitDurableObject = EffectAuthRateLimitDurableObject;
|
|
24
|
+
export const RateLimitStoreDurableObject = {
|
|
25
|
+
layer: (options) => Internal.makeRateLimitDurableObjectStoreLayer({
|
|
26
|
+
namespace: options.namespace,
|
|
27
|
+
prefix: options.prefix,
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=RateLimitDurableObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.js","sourceRoot":"","sources":["../../../src/alchemy/cloudflare/RateLimitDurableObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,QAAQ,MAAM,0CAA0C,CAAC;AAsCrE,MAAM,4BAA4B,GAAG,CACnC,UAAiD,EACT,EAAE;IAC1C,MAAM,OAAO,GAA2C;QACtD,GAAG,EAAE,CAAc,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAI,GAAG,CAAC;QACzD,GAAG,EAAE,CAAI,GAAW,EAAE,KAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAC7D,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;KACrC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG,CACtC,oBAAqD,EACb,EAAE,CAAC,CAAC;IAC5C,GAAG,4BAA4B,CAAC,oBAAoB,CAAC;IACrD,WAAW,EAAE,CACX,IAE8B,EAC9B,EAAE,CACF,oBAAoB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAC/C,IAAI,CAAC,4BAA4B,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CACnE;CACJ,CAAC,CAAC;AAEH,MAAM,OAAO,gCAAiC,SAAQ,UAAU,CAAC,sBAAsB,EAAoC,CACzH,kCAAkC,EAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAEnD,OAAO,QAAQ,CAAC,6BAA6B,CAC3C,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH;CAAG;AAEJ,MAAM,CAAC,MAAM,sBAAsB,GACjC,gCAAoG,CAAC;AAEvG,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,KAAK,EAAE,CAAC,OAAgD,EAAE,EAAE,CAC1D,QAAQ,CAAC,oCAAoC,CAAC;QAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;CACI,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
export interface RateLimitDurableObjectFixedWindowInput {
|
|
3
|
+
readonly tokens: number;
|
|
4
|
+
readonly refillMillis: number;
|
|
5
|
+
readonly limit: number | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface RateLimitDurableObjectTokenBucketInput {
|
|
8
|
+
readonly tokens: number;
|
|
9
|
+
readonly limit: number;
|
|
10
|
+
readonly refillMillis: number;
|
|
11
|
+
readonly allowOverflow: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface RateLimitDurableObjectApi {
|
|
14
|
+
readonly fixedWindow: (input: RateLimitDurableObjectFixedWindowInput) => Effect.Effect<readonly [count: number, ttl: number], unknown>;
|
|
15
|
+
readonly tokenBucket: (input: RateLimitDurableObjectTokenBucketInput) => Effect.Effect<number, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface CloudflareRateLimitDurableObjectStorageOperations {
|
|
18
|
+
readonly get: <T = unknown>(key: string) => Promise<T | undefined>;
|
|
19
|
+
readonly put: <T>(key: string, value: T) => Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface CloudflareRateLimitDurableObjectStorage extends CloudflareRateLimitDurableObjectStorageOperations {
|
|
22
|
+
readonly transaction: <A>(body: (transaction: CloudflareRateLimitDurableObjectStorageOperations) => Promise<A>) => Promise<A>;
|
|
23
|
+
}
|
|
24
|
+
export type MaybePromise<T> = T | PromiseLike<T>;
|
|
25
|
+
export type CloudflareRateLimitDurableObjectFixedWindowOutput = readonly MaybePromise<number>[];
|
|
26
|
+
export interface CloudflareRateLimitDurableObjectStub {
|
|
27
|
+
readonly fixedWindow: (input: RateLimitDurableObjectFixedWindowInput) => MaybePromise<CloudflareRateLimitDurableObjectFixedWindowOutput>;
|
|
28
|
+
readonly tokenBucket: (input: RateLimitDurableObjectTokenBucketInput) => MaybePromise<number>;
|
|
29
|
+
}
|
|
30
|
+
export type CloudflareRateLimitDurableObjectNamespace<Id = unknown> = {
|
|
31
|
+
readonly getByName: (name: string) => CloudflareRateLimitDurableObjectStub;
|
|
32
|
+
} | {
|
|
33
|
+
readonly idFromName: (name: string) => Id;
|
|
34
|
+
readonly get: (id: Id) => CloudflareRateLimitDurableObjectStub;
|
|
35
|
+
};
|
|
36
|
+
export interface RateLimitStoreDurableObjectLayerOptions<Id = unknown> {
|
|
37
|
+
readonly namespace: CloudflareRateLimitDurableObjectNamespace<Id>;
|
|
38
|
+
readonly prefix?: string;
|
|
39
|
+
}
|
|
40
|
+
export type CloudflareDurableObjectBase = abstract new (...args: any[]) => object;
|
|
41
|
+
export declare const makeRateLimitDurableObjectApi: (storage: CloudflareRateLimitDurableObjectStorage) => RateLimitDurableObjectApi;
|
|
42
|
+
export declare const RateLimitDurableObject: <Base extends CloudflareDurableObjectBase>(Base: Base) => (abstract new (...args: any[]) => {
|
|
43
|
+
readonly "__#106@#api": RateLimitDurableObjectApi;
|
|
44
|
+
fixedWindow(input: RateLimitDurableObjectFixedWindowInput): Promise<readonly [count: number, ttl: number]>;
|
|
45
|
+
tokenBucket(input: RateLimitDurableObjectTokenBucketInput): Promise<number>;
|
|
46
|
+
}) & Base;
|
|
47
|
+
export declare const RateLimitStoreDurableObject: {
|
|
48
|
+
readonly layer: <Id>(options: RateLimitStoreDurableObjectLayerOptions<Id>) => import("effect/Layer").Layer<import("effect/unstable/persistence/RateLimiter").RateLimiterStore, never, never>;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=RateLimitDurableObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.d.ts","sourceRoot":"","sources":["../../src/cloudflare/RateLimitDurableObject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import * as Internal from "../internal/RateLimitDurableObject.js";
|
|
3
|
+
const fromCloudflareStorageOperations = (operations) => {
|
|
4
|
+
const storage = {
|
|
5
|
+
get: (key) => Effect.tryPromise(() => operations.get(key)),
|
|
6
|
+
put: (key, value) => Effect.tryPromise(() => operations.put(key, value)),
|
|
7
|
+
transaction: (body) => body(storage),
|
|
8
|
+
};
|
|
9
|
+
return storage;
|
|
10
|
+
};
|
|
11
|
+
const fromCloudflareDurableObjectStorage = (durableObjectStorage) => ({
|
|
12
|
+
...fromCloudflareStorageOperations(durableObjectStorage),
|
|
13
|
+
transaction: (body) => Effect.tryPromise(() => durableObjectStorage.transaction((transaction) => Effect.runPromise(body(fromCloudflareStorageOperations(transaction))))),
|
|
14
|
+
});
|
|
15
|
+
const getStubByName = (namespace, name) => "getByName" in namespace
|
|
16
|
+
? namespace.getByName(name)
|
|
17
|
+
: namespace.get(namespace.idFromName(name));
|
|
18
|
+
const fromCloudflareDurableObjectNamespace = (namespace) => ({
|
|
19
|
+
getByName: (name) => {
|
|
20
|
+
const stub = getStubByName(namespace, name);
|
|
21
|
+
return {
|
|
22
|
+
fixedWindow: (input) => Effect.tryPromise(async () => {
|
|
23
|
+
const result = await stub.fixedWindow(input);
|
|
24
|
+
const count = await result[0];
|
|
25
|
+
const ttl = await result[1];
|
|
26
|
+
return [count, ttl];
|
|
27
|
+
}),
|
|
28
|
+
tokenBucket: (input) => Effect.tryPromise(() => Promise.resolve(stub.tokenBucket(input))),
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
export const makeRateLimitDurableObjectApi = (storage) => Internal.makeRateLimitDurableObjectApi(fromCloudflareDurableObjectStorage(storage));
|
|
33
|
+
export const RateLimitDurableObject = (Base) => {
|
|
34
|
+
class EffectAuthRateLimitDurableObject extends Base {
|
|
35
|
+
#api = makeRateLimitDurableObjectApi(this.ctx.storage);
|
|
36
|
+
fixedWindow(input) {
|
|
37
|
+
return Effect.runPromise(this.#api.fixedWindow(input));
|
|
38
|
+
}
|
|
39
|
+
tokenBucket(input) {
|
|
40
|
+
return Effect.runPromise(this.#api.tokenBucket(input));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return EffectAuthRateLimitDurableObject;
|
|
44
|
+
};
|
|
45
|
+
export const RateLimitStoreDurableObject = {
|
|
46
|
+
layer: (options) => Internal.makeRateLimitDurableObjectStoreLayer({
|
|
47
|
+
namespace: fromCloudflareDurableObjectNamespace(options.namespace),
|
|
48
|
+
prefix: options.prefix,
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=RateLimitDurableObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.js","sourceRoot":"","sources":["../../src/cloudflare/RateLimitDurableObject.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
export declare const packageName: "@effect-auth/core";
|
|
2
2
|
export * from "./AuditLog.js";
|
|
3
|
+
export * from "./AuthConfig.js";
|
|
3
4
|
export * from "./AuthFlow.js";
|
|
5
|
+
export * from "./AuthKernel.js";
|
|
4
6
|
export * from "./Challenge.js";
|
|
5
7
|
export * from "./Crypto.js";
|
|
8
|
+
export * from "./EmailOtp.js";
|
|
9
|
+
export * from "./EmailVerification.js";
|
|
6
10
|
export * from "./Identifiers.js";
|
|
11
|
+
export * from "./Mailer.js";
|
|
12
|
+
export * from "./Password.js";
|
|
7
13
|
export * from "./Policy.js";
|
|
8
14
|
export * from "./Privacy.js";
|
|
9
15
|
export * from "./Sessions.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAG,mBAA4B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAG,mBAA4B,CAAC;AAExD,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
export const packageName = "@effect-auth/core";
|
|
2
2
|
export * from "./AuditLog.js";
|
|
3
|
+
export * from "./AuthConfig.js";
|
|
3
4
|
export * from "./AuthFlow.js";
|
|
5
|
+
export * from "./AuthKernel.js";
|
|
4
6
|
export * from "./Challenge.js";
|
|
5
7
|
export * from "./Crypto.js";
|
|
8
|
+
export * from "./EmailOtp.js";
|
|
9
|
+
export * from "./EmailVerification.js";
|
|
6
10
|
export * from "./Identifiers.js";
|
|
11
|
+
export * from "./Mailer.js";
|
|
12
|
+
export * from "./Password.js";
|
|
7
13
|
export * from "./Policy.js";
|
|
8
14
|
export * from "./Privacy.js";
|
|
9
15
|
export * from "./Sessions.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,mBAA4B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,mBAA4B,CAAC;AAExD,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Effect, Layer } from "effect";
|
|
2
|
+
import { RateLimiter as PersistenceRateLimiter } from "effect/unstable/persistence";
|
|
3
|
+
export interface RateLimitDurableObjectFixedWindowInput {
|
|
4
|
+
readonly tokens: number;
|
|
5
|
+
readonly refillMillis: number;
|
|
6
|
+
readonly limit: number | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface RateLimitDurableObjectTokenBucketInput {
|
|
9
|
+
readonly tokens: number;
|
|
10
|
+
readonly limit: number;
|
|
11
|
+
readonly refillMillis: number;
|
|
12
|
+
readonly allowOverflow: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface RateLimitDurableObjectStorage {
|
|
15
|
+
readonly get: <T = unknown>(key: string) => Effect.Effect<T | undefined, unknown>;
|
|
16
|
+
readonly put: <T>(key: string, value: T) => Effect.Effect<void, unknown>;
|
|
17
|
+
readonly transaction: <A>(body: (transaction: RateLimitDurableObjectStorage) => Effect.Effect<A, unknown>) => Effect.Effect<A, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface RateLimitDurableObjectApi {
|
|
20
|
+
readonly fixedWindow: (input: RateLimitDurableObjectFixedWindowInput) => Effect.Effect<readonly [count: number, ttl: number], unknown>;
|
|
21
|
+
readonly tokenBucket: (input: RateLimitDurableObjectTokenBucketInput) => Effect.Effect<number, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export interface RateLimitDurableObjectNamespace {
|
|
24
|
+
readonly getByName: (name: string) => RateLimitDurableObjectApi;
|
|
25
|
+
}
|
|
26
|
+
export interface RateLimitDurableObjectStoreOptions {
|
|
27
|
+
readonly namespace: RateLimitDurableObjectNamespace;
|
|
28
|
+
readonly prefix?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare const makeRateLimitDurableObjectApi: (storage: RateLimitDurableObjectStorage) => RateLimitDurableObjectApi;
|
|
31
|
+
export declare const makeRateLimitDurableObjectStoreLayer: (options: RateLimitDurableObjectStoreOptions) => Layer.Layer<PersistenceRateLimiter.RateLimiterStore>;
|
|
32
|
+
//# sourceMappingURL=RateLimitDurableObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.d.ts","sourceRoot":"","sources":["../../src/internal/RateLimitDurableObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,WAAW,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EACxB,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EACtB,IAAI,EAAE,CACJ,WAAW,EAAE,6BAA6B,KACvC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,sCAAsC,KAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,sCAAsC,KAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,yBAAyB,CAAC;CACjE;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAC;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AA4BD,eAAO,MAAM,6BAA6B,GACxC,SAAS,6BAA6B,KACrC,yBA+DD,CAAC;AAEH,eAAO,MAAM,oCAAoC,GAC/C,SAAS,kCAAkC,KAC1C,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,gBAAgB,CA2BrD,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Clock, Duration, Effect, Layer } from "effect";
|
|
2
|
+
import { RateLimiter as PersistenceRateLimiter } from "effect/unstable/persistence";
|
|
3
|
+
const fixedWindowKey = "fixed-window";
|
|
4
|
+
const tokenBucketKey = "token-bucket";
|
|
5
|
+
const nonZeroMillis = (millis) => Math.max(1, millis);
|
|
6
|
+
const storeError = (operation, cause) => new PersistenceRateLimiter.RateLimiterError({
|
|
7
|
+
reason: new PersistenceRateLimiter.RateLimitStoreError({
|
|
8
|
+
message: `Cloudflare Durable Object rate limit store failed during ${operation}`,
|
|
9
|
+
cause,
|
|
10
|
+
}),
|
|
11
|
+
});
|
|
12
|
+
export const makeRateLimitDurableObjectApi = (storage) => ({
|
|
13
|
+
fixedWindow: (input) => storage.transaction((transaction) => Effect.gen(function* () {
|
|
14
|
+
const now = yield* Clock.currentTimeMillis;
|
|
15
|
+
const refillMillis = nonZeroMillis(input.refillMillis);
|
|
16
|
+
let counter = yield* transaction.get(fixedWindowKey);
|
|
17
|
+
if (!counter || counter.expiresAt <= now) {
|
|
18
|
+
counter = { count: 0, expiresAt: now };
|
|
19
|
+
}
|
|
20
|
+
const nextCount = counter.count + input.tokens;
|
|
21
|
+
const currentTtl = Math.max(0, counter.expiresAt - now);
|
|
22
|
+
if (input.limit !== undefined && nextCount > input.limit) {
|
|
23
|
+
return [nextCount, currentTtl];
|
|
24
|
+
}
|
|
25
|
+
const next = {
|
|
26
|
+
count: nextCount,
|
|
27
|
+
expiresAt: counter.expiresAt + refillMillis * input.tokens,
|
|
28
|
+
};
|
|
29
|
+
yield* transaction.put(fixedWindowKey, next);
|
|
30
|
+
return [next.count, Math.max(0, next.expiresAt - now)];
|
|
31
|
+
})),
|
|
32
|
+
tokenBucket: (input) => storage.transaction((transaction) => Effect.gen(function* () {
|
|
33
|
+
const now = yield* Clock.currentTimeMillis;
|
|
34
|
+
const refillMillis = nonZeroMillis(input.refillMillis);
|
|
35
|
+
let bucket = yield* transaction.get(tokenBucketKey);
|
|
36
|
+
if (!bucket) {
|
|
37
|
+
bucket = { tokens: input.limit, lastRefill: now };
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const elapsed = now - bucket.lastRefill;
|
|
41
|
+
const tokensToAdd = Math.floor(elapsed / refillMillis);
|
|
42
|
+
if (tokensToAdd > 0) {
|
|
43
|
+
bucket = {
|
|
44
|
+
tokens: Math.min(input.limit, bucket.tokens + tokensToAdd),
|
|
45
|
+
lastRefill: bucket.lastRefill + tokensToAdd * refillMillis,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const remaining = bucket.tokens - input.tokens;
|
|
50
|
+
if (input.allowOverflow || remaining >= 0) {
|
|
51
|
+
yield* transaction.put(tokenBucketKey, {
|
|
52
|
+
tokens: remaining,
|
|
53
|
+
lastRefill: bucket.lastRefill,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return remaining;
|
|
57
|
+
})),
|
|
58
|
+
});
|
|
59
|
+
export const makeRateLimitDurableObjectStoreLayer = (options) => {
|
|
60
|
+
const prefix = options.prefix ?? "effect-auth:rate-limit:";
|
|
61
|
+
const object = (key) => options.namespace.getByName(`${prefix}${key}`);
|
|
62
|
+
return Layer.sync(PersistenceRateLimiter.RateLimiterStore, () => PersistenceRateLimiter.RateLimiterStore.of({
|
|
63
|
+
fixedWindow: (input) => object(input.key)
|
|
64
|
+
.fixedWindow({
|
|
65
|
+
tokens: input.tokens,
|
|
66
|
+
refillMillis: Duration.toMillis(input.refillRate),
|
|
67
|
+
limit: input.limit,
|
|
68
|
+
})
|
|
69
|
+
.pipe(Effect.mapError((cause) => storeError("fixedWindow", cause))),
|
|
70
|
+
tokenBucket: (input) => object(input.key)
|
|
71
|
+
.tokenBucket({
|
|
72
|
+
tokens: input.tokens,
|
|
73
|
+
limit: input.limit,
|
|
74
|
+
refillMillis: Duration.toMillis(input.refillRate),
|
|
75
|
+
allowOverflow: input.allowOverflow,
|
|
76
|
+
})
|
|
77
|
+
.pipe(Effect.mapError((cause) => storeError("tokenBucket", cause))),
|
|
78
|
+
}));
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=RateLimitDurableObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimitDurableObject.js","sourceRoot":"","sources":["../../src/internal/RateLimitDurableObject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
create table if not exists auth_user (
|
|
2
|
+
id text primary key,
|
|
3
|
+
email text not null,
|
|
4
|
+
email_verified integer not null,
|
|
5
|
+
created_at integer not null,
|
|
6
|
+
updated_at integer not null,
|
|
7
|
+
disabled_at integer,
|
|
8
|
+
metadata text
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
create unique index if not exists auth_user_email_idx on auth_user (email);
|
|
12
|
+
|
|
13
|
+
create table if not exists auth_credential (
|
|
14
|
+
id text primary key,
|
|
15
|
+
user_id text not null,
|
|
16
|
+
type text not null,
|
|
17
|
+
password_hash text,
|
|
18
|
+
created_at integer not null,
|
|
19
|
+
updated_at integer not null,
|
|
20
|
+
revoked_at integer,
|
|
21
|
+
metadata text
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
create index if not exists auth_credential_user_id_idx on auth_credential (user_id);
|
|
25
|
+
create unique index if not exists auth_credential_user_type_idx on auth_credential (user_id, type);
|