@effect-auth/core 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (227) hide show
  1. package/README.md +728 -72
  2. package/dist/ApiKey.d.ts +207 -0
  3. package/dist/ApiKey.d.ts.map +1 -0
  4. package/dist/ApiKey.js +275 -0
  5. package/dist/ApiKey.js.map +1 -0
  6. package/dist/AuditLog.d.ts +275 -1
  7. package/dist/AuditLog.d.ts.map +1 -1
  8. package/dist/AuditLog.js +213 -1
  9. package/dist/AuditLog.js.map +1 -1
  10. package/dist/AuthConfig.d.ts +42 -0
  11. package/dist/AuthConfig.d.ts.map +1 -0
  12. package/dist/AuthConfig.js +43 -0
  13. package/dist/AuthConfig.js.map +1 -0
  14. package/dist/AuthFlow.d.ts +462 -36
  15. package/dist/AuthFlow.d.ts.map +1 -1
  16. package/dist/AuthFlow.js +657 -5
  17. package/dist/AuthFlow.js.map +1 -1
  18. package/dist/AuthKernel.d.ts +3 -0
  19. package/dist/AuthKernel.d.ts.map +1 -0
  20. package/dist/AuthKernel.js +9 -0
  21. package/dist/AuthKernel.js.map +1 -0
  22. package/dist/Challenge.d.ts +24 -4
  23. package/dist/Challenge.d.ts.map +1 -1
  24. package/dist/Challenge.js +167 -1
  25. package/dist/Challenge.js.map +1 -1
  26. package/dist/Client.d.ts +378 -0
  27. package/dist/Client.d.ts.map +1 -0
  28. package/dist/Client.js +768 -0
  29. package/dist/Client.js.map +1 -0
  30. package/dist/Crypto.d.ts +6 -1
  31. package/dist/Crypto.d.ts.map +1 -1
  32. package/dist/Crypto.js +62 -1
  33. package/dist/Crypto.js.map +1 -1
  34. package/dist/EffectQbSqliteStorage.d.ts +600 -0
  35. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  36. package/dist/EffectQbSqliteStorage.js +1637 -0
  37. package/dist/EffectQbSqliteStorage.js.map +1 -0
  38. package/dist/EmailOtp.d.ts +120 -0
  39. package/dist/EmailOtp.d.ts.map +1 -0
  40. package/dist/EmailOtp.js +286 -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 +200 -0
  45. package/dist/EmailVerification.js.map +1 -0
  46. package/dist/HttpApi/Api.d.ts +1956 -0
  47. package/dist/HttpApi/Api.d.ts.map +1 -0
  48. package/dist/HttpApi/Api.js +2325 -0
  49. package/dist/HttpApi/Api.js.map +1 -0
  50. package/dist/HttpApi/Endpoints.d.ts +945 -0
  51. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  52. package/dist/HttpApi/Endpoints.js +373 -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 +1113 -0
  59. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  60. package/dist/HttpApi/Schemas.js +734 -0
  61. package/dist/HttpApi/Schemas.js.map +1 -0
  62. package/dist/HttpApi/Security.d.ts +159 -0
  63. package/dist/HttpApi/Security.d.ts.map +1 -0
  64. package/dist/HttpApi/Security.js +530 -0
  65. package/dist/HttpApi/Security.js.map +1 -0
  66. package/dist/HttpApi/Transport.d.ts +65 -0
  67. package/dist/HttpApi/Transport.d.ts.map +1 -0
  68. package/dist/HttpApi/Transport.js +311 -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/Jwt.d.ts +271 -0
  85. package/dist/Jwt.d.ts.map +1 -0
  86. package/dist/Jwt.js +512 -0
  87. package/dist/Jwt.js.map +1 -0
  88. package/dist/LoginApproval.d.ts +314 -0
  89. package/dist/LoginApproval.d.ts.map +1 -0
  90. package/dist/LoginApproval.js +551 -0
  91. package/dist/LoginApproval.js.map +1 -0
  92. package/dist/LoginNotification.d.ts +183 -0
  93. package/dist/LoginNotification.d.ts.map +1 -0
  94. package/dist/LoginNotification.js +329 -0
  95. package/dist/LoginNotification.js.map +1 -0
  96. package/dist/LoginRisk.d.ts +73 -0
  97. package/dist/LoginRisk.d.ts.map +1 -0
  98. package/dist/LoginRisk.js +57 -0
  99. package/dist/LoginRisk.js.map +1 -0
  100. package/dist/MagicLink.d.ts +85 -0
  101. package/dist/MagicLink.d.ts.map +1 -0
  102. package/dist/MagicLink.js +206 -0
  103. package/dist/MagicLink.js.map +1 -0
  104. package/dist/Mailer.d.ts +147 -0
  105. package/dist/Mailer.d.ts.map +1 -0
  106. package/dist/Mailer.js +208 -0
  107. package/dist/Mailer.js.map +1 -0
  108. package/dist/OAuth.d.ts +934 -0
  109. package/dist/OAuth.d.ts.map +1 -0
  110. package/dist/OAuth.js +1661 -0
  111. package/dist/OAuth.js.map +1 -0
  112. package/dist/Passkey.d.ts +334 -0
  113. package/dist/Passkey.d.ts.map +1 -0
  114. package/dist/Passkey.js +422 -0
  115. package/dist/Passkey.js.map +1 -0
  116. package/dist/PasskeySimpleWebAuthn.d.ts +11 -0
  117. package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -0
  118. package/dist/PasskeySimpleWebAuthn.js +181 -0
  119. package/dist/PasskeySimpleWebAuthn.js.map +1 -0
  120. package/dist/Password.d.ts +237 -0
  121. package/dist/Password.d.ts.map +1 -0
  122. package/dist/Password.js +641 -0
  123. package/dist/Password.js.map +1 -0
  124. package/dist/Policy.d.ts +7 -4
  125. package/dist/Policy.d.ts.map +1 -1
  126. package/dist/Policy.js +28 -5
  127. package/dist/Policy.js.map +1 -1
  128. package/dist/Privacy.d.ts +15 -0
  129. package/dist/Privacy.d.ts.map +1 -1
  130. package/dist/Privacy.js +58 -1
  131. package/dist/Privacy.js.map +1 -1
  132. package/dist/RateLimiter.d.ts +104 -0
  133. package/dist/RateLimiter.d.ts.map +1 -0
  134. package/dist/RateLimiter.js +118 -0
  135. package/dist/RateLimiter.js.map +1 -0
  136. package/dist/RecoveryCode.d.ts +169 -0
  137. package/dist/RecoveryCode.d.ts.map +1 -0
  138. package/dist/RecoveryCode.js +299 -0
  139. package/dist/RecoveryCode.js.map +1 -0
  140. package/dist/RefreshToken.d.ts +222 -0
  141. package/dist/RefreshToken.d.ts.map +1 -0
  142. package/dist/RefreshToken.js +342 -0
  143. package/dist/RefreshToken.js.map +1 -0
  144. package/dist/SecurityTimeline.d.ts +72 -0
  145. package/dist/SecurityTimeline.d.ts.map +1 -0
  146. package/dist/SecurityTimeline.js +386 -0
  147. package/dist/SecurityTimeline.js.map +1 -0
  148. package/dist/Sessions.d.ts +123 -11
  149. package/dist/Sessions.d.ts.map +1 -1
  150. package/dist/Sessions.js +534 -1
  151. package/dist/Sessions.js.map +1 -1
  152. package/dist/StepUp.d.ts +44 -0
  153. package/dist/StepUp.d.ts.map +1 -0
  154. package/dist/StepUp.js +82 -0
  155. package/dist/StepUp.js.map +1 -0
  156. package/dist/Storage.d.ts +73 -5
  157. package/dist/Storage.d.ts.map +1 -1
  158. package/dist/Storage.js +11 -1
  159. package/dist/Storage.js.map +1 -1
  160. package/dist/StorageMigrations.d.ts +13 -1
  161. package/dist/StorageMigrations.d.ts.map +1 -1
  162. package/dist/StorageMigrations.js +256 -2
  163. package/dist/StorageMigrations.js.map +1 -1
  164. package/dist/Testing.d.ts +9 -1
  165. package/dist/Testing.d.ts.map +1 -1
  166. package/dist/Testing.js +30 -2
  167. package/dist/Testing.js.map +1 -1
  168. package/dist/Totp.d.ts +220 -0
  169. package/dist/Totp.d.ts.map +1 -0
  170. package/dist/Totp.js +477 -0
  171. package/dist/Totp.js.map +1 -0
  172. package/dist/TrustedDevice.d.ts +127 -0
  173. package/dist/TrustedDevice.d.ts.map +1 -0
  174. package/dist/TrustedDevice.js +252 -0
  175. package/dist/TrustedDevice.js.map +1 -0
  176. package/dist/WaitUntil.d.ts.map +1 -1
  177. package/dist/WaitUntil.js +1 -1
  178. package/dist/WaitUntil.js.map +1 -1
  179. package/dist/Webhook.d.ts +72 -0
  180. package/dist/Webhook.d.ts.map +1 -0
  181. package/dist/Webhook.js +82 -0
  182. package/dist/Webhook.js.map +1 -0
  183. package/dist/alchemy/cloudflare/Email.d.ts +25 -0
  184. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
  185. package/dist/alchemy/cloudflare/Email.js +117 -0
  186. package/dist/alchemy/cloudflare/Email.js.map +1 -0
  187. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  188. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  189. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  190. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  191. package/dist/cloudflare/Email.d.ts +25 -0
  192. package/dist/cloudflare/Email.d.ts.map +1 -0
  193. package/dist/cloudflare/Email.js +153 -0
  194. package/dist/cloudflare/Email.js.map +1 -0
  195. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  196. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  197. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  198. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  199. package/dist/index.d.ts +21 -0
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +21 -0
  202. package/dist/index.js.map +1 -1
  203. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  204. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  205. package/dist/internal/RateLimitDurableObject.js +80 -0
  206. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  207. package/migrations/0002_auth_password.sql +25 -0
  208. package/migrations/0003_auth_login_approval_review.sql +22 -0
  209. package/migrations/0004_auth_trusted_device.sql +12 -0
  210. package/migrations/0005_auth_passkey.sql +17 -0
  211. package/migrations/0006_auth_totp_factor.sql +17 -0
  212. package/migrations/0007_auth_recovery_code.sql +13 -0
  213. package/migrations/0008_auth_api_key.sql +17 -0
  214. package/migrations/0009_auth_refresh_token.sql +21 -0
  215. package/migrations/0010_auth_jwt_revocation.sql +8 -0
  216. package/migrations/0011_auth_oauth_account.sql +16 -0
  217. package/migrations/0012_auth_oauth_provider_token_vault.sql +20 -0
  218. package/migrations/0013_auth_security_timeline.sql +16 -0
  219. package/package.json +146 -26
  220. package/dist/D1Kysely.d.ts +0 -40
  221. package/dist/D1Kysely.d.ts.map +0 -1
  222. package/dist/D1Kysely.js +0 -75
  223. package/dist/D1Kysely.js.map +0 -1
  224. package/dist/KyselyStorage.d.ts +0 -41
  225. package/dist/KyselyStorage.d.ts.map +0 -1
  226. package/dist/KyselyStorage.js +0 -176
  227. package/dist/KyselyStorage.js.map +0 -1
