@yielded/auth-persistence-drizzle 0.1.0-beta.22 → 0.1.0-beta.24

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 (200) hide show
  1. package/README.md +3 -0
  2. package/dist/D1.d.mts +11 -11
  3. package/dist/D1.mjs +2 -1
  4. package/dist/D1.mjs.map +1 -1
  5. package/dist/Libsql.d.mts +40 -56
  6. package/dist/Libsql.mjs +2 -1
  7. package/dist/Libsql.mjs.map +1 -1
  8. package/dist/Mysql2.d.mts +16 -17
  9. package/dist/Pglite.d.mts +18 -18
  10. package/dist/Pglite.mjs +2 -1
  11. package/dist/Pglite.mjs.map +1 -1
  12. package/dist/Postgres.d.mts +24 -24
  13. package/dist/Postgres.mjs +2 -1
  14. package/dist/Postgres.mjs.map +1 -1
  15. package/dist/SqliteBun.d.mts +39 -55
  16. package/dist/SqliteBun.mjs +2 -1
  17. package/dist/SqliteBun.mjs.map +1 -1
  18. package/dist/SqliteDo.d.mts +48 -64
  19. package/dist/SqliteDo.mjs +2 -1
  20. package/dist/SqliteDo.mjs.map +1 -1
  21. package/dist/SqliteNode.d.mts +45 -61
  22. package/dist/SqliteNode.mjs +2 -1
  23. package/dist/SqliteNode.mjs.map +1 -1
  24. package/dist/SqliteWasm.d.mts +48 -64
  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 +14 -14
  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.map +1 -1
  33. package/dist/drizzle/d1-passwords.d.mts +18 -35
  34. package/dist/drizzle/d1-passwords.mjs +78 -290
  35. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  36. package/dist/drizzle/d1-phone.d.mts +1 -1
  37. package/dist/drizzle/d1-proofs.d.mts +2 -2
  38. package/dist/drizzle/d1-sessions.d.mts +3 -3
  39. package/dist/drizzle/d1-sessions.mjs +11 -6
  40. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  41. package/dist/drizzle/d1-totp.d.mts +1 -1
  42. package/dist/drizzle/mysql-password-prepared.d.mts +5 -5
  43. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  44. package/dist/drizzle/mysql-passwords.d.mts +16 -32
  45. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  46. package/dist/drizzle/mysql-sessions.d.mts +1 -1
  47. package/dist/drizzle/native-sql-table.mjs +135 -0
  48. package/dist/drizzle/native-sql-table.mjs.map +1 -0
  49. package/dist/drizzle/oauth-connected-model.d.mts +20 -281
  50. package/dist/drizzle/oauth-connected-model.mjs +3 -17
  51. package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
  52. package/dist/drizzle/oauth-connected-reference.d.mts +1 -3
  53. package/dist/drizzle/oauth-connected-reference.mjs +4 -53
  54. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
  55. package/dist/drizzle/oauth-connected-target.d.mts +3 -990
  56. package/dist/drizzle/oauth-connected-target.mjs +8 -92
  57. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  58. package/dist/drizzle/oauth-kernel.mjs +11 -0
  59. package/dist/drizzle/oauth-kernel.mjs.map +1 -0
  60. package/dist/drizzle/oauth-model.d.mts +35 -438
  61. package/dist/drizzle/oauth-model.mjs +6 -44
  62. package/dist/drizzle/oauth-model.mjs.map +1 -1
  63. package/dist/drizzle/oauth-mysql.mjs +2 -2
  64. package/dist/drizzle/oauth-mysql.mjs.map +1 -1
  65. package/dist/drizzle/oauth-proxy.d.mts +10 -0
  66. package/dist/drizzle/oauth-proxy.mjs +54 -0
  67. package/dist/drizzle/oauth-proxy.mjs.map +1 -0
  68. package/dist/drizzle/oauth-target.d.mts +6 -107
  69. package/dist/drizzle/oauth-target.mjs +15 -245
  70. package/dist/drizzle/oauth-target.mjs.map +1 -1
  71. package/dist/drizzle/password-model.d.mts +5 -8
  72. package/dist/drizzle/password-prepared-model.d.mts +5 -5
  73. package/dist/drizzle/password-prepared-model.mjs.map +1 -1
  74. package/dist/drizzle/password-prepared-state.mjs +1 -1
  75. package/dist/drizzle/password-sql.mjs +2 -1
  76. package/dist/drizzle/password-sql.mjs.map +1 -1
  77. package/dist/drizzle/password-target.mjs +13 -2
  78. package/dist/drizzle/password-target.mjs.map +1 -1
  79. package/dist/drizzle/pg-password-prepared.d.mts +5 -5
  80. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  81. package/dist/drizzle/pg-passwords.d.mts +16 -32
  82. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  83. package/dist/drizzle/pg-sessions.d.mts +1 -1
  84. package/dist/drizzle/phone-target.d.mts +2 -2
  85. package/dist/drizzle/phone-target.mjs +1 -1
  86. package/dist/drizzle/query-operations.mjs +3 -1
  87. package/dist/drizzle/query-operations.mjs.map +1 -1
  88. package/dist/drizzle/session-sql.mjs +2 -1
  89. package/dist/drizzle/session-sql.mjs.map +1 -1
  90. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  91. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  92. package/dist/drizzle/storage-validation.mjs +10 -198
  93. package/dist/drizzle/storage-validation.mjs.map +1 -1
  94. package/dist/drizzle/totp-target.d.mts +3 -3
  95. package/dist/drizzle/totp-target.mjs +2 -2
  96. package/dist/drizzle/transaction-execution.d.mts +2 -2
  97. package/dist/drizzle/transaction-owner.d.mts +1 -2
  98. package/dist/index.d.mts +3 -2
  99. package/dist/internal/drizzle-postgres-oauth-proxy.d.mts +138 -0
  100. package/dist/internal/drizzle-postgres-oauth-proxy.mjs +29 -0
  101. package/dist/internal/drizzle-postgres-oauth-proxy.mjs.map +1 -0
  102. package/dist/internal/drizzle-postgres.mjs +2 -0
  103. package/dist/internal/drizzle-postgres.mjs.map +1 -1
  104. package/dist/internal/drizzle-sqlite-oauth-proxy.d.mts +146 -0
  105. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs +29 -0
  106. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs.map +1 -0
  107. package/dist/internal/drizzle-sqlite.mjs +2 -0
  108. package/dist/internal/drizzle-sqlite.mjs.map +1 -1
  109. package/package.json +1 -1
  110. package/src/D1.ts +2 -0
  111. package/src/Libsql.ts +2 -0
  112. package/src/Pglite.ts +2 -0
  113. package/src/Postgres.ts +2 -0
  114. package/src/SqliteBun.ts +2 -0
  115. package/src/SqliteDo.ts +2 -0
  116. package/src/SqliteNode.ts +2 -0
  117. package/src/SqliteWasm.ts +2 -0
  118. package/src/drizzle/d1-password-prepared.ts +2 -23
  119. package/src/drizzle/d1-passwords.ts +158 -780
  120. package/src/drizzle/d1-sessions.ts +21 -6
  121. package/src/drizzle/mysql-password-prepared.ts +4 -16
  122. package/src/drizzle/mysql-passwords.ts +5 -20
  123. package/src/drizzle/native-sql-table.ts +259 -0
  124. package/src/drizzle/oauth-connected-model.ts +97 -315
  125. package/src/drizzle/oauth-connected-reference.ts +13 -93
  126. package/src/drizzle/oauth-connected-target.ts +14 -271
  127. package/src/drizzle/oauth-kernel.ts +10 -0
  128. package/src/drizzle/oauth-model.ts +188 -541
  129. package/src/drizzle/oauth-mysql.ts +2 -2
  130. package/src/drizzle/oauth-proxy.ts +101 -0
  131. package/src/drizzle/oauth-target.ts +33 -737
  132. package/src/drizzle/password-model.ts +0 -33
  133. package/src/drizzle/password-prepared-model.ts +0 -18
  134. package/src/drizzle/password-sql.ts +3 -0
  135. package/src/drizzle/password-target.ts +41 -4
  136. package/src/drizzle/pg-password-prepared.ts +4 -16
  137. package/src/drizzle/pg-passwords.ts +5 -20
  138. package/src/drizzle/query-operations.ts +4 -0
  139. package/src/drizzle/session-sql.ts +2 -1
  140. package/src/drizzle/sqlite-password-prepared.ts +4 -52
  141. package/src/drizzle/sqlite-passwords.ts +7 -28
  142. package/src/drizzle/storage-validation.ts +13 -222
  143. package/src/index.ts +2 -8
  144. package/src/internal/drizzle-postgres-oauth-proxy.ts +37 -0
  145. package/src/internal/drizzle-postgres.ts +2 -0
  146. package/src/internal/drizzle-sqlite-oauth-proxy.ts +44 -0
  147. package/src/internal/drizzle-sqlite.ts +2 -0
  148. package/dist/_virtual/_rolldown/runtime.mjs +0 -13
  149. package/dist/drizzle/oauth-accounts.mjs +0 -359
  150. package/dist/drizzle/oauth-accounts.mjs.map +0 -1
  151. package/dist/drizzle/oauth-connected-access.mjs +0 -212
  152. package/dist/drizzle/oauth-connected-access.mjs.map +0 -1
  153. package/dist/drizzle/oauth-connected-collection.mjs +0 -202
  154. package/dist/drizzle/oauth-connected-collection.mjs.map +0 -1
  155. package/dist/drizzle/oauth-connected-custody.mjs +0 -147
  156. package/dist/drizzle/oauth-connected-custody.mjs.map +0 -1
  157. package/dist/drizzle/oauth-connected-flow.mjs +0 -297
  158. package/dist/drizzle/oauth-connected-flow.mjs.map +0 -1
  159. package/dist/drizzle/oauth-connected-input.mjs +0 -122
  160. package/dist/drizzle/oauth-connected-input.mjs.map +0 -1
  161. package/dist/drizzle/oauth-connected-maintenance.mjs +0 -214
  162. package/dist/drizzle/oauth-connected-maintenance.mjs.map +0 -1
  163. package/dist/drizzle/oauth-connected-management.mjs +0 -229
  164. package/dist/drizzle/oauth-connected-management.mjs.map +0 -1
  165. package/dist/drizzle/oauth-connected-settlement.mjs +0 -128
  166. package/dist/drizzle/oauth-connected-settlement.mjs.map +0 -1
  167. package/dist/drizzle/oauth-connected-sign-in.mjs +0 -265
  168. package/dist/drizzle/oauth-connected-sign-in.mjs.map +0 -1
  169. package/dist/drizzle/oauth-connected-state.d.mts +0 -2062
  170. package/dist/drizzle/oauth-connected-state.mjs +0 -430
  171. package/dist/drizzle/oauth-connected-state.mjs.map +0 -1
  172. package/dist/drizzle/oauth-flow.d.mts +0 -22
  173. package/dist/drizzle/oauth-flow.mjs +0 -253
  174. package/dist/drizzle/oauth-flow.mjs.map +0 -1
  175. package/dist/drizzle/oauth-input.mjs +0 -127
  176. package/dist/drizzle/oauth-input.mjs.map +0 -1
  177. package/dist/drizzle/oauth-owner.d.mts +0 -10
  178. package/dist/drizzle/oauth-owner.mjs +0 -10
  179. package/dist/drizzle/oauth-owner.mjs.map +0 -1
  180. package/dist/drizzle/oauth-registration.d.mts +0 -5
  181. package/dist/drizzle/oauth-registration.mjs +0 -374
  182. package/dist/drizzle/oauth-registration.mjs.map +0 -1
  183. package/dist/drizzle/oauth-state.mjs +0 -107
  184. package/dist/drizzle/oauth-state.mjs.map +0 -1
  185. package/src/drizzle/oauth-accounts.ts +0 -805
  186. package/src/drizzle/oauth-connected-access.ts +0 -361
  187. package/src/drizzle/oauth-connected-collection.ts +0 -324
  188. package/src/drizzle/oauth-connected-custody.ts +0 -279
  189. package/src/drizzle/oauth-connected-flow.ts +0 -529
  190. package/src/drizzle/oauth-connected-input.ts +0 -147
  191. package/src/drizzle/oauth-connected-maintenance.ts +0 -346
  192. package/src/drizzle/oauth-connected-management.ts +0 -365
  193. package/src/drizzle/oauth-connected-settlement.ts +0 -251
  194. package/src/drizzle/oauth-connected-sign-in.ts +0 -443
  195. package/src/drizzle/oauth-connected-state.ts +0 -872
  196. package/src/drizzle/oauth-flow.ts +0 -462
  197. package/src/drizzle/oauth-input.ts +0 -201
  198. package/src/drizzle/oauth-owner.ts +0 -29
  199. package/src/drizzle/oauth-registration.ts +0 -640
  200. 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
- });