@yielded/auth-persistence-drizzle 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.
Files changed (189) hide show
  1. package/README.md +3 -0
  2. package/dist/D1.d.mts +9 -9
  3. package/dist/D1.mjs +2 -1
  4. package/dist/D1.mjs.map +1 -1
  5. package/dist/Libsql.d.mts +48 -64
  6. package/dist/Libsql.mjs +2 -1
  7. package/dist/Libsql.mjs.map +1 -1
  8. package/dist/Mysql2.d.mts +26 -27
  9. package/dist/Pglite.d.mts +28 -28
  10. package/dist/Pglite.mjs +2 -1
  11. package/dist/Pglite.mjs.map +1 -1
  12. package/dist/Postgres.d.mts +29 -29
  13. package/dist/Postgres.mjs +2 -1
  14. package/dist/Postgres.mjs.map +1 -1
  15. package/dist/SqliteBun.d.mts +49 -65
  16. package/dist/SqliteBun.mjs +2 -1
  17. package/dist/SqliteBun.mjs.map +1 -1
  18. package/dist/SqliteDo.d.mts +47 -63
  19. package/dist/SqliteDo.mjs +2 -1
  20. package/dist/SqliteDo.mjs.map +1 -1
  21. package/dist/SqliteNode.d.mts +51 -67
  22. package/dist/SqliteNode.mjs +2 -1
  23. package/dist/SqliteNode.mjs.map +1 -1
  24. package/dist/SqliteWasm.d.mts +47 -63
  25. package/dist/SqliteWasm.mjs +2 -1
  26. package/dist/SqliteWasm.mjs.map +1 -1
  27. package/dist/drizzle/crypto.mjs +1 -1
  28. package/dist/drizzle/d1-emails.d.mts +1 -1
  29. package/dist/drizzle/d1-oauth.d.mts +15 -15
  30. package/dist/drizzle/d1-passkey.d.mts +1 -1
  31. package/dist/drizzle/d1-password-prepared.d.mts +4 -4
  32. package/dist/drizzle/d1-password-prepared.mjs +1 -1
  33. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  34. package/dist/drizzle/d1-passwords.d.mts +17 -33
  35. package/dist/drizzle/d1-passwords.mjs +57 -199
  36. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  37. package/dist/drizzle/d1-phone.d.mts +1 -1
  38. package/dist/drizzle/d1-proofs.d.mts +1 -1
  39. package/dist/drizzle/d1-sessions.d.mts +2 -2
  40. package/dist/drizzle/d1-sessions.mjs +11 -6
  41. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  42. package/dist/drizzle/d1-totp.d.mts +1 -1
  43. package/dist/drizzle/mysql-password-prepared.d.mts +5 -5
  44. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  45. package/dist/drizzle/mysql-passwords.d.mts +16 -32
  46. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  47. package/dist/drizzle/mysql-sessions.d.mts +1 -1
  48. package/dist/drizzle/native-sql-table.mjs +26 -1
  49. package/dist/drizzle/native-sql-table.mjs.map +1 -1
  50. package/dist/drizzle/oauth-connected-model.d.mts +20 -281
  51. package/dist/drizzle/oauth-connected-model.mjs +3 -17
  52. package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
  53. package/dist/drizzle/oauth-connected-reference.d.mts +1 -3
  54. package/dist/drizzle/oauth-connected-reference.mjs +4 -53
  55. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
  56. package/dist/drizzle/oauth-connected-target.d.mts +3 -990
  57. package/dist/drizzle/oauth-connected-target.mjs +8 -92
  58. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  59. package/dist/drizzle/oauth-kernel.mjs +11 -0
  60. package/dist/drizzle/oauth-kernel.mjs.map +1 -0
  61. package/dist/drizzle/oauth-model.d.mts +35 -438
  62. package/dist/drizzle/oauth-model.mjs +6 -44
  63. package/dist/drizzle/oauth-model.mjs.map +1 -1
  64. package/dist/drizzle/oauth-mysql.mjs +2 -2
  65. package/dist/drizzle/oauth-mysql.mjs.map +1 -1
  66. package/dist/drizzle/oauth-proxy.d.mts +10 -0
  67. package/dist/drizzle/oauth-proxy.mjs +54 -0
  68. package/dist/drizzle/oauth-proxy.mjs.map +1 -0
  69. package/dist/drizzle/oauth-target.d.mts +6 -107
  70. package/dist/drizzle/oauth-target.mjs +15 -245
  71. package/dist/drizzle/oauth-target.mjs.map +1 -1
  72. package/dist/drizzle/password-model.d.mts +5 -6
  73. package/dist/drizzle/password-prepared-model.d.mts +5 -5
  74. package/dist/drizzle/password-prepared-model.mjs.map +1 -1
  75. package/dist/drizzle/password-prepared-sql.mjs +1 -1
  76. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  77. package/dist/drizzle/password-prepared-state.mjs +1 -1
  78. package/dist/drizzle/pg-password-prepared.d.mts +5 -5
  79. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  80. package/dist/drizzle/pg-passwords.d.mts +16 -32
  81. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  82. package/dist/drizzle/pg-sessions.d.mts +1 -1
  83. package/dist/drizzle/phone-target.d.mts +1 -1
  84. package/dist/drizzle/phone-target.mjs +1 -1
  85. package/dist/drizzle/query-operations.mjs +3 -1
  86. package/dist/drizzle/query-operations.mjs.map +1 -1
  87. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  88. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  89. package/dist/drizzle/storage-validation.mjs +10 -185
  90. package/dist/drizzle/storage-validation.mjs.map +1 -1
  91. package/dist/drizzle/totp-target.d.mts +2 -2
  92. package/dist/drizzle/totp-target.mjs +2 -2
  93. package/dist/drizzle/transaction-execution.d.mts +2 -2
  94. package/dist/drizzle/transaction-owner.d.mts +1 -2
  95. package/dist/index.d.mts +3 -2
  96. package/dist/internal/drizzle-postgres-oauth-proxy.d.mts +138 -0
  97. package/dist/internal/drizzle-postgres-oauth-proxy.mjs +29 -0
  98. package/dist/internal/drizzle-postgres-oauth-proxy.mjs.map +1 -0
  99. package/dist/internal/drizzle-sqlite-oauth-proxy.d.mts +146 -0
  100. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs +29 -0
  101. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs.map +1 -0
  102. package/package.json +1 -1
  103. package/src/D1.ts +2 -0
  104. package/src/Libsql.ts +2 -0
  105. package/src/Pglite.ts +2 -0
  106. package/src/Postgres.ts +2 -0
  107. package/src/SqliteBun.ts +2 -0
  108. package/src/SqliteDo.ts +2 -0
  109. package/src/SqliteNode.ts +2 -0
  110. package/src/SqliteWasm.ts +2 -0
  111. package/src/drizzle/d1-password-prepared.ts +4 -6
  112. package/src/drizzle/d1-passwords.ts +125 -459
  113. package/src/drizzle/d1-sessions.ts +21 -6
  114. package/src/drizzle/mysql-password-prepared.ts +4 -8
  115. package/src/drizzle/mysql-passwords.ts +5 -10
  116. package/src/drizzle/native-sql-table.ts +30 -0
  117. package/src/drizzle/oauth-connected-model.ts +97 -315
  118. package/src/drizzle/oauth-connected-reference.ts +13 -93
  119. package/src/drizzle/oauth-connected-target.ts +14 -271
  120. package/src/drizzle/oauth-kernel.ts +10 -0
  121. package/src/drizzle/oauth-model.ts +188 -541
  122. package/src/drizzle/oauth-mysql.ts +2 -2
  123. package/src/drizzle/oauth-proxy.ts +101 -0
  124. package/src/drizzle/oauth-target.ts +33 -737
  125. package/src/drizzle/password-model.ts +0 -13
  126. package/src/drizzle/password-prepared-model.ts +0 -6
  127. package/src/drizzle/password-prepared-sql.ts +2 -1
  128. package/src/drizzle/pg-password-prepared.ts +4 -8
  129. package/src/drizzle/pg-passwords.ts +5 -10
  130. package/src/drizzle/query-operations.ts +4 -0
  131. package/src/drizzle/sqlite-password-prepared.ts +4 -8
  132. package/src/drizzle/sqlite-passwords.ts +7 -14
  133. package/src/drizzle/storage-validation.ts +13 -214
  134. package/src/index.ts +2 -4
  135. package/src/internal/drizzle-postgres-oauth-proxy.ts +37 -0
  136. package/src/internal/drizzle-sqlite-oauth-proxy.ts +44 -0
  137. package/dist/_virtual/_rolldown/runtime.mjs +0 -13
  138. package/dist/drizzle/oauth-accounts.mjs +0 -359
  139. package/dist/drizzle/oauth-accounts.mjs.map +0 -1
  140. package/dist/drizzle/oauth-connected-access.mjs +0 -212
  141. package/dist/drizzle/oauth-connected-access.mjs.map +0 -1
  142. package/dist/drizzle/oauth-connected-collection.mjs +0 -202
  143. package/dist/drizzle/oauth-connected-collection.mjs.map +0 -1
  144. package/dist/drizzle/oauth-connected-custody.mjs +0 -147
  145. package/dist/drizzle/oauth-connected-custody.mjs.map +0 -1
  146. package/dist/drizzle/oauth-connected-flow.mjs +0 -297
  147. package/dist/drizzle/oauth-connected-flow.mjs.map +0 -1
  148. package/dist/drizzle/oauth-connected-input.mjs +0 -122
  149. package/dist/drizzle/oauth-connected-input.mjs.map +0 -1
  150. package/dist/drizzle/oauth-connected-maintenance.mjs +0 -214
  151. package/dist/drizzle/oauth-connected-maintenance.mjs.map +0 -1
  152. package/dist/drizzle/oauth-connected-management.mjs +0 -229
  153. package/dist/drizzle/oauth-connected-management.mjs.map +0 -1
  154. package/dist/drizzle/oauth-connected-settlement.mjs +0 -128
  155. package/dist/drizzle/oauth-connected-settlement.mjs.map +0 -1
  156. package/dist/drizzle/oauth-connected-sign-in.mjs +0 -265
  157. package/dist/drizzle/oauth-connected-sign-in.mjs.map +0 -1
  158. package/dist/drizzle/oauth-connected-state.d.mts +0 -2062
  159. package/dist/drizzle/oauth-connected-state.mjs +0 -430
  160. package/dist/drizzle/oauth-connected-state.mjs.map +0 -1
  161. package/dist/drizzle/oauth-flow.d.mts +0 -22
  162. package/dist/drizzle/oauth-flow.mjs +0 -253
  163. package/dist/drizzle/oauth-flow.mjs.map +0 -1
  164. package/dist/drizzle/oauth-input.mjs +0 -127
  165. package/dist/drizzle/oauth-input.mjs.map +0 -1
  166. package/dist/drizzle/oauth-owner.d.mts +0 -10
  167. package/dist/drizzle/oauth-owner.mjs +0 -10
  168. package/dist/drizzle/oauth-owner.mjs.map +0 -1
  169. package/dist/drizzle/oauth-registration.d.mts +0 -5
  170. package/dist/drizzle/oauth-registration.mjs +0 -374
  171. package/dist/drizzle/oauth-registration.mjs.map +0 -1
  172. package/dist/drizzle/oauth-state.mjs +0 -107
  173. package/dist/drizzle/oauth-state.mjs.map +0 -1
  174. package/src/drizzle/oauth-accounts.ts +0 -805
  175. package/src/drizzle/oauth-connected-access.ts +0 -361
  176. package/src/drizzle/oauth-connected-collection.ts +0 -324
  177. package/src/drizzle/oauth-connected-custody.ts +0 -279
  178. package/src/drizzle/oauth-connected-flow.ts +0 -529
  179. package/src/drizzle/oauth-connected-input.ts +0 -147
  180. package/src/drizzle/oauth-connected-maintenance.ts +0 -346
  181. package/src/drizzle/oauth-connected-management.ts +0 -365
  182. package/src/drizzle/oauth-connected-settlement.ts +0 -251
  183. package/src/drizzle/oauth-connected-sign-in.ts +0 -443
  184. package/src/drizzle/oauth-connected-state.ts +0 -872
  185. package/src/drizzle/oauth-flow.ts +0 -462
  186. package/src/drizzle/oauth-input.ts +0 -201
  187. package/src/drizzle/oauth-owner.ts +0 -29
  188. package/src/drizzle/oauth-registration.ts +0 -640
  189. package/src/drizzle/oauth-state.ts +0 -218
