@yielded/auth-persistence 0.1.0-beta.23 → 0.1.0-beta.25
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 +11 -0
- package/dist/Adapter.d.mts +12 -6
- package/dist/Adapter.mjs +8 -3
- package/dist/OAuthPersistence.d.mts +87 -0
- package/dist/OAuthPersistence.mjs +125 -0
- package/dist/OAuthPersistence.mjs.map +1 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/index.d.mts +3 -1
- package/dist/index.mjs +3 -1
- package/dist/internal/configuration.d.mts +1 -1
- package/dist/internal/configuration.mjs.map +1 -1
- package/dist/internal/email-kernel.d.mts +1 -1
- package/dist/internal/email-kernel.mjs +1 -1
- package/dist/internal/email-kernel.mjs.map +1 -1
- package/dist/internal/models/oauth-connected-model.d.mts +294 -0
- package/dist/internal/models/oauth-connected-model.mjs +22 -0
- package/dist/internal/models/oauth-connected-model.mjs.map +1 -0
- package/dist/internal/models/oauth-model.d.mts +467 -0
- package/dist/internal/models/oauth-model.mjs +49 -0
- package/dist/internal/models/oauth-model.mjs.map +1 -0
- package/dist/internal/models/password-model.d.mts +6 -48
- package/dist/internal/models/password-model.mjs +0 -1
- package/dist/internal/models/password-model.mjs.map +1 -1
- package/dist/internal/native-sql-table.d.mts +4 -0
- package/dist/internal/native-sql-table.mjs +7 -0
- package/dist/internal/native-sql-table.mjs.map +1 -1
- package/dist/internal/oauth/accounts.d.mts +8 -0
- package/dist/internal/oauth/accounts.mjs +379 -0
- package/dist/internal/oauth/accounts.mjs.map +1 -0
- package/dist/internal/oauth/connected-access.d.mts +9 -0
- package/dist/internal/oauth/connected-access.mjs +229 -0
- package/dist/internal/oauth/connected-access.mjs.map +1 -0
- package/dist/internal/oauth/connected-collection.d.mts +7 -0
- package/dist/internal/oauth/connected-collection.mjs +214 -0
- package/dist/internal/oauth/connected-collection.mjs.map +1 -0
- package/dist/internal/oauth/connected-custody.d.mts +6 -0
- package/dist/internal/oauth/connected-custody.mjs +165 -0
- package/dist/internal/oauth/connected-custody.mjs.map +1 -0
- package/dist/internal/oauth/connected-flow.d.mts +7 -0
- package/dist/internal/oauth/connected-flow.mjs +324 -0
- package/dist/internal/oauth/connected-flow.mjs.map +1 -0
- package/dist/internal/oauth/connected-input.mjs +122 -0
- package/dist/internal/oauth/connected-input.mjs.map +1 -0
- package/dist/internal/oauth/connected-keys.d.mts +2 -0
- package/dist/internal/oauth/connected-keys.mjs +22 -0
- package/dist/internal/oauth/connected-keys.mjs.map +1 -0
- package/dist/internal/oauth/connected-maintenance.d.mts +9 -0
- package/dist/internal/oauth/connected-maintenance.mjs +226 -0
- package/dist/internal/oauth/connected-maintenance.mjs.map +1 -0
- package/dist/internal/oauth/connected-management.d.mts +9 -0
- package/dist/internal/oauth/connected-management.mjs +243 -0
- package/dist/internal/oauth/connected-management.mjs.map +1 -0
- package/dist/internal/oauth/connected-reference.mjs +63 -0
- package/dist/internal/oauth/connected-reference.mjs.map +1 -0
- package/dist/internal/oauth/connected-settlement.d.mts +8 -0
- package/dist/internal/oauth/connected-settlement.mjs +141 -0
- package/dist/internal/oauth/connected-settlement.mjs.map +1 -0
- package/dist/internal/oauth/connected-sign-in.d.mts +10 -0
- package/dist/internal/oauth/connected-sign-in.mjs +281 -0
- package/dist/internal/oauth/connected-sign-in.mjs.map +1 -0
- package/dist/internal/oauth/connected-state.d.mts +14 -0
- package/dist/internal/oauth/connected-state.mjs +469 -0
- package/dist/internal/oauth/connected-state.mjs.map +1 -0
- package/dist/internal/oauth/connected-target.d.mts +21 -0
- package/dist/internal/oauth/connected-target.mjs +117 -0
- package/dist/internal/oauth/connected-target.mjs.map +1 -0
- package/dist/internal/oauth/flow.d.mts +5 -0
- package/dist/internal/oauth/flow.mjs +279 -0
- package/dist/internal/oauth/flow.mjs.map +1 -0
- package/dist/internal/oauth/input.mjs +127 -0
- package/dist/internal/oauth/input.mjs.map +1 -0
- package/dist/internal/oauth/owner.d.mts +10 -0
- package/dist/internal/oauth/owner.mjs +10 -0
- package/dist/internal/oauth/owner.mjs.map +1 -0
- package/dist/internal/oauth/query-compiler.d.mts +7 -0
- package/dist/internal/oauth/query-compiler.mjs +9 -0
- package/dist/internal/oauth/query-compiler.mjs.map +1 -0
- package/dist/internal/oauth/registration.d.mts +7 -0
- package/dist/internal/oauth/registration.mjs +393 -0
- package/dist/internal/oauth/registration.mjs.map +1 -0
- package/dist/internal/oauth/state.mjs +107 -0
- package/dist/internal/oauth/state.mjs.map +1 -0
- package/dist/internal/oauth/target.d.mts +31 -0
- package/dist/internal/oauth/target.mjs +273 -0
- package/dist/internal/oauth/target.mjs.map +1 -0
- package/dist/internal/oauth-kernel.d.mts +1423 -0
- package/dist/internal/oauth-kernel.mjs +187 -0
- package/dist/internal/oauth-kernel.mjs.map +1 -0
- package/dist/internal/oauth-proxy.d.mts +31 -0
- package/dist/internal/oauth-proxy.mjs +129 -0
- package/dist/internal/oauth-proxy.mjs.map +1 -0
- package/dist/internal/passkey/write-state.mjs +9 -1
- package/dist/internal/passkey/write-state.mjs.map +1 -1
- package/dist/internal/passkey-kernel.d.mts +9 -9
- package/dist/internal/{password-attempts.d.mts → password-credentials.d.mts} +3 -4
- package/dist/internal/password-credentials.mjs +121 -0
- package/dist/internal/password-credentials.mjs.map +1 -0
- package/dist/internal/password-kernel.d.mts +8 -24
- package/dist/internal/password-kernel.mjs +5 -43
- package/dist/internal/password-kernel.mjs.map +1 -1
- package/dist/internal/persistence.d.mts +1 -1
- package/dist/internal/persistence.mjs +2 -2
- package/dist/internal/persistence.mjs.map +1 -1
- package/dist/internal/query-operations.d.mts +2 -0
- package/dist/internal/session-kernel.d.mts +2 -2
- package/dist/internal/session-kernel.mjs +74 -18
- package/dist/internal/session-kernel.mjs.map +1 -1
- package/dist/internal/sql-oauth-connected-model.d.mts +29 -0
- package/dist/internal/sql-oauth-connected-model.mjs +7 -0
- package/dist/internal/sql-oauth-connected-model.mjs.map +1 -0
- package/dist/internal/sql-oauth-model.d.mts +60 -0
- package/dist/internal/sql-oauth-model.mjs +10 -0
- package/dist/internal/sql-oauth-model.mjs.map +1 -0
- package/dist/internal/sql-query.d.mts +12 -0
- package/dist/internal/sql-query.mjs +15 -18
- package/dist/internal/sql-query.mjs.map +1 -1
- package/dist/internal/sql-storage-validation.mjs +54 -0
- package/dist/internal/sql-storage-validation.mjs.map +1 -0
- package/dist/internal/storage-mapping.mjs +1 -37
- package/dist/internal/storage-mapping.mjs.map +1 -1
- package/dist/internal/storage-plans.d.mts +7 -0
- package/dist/internal/storage-plans.mjs +189 -0
- package/dist/internal/storage-plans.mjs.map +1 -0
- package/dist/internal/storage-tables.d.mts +0 -56
- package/dist/internal/storage-tables.mjs +0 -17
- package/dist/internal/storage-tables.mjs.map +1 -1
- package/dist/internal/storage-validation.d.mts +6 -1
- package/dist/internal/storage-validation.mjs +42 -1
- package/dist/internal/storage-validation.mjs.map +1 -1
- package/dist/internal/transaction-kernel.mjs +3 -2
- package/dist/internal/transaction-kernel.mjs.map +1 -1
- package/package.json +1 -1
- package/src/Adapter.ts +89 -5
- package/src/OAuthPersistence.ts +427 -0
- package/src/index.ts +3 -0
- package/src/internal/configuration.ts +1 -3
- package/src/internal/email-kernel.ts +2 -1
- package/src/internal/models/oauth-connected-model.ts +396 -0
- package/src/internal/models/oauth-model.ts +708 -0
- package/src/internal/models/password-model.ts +2 -57
- package/src/internal/native-sql-table.ts +14 -0
- package/src/internal/oauth/accounts.ts +839 -0
- package/src/internal/oauth/connected-access.ts +388 -0
- package/src/internal/oauth/connected-collection.ts +345 -0
- package/src/internal/oauth/connected-custody.ts +308 -0
- package/src/internal/oauth/connected-flow.ts +562 -0
- package/src/internal/oauth/connected-input.ts +147 -0
- package/src/internal/oauth/connected-keys.ts +31 -0
- package/src/internal/oauth/connected-maintenance.ts +379 -0
- package/src/internal/oauth/connected-management.ts +391 -0
- package/src/internal/oauth/connected-reference.ts +135 -0
- package/src/internal/oauth/connected-settlement.ts +278 -0
- package/src/internal/oauth/connected-sign-in.ts +472 -0
- package/src/internal/oauth/connected-state.ts +924 -0
- package/src/internal/oauth/connected-target.ts +307 -0
- package/src/internal/oauth/flow.ts +505 -0
- package/src/internal/oauth/input.ts +201 -0
- package/src/internal/oauth/owner.ts +22 -0
- package/src/internal/oauth/query-compiler.ts +15 -0
- package/src/internal/oauth/registration.ts +676 -0
- package/src/internal/oauth/state.ts +218 -0
- package/src/internal/oauth/target.ts +803 -0
- package/src/internal/oauth-kernel.ts +294 -0
- package/src/internal/oauth-proxy.ts +176 -0
- package/src/internal/passkey/write-state.ts +18 -4
- package/src/internal/password-credentials.ts +245 -0
- package/src/internal/password-kernel.ts +7 -99
- package/src/internal/persistence.ts +1 -1
- package/src/internal/query-operations.ts +2 -0
- package/src/internal/session-kernel.ts +143 -55
- package/src/internal/sql-oauth-connected-model.ts +145 -0
- package/src/internal/sql-oauth-model.ts +263 -0
- package/src/internal/sql-query.ts +16 -13
- package/src/internal/sql-storage-validation.ts +64 -0
- package/src/internal/storage-mapping.ts +0 -37
- package/src/internal/storage-plans.ts +218 -0
- package/src/internal/storage-tables.ts +0 -20
- package/src/internal/storage-validation.ts +58 -0
- package/src/internal/transaction-kernel.ts +6 -2
- package/dist/internal/password-attempts.mjs +0 -197
- package/dist/internal/password-attempts.mjs.map +0 -1
- package/src/internal/password-attempts.ts +0 -466
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type RecoveryReference, type LoginIdentifier } from "@yielded/auth/Identity";
|
|
2
2
|
import type {
|
|
3
3
|
PasswordAction,
|
|
4
|
-
PasswordAttemptId,
|
|
5
4
|
PasswordCredentialSnapshot,
|
|
6
5
|
PasswordReplacement,
|
|
7
6
|
PasswordRegistrationDecision,
|
|
@@ -15,10 +14,6 @@ import type { PersistenceMappingError, SubjectIdCodec } from "./common";
|
|
|
15
14
|
|
|
16
15
|
type ColumnKey<T extends Table> = T["column"];
|
|
17
16
|
|
|
18
|
-
export type PasswordAttemptAction = "sign-in" | "change";
|
|
19
|
-
|
|
20
|
-
export type PasswordAttemptState = "pending" | "verified" | "rejected";
|
|
21
|
-
|
|
22
17
|
export interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {
|
|
23
18
|
readonly table: Subject["table"];
|
|
24
19
|
readonly id: ColumnKey<Subject>;
|
|
@@ -121,48 +116,6 @@ export interface PasswordCredentialTable<
|
|
|
121
116
|
}) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;
|
|
122
117
|
}
|
|
123
118
|
|
|
124
|
-
export interface PasswordAttemptRecord {
|
|
125
|
-
readonly moduleId: string;
|
|
126
|
-
readonly action: PasswordAttemptAction;
|
|
127
|
-
readonly attemptId: PasswordAttemptId;
|
|
128
|
-
readonly identifier: LoginIdentifier;
|
|
129
|
-
readonly subjectId?: string;
|
|
130
|
-
readonly credentialId?: string;
|
|
131
|
-
readonly securityRevision?: SecurityRevision;
|
|
132
|
-
readonly credentialRevision?: SecurityRevision;
|
|
133
|
-
readonly verifierVersion?: SecurityRevision;
|
|
134
|
-
readonly identifierBindingRevision?: SecurityRevision;
|
|
135
|
-
readonly admittedAtMillis: number;
|
|
136
|
-
readonly deadlineMillis: number;
|
|
137
|
-
readonly retentionUntilMillis: number;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export interface PasswordAttemptTable<Attempt extends Table, NativeSubjectId> {
|
|
141
|
-
readonly table: Attempt["table"];
|
|
142
|
-
readonly moduleId: ColumnKey<Attempt>;
|
|
143
|
-
readonly action: ColumnKey<Attempt>;
|
|
144
|
-
readonly attemptId: ColumnKey<Attempt>;
|
|
145
|
-
readonly identifierNamespace: ColumnKey<Attempt>;
|
|
146
|
-
readonly identifierValue: ColumnKey<Attempt>;
|
|
147
|
-
readonly subjectId: ColumnKey<Attempt>;
|
|
148
|
-
readonly credentialId: ColumnKey<Attempt>;
|
|
149
|
-
readonly securityRevision: ColumnKey<Attempt>;
|
|
150
|
-
readonly credentialRevision: ColumnKey<Attempt>;
|
|
151
|
-
readonly verifierVersion: ColumnKey<Attempt>;
|
|
152
|
-
readonly identifierBindingRevision: ColumnKey<Attempt>;
|
|
153
|
-
readonly admittedAt: ColumnKey<Attempt>;
|
|
154
|
-
readonly deadline: ColumnKey<Attempt>;
|
|
155
|
-
readonly retentionUntil: ColumnKey<Attempt>;
|
|
156
|
-
readonly state: ColumnKey<Attempt>;
|
|
157
|
-
readonly encodeInsert: (
|
|
158
|
-
record: PasswordAttemptRecord,
|
|
159
|
-
input: {
|
|
160
|
-
readonly nativeSubjectId?: NativeSubjectId;
|
|
161
|
-
readonly state: "pending";
|
|
162
|
-
},
|
|
163
|
-
) => Attempt["insert"];
|
|
164
|
-
}
|
|
165
|
-
|
|
166
119
|
export interface PasswordCommandTable<Command extends Table> {
|
|
167
120
|
readonly table: Command["table"];
|
|
168
121
|
readonly moduleId: ColumnKey<Command>;
|
|
@@ -186,7 +139,6 @@ export interface RequiredPasswordConstraints {
|
|
|
186
139
|
readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
|
|
187
140
|
readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
|
|
188
141
|
readonly credentialId: "unique(credential.moduleId,credential.credentialId)";
|
|
189
|
-
readonly attempt: "unique(attempt.moduleId,attempt.attemptId)";
|
|
190
142
|
readonly command: "unique(command.moduleId,command.commandId)";
|
|
191
143
|
}
|
|
192
144
|
|
|
@@ -195,7 +147,6 @@ export const requiredPasswordConstraints: RequiredPasswordConstraints = {
|
|
|
195
147
|
authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
|
|
196
148
|
credentialSubject: "unique(credential.moduleId,credential.subjectId)",
|
|
197
149
|
credentialId: "unique(credential.moduleId,credential.credentialId)",
|
|
198
|
-
attempt: "unique(attempt.moduleId,attempt.attemptId)",
|
|
199
150
|
command: "unique(command.moduleId,command.commandId)",
|
|
200
151
|
};
|
|
201
152
|
|
|
@@ -216,7 +167,6 @@ export interface PasswordPersistenceMapping<
|
|
|
216
167
|
Identifier extends Table,
|
|
217
168
|
Credential extends Table,
|
|
218
169
|
AuthorityCredential extends Table,
|
|
219
|
-
Attempt extends Table,
|
|
220
170
|
Command extends Table,
|
|
221
171
|
NativeSubjectId,
|
|
222
172
|
Expression extends SqlExpression = SqlExpression,
|
|
@@ -229,20 +179,18 @@ export interface PasswordPersistenceMapping<
|
|
|
229
179
|
AuthorityCredential,
|
|
230
180
|
NativeSubjectId
|
|
231
181
|
>;
|
|
232
|
-
readonly attempt: PasswordAttemptTable<Attempt, NativeSubjectId>;
|
|
233
182
|
readonly command: PasswordCommandTable<Command>;
|
|
234
183
|
readonly subjectId: SubjectIdCodec<NativeSubjectId>;
|
|
235
184
|
readonly constraints: RequiredPasswordConstraints;
|
|
236
185
|
readonly encodeInstant: (epochMillis: number) => unknown;
|
|
237
186
|
readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;
|
|
238
|
-
readonly allocateAttemptId?: Effect.Effect<PasswordAttemptId, PersistenceMappingError>;
|
|
239
|
-
readonly allocateAttemptIdSync?: () => PasswordAttemptId;
|
|
240
187
|
readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;
|
|
241
188
|
readonly allocateCredentialIdSync?: () => string;
|
|
242
189
|
readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
|
|
243
190
|
readonly allocateRevisionSync?: () => SecurityRevision;
|
|
244
191
|
readonly commandRetentionMillis: number;
|
|
245
|
-
/** All semantic replacements still bump subject revision. This flag
|
|
192
|
+
/** All semantic replacements still bump subject revision. This flag declares
|
|
193
|
+
* authoritative verification's invalidation latency; cookie exposure is separate. */
|
|
246
194
|
readonly sessionInvalidation: "same-authority-immediate" | "original-absolute-expiry";
|
|
247
195
|
readonly d1?: PasswordD1Clock<Expression>;
|
|
248
196
|
}
|
|
@@ -252,7 +200,6 @@ export type D1PasswordPersistenceMapping<
|
|
|
252
200
|
Identifier extends Table,
|
|
253
201
|
Credential extends Table,
|
|
254
202
|
AuthorityCredential extends Table,
|
|
255
|
-
Attempt extends Table,
|
|
256
203
|
Command extends Table,
|
|
257
204
|
NativeSubjectId,
|
|
258
205
|
Expression extends SqlExpression = SqlExpression,
|
|
@@ -261,7 +208,6 @@ export type D1PasswordPersistenceMapping<
|
|
|
261
208
|
Identifier,
|
|
262
209
|
Credential,
|
|
263
210
|
AuthorityCredential,
|
|
264
|
-
Attempt,
|
|
265
211
|
Command,
|
|
266
212
|
NativeSubjectId,
|
|
267
213
|
Expression
|
|
@@ -429,7 +375,6 @@ export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = Sql
|
|
|
429
375
|
AnyTableModel,
|
|
430
376
|
AnyTableModel,
|
|
431
377
|
AnyTableModel,
|
|
432
|
-
AnyTableModel,
|
|
433
378
|
unknown,
|
|
434
379
|
Expression
|
|
435
380
|
>;
|
|
@@ -4,6 +4,7 @@ import * as Statement from "effect/sql/Statement";
|
|
|
4
4
|
|
|
5
5
|
import { PersistenceMappingError } from "./mapping-error";
|
|
6
6
|
import { Table, identifier } from "./sql-table";
|
|
7
|
+
import type { PhysicalTextColumn } from "./storage-validation";
|
|
7
8
|
|
|
8
9
|
/** Capture synchronous mapping callbacks without changing SQL execution errors. */
|
|
9
10
|
export const sqlMapping = <A>(thunk: () => A): Effect.Effect<A, PersistenceMappingError> =>
|
|
@@ -19,6 +20,9 @@ export interface SqlTable {
|
|
|
19
20
|
/** Alias reads only; writes continue to target the original physical table. */
|
|
20
21
|
readonly as: (alias: string) => SqlTable;
|
|
21
22
|
readonly column: (key: string) => Statement.Fragment;
|
|
23
|
+
/** Optional codec-free text candidate. Physical type/collation compatibility
|
|
24
|
+
* must still be checked against the database before comparing columns. */
|
|
25
|
+
readonly unencodedTextColumn?: (key: string) => PhysicalTextColumn | undefined;
|
|
22
26
|
/** Project every column under an ordinal alias, using a distinct prefix per table. */
|
|
23
27
|
readonly fields: (prefix: string) => Statement.Fragment;
|
|
24
28
|
readonly decode: (
|
|
@@ -98,6 +102,16 @@ const directTable = (client: SqlClient, physical: object): SqlTable => {
|
|
|
98
102
|
name: alias === undefined ? name : client`${name} AS ${reference}`,
|
|
99
103
|
as: bind,
|
|
100
104
|
column,
|
|
105
|
+
unencodedTextColumn: (key) =>
|
|
106
|
+
getColumn(key).options.type === "text"
|
|
107
|
+
? {
|
|
108
|
+
table: {
|
|
109
|
+
name: physical.name,
|
|
110
|
+
...(physical.schema === undefined ? {} : { schema: physical.schema }),
|
|
111
|
+
},
|
|
112
|
+
name: getColumn(key).options.name,
|
|
113
|
+
}
|
|
114
|
+
: undefined,
|
|
101
115
|
value,
|
|
102
116
|
fields: (prefix) =>
|
|
103
117
|
client.join(
|