@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.
Files changed (147) hide show
  1. package/README.md +679 -36
  2. package/dist/AuditLog.d.ts +3 -0
  3. package/dist/AuditLog.d.ts.map +1 -1
  4. package/dist/AuditLog.js +6 -3
  5. package/dist/AuditLog.js.map +1 -1
  6. package/dist/AuthConfig.d.ts +51 -0
  7. package/dist/AuthConfig.d.ts.map +1 -0
  8. package/dist/AuthConfig.js +56 -0
  9. package/dist/AuthConfig.js.map +1 -0
  10. package/dist/AuthFlow.d.ts +295 -35
  11. package/dist/AuthFlow.d.ts.map +1 -1
  12. package/dist/AuthFlow.js +133 -6
  13. package/dist/AuthFlow.js.map +1 -1
  14. package/dist/AuthKernel.d.ts +3 -0
  15. package/dist/AuthKernel.d.ts.map +1 -0
  16. package/dist/AuthKernel.js +9 -0
  17. package/dist/AuthKernel.js.map +1 -0
  18. package/dist/Challenge.d.ts +22 -3
  19. package/dist/Challenge.d.ts.map +1 -1
  20. package/dist/Challenge.js +160 -1
  21. package/dist/Challenge.js.map +1 -1
  22. package/dist/Client.d.ts +36 -0
  23. package/dist/Client.d.ts.map +1 -0
  24. package/dist/Client.js +55 -0
  25. package/dist/Client.js.map +1 -0
  26. package/dist/Crypto.d.ts +9 -1
  27. package/dist/Crypto.d.ts.map +1 -1
  28. package/dist/Crypto.js +65 -1
  29. package/dist/Crypto.js.map +1 -1
  30. package/dist/D1Kysely.d.ts +43 -0
  31. package/dist/D1Kysely.d.ts.map +1 -0
  32. package/dist/D1Kysely.js +78 -0
  33. package/dist/D1Kysely.js.map +1 -0
  34. package/dist/EffectQbSqliteStorage.d.ts +183 -0
  35. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  36. package/dist/EffectQbSqliteStorage.js +446 -0
  37. package/dist/EffectQbSqliteStorage.js.map +1 -0
  38. package/dist/EmailOtp.d.ts +117 -0
  39. package/dist/EmailOtp.d.ts.map +1 -0
  40. package/dist/EmailOtp.js +279 -0
  41. package/dist/EmailOtp.js.map +1 -0
  42. package/dist/EmailVerification.d.ts +121 -0
  43. package/dist/EmailVerification.d.ts.map +1 -0
  44. package/dist/EmailVerification.js +201 -0
  45. package/dist/EmailVerification.js.map +1 -0
  46. package/dist/HttpApi/Api.d.ts +175 -0
  47. package/dist/HttpApi/Api.d.ts.map +1 -0
  48. package/dist/HttpApi/Api.js +340 -0
  49. package/dist/HttpApi/Api.js.map +1 -0
  50. package/dist/HttpApi/Endpoints.d.ts +92 -0
  51. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  52. package/dist/HttpApi/Endpoints.js +48 -0
  53. package/dist/HttpApi/Endpoints.js.map +1 -0
  54. package/dist/HttpApi/Errors.d.ts +82 -0
  55. package/dist/HttpApi/Errors.d.ts.map +1 -0
  56. package/dist/HttpApi/Errors.js +184 -0
  57. package/dist/HttpApi/Errors.js.map +1 -0
  58. package/dist/HttpApi/Schemas.d.ts +86 -0
  59. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  60. package/dist/HttpApi/Schemas.js +63 -0
  61. package/dist/HttpApi/Schemas.js.map +1 -0
  62. package/dist/HttpApi/Security.d.ts +147 -0
  63. package/dist/HttpApi/Security.d.ts.map +1 -0
  64. package/dist/HttpApi/Security.js +439 -0
  65. package/dist/HttpApi/Security.js.map +1 -0
  66. package/dist/HttpApi/Transport.d.ts +31 -0
  67. package/dist/HttpApi/Transport.d.ts.map +1 -0
  68. package/dist/HttpApi/Transport.js +169 -0
  69. package/dist/HttpApi/Transport.js.map +1 -0
  70. package/dist/HttpApi/index.d.ts +8 -0
  71. package/dist/HttpApi/index.d.ts.map +1 -0
  72. package/dist/HttpApi/index.js +7 -0
  73. package/dist/HttpApi/index.js.map +1 -0
  74. package/dist/HttpApi.d.ts +2 -0
  75. package/dist/HttpApi.d.ts.map +1 -0
  76. package/dist/HttpApi.js +2 -0
  77. package/dist/HttpApi.js.map +1 -0
  78. package/dist/Identifiers.d.ts.map +1 -1
  79. package/dist/Identifiers.js.map +1 -1
  80. package/dist/Internal.d.ts +7 -0
  81. package/dist/Internal.d.ts.map +1 -0
  82. package/dist/Internal.js +12 -0
  83. package/dist/Internal.js.map +1 -0
  84. package/dist/KyselyStorage.d.ts +67 -0
  85. package/dist/KyselyStorage.d.ts.map +1 -0
  86. package/dist/KyselyStorage.js +366 -0
  87. package/dist/KyselyStorage.js.map +1 -0
  88. package/dist/Mailer.d.ts +116 -0
  89. package/dist/Mailer.d.ts.map +1 -0
  90. package/dist/Mailer.js +101 -0
  91. package/dist/Mailer.js.map +1 -0
  92. package/dist/Password.d.ts +107 -0
  93. package/dist/Password.d.ts.map +1 -0
  94. package/dist/Password.js +252 -0
  95. package/dist/Password.js.map +1 -0
  96. package/dist/Policy.d.ts +7 -4
  97. package/dist/Policy.d.ts.map +1 -1
  98. package/dist/Policy.js +28 -5
  99. package/dist/Policy.js.map +1 -1
  100. package/dist/Privacy.d.ts +18 -0
  101. package/dist/Privacy.d.ts.map +1 -1
  102. package/dist/Privacy.js +63 -3
  103. package/dist/Privacy.js.map +1 -1
  104. package/dist/RateLimiter.d.ts +104 -0
  105. package/dist/RateLimiter.d.ts.map +1 -0
  106. package/dist/RateLimiter.js +118 -0
  107. package/dist/RateLimiter.js.map +1 -0
  108. package/dist/Sessions.d.ts +85 -11
  109. package/dist/Sessions.d.ts.map +1 -1
  110. package/dist/Sessions.js +424 -1
  111. package/dist/Sessions.js.map +1 -1
  112. package/dist/Storage.d.ts +162 -0
  113. package/dist/Storage.d.ts.map +1 -0
  114. package/dist/Storage.js +27 -0
  115. package/dist/Storage.js.map +1 -0
  116. package/dist/StorageMigrations.d.ts +8 -0
  117. package/dist/StorageMigrations.d.ts.map +1 -0
  118. package/dist/StorageMigrations.js +68 -0
  119. package/dist/StorageMigrations.js.map +1 -0
  120. package/dist/Testing.d.ts +9 -1
  121. package/dist/Testing.d.ts.map +1 -1
  122. package/dist/Testing.js +30 -2
  123. package/dist/Testing.js.map +1 -1
  124. package/dist/WaitUntil.d.ts +3 -0
  125. package/dist/WaitUntil.d.ts.map +1 -1
  126. package/dist/WaitUntil.js +6 -3
  127. package/dist/WaitUntil.js.map +1 -1
  128. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  129. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  130. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  131. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  132. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  133. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  134. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  135. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  136. package/dist/index.d.ts +7 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +7 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  141. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  142. package/dist/internal/RateLimitDurableObject.js +80 -0
  143. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  144. package/migrations/0001_auth_storage.sql +32 -0
  145. package/migrations/0002_auth_password.sql +25 -0
  146. package/package.json +97 -16
  147. package/LICENSE +0 -21