@@ -1,218 +0,0 @@
1
- import {
2
- type OAuthActionAuthorization,
3
- type OAuthAccountRevision,
4
- OAuthUnavailable,
5
- OAuthExternalIdentity,
6
- snapshotOAuthSync,
7
- } from "@yielded/auth/OAuth";
8
- import type { AuthenticationRequirement } from "@yielded/auth/Sessions";
9
- import { Crypto, DateTime, Effect, Schema } from "effect";
10
- import { Base64Url } from "effect/encoding";
11
-
12
- import { digest, randomId } from "./crypto";
13
- export { digest } from "./crypto";
14
-
15
- const encoder = new TextEncoder();
16
- const decoder = new TextDecoder("utf-8", { fatal: true });
17
-
18
- export const unavailable = () => OAuthUnavailable.make({});
19
-
20
- export const invariant: (value: unknown) => asserts value = (value) => {
21
- if (!value) throw unavailable();
22
- };
23
-
24
- export const nonce = randomId;
25
-
26
- /** Capture configuration/callback references while preserving Drizzle table, SQL
27
- * and Effect objects. Never freeze or mutate the consumer's original graph. */
28
- export const captureOAuthMapping = <A>(input: A): A => {
29
- const seen = new Map<object, unknown>();
30
-
31
- const copy = (value: unknown): unknown => {
32
- if (value === null || typeof value !== "object" || Effect.isEffect(value)) return value;
33
- if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) return value;
34
- const prior = seen.get(value);
35
-
36
- if (prior !== undefined) return prior;
37
- if (Array.isArray(value)) {
38
- const result: unknown[] = [];
39
-
40
- seen.set(value, result);
41
- result.push(...value.map(copy));
42
-
43
- return Object.freeze(result);
44
- }
45
- const result: Record<string, unknown> = {};
46
-
47
- seen.set(value, result);
48
- for (const [key, child] of Object.entries(value)) result[key] = copy(child);
49
-
50
- return Object.freeze(result);
51
- };
52
-
53
- return copy(input) as A;
54
- };
55
-
56
- /** Versioned length-delimited UTF-8 tuple; the module is deliberately excluded.
57
- * Reject ill-formed UTF-16 rather than letting UTF-8 replacement alias identities. */
58
- export const oauthIdentityKey = Effect.fnUntraced(function* (
59
- input: typeof OAuthExternalIdentity.Type,
60
- ) {
61
- const identity = snapshotOAuthSync(OAuthExternalIdentity, input);
62
-
63
- const fields = [
64
- "effect-auth/oauth-identity-key/v1",
65
- identity.provider,
66
- identity.issuer,
67
- identity.subject,
68
- ];
69
-
70
- const bytes = fields.map((field) => {
71
- const value = encoder.encode(field);
72
-
73
- invariant(decoder.decode(value) === field);
74
-
75
- return value;
76
- });
77
-
78
- const packed = new Uint8Array(bytes.reduce((size, value) => size + 4 + value.length, 0));
79
- const view = new DataView(packed.buffer);
80
- let offset = 0;
81
-
82
- for (const value of bytes) {
83
- view.setUint32(offset, value.length, false);
84
- packed.set(value, offset + 4);
85
- offset += 4 + value.length;
86
- }
87
-
88
- const crypto = yield* Crypto.Crypto;
89
-
90
- return "v1:" + Base64Url.encode(yield* crypto.digest("SHA-256", packed));
91
- });
92
-
93
- export const sameIdentity = (
94
- left: typeof OAuthExternalIdentity.Type,
95
- right: typeof OAuthExternalIdentity.Type,
96
- ) =>
97
- left.provider === right.provider &&
98
- left.issuer === right.issuer &&
99
- left.subject === right.subject;
100
-
101
- /** Private Type storage: opaque wrappers and DateTimes are freshly reconstructed. */
102
- export const storage = <S extends Schema.Codec<unknown, unknown, never, never>>(schema: S) => {
103
- const codec = Schema.fromJsonString(Schema.toCodecJson(Schema.toType(schema)));
104
- const encode = Schema.encodeSync(codec);
105
- const decode = Schema.decodeSync(codec);
106
-
107
- return {
108
- encode: (value: S["Type"]) => encode(snapshotOAuthSync(schema, value)),
109
- decode: (value: string) => snapshotOAuthSync(schema, decode(value)),
110
- };
111
- };
112
-
113
- export const sameRevision = (left: OAuthAccountRevision, right: OAuthAccountRevision) => {
114
- if (
115
- left.subjectId !== right.subjectId ||
116
- left.securityRevision !== right.securityRevision ||
117
- left.credentials.length !== right.credentials.length
118
- )
119
- return false;
120
- const revisions = new Map(left.credentials.map((item) => [item.credentialId, item.revision]));
121
-
122
- return (
123
- revisions.size === left.credentials.length &&
124
- new Set(right.credentials.map((item) => item.credentialId)).size === right.credentials.length &&
125
- right.credentials.every((item) => revisions.get(item.credentialId) === item.revision)
126
- );
127
- };
128
-
129
- export const satisfies = (
130
- proofs: ReadonlyArray<{
131
- readonly credentialId: string;
132
- readonly factors: ReadonlyArray<string>;
133
- readonly userVerified: boolean;
134
- readonly phishingResistant: boolean;
135
- }>,
136
- requirement: AuthenticationRequirement,
137
- ) => {
138
- const factors = new Set(proofs.flatMap((proof) => [...proof.factors]));
139
- const count = new Set(proofs.map((proof) => proof.credentialId)).size;
140
-
141
- return requirement.alternatives.some(
142
- (alternative) =>
143
- alternative.factors.every((factor) => factors.has(factor)) &&
144
- count >= alternative.minimumCredentials &&
145
- proofs.some(
146
- (proof) =>
147
- (!alternative.userVerified || proof.userVerified) &&
148
- (!alternative.phishingResistant || proof.phishingResistant),
149
- ),
150
- );
151
- };
152
-
153
- export const validAction = Effect.fnUntraced(function* (
154
- authorization: OAuthActionAuthorization,
155
- expected: {
156
- readonly moduleId: string;
157
- readonly action: OAuthActionAuthorization["challenge"]["action"];
158
- readonly flowId: string;
159
- readonly commandId: string;
160
- readonly revision: OAuthAccountRevision;
161
- readonly intent: string;
162
- },
163
- currentRequirement: AuthenticationRequirement,
164
- now: number,
165
- maximumAgeMillis: number,
166
- ) {
167
- const challenge = authorization.challenge;
168
- const evidence = authorization.evidence;
169
- const intentDigest = yield* digest(expected.intent);
170
-
171
- const binding = yield* digest(
172
- // oxlint-disable-next-line no-restricted-properties -- Fixed private action fingerprint format shared with the core verifier.
173
- JSON.stringify([
174
- "effect-auth/oauth-action/v1",
175
- expected.moduleId,
176
- expected.action,
177
- expected.flowId,
178
- expected.commandId,
179
- intentDigest,
180
- ]),
181
- );
182
-
183
- if (
184
- challenge.moduleId !== expected.moduleId ||
185
- challenge.action !== expected.action ||
186
- challenge.flowId !== expected.flowId ||
187
- challenge.commandId !== expected.commandId ||
188
- challenge.intentDigest !== intentDigest ||
189
- challenge.bindingDigest !== binding ||
190
- evidence.flowId !== expected.flowId ||
191
- evidence.bindingDigest !== binding ||
192
- !sameRevision(challenge.revision, expected.revision) ||
193
- !sameRevision(evidence.revision, expected.revision)
194
- )
195
- return false;
196
-
197
- const revisions = new Map(
198
- expected.revision.credentials.map((item) => [item.credentialId, item.revision]),
199
- );
200
-
201
- if (
202
- evidence.proofs.some(
203
- (proof) =>
204
- !revisions.has(proof.credentialId) || DateTime.toEpochMillis(proof.verifiedAt) > now,
205
- )
206
- )
207
- return false;
208
-
209
- return [authorization.requirement, currentRequirement].every((requirement) => {
210
- const fresh = evidence.proofs.filter((proof) => {
211
- const age = now - DateTime.toEpochMillis(proof.verifiedAt);
212
-
213
- return age >= 0 && age < Math.min(maximumAgeMillis, requirement.maximumAgeMillis);
214
- });
215
-
216
- return satisfies(fresh, requirement);
217
- });
218
- });