@@ -0,0 +1,207 @@
1
+ import { Brand, Context, Effect, Layer, Redacted } from "effect";
2
+ import type * as OptionTypes from "effect/Option";
3
+ import { Crypto } from "./Crypto.js";
4
+ import type { CryptoService } from "./Crypto.js";
5
+ import type { UnixMillis, UserId } from "./Identifiers.js";
6
+ export type ApiKeyId = Brand.Branded<string, "auth/ApiKeyId">;
7
+ export declare const ApiKeyId: Brand.Constructor<ApiKeyId>;
8
+ export type ApiKeyPrefix = Brand.Branded<string, "auth/ApiKeyPrefix">;
9
+ export declare const ApiKeyPrefix: Brand.Constructor<ApiKeyPrefix>;
10
+ export type ApiKeySecret = Brand.Branded<string, "auth/ApiKeySecret">;
11
+ export declare const ApiKeySecret: Brand.Constructor<ApiKeySecret>;
12
+ export type ApiKeySecretHash = Brand.Branded<string, "auth/ApiKeySecretHash">;
13
+ export declare const ApiKeySecretHash: Brand.Constructor<ApiKeySecretHash>;
14
+ export declare const defaultApiKeyPrefixBytes = 8;
15
+ export declare const defaultApiKeySecretBytes = 32;
16
+ export declare const defaultApiKeyIdBytes = 16;
17
+ export type ApiKeyOperation = "generate" | "parse" | "hash" | "verify";
18
+ declare const ApiKeyError_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 & {
19
+ readonly _tag: "ApiKeyError";
20
+ } & Readonly<A>;
21
+ export declare class ApiKeyError extends ApiKeyError_base<{
22
+ readonly operation: ApiKeyOperation;
23
+ readonly message: string;
24
+ readonly cause?: unknown;
25
+ }> {
26
+ }
27
+ export interface ApiKeyGenerateInput {
28
+ readonly prefixBytes?: number;
29
+ readonly secretBytes?: number;
30
+ }
31
+ export interface GeneratedApiKeySecret {
32
+ readonly prefix: ApiKeyPrefix;
33
+ readonly secret: Redacted.Redacted<ApiKeySecret>;
34
+ }
35
+ export interface ApiKeyHashInput {
36
+ readonly secret: Redacted.Redacted<string>;
37
+ }
38
+ export interface ApiKeyVerifyInput extends ApiKeyHashInput {
39
+ readonly hash: ApiKeySecretHash;
40
+ }
41
+ export interface ApiKeysService {
42
+ readonly generate: (input?: ApiKeyGenerateInput) => Effect.Effect<GeneratedApiKeySecret, ApiKeyError>;
43
+ readonly parse: (secret: Redacted.Redacted<string>) => Effect.Effect<ApiKeyPrefix, ApiKeyError>;
44
+ readonly hash: (input: ApiKeyHashInput) => Effect.Effect<ApiKeySecretHash, ApiKeyError>;
45
+ readonly verify: (input: ApiKeyVerifyInput) => Effect.Effect<boolean, ApiKeyError>;
46
+ }
47
+ declare const ApiKeys_base: Context.ServiceClass<ApiKeys, "auth/ApiKeys", ApiKeysService>;
48
+ export declare class ApiKeys extends ApiKeys_base {
49
+ }
50
+ export declare namespace ApiKeys {
51
+ const make: (service: ApiKeysService) => ApiKeysService;
52
+ }
53
+ export interface ApiKeysDependencies {
54
+ readonly crypto: CryptoService;
55
+ }
56
+ export declare const makeApiKeys: (dependencies: ApiKeysDependencies) => ApiKeysService;
57
+ export declare const ApiKeysLive: Layer.Layer<ApiKeys, never, Crypto>;
58
+ export interface ApiKeyRecord {
59
+ readonly id: ApiKeyId;
60
+ readonly userId: UserId;
61
+ readonly prefix: ApiKeyPrefix;
62
+ readonly secretHash: ApiKeySecretHash;
63
+ readonly scopes: readonly string[];
64
+ readonly createdAt: UnixMillis;
65
+ readonly expiresAt?: UnixMillis;
66
+ readonly lastUsedAt?: UnixMillis;
67
+ readonly revokedAt?: UnixMillis;
68
+ readonly metadata?: Readonly<Record<string, unknown>>;
69
+ }
70
+ export interface ApiKeyListByUserInput {
71
+ readonly userId: UserId;
72
+ readonly includeRevoked?: boolean;
73
+ }
74
+ export interface ApiKeyMarkUsedInput {
75
+ readonly id: ApiKeyId;
76
+ readonly lastUsedAt: UnixMillis;
77
+ readonly metadata?: Readonly<Record<string, unknown>>;
78
+ }
79
+ export interface ApiKeyRevokeInput {
80
+ readonly id: ApiKeyId;
81
+ readonly revokedAt: UnixMillis;
82
+ readonly reason?: string;
83
+ }
84
+ export type ApiKeyStoreOperation = "insert" | "find" | "list" | "mark-used" | "revoke";
85
+ declare const ApiKeyStoreError_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 & {
86
+ readonly _tag: "ApiKeyStoreError";
87
+ } & Readonly<A>;
88
+ export declare class ApiKeyStoreError extends ApiKeyStoreError_base<{
89
+ readonly operation: ApiKeyStoreOperation;
90
+ readonly message: string;
91
+ readonly cause?: unknown;
92
+ }> {
93
+ }
94
+ export interface ApiKeyStoreService {
95
+ readonly insert: (row: ApiKeyRecord) => Effect.Effect<void, ApiKeyStoreError>;
96
+ readonly findById: (id: ApiKeyId) => Effect.Effect<OptionTypes.Option<ApiKeyRecord>, ApiKeyStoreError>;
97
+ readonly findByPrefix: (prefix: ApiKeyPrefix) => Effect.Effect<OptionTypes.Option<ApiKeyRecord>, ApiKeyStoreError>;
98
+ readonly listByUser: (input: ApiKeyListByUserInput) => Effect.Effect<readonly ApiKeyRecord[], ApiKeyStoreError>;
99
+ readonly markUsed: (input: ApiKeyMarkUsedInput) => Effect.Effect<OptionTypes.Option<ApiKeyRecord>, ApiKeyStoreError>;
100
+ readonly revoke: (input: ApiKeyRevokeInput) => Effect.Effect<void, ApiKeyStoreError>;
101
+ }
102
+ declare const ApiKeyStore_base: Context.ServiceClass<ApiKeyStore, "auth/ApiKeyStore", ApiKeyStoreService>;
103
+ export declare class ApiKeyStore extends ApiKeyStore_base {
104
+ }
105
+ export declare namespace ApiKeyStore {
106
+ const make: (service: ApiKeyStoreService) => ApiKeyStoreService;
107
+ }
108
+ export declare const makeApiKeyStoreMemory: () => ApiKeyStoreService;
109
+ export declare const ApiKeyStoreMemoryLive: Layer.Layer<ApiKeyStore, never, never>;
110
+ export interface ApiKeyInfo {
111
+ readonly id: ApiKeyId;
112
+ readonly userId: UserId;
113
+ readonly prefix: ApiKeyPrefix;
114
+ readonly scopes: readonly string[];
115
+ readonly createdAt: UnixMillis;
116
+ readonly expiresAt?: UnixMillis;
117
+ readonly lastUsedAt?: UnixMillis;
118
+ readonly revokedAt?: UnixMillis;
119
+ readonly metadata?: Readonly<Record<string, unknown>>;
120
+ }
121
+ export interface ApiKeyCreateForUserInput {
122
+ readonly userId: UserId;
123
+ readonly keyId?: ApiKeyId;
124
+ readonly scopes?: readonly string[];
125
+ readonly now?: UnixMillis;
126
+ readonly expiresAt?: UnixMillis;
127
+ readonly metadata?: Readonly<Record<string, unknown>>;
128
+ }
129
+ export interface CreatedApiKey {
130
+ readonly secret: Redacted.Redacted<ApiKeySecret>;
131
+ readonly key: ApiKeyInfo;
132
+ }
133
+ export interface ApiKeyManagementListInput {
134
+ readonly userId: UserId;
135
+ readonly includeRevoked?: boolean;
136
+ }
137
+ export interface ApiKeyManagementRevokeInput {
138
+ readonly userId: UserId;
139
+ readonly keyId: ApiKeyId;
140
+ readonly revokedAt?: UnixMillis;
141
+ readonly reason?: string;
142
+ }
143
+ export type ApiKeyManagementOperation = "create" | "list" | "revoke";
144
+ declare const ApiKeyManagementError_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 & {
145
+ readonly _tag: "ApiKeyManagementError";
146
+ } & Readonly<A>;
147
+ export declare class ApiKeyManagementError extends ApiKeyManagementError_base<{
148
+ readonly operation: ApiKeyManagementOperation;
149
+ readonly message: string;
150
+ readonly cause?: unknown;
151
+ }> {
152
+ }
153
+ export interface ApiKeyManagementService {
154
+ readonly createForUser: (input: ApiKeyCreateForUserInput) => Effect.Effect<CreatedApiKey, ApiKeyManagementError>;
155
+ readonly listForUser: (input: ApiKeyManagementListInput) => Effect.Effect<readonly ApiKeyInfo[], ApiKeyManagementError>;
156
+ readonly revokeForUser: (input: ApiKeyManagementRevokeInput) => Effect.Effect<void, ApiKeyManagementError>;
157
+ }
158
+ declare const ApiKeyManagement_base: Context.ServiceClass<ApiKeyManagement, "auth/ApiKeyManagement", ApiKeyManagementService>;
159
+ export declare class ApiKeyManagement extends ApiKeyManagement_base {
160
+ }
161
+ export declare namespace ApiKeyManagement {
162
+ const make: (service: ApiKeyManagementService) => ApiKeyManagementService;
163
+ }
164
+ export interface ApiKeyManagementDependencies {
165
+ readonly apiKeys: ApiKeysService;
166
+ readonly crypto: CryptoService;
167
+ readonly keyStore: ApiKeyStoreService;
168
+ readonly keyIdBytes?: number;
169
+ }
170
+ export declare const makeApiKeyManagement: (dependencies: ApiKeyManagementDependencies) => ApiKeyManagementService;
171
+ export declare const ApiKeyManagementLive: Layer.Layer<ApiKeyManagement, never, Crypto | ApiKeys | ApiKeyStore>;
172
+ export interface ApiKeyVerificationInput {
173
+ readonly secret: Redacted.Redacted<string>;
174
+ readonly now?: UnixMillis;
175
+ readonly metadata?: Readonly<Record<string, unknown>>;
176
+ }
177
+ export interface ApiKeyVerificationResult {
178
+ readonly valid: boolean;
179
+ readonly key?: ApiKeyInfo;
180
+ }
181
+ export type ApiKeyVerificationOperation = "verify";
182
+ declare const ApiKeyVerificationError_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 & {
183
+ readonly _tag: "ApiKeyVerificationError";
184
+ } & Readonly<A>;
185
+ export declare class ApiKeyVerificationError extends ApiKeyVerificationError_base<{
186
+ readonly operation: ApiKeyVerificationOperation;
187
+ readonly message: string;
188
+ readonly cause?: unknown;
189
+ }> {
190
+ }
191
+ export interface ApiKeyVerificationService {
192
+ readonly verify: (input: ApiKeyVerificationInput) => Effect.Effect<ApiKeyVerificationResult, ApiKeyVerificationError>;
193
+ }
194
+ declare const ApiKeyVerification_base: Context.ServiceClass<ApiKeyVerification, "auth/ApiKeyVerification", ApiKeyVerificationService>;
195
+ export declare class ApiKeyVerification extends ApiKeyVerification_base {
196
+ }
197
+ export declare namespace ApiKeyVerification {
198
+ const make: (service: ApiKeyVerificationService) => ApiKeyVerificationService;
199
+ }
200
+ export interface ApiKeyVerificationDependencies {
201
+ readonly apiKeys: ApiKeysService;
202
+ readonly keyStore: ApiKeyStoreService;
203
+ }
204
+ export declare const makeApiKeyVerification: (dependencies: ApiKeyVerificationDependencies) => ApiKeyVerificationService;
205
+ export declare const ApiKeyVerificationLive: Layer.Layer<ApiKeyVerification, never, ApiKeys | ApiKeyStore>;
206
+ export {};
207
+ //# sourceMappingURL=ApiKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiKey.d.ts","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"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"}
package/dist/ApiKey.js ADDED
@@ -0,0 +1,275 @@
1
+ import { Brand, Context, Data, Effect, Layer, Option, Redacted } from "effect";
2
+ import { Crypto } from "./Crypto.js";
3
+ import { currentUnixMillis } from "./Internal.js";
4
+ export const ApiKeyId = Brand.nominal();
5
+ export const ApiKeyPrefix = Brand.nominal();
6
+ export const ApiKeySecret = Brand.nominal();
7
+ export const ApiKeySecretHash = Brand.nominal();
8
+ export const defaultApiKeyPrefixBytes = 8;
9
+ export const defaultApiKeySecretBytes = 32;
10
+ export const defaultApiKeyIdBytes = 16;
11
+ export class ApiKeyError extends Data.TaggedError("ApiKeyError") {
12
+ }
13
+ export class ApiKeys extends Context.Service()("auth/ApiKeys") {
14
+ }
15
+ (function (ApiKeys) {
16
+ ApiKeys.make = (service) => ApiKeys.of(service);
17
+ })(ApiKeys || (ApiKeys = {}));
18
+ const textEncoder = new TextEncoder();
19
+ const apiKeyError = (operation, message, cause) => new ApiKeyError({
20
+ operation,
21
+ message,
22
+ ...(cause === undefined ? {} : { cause }),
23
+ });
24
+ const validateByteLength = (byteLength, operation, label) => Number.isInteger(byteLength) && byteLength >= 4 && byteLength <= 128
25
+ ? Effect.succeed(byteLength)
26
+ : Effect.fail(apiKeyError(operation, `${label} byte length must be an integer between 4 and 128`));
27
+ const parseApiKeySecretValue = (secret) => {
28
+ const value = secret.trim();
29
+ const parts = value.split(".");
30
+ if (parts.length !== 2 || parts[0] === "" || parts[1] === "") {
31
+ return Effect.fail(apiKeyError("parse", "API key secret must use '<prefix>.<secret>' format"));
32
+ }
33
+ return Effect.succeed(ApiKeyPrefix(parts[0]));
34
+ };
35
+ const hashApiKeySecretValue = (dependencies, secret, operation) => dependencies.crypto.digestSha256({ data: `api-key:${secret}` }).pipe(Effect.map((hash) => ApiKeySecretHash(`sha256:${hash}`)), Effect.mapError((cause) => apiKeyError(operation, "Failed to hash API key secret", cause)));
36
+ export const makeApiKeys = (dependencies) => ApiKeys.make({
37
+ generate: Effect.fn("auth.api_key.generate")(function* (input) {
38
+ const prefixBytes = yield* validateByteLength(input?.prefixBytes ?? defaultApiKeyPrefixBytes, "generate", "API key prefix");
39
+ const secretBytes = yield* validateByteLength(input?.secretBytes ?? defaultApiKeySecretBytes, "generate", "API key secret");
40
+ const prefix = yield* dependencies.crypto.randomToken(prefixBytes).pipe(Effect.map(ApiKeyPrefix), Effect.mapError((cause) => apiKeyError("generate", "Failed to generate API key prefix", cause)));
41
+ const secret = yield* dependencies.crypto.randomToken(secretBytes).pipe(Effect.map((value) => ApiKeySecret(`${prefix}.${value}`)), Effect.mapError((cause) => apiKeyError("generate", "Failed to generate API key secret", cause)));
42
+ return {
43
+ prefix,
44
+ secret: Redacted.make(secret),
45
+ };
46
+ }),
47
+ parse: Effect.fn("auth.api_key.parse")(function* (secret) {
48
+ return yield* parseApiKeySecretValue(Redacted.value(secret));
49
+ }),
50
+ hash: Effect.fn("auth.api_key.hash")(function* (input) {
51
+ const secret = Redacted.value(input.secret).trim();
52
+ yield* parseApiKeySecretValue(secret).pipe(Effect.mapError((cause) => apiKeyError("hash", "Cannot hash malformed API key secret", cause)));
53
+ return yield* hashApiKeySecretValue(dependencies, secret, "hash");
54
+ }),
55
+ verify: Effect.fn("auth.api_key.verify")(function* (input) {
56
+ const secret = Redacted.value(input.secret).trim();
57
+ const prefix = yield* parseApiKeySecretValue(secret).pipe(Effect.catchTag("ApiKeyError", () => Effect.succeed(undefined)));
58
+ if (prefix === undefined) {
59
+ return false;
60
+ }
61
+ const hash = yield* hashApiKeySecretValue(dependencies, secret, "verify");
62
+ return yield* dependencies.crypto
63
+ .timingSafeEqual({
64
+ left: textEncoder.encode(hash),
65
+ right: textEncoder.encode(input.hash),
66
+ })
67
+ .pipe(Effect.mapError((cause) => apiKeyError("verify", "Failed to compare API key hashes", cause)));
68
+ }),
69
+ });
70
+ export const ApiKeysLive = Layer.effect(ApiKeys)(Effect.gen(function* () {
71
+ const crypto = yield* Crypto;
72
+ return makeApiKeys({ crypto });
73
+ }));
74
+ export class ApiKeyStoreError extends Data.TaggedError("ApiKeyStoreError") {
75
+ }
76
+ export class ApiKeyStore extends Context.Service()("auth/ApiKeyStore") {
77
+ }
78
+ (function (ApiKeyStore) {
79
+ ApiKeyStore.make = (service) => ApiKeyStore.of(service);
80
+ })(ApiKeyStore || (ApiKeyStore = {}));
81
+ const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
82
+ const cloneApiKeyRecord = (record) => ({
83
+ ...record,
84
+ scopes: [...record.scopes],
85
+ ...(record.metadata === undefined ? {} : { metadata: cloneMetadata(record.metadata) }),
86
+ });
87
+ export const makeApiKeyStoreMemory = () => {
88
+ const keysById = new Map();
89
+ const idByPrefix = new Map();
90
+ return ApiKeyStore.make({
91
+ insert: (row) => Effect.sync(() => {
92
+ keysById.set(row.id, cloneApiKeyRecord(row));
93
+ idByPrefix.set(row.prefix, row.id);
94
+ }),
95
+ findById: (id) => Effect.sync(() => {
96
+ const row = keysById.get(id);
97
+ return row === undefined ? Option.none() : Option.some(cloneApiKeyRecord(row));
98
+ }),
99
+ findByPrefix: (prefix) => Effect.sync(() => {
100
+ const id = idByPrefix.get(prefix);
101
+ const row = id === undefined ? undefined : keysById.get(id);
102
+ return row === undefined ? Option.none() : Option.some(cloneApiKeyRecord(row));
103
+ }),
104
+ listByUser: (input) => Effect.sync(() => [...keysById.values()]
105
+ .filter((row) => row.userId === input.userId &&
106
+ (input.includeRevoked === true || row.revokedAt === undefined))
107
+ .map(cloneApiKeyRecord)),
108
+ markUsed: (input) => Effect.sync(() => {
109
+ const row = keysById.get(input.id);
110
+ if (row === undefined || row.revokedAt !== undefined) {
111
+ return Option.none();
112
+ }
113
+ const updated = {
114
+ ...row,
115
+ lastUsedAt: input.lastUsedAt,
116
+ metadata: input.metadata ?? row.metadata,
117
+ };
118
+ keysById.set(input.id, updated);
119
+ return Option.some(cloneApiKeyRecord(updated));
120
+ }),
121
+ revoke: (input) => Effect.sync(() => {
122
+ const row = keysById.get(input.id);
123
+ if (row !== undefined) {
124
+ keysById.set(input.id, {
125
+ ...row,
126
+ revokedAt: input.revokedAt,
127
+ metadata: input.reason === undefined
128
+ ? row.metadata
129
+ : { ...row.metadata, revokeReason: input.reason },
130
+ });
131
+ }
132
+ }),
133
+ });
134
+ };
135
+ export const ApiKeyStoreMemoryLive = Layer.sync(ApiKeyStore)(makeApiKeyStoreMemory);
136
+ export class ApiKeyManagementError extends Data.TaggedError("ApiKeyManagementError") {
137
+ }
138
+ export class ApiKeyManagement extends Context.Service()("auth/ApiKeyManagement") {
139
+ }
140
+ (function (ApiKeyManagement) {
141
+ ApiKeyManagement.make = (service) => ApiKeyManagement.of(service);
142
+ })(ApiKeyManagement || (ApiKeyManagement = {}));
143
+ const apiKeyInfo = (record) => ({
144
+ id: record.id,
145
+ userId: record.userId,
146
+ prefix: record.prefix,
147
+ scopes: [...record.scopes],
148
+ createdAt: record.createdAt,
149
+ ...(record.expiresAt === undefined ? {} : { expiresAt: record.expiresAt }),
150
+ ...(record.lastUsedAt === undefined ? {} : { lastUsedAt: record.lastUsedAt }),
151
+ ...(record.revokedAt === undefined ? {} : { revokedAt: record.revokedAt }),
152
+ ...(record.metadata === undefined ? {} : { metadata: record.metadata }),
153
+ });
154
+ const apiKeyManagementError = (operation, message, cause) => new ApiKeyManagementError({
155
+ operation,
156
+ message,
157
+ ...(cause === undefined ? {} : { cause }),
158
+ });
159
+ const makeApiKeyId = (dependencies) => dependencies.crypto.randomToken(dependencies.keyIdBytes ?? defaultApiKeyIdBytes).pipe(Effect.map(ApiKeyId), Effect.mapError((cause) => apiKeyManagementError("create", "Failed to generate API key id", cause)));
160
+ const loadOwnedApiKey = (dependencies, operation, input) => Effect.gen(function* () {
161
+ const key = yield* dependencies.keyStore.findById(input.keyId).pipe(Effect.mapError((cause) => apiKeyManagementError(operation, "Failed to load API key", cause)));
162
+ if (Option.isNone(key) || key.value.userId !== input.userId) {
163
+ return yield* apiKeyManagementError(operation, "API key not found");
164
+ }
165
+ return key.value;
166
+ });
167
+ export const makeApiKeyManagement = (dependencies) => ApiKeyManagement.make({
168
+ createForUser: Effect.fn("auth.api_key.management.create")(function* (input) {
169
+ const now = input.now ?? (yield* currentUnixMillis);
170
+ const generated = yield* dependencies.apiKeys.generate().pipe(Effect.mapError((cause) => apiKeyManagementError("create", "Failed to generate API key secret", cause)));
171
+ const secretHash = yield* dependencies.apiKeys
172
+ .hash({ secret: Redacted.make(Redacted.value(generated.secret)) })
173
+ .pipe(Effect.mapError((cause) => apiKeyManagementError("create", "Failed to hash API key secret", cause)));
174
+ const row = {
175
+ id: input.keyId ?? (yield* makeApiKeyId(dependencies)),
176
+ userId: input.userId,
177
+ prefix: generated.prefix,
178
+ secretHash,
179
+ scopes: [...(input.scopes ?? [])],
180
+ createdAt: now,
181
+ ...(input.expiresAt === undefined ? {} : { expiresAt: input.expiresAt }),
182
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
183
+ };
184
+ yield* dependencies.keyStore.insert(row).pipe(Effect.mapError((cause) => apiKeyManagementError("create", "Failed to store API key", cause)));
185
+ return {
186
+ secret: generated.secret,
187
+ key: apiKeyInfo(row),
188
+ };
189
+ }),
190
+ listForUser: Effect.fn("auth.api_key.management.list")(function* (input) {
191
+ const keys = yield* dependencies.keyStore
192
+ .listByUser({
193
+ userId: input.userId,
194
+ ...(input.includeRevoked === undefined
195
+ ? {}
196
+ : { includeRevoked: input.includeRevoked }),
197
+ })
198
+ .pipe(Effect.mapError((cause) => apiKeyManagementError("list", "Failed to list API keys", cause)));
199
+ return keys.map(apiKeyInfo);
200
+ }),
201
+ revokeForUser: Effect.fn("auth.api_key.management.revoke")(function* (input) {
202
+ const key = yield* loadOwnedApiKey(dependencies, "revoke", input);
203
+ if (key.revokedAt !== undefined) {
204
+ return;
205
+ }
206
+ const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
207
+ yield* dependencies.keyStore
208
+ .revoke({
209
+ id: input.keyId,
210
+ revokedAt,
211
+ ...(input.reason === undefined ? {} : { reason: input.reason }),
212
+ })
213
+ .pipe(Effect.mapError((cause) => apiKeyManagementError("revoke", "Failed to revoke API key", cause)));
214
+ }),
215
+ });
216
+ export const ApiKeyManagementLive = Layer.effect(ApiKeyManagement)(Effect.gen(function* () {
217
+ const apiKeys = yield* ApiKeys;
218
+ const crypto = yield* Crypto;
219
+ const keyStore = yield* ApiKeyStore;
220
+ return makeApiKeyManagement({ apiKeys, crypto, keyStore });
221
+ }));
222
+ export class ApiKeyVerificationError extends Data.TaggedError("ApiKeyVerificationError") {
223
+ }
224
+ export class ApiKeyVerification extends Context.Service()("auth/ApiKeyVerification") {
225
+ }
226
+ (function (ApiKeyVerification) {
227
+ ApiKeyVerification.make = (service) => ApiKeyVerification.of(service);
228
+ })(ApiKeyVerification || (ApiKeyVerification = {}));
229
+ const apiKeyVerificationError = (message, cause) => new ApiKeyVerificationError({
230
+ operation: "verify",
231
+ message,
232
+ ...(cause === undefined ? {} : { cause }),
233
+ });
234
+ export const makeApiKeyVerification = (dependencies) => ApiKeyVerification.make({
235
+ verify: Effect.fn("auth.api_key.verification.verify")(function* (input) {
236
+ const prefix = yield* dependencies.apiKeys.parse(input.secret).pipe(Effect.catchTag("ApiKeyError", () => Effect.succeed(undefined)));
237
+ if (prefix === undefined) {
238
+ return { valid: false };
239
+ }
240
+ const key = yield* dependencies.keyStore.findByPrefix(prefix).pipe(Effect.mapError((cause) => apiKeyVerificationError("Failed to load API key", cause)));
241
+ if (Option.isNone(key) || key.value.revokedAt !== undefined) {
242
+ return { valid: false };
243
+ }
244
+ const now = input.now ?? (yield* currentUnixMillis);
245
+ if (key.value.expiresAt !== undefined && Number(key.value.expiresAt) <= Number(now)) {
246
+ return { valid: false };
247
+ }
248
+ const valid = yield* dependencies.apiKeys
249
+ .verify({ secret: input.secret, hash: key.value.secretHash })
250
+ .pipe(Effect.mapError((cause) => apiKeyVerificationError("Failed to verify API key", cause)));
251
+ if (!valid) {
252
+ return { valid: false };
253
+ }
254
+ const updated = yield* dependencies.keyStore
255
+ .markUsed({
256
+ id: key.value.id,
257
+ lastUsedAt: now,
258
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
259
+ })
260
+ .pipe(Effect.mapError((cause) => apiKeyVerificationError("Failed to mark API key as used", cause)));
261
+ if (Option.isNone(updated)) {
262
+ return { valid: false };
263
+ }
264
+ return {
265
+ valid: true,
266
+ key: apiKeyInfo(updated.value),
267
+ };
268
+ }),
269
+ });
270
+ export const ApiKeyVerificationLive = Layer.effect(ApiKeyVerification)(Effect.gen(function* () {
271
+ const apiKeys = yield* ApiKeys;
272
+ const keyStore = yield* ApiKeyStore;
273
+ return makeApiKeyVerification({ apiKeys, keyStore });
274
+ }));
275
+ //# sourceMappingURL=ApiKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiKey.js","sourceRoot":"","sources":["../src/ApiKey.ts"],"names":[],"mappings":"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"}