@@ -0,0 +1,27 @@
1
+ import { Context, Data } from "effect";
2
+ export class StorageError extends Data.TaggedError("StorageError") {
3
+ }
4
+ (function (StorageError) {
5
+ StorageError.fromUnknown = (entity, operation, cause, message = `${entity} ${operation} failed`) => new StorageError({ entity, operation, message, cause });
6
+ })(StorageError || (StorageError = {}));
7
+ export class UserStore extends Context.Service()("auth/UserStore") {
8
+ }
9
+ (function (UserStore) {
10
+ UserStore.make = (service) => UserStore.of(service);
11
+ })(UserStore || (UserStore = {}));
12
+ export class CredentialStore extends Context.Service()("auth/CredentialStore") {
13
+ }
14
+ (function (CredentialStore) {
15
+ CredentialStore.make = (service) => CredentialStore.of(service);
16
+ })(CredentialStore || (CredentialStore = {}));
17
+ export class SessionStore extends Context.Service()("auth/SessionStore") {
18
+ }
19
+ (function (SessionStore) {
20
+ SessionStore.make = (service) => SessionStore.of(service);
21
+ })(SessionStore || (SessionStore = {}));
22
+ export class VerificationStore extends Context.Service()("auth/VerificationStore") {
23
+ }
24
+ (function (VerificationStore) {
25
+ VerificationStore.make = (service) => VerificationStore.of(service);
26
+ })(VerificationStore || (VerificationStore = {}));
27
+ //# sourceMappingURL=Storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Storage.js","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiCvC,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAK/D;CAAG;AAEL,WAAiB,YAAY;IACd,wBAAW,GAAG,CACzB,MAAqB,EACrB,SAA2B,EAC3B,KAAc,EACd,OAAO,GAAG,GAAG,MAAM,IAAI,SAAS,SAAS,EAC3B,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,CAAC,EAPgB,YAAY,KAAZ,YAAY,QAO5B;AAgCD,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAC3E,gBAAgB,CACjB;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;AAuBD,MAAM,OAAO,eAAgB,SAAQ,OAAO,CAAC,OAAO,EAGjD,CAAC,sBAAsB,CAAC;CAAG;AAE9B,WAAiB,eAAe;IACjB,oBAAI,GAAG,CAClB,OAA+B,EACP,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC,EAJgB,eAAe,KAAf,eAAe,QAI/B;AA0ED,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,OAAO,EAG9C,CAAC,mBAAmB,CAAC;CAAG;AAE3B,WAAiB,YAAY;IACd,iBAAI,GAAG,CAAC,OAA4B,EAAuB,EAAE,CACxE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,EAHgB,YAAY,KAAZ,YAAY,QAG5B;AA0CD,MAAM,OAAO,iBAAkB,SAAQ,OAAO,CAAC,OAAO,EAGnD,CAAC,wBAAwB,CAAC;CAAG;AAEhC,WAAiB,iBAAiB;IACnB,sBAAI,GAAG,CAClB,OAAiC,EACP,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC,EAJgB,iBAAiB,KAAjB,iBAAiB,QAIjC"}
@@ -0,0 +1,8 @@
1
+ export interface AuthStorageMigration {
2
+ readonly id: string;
3
+ readonly sql: string;
4
+ }
5
+ export declare const authStorageMigration001: AuthStorageMigration;
6
+ export declare const authStorageMigration002: AuthStorageMigration;
7
+ export declare const authStorageMigrations: readonly [AuthStorageMigration, AuthStorageMigration];
8
+ //# sourceMappingURL=StorageMigrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageMigrations.d.ts","sourceRoot":"","sources":["../src/StorageMigrations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,uBAAuB,EAAE,oBAkCrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,oBA2BrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,uDAGxB,CAAC"}
@@ -0,0 +1,68 @@
1
+ export const authStorageMigration001 = {
2
+ id: "0001_auth_storage",
3
+ sql: `create table if not exists auth_session (
4
+ id text primary key,
5
+ user_id text not null,
6
+ secret_hash text not null,
7
+ created_at integer not null,
8
+ expires_at integer not null,
9
+ auth_time integer not null,
10
+ aal text not null,
11
+ amr text not null,
12
+ mfa_verified_at integer,
13
+ metadata text,
14
+ revoked_at integer,
15
+ last_seen_at integer,
16
+ rotated_at integer
17
+ );
18
+
19
+ create index if not exists auth_session_user_id_idx on auth_session (user_id);
20
+ create index if not exists auth_session_expires_at_idx on auth_session (expires_at);
21
+
22
+ create table if not exists auth_verification (
23
+ id text primary key,
24
+ type text not null,
25
+ subject text not null,
26
+ secret_hash text,
27
+ created_at integer not null,
28
+ expires_at integer not null,
29
+ metadata text,
30
+ consumed_at integer
31
+ );
32
+
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);`,
35
+ };
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
+ ];
68
+ //# sourceMappingURL=StorageMigrations.js.map
@@ -0,0 +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,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
- export declare const CoreTestingLive: Layer.Layer<import("./AuditLog.js").AuditLog | import("./Privacy.js").Privacy | import("./WaitUntil.js").WaitUntil, never, never>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"Testing.d.ts","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAM9B,eAAO,MAAM,eAAe,mIAI3B,CAAA"}
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
- export const CoreTestingLive = Layer.mergeAll(AuditLogNoopLive, PrivacyTestLive, WaitUntilNoopLive);
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
@@ -1 +1 @@
1
- {"version":3,"file":"Testing.js","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAC3C,gBAAgB,EAChB,eAAe,EACf,iBAAiB,CAClB,CAAA"}
1
+ {"version":3,"file":"Testing.js","sourceRoot":"","sources":["../src/Testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAU,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1E,MAAM,aAAa,GAAG,CAAC,KAA0B,EAAU,EAAE,CAC3D,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,GAAc,EAAU,EAAE,CAC7C,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAkB,EAAE;IAChD,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,MAAM,CAAC,IAAI,CAAC;QACjB,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,OAAO,IAAI,CAAC,CAAC;YAEb,OAAO,UAAU,CAAC,IAAI,CACpB,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CACtC,CAAC;QACJ,CAAC,CAAC;QACJ,WAAW,EAAE,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,CAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,OAAO,IAAI,CAAC,CAAC;YAEb,OAAO,cAAc,UAAU,IAAI,OAAO,EAAE,CAAC;QAC/C,CAAC,CAAC;QACJ,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACtB,MAAM,CAAC,OAAO,CAAC,eAAe,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACpB,MAAM,CAAC,OAAO,CACZ,aAAa,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CACnE;QACH,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACnE;KACJ,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAA0B,EAAE,CAChE,cAAc,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,MAAM,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,KAAK,aAAa,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAC7D;CACJ,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CACjE,sBAAsB,EAAE,CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAC3C,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,iBAAiB,CAClB,CAAC"}
@@ -13,6 +13,9 @@ export interface WaitUntilService {
13
13
  declare const WaitUntil_base: Context.ServiceClass<WaitUntil, "runtime/WaitUntil", WaitUntilService>;
14
14
  export declare class WaitUntil extends WaitUntil_base {
15
15
  }
16
+ export declare namespace WaitUntil {
17
+ const make: (service: WaitUntilService) => WaitUntilService;
18
+ }
16
19
  export declare const WaitUntilNoopLive: Layer.Layer<WaitUntil, never, never>;
17
20
  export {};
18
21
  //# sourceMappingURL=WaitUntil.d.ts.map
@@ -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,CAAA;;;;AAErD,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;CAAG;AAEL,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;CACxG;;AAED,qBAAa,SAAU,SAAQ,cAAmE;CAAG;AAErG,eAAO,MAAM,iBAAiB,sCAE5B,CAAA"}
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
@@ -3,7 +3,10 @@ export class WaitUntilError extends Data.TaggedError("WaitUntilError") {
3
3
  }
4
4
  export class WaitUntil extends Context.Service()("runtime/WaitUntil") {
5
5
  }
6
- export const WaitUntilNoopLive = Layer.succeed(WaitUntil)({
7
- waitUntil: (_effect) => Effect.asVoid(Effect.context())
8
- });
6
+ (function (WaitUntil) {
7
+ WaitUntil.make = (service) => WaitUntil.of(service);
8
+ })(WaitUntil || (WaitUntil = {}));
9
+ export const WaitUntilNoopLive = Layer.succeed(WaitUntil)(WaitUntil.make({
10
+ waitUntil: (_effect) => Effect.asVoid(Effect.context()),
11
+ }));
9
12
  //# sourceMappingURL=WaitUntil.js.map
@@ -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,CAAA;AAErD,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAML,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAAC,mBAAmB,CAAC;CAAG;AAErG,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,SAAS,EAAE,CAAU,OAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAK,CAAC;CAC5F,CAAC,CAAA"}
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,QAAQ,MAAM,uCAAuC,CAAC;AA8ElE,MAAM,+BAA+B,GAAG,CACtC,UAA6D,EACrB,EAAE;IAC1C,MAAM,OAAO,GAA2C;QACtD,GAAG,EAAE,CAAc,GAAW,EAAE,EAAE,CAChC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;QACjD,GAAG,EAAE,CAAI,GAAW,EAAE,KAAQ,EAAE,EAAE,CAChC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;KACrC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,kCAAkC,GAAG,CACzC,oBAA6D,EACrB,EAAE,CAAC,CAAC;IAC5C,GAAG,+BAA+B,CAAC,oBAAoB,CAAC;IACxD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CACrB,oBAAoB,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAC/C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,CACtE,CACF;CACJ,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CACpB,SAAwD,EACxD,IAAY,EAC0B,EAAE,CACxC,WAAW,IAAI,SAAS;IACtB,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IAC3B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAEhD,MAAM,oCAAoC,GAAG,CAC3C,SAAwD,EACd,EAAE,CAAC,CAAC;IAC9C,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAE5C,OAAO;YACL,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;gBAE5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAU,CAAC;YAC/B,CAAC,CAAC;YACJ,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CACrB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;SACpE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,OAAgD,EACrB,EAAE,CAC7B,QAAQ,CAAC,6BAA6B,CACpC,kCAAkC,CAAC,OAAO,CAAC,CAC5C,CAAC;AAEJ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAGpC,IAAU,EACV,EAAE;IACF,MAAe,gCACb,SAAQ,IAAI;QAGH,IAAI,GAAG,6BAA6B,CAC1C,IAAsD,CAAC,GAAG,CAAC,OAAO,CACpE,CAAC;QAEF,WAAW,CACT,KAA6C;YAE7C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,WAAW,CACT,KAA6C;YAE7C,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,CAAC;KACF;IAED,OAAO,gCAAgC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,KAAK,EAAE,CAAK,OAAoD,EAAE,EAAE,CAClE,QAAQ,CAAC,oCAAoC,CAAC;QAC5C,SAAS,EAAE,oCAAoC,CAAC,OAAO,CAAC,SAAS,CAAC;QAClE,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;CACI,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,18 @@
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";
16
+ export * from "./Storage.js";
10
17
  export * from "./WaitUntil.js";
11
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,EAAG,mBAA4B,CAAA;AAEvD,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA"}
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,11 +1,18 @@
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";
16
+ export * from "./Storage.js";
10
17
  export * from "./WaitUntil.js";
11
18
  //# sourceMappingURL=index.js.map
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,CAAA;AAEvD,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA"}
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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"}