@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,430 +0,0 @@
1
- import { digest } from "./crypto.mjs";
2
- import { invariant, oauthIdentityKey, sameRevision, satisfies, storage, unavailable } from "./oauth-state.mjs";
3
- import { both } from "./transaction-owner.mjs";
4
- import { CurrentOAuthTransaction, col, copiedRow, equal } from "./oauth-owner.mjs";
5
- import { currentSubject } from "./oauth-flow.mjs";
6
- import { and, eq, isNull, sql } from "drizzle-orm";
7
- import { DateTime, Effect, Schema } from "effect";
8
- import { AuthenticationRequirement } from "@yielded/auth/Sessions";
9
- import * as M from "@yielded/auth/OAuth";
10
- import { snapshotOAuthSync } from "@yielded/auth/OAuth";
11
- //#region src/drizzle/oauth-connected-state.ts
12
- const contextStorage = storage(M.OAuthConnectedTransactionContext);
13
- const flowStorage = storage(M.OAuthConnectedPendingFlow);
14
- const claimStorage = storage(M.OAuthConnectedClaim);
15
- const tokenContextStorage = storage(M.OAuthConnectedTokenContext);
16
- const sealedStorage = storage(M.OAuthConnectedSealedTokens);
17
- const grantStorage = storage(M.OAuthConnectedStoredGrant);
18
- const admissionStorage = storage(Schema.Struct({
19
- grant: M.OAuthConnectedStoredGrant,
20
- authorization: M.OAuthConnectedUseAuthorization
21
- }));
22
- const commandStorage = storage(Schema.Struct({
23
- context: M.OAuthConnectedTokenContext,
24
- originalDigest: Schema.String.check(Schema.isPattern(/^[A-Za-z0-9_-]{43}$/)),
25
- revocationJobId: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256)))
26
- }));
27
- const disconnectStorage = storage(M.OAuthConnectedDisconnectGrant);
28
- const refreshStorage = storage(M.OAuthConnectedRefreshClaim);
29
- const jobStorage = storage(M.OAuthConnectedRevocationJob);
30
- const summaryStorage = storage(M.OAuthConnectedSummary);
31
- const disconnectedStorage = storage(M.OAuthConnectedDisconnected);
32
- const strings = storage(Schema.Array(Schema.String));
33
- const safeInteger = Schema.Int.check(Schema.isBetween({
34
- minimum: 0,
35
- maximum: Number.MAX_SAFE_INTEGER
36
- }));
37
- const orderParser = Schema.decodeSync(safeInteger);
38
- const canonicalOrder = Schema.String.check(Schema.isPattern(/^(0|[1-9][0-9]{0,15})$/));
39
- const orderTextParser = Schema.decodeSync(canonicalOrder);
40
- const orderNumber = (value) => {
41
- const number = orderParser(Number(orderTextParser(value)));
42
- invariant(String(number) === value);
43
- return number;
44
- };
45
- const nativeOrder = (mapping, value) => orderParser(mapping.order.decode(value));
46
- const encoder = new TextEncoder();
47
- const decoder = new TextDecoder("utf-8", { fatal: true });
48
- const key = Effect.fnUntraced(function* (domain, fields) {
49
- for (const value of fields) invariant(decoder.decode(encoder.encode(value)) === value);
50
- return "v1:" + (yield* digest(strings.encode([domain, ...fields])));
51
- });
52
- const clientKey = (configuration) => key("effect-auth/oauth-connected-client/v1", [
53
- configuration.provider,
54
- configuration.issuer,
55
- configuration.profile.clientRegistrationId
56
- ]);
57
- const cohortKey = (client, identity) => key("effect-auth/oauth-connected-cohort/v1", [client, identity]);
58
- const initialGeneration = (cohort) => digest(cohort).pipe(Effect.map((value) => M.OAuthConnectedTarget.fields.cohortGeneration.make("initial:" + value)));
59
- const configuration = (flow) => snapshotOAuthSync(M.OAuthConnectedConfiguration, flow.context);
60
- const retainedUntil = (mapping, now) => {
61
- invariant(Number.isSafeInteger(mapping.retentionMillis) && mapping.retentionMillis >= 12e4 && mapping.retentionMillis <= 2592e6);
62
- return orderParser(now + mapping.retentionMillis);
63
- };
64
- const rowCount = Effect.fn("oauthConnected.rowCount")(function* (table, where) {
65
- const rows = yield* (yield* CurrentOAuthTransaction).database.select({ value: sql`count(*)`.mapWith(Number) }).from(table).where(where).pipe(Effect.mapError(unavailable));
66
- invariant(rows.length === 1);
67
- return orderParser(rows[0].value);
68
- });
69
- const countCondition = (table, where, count) => sql`(select count(*) from ${table} where ${where}) = ${count}`;
70
- const current = Effect.fn("oauthConnected.current")(function* (mapping, subject) {
71
- const native = yield* mapping.subjectId.toNative(subject);
72
- return yield* currentSubject(mapping, native);
73
- });
74
- const nativeCopy = (value) => copiedRow({ value }).value;
75
- const policyData = (input) => Object.freeze({
76
- ...input,
77
- subjectId: nativeCopy(input.subjectId),
78
- revision: snapshotOAuthSync(M.OAuthConnectedUseAuthorization.fields.revision, input.revision),
79
- ...input.kind === "sign-in" ? {
80
- credential: snapshotOAuthSync(M.OAuthCredentialSnapshot, input.credential),
81
- configuration: snapshotOAuthSync(M.OAuthConnectedConfiguration, input.configuration)
82
- } : {
83
- authorization: input.kind === "action" ? snapshotOAuthSync(M.OAuthConnectedActionAuthorization, input.authorization) : snapshotOAuthSync(M.OAuthConnectedUseAuthorization, input.authorization),
84
- ...input.kind === "action" ? { configuration: snapshotOAuthSync(M.OAuthConnectedConfiguration, input.configuration) } : {}
85
- },
86
- ...input.grant === void 0 ? {} : { grant: snapshotOAuthSync(M.OAuthConnectedTokenContext, input.grant) }
87
- });
88
- const jobTable = (mapping) => {
89
- const direct = mapping.job;
90
- const configured = mapping.revocation;
91
- return direct ?? (configured?.mode === "cohort" ? configured.job : void 0);
92
- };
93
- const policy = Effect.fn("oauthConnected.policy")(function* (mapping, input) {
94
- const owner = yield* CurrentOAuthTransaction;
95
- invariant((mapping.policy.guards?.length ?? 0) <= 32);
96
- for (const guard of mapping.policy.guards ?? []) {
97
- const read = yield* owner.read(guard.table, guard.condition(policyData(input)), { orderBy: col(guard.table, guard.orderBy) });
98
- invariant(read.rows.length > 0);
99
- }
100
- const condition = mapping.policy.condition(policyData(input));
101
- const accepted = yield* owner.check(condition);
102
- if (accepted) owner.postconditions.push(condition);
103
- return accepted;
104
- });
105
- const action = Effect.fn("oauthConnected.action")(function* (mapping, found, authorization, operation, expected) {
106
- const owner = yield* CurrentOAuthTransaction;
107
- const challenge = authorization.challenge, evidence = authorization.evidence;
108
- const name = operation === "issue" ? "connected-begin" : operation === "disconnect" ? "connected-disconnect" : "connected-complete";
109
- const intentDigest = yield* digest(expected.intent);
110
- const binding = yield* digest(strings.encode([
111
- "effect-auth/oauth-connected-action/v1",
112
- expected.moduleId,
113
- name,
114
- expected.flowId,
115
- expected.commandId,
116
- intentDigest
117
- ]));
118
- if (challenge.moduleId !== expected.moduleId || challenge.action !== name || challenge.flowId !== expected.flowId || challenge.commandId !== expected.commandId || challenge.intentDigest !== intentDigest || challenge.bindingDigest !== binding || evidence.flowId !== expected.flowId || evidence.bindingDigest !== binding || !sameRevision(challenge.revision, expected.revision) || !sameRevision(evidence.revision, expected.revision) || !sameRevision(found.revision, expected.revision)) return false;
119
- const now = yield* owner.now(mapping.clock);
120
- const requirement = snapshotOAuthSync(AuthenticationRequirement, mapping.subject.decodeActionRequirement(copiedRow(found.row), name));
121
- const revisions = new Map(found.revision.credentials.map((item) => [item.credentialId, item.revision]));
122
- if (evidence.proofs.some((proof) => !revisions.has(proof.credentialId) || DateTime.toEpochMillis(proof.verifiedAt) > now)) return false;
123
- for (const required of [authorization.requirement, requirement]) {
124
- const age = Math.min(expected.maximumAgeMillis, required.maximumAgeMillis);
125
- const fresh = evidence.proofs.filter((proof) => now - DateTime.toEpochMillis(proof.verifiedAt) < age);
126
- if (!satisfies(fresh, required)) return false;
127
- owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${now} and ${both(...fresh.map((proof) => sql`${mapping.clock.engineNowMillis} < ${DateTime.toEpochMillis(proof.verifiedAt) + age}`))}`);
128
- }
129
- return yield* policy(mapping, {
130
- subjectId: found.nativeId,
131
- revision: found.revision,
132
- kind: "action",
133
- operation,
134
- authorization,
135
- configuration: expected.configuration,
136
- ...expected.grant === void 0 ? {} : { grant: expected.grant }
137
- });
138
- });
139
- const useAuthority = Effect.fn("oauthConnected.useAuthority")(function* (mapping, authorization, kind, grant) {
140
- const owner = yield* CurrentOAuthTransaction;
141
- const found = yield* current(mapping, authorization.revision.subjectId);
142
- const now = yield* owner.now(mapping.clock);
143
- if (found === void 0 || authorization.purpose !== kind || !sameRevision(found.revision, authorization.revision) || now >= authorization.expiresAtMillis || grant !== void 0 && (grant.moduleId !== authorization.moduleId || grant.subjectId !== authorization.revision.subjectId || authorization.grantId !== void 0 && authorization.grantId !== grant.grantId || authorization.profileKey !== void 0 && authorization.profileKey !== grant.configuration.profile.key)) return void 0;
144
- if (!(yield* policy(mapping, {
145
- subjectId: found.nativeId,
146
- revision: found.revision,
147
- kind,
148
- authorization,
149
- ...grant === void 0 ? {} : { grant }
150
- }))) return void 0;
151
- owner.postconditions.push(sql`${mapping.clock.engineNowMillis} >= ${now} and ${mapping.clock.engineNowMillis} < ${authorization.expiresAtMillis}`);
152
- return found;
153
- });
154
- const scopeKey = (provider, issuer) => key("effect-auth/oauth-connected-provider-issuer/v1", [provider, issuer]).pipe(Effect.map((value) => "scope:" + value));
155
- const scopeCache = /* @__PURE__ */ new WeakMap();
156
- const clientCache = /* @__PURE__ */ new WeakMap();
157
- const anchors = Effect.fn("oauthConnected.anchors")(function* (cache, table) {
158
- const owner = yield* CurrentOAuthTransaction;
159
- let tables = cache.get(owner);
160
- if (tables === void 0) {
161
- tables = /* @__PURE__ */ new Map();
162
- cache.set(owner, tables);
163
- }
164
- let rows = tables.get(table);
165
- if (rows === void 0) {
166
- rows = /* @__PURE__ */ new Map();
167
- tables.set(table, rows);
168
- }
169
- return rows;
170
- });
171
- /** Empty registration ID is impossible in the public profile label schema. The
172
- * distinct 52-byte key domain shares the physical table, never a client counter. */
173
- const scope = Effect.fn("oauthConnected.scope")(function* (mapping, config, create) {
174
- const owner = yield* CurrentOAuthTransaction;
175
- const c = mapping.client, id = yield* scopeKey(config.provider, config.issuer), cache = yield* anchors(scopeCache, c.table);
176
- const existing = cache.get(id);
177
- if (existing !== void 0) return existing;
178
- const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 });
179
- if (read.rows.length === 0) {
180
- const related = [
181
- mapping.flow,
182
- mapping.grant,
183
- mapping.cohort,
184
- ...jobTable(mapping) === void 0 ? [] : [jobTable(mapping)]
185
- ];
186
- invariant(yield* owner.check(both(sql`not exists(select 1 from ${c.table} where ${owner.exact(c.table, {
187
- [c.provider]: config.provider,
188
- [c.issuer]: config.issuer
189
- })})`, ...related.map((v) => sql`not exists(select 1 from ${v.table} where not exists(select 1 from ${c.table} where ${col(c.table, c.clientKey)} = ${col(v.table, v.clientKey)}))`))));
190
- if (!create) return void 0;
191
- invariant(c.encodeInsert !== void 0);
192
- read.rows = (yield* owner.insert(c.table, {
193
- ...c.encodeInsert(snapshotOAuthSync(M.OAuthConnectedConfiguration, config)),
194
- [c.clientKey]: id,
195
- [c.provider]: config.provider,
196
- [c.issuer]: config.issuer,
197
- [c.clientRegistrationId]: "",
198
- [c.counter]: mapping.order.encode(0),
199
- [c.version]: owner.marker
200
- }, { [c.clientKey]: id }, true)).rows;
201
- }
202
- const row = read.rows[0];
203
- invariant(row[c.provider] === config.provider && row[c.issuer] === config.issuer && row[c.clientRegistrationId] === "" && nativeOrder(mapping, row[c.counter]) === 0);
204
- const found = {
205
- id,
206
- row
207
- };
208
- cache.set(id, found);
209
- return found;
210
- });
211
- const touchScope = Effect.fn("oauthConnected.touchScope")(function* (mapping, found) {
212
- const owner = yield* CurrentOAuthTransaction;
213
- const c = mapping.client;
214
- yield* owner.update(c.table, {
215
- [c.clientKey]: found.id,
216
- [c.version]: found.row[c.version]
217
- }, { [c.version]: owner.marker });
218
- found.row = {
219
- ...found.row,
220
- [c.version]: owner.marker
221
- };
222
- });
223
- const readScope = Effect.fn("oauthConnected.readScope")(function* (mapping, provider, issuer) {
224
- const owner = yield* CurrentOAuthTransaction;
225
- const c = mapping.client, id = yield* scopeKey(provider, issuer), cache = yield* anchors(scopeCache, c.table), cached = cache.get(id);
226
- if (cached !== void 0) return cached;
227
- const row = (yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 })).rows[0];
228
- invariant(row !== void 0 && row[c.provider] === provider && row[c.issuer] === issuer && row[c.clientRegistrationId] === "" && nativeOrder(mapping, row[c.counter]) === 0);
229
- const found = {
230
- id,
231
- row
232
- };
233
- cache.set(id, found);
234
- return found;
235
- });
236
- const lockClientById = Effect.fn("oauthConnected.lockClientById")(function* (mapping, id) {
237
- const owner = yield* CurrentOAuthTransaction;
238
- const c = mapping.client, cache = yield* anchors(clientCache, c.table), cached = cache.get(id);
239
- if (cached !== void 0) return cached;
240
- const initial = (yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), {
241
- limit: 1,
242
- observe: false,
243
- lock: false
244
- })).rows[0];
245
- invariant(initial !== void 0);
246
- const scope = yield* readScope(mapping, initial[c.provider], initial[c.issuer]);
247
- const row = (yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 })).rows[0];
248
- invariant(row !== void 0 && row[c.clientRegistrationId] !== "" && id === (yield* key("effect-auth/oauth-connected-client/v1", [
249
- row[c.provider],
250
- row[c.issuer],
251
- row[c.clientRegistrationId]
252
- ])) && scope.id === (yield* scopeKey(row[c.provider], row[c.issuer])));
253
- const found = {
254
- id,
255
- row,
256
- counter: nativeOrder(mapping, row[c.counter]),
257
- scope
258
- };
259
- cache.set(id, found);
260
- return found;
261
- });
262
- const heldScope = Effect.fnUntraced(function* (mapping, provider, issuer) {
263
- return (yield* anchors(scopeCache, mapping.client.table)).get(yield* scopeKey(provider, issuer));
264
- });
265
- /** Cleanup obtains every scope then every client before entering any tuple. */
266
- const prelockClients = Effect.fn("oauthConnected.prelockClients")(function* (mapping, ids, releaseScopes = []) {
267
- const owner = yield* CurrentOAuthTransaction;
268
- const unique = [...new Set(ids)].sort(), c = mapping.client;
269
- invariant(unique.length <= 4e3);
270
- const scopes = /* @__PURE__ */ new Map();
271
- for (const value of releaseScopes) scopes.set(yield* scopeKey(value.provider, value.issuer), {
272
- ...value,
273
- required: false
274
- });
275
- for (const id of unique) {
276
- const row = (yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), {
277
- limit: 1,
278
- lock: false,
279
- observe: false
280
- })).rows[0];
281
- invariant(row !== void 0);
282
- scopes.set(yield* scopeKey(row[c.provider], row[c.issuer]), {
283
- provider: row[c.provider],
284
- issuer: row[c.issuer],
285
- required: true
286
- });
287
- }
288
- for (const [id, { provider, issuer, required }] of [...scopes].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) if (required) yield* readScope(mapping, provider, issuer);
289
- else {
290
- const row = (yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 })).rows[0];
291
- if (row !== void 0) {
292
- invariant(row[c.provider] === provider && row[c.issuer] === issuer && row[c.clientRegistrationId] === "" && nativeOrder(mapping, row[c.counter]) === 0);
293
- (yield* anchors(scopeCache, c.table)).set(id, {
294
- id,
295
- row
296
- });
297
- }
298
- }
299
- for (const id of unique) yield* lockClientById(mapping, id);
300
- });
301
- const client = Effect.fn("oauthConnected.client")(function* (mapping, config, create) {
302
- const owner = yield* CurrentOAuthTransaction;
303
- const c = mapping.client, id = yield* clientKey(config), where = { [c.clientKey]: id };
304
- const heldScope = yield* scope(mapping, config, create);
305
- if (heldScope === void 0) return void 0;
306
- const cache = yield* anchors(clientCache, c.table), cached = cache.get(id);
307
- if (cached !== void 0) return cached;
308
- let read = yield* owner.read(c.table, equal(c.table, where), { limit: 1 });
309
- if (read.rows.length === 0) {
310
- const related = [
311
- mapping.flow,
312
- mapping.grant,
313
- mapping.cohort,
314
- ...jobTable(mapping) === void 0 ? [] : [jobTable(mapping)]
315
- ];
316
- invariant(yield* owner.check(both(...related.map((v) => sql`not exists(select 1 from ${v.table} where ${eq(col(v.table, v.clientKey), id)})`))));
317
- }
318
- if (read.rows.length === 0 && create) read.rows = (yield* owner.insert(c.table, {
319
- ...(invariant(c.encodeInsert !== void 0), c.encodeInsert(snapshotOAuthSync(M.OAuthConnectedConfiguration, config))),
320
- ...where,
321
- [c.provider]: config.provider,
322
- [c.issuer]: config.issuer,
323
- [c.clientRegistrationId]: config.profile.clientRegistrationId,
324
- [c.counter]: mapping.order.encode(0),
325
- [c.version]: owner.marker
326
- }, where, true)).rows;
327
- const row = read.rows[0];
328
- if (row === void 0) return void 0;
329
- invariant(row[c.provider] === config.provider && row[c.issuer] === config.issuer && row[c.clientRegistrationId] === config.profile.clientRegistrationId);
330
- const found = {
331
- id,
332
- row,
333
- counter: nativeOrder(mapping, row[c.counter]),
334
- scope: heldScope
335
- };
336
- cache.set(id, found);
337
- return found;
338
- });
339
- const nextOrder = Effect.fn("oauthConnected.nextOrder")(function* (mapping, found) {
340
- const owner = yield* CurrentOAuthTransaction;
341
- const next = orderParser(found.counter + 1), c = mapping.client;
342
- yield* owner.update(c.table, {
343
- [c.clientKey]: found.id,
344
- [c.counter]: mapping.order.encode(found.counter)
345
- }, {
346
- [c.counter]: mapping.order.encode(next),
347
- [c.version]: owner.marker
348
- });
349
- found.counter = next;
350
- return next;
351
- });
352
- const cohort = Effect.fn("oauthConnected.cohort")(function* (mapping, clientId, identityId, create) {
353
- const owner = yield* CurrentOAuthTransaction;
354
- const c = mapping.cohort, id = yield* cohortKey(clientId, identityId), where = { [c.cohortKey]: id };
355
- let read = yield* owner.read(c.table, equal(c.table, where), { limit: 1 });
356
- if (read.rows.length === 0) {
357
- const related = [
358
- mapping.flow,
359
- mapping.grant,
360
- ...jobTable(mapping) === void 0 ? [] : [jobTable(mapping)]
361
- ];
362
- invariant(yield* owner.check(both(...related.map((v) => sql`not exists(select 1 from ${v.table} where ${eq(col(v.table, v.cohortKey), id)})`))));
363
- }
364
- if (read.rows.length === 0 && create) read.rows = (yield* owner.insert(c.table, {
365
- ...(invariant(c.encodeInsert !== void 0), c.encodeInsert({
366
- clientKey: clientId,
367
- identityKey: identityId
368
- })),
369
- ...where,
370
- [c.clientKey]: clientId,
371
- [c.identityKey]: identityId,
372
- [c.generation]: yield* initialGeneration(id),
373
- [c.cutoff]: mapping.order.encode(0),
374
- [c.state]: "Open",
375
- [c.version]: owner.marker
376
- }, where, true)).rows;
377
- const row = read.rows[0];
378
- if (row === void 0) return {
379
- id,
380
- row: void 0,
381
- generation: yield* initialGeneration(id),
382
- cutoff: 0,
383
- blocked: false
384
- };
385
- invariant(row[c.clientKey] === clientId && row[c.identityKey] === identityId && ["Open", "Blocked"].includes(row[c.state]));
386
- return {
387
- id,
388
- row,
389
- generation: snapshotOAuthSync(M.OAuthConnectedTarget.fields.cohortGeneration, row[c.generation]),
390
- cutoff: nativeOrder(mapping, row[c.cutoff]),
391
- blocked: row[c.state] === "Blocked"
392
- };
393
- });
394
- const readGrant = Effect.fn("oauthConnected.readGrant")(function* (mapping, moduleId, grantId, lock = true) {
395
- const owner = yield* CurrentOAuthTransaction;
396
- const g = mapping.grant;
397
- const read = yield* owner.read(g.table, equal(g.table, {
398
- [g.moduleId]: moduleId,
399
- [g.grantId]: grantId
400
- }), {
401
- limit: 1,
402
- lock,
403
- admissionOnly: lock,
404
- observe: false
405
- });
406
- const row = read.rows[0];
407
- if (row === void 0) return void 0;
408
- if (lock) owner.observations.push(read);
409
- const context = tokenContextStorage.decode(row[g.context]);
410
- const native = yield* mapping.subjectId.toNative(context.subjectId);
411
- invariant(context.moduleId === moduleId && context.grantId === grantId && mapping.subjectId.equals(native, row[g.subjectId]) && row[g.identityKey] === (yield* oauthIdentityKey(context.identity)) && row[g.clientKey] === (yield* clientKey(context.configuration)) && row[g.cohortKey] === (yield* cohortKey(row[g.clientKey], row[g.identityKey])) && row[g.profileKey] === context.configuration.profile.key && row[g.grantVersion] === context.grantVersion && row[g.tokenVersion] === context.tokenVersion && row[g.cohortGeneration] === context.cohortGeneration);
412
- return {
413
- row,
414
- context,
415
- native,
416
- sealed: row[g.sealed] === null ? void 0 : sealedStorage.decode(row[g.sealed])
417
- };
418
- });
419
- const unknownWork = (mapping, clientId, cutoff) => {
420
- const f = mapping.flow;
421
- return both(eq(col(f.table, f.clientKey), clientId), eq(col(f.table, f.work), "Unresolved"), isNull(col(f.table, f.cohortKey)), cutoff === void 0 ? void 0 : sql`${col(f.table, f.claimOrder)} <= ${mapping.order.encode(cutoff)}`);
422
- };
423
- const cohortWork = (mapping, id) => {
424
- const f = mapping.flow, g = mapping.grant;
425
- return both(sql`not exists(select 1 from ${f.table} where ${and(eq(col(f.table, f.cohortKey), id), eq(col(f.table, f.work), "Unresolved"))})`, sql`not exists(select 1 from ${g.table} where ${and(eq(col(g.table, g.cohortKey), id), eq(col(g.table, g.refreshWork), "Unresolved"))})`);
426
- };
427
- //#endregion
428
- export { action, admissionStorage, claimStorage, client, clientKey, cohort, cohortKey, cohortWork, commandStorage, configuration, contextStorage, countCondition, current, disconnectStorage, disconnectedStorage, flowStorage, grantStorage, heldScope, initialGeneration, jobStorage, jobTable, lockClientById, nativeCopy, nativeOrder, nextOrder, orderNumber, policy, prelockClients, readGrant, readScope, refreshStorage, retainedUntil, rowCount, scope, scopeKey, sealedStorage, summaryStorage, tokenContextStorage, touchScope, unknownWork, useAuthority };
429
-
430
- //# sourceMappingURL=oauth-connected-state.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-connected-state.mjs","names":[],"sources":["../../src/drizzle/oauth-connected-state.ts"],"sourcesContent":["import { type OAuthAccountRevision, snapshotOAuthSync } from \"@yielded/auth/OAuth\";\nimport * as M from \"@yielded/auth/OAuth\";\nimport { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\n/* oxlint-disable no-explicit-any -- private table erasure retains declared callback error/requirements channels. */\nimport { and, eq, isNull, sql, type SQL, type Table } from \"drizzle-orm\";\nimport type { EffectDrizzleQueryError } from \"drizzle-orm/effect-core\";\nimport { DateTime, Effect, Schema } from \"effect\";\n\nimport type {\n OAuthConnectedAuthorityMapping,\n OAuthConnectedClientRegistrationTable,\n OAuthConnectedCohortTable,\n OAuthConnectedMapping,\n OAuthConnectedPolicyInput,\n OAuthConnectedRevocationMapping,\n} from \"./oauth-connected-model\";\nimport { currentSubject } from \"./oauth-flow\";\nimport {\n both,\n col,\n copiedRow,\n equal,\n CurrentOAuthTransaction,\n type OAuthOwner,\n type Row,\n} from \"./oauth-owner\";\nimport {\n digest,\n invariant,\n oauthIdentityKey,\n sameRevision,\n satisfies,\n storage,\n unavailable,\n} from \"./oauth-state\";\n\nexport type Authority = OAuthConnectedAuthorityMapping<any, any, any, any, any, any, any> & {\n readonly client: Partial<Pick<OAuthConnectedClientRegistrationTable<any>, \"encodeInsert\">>;\n readonly cohort: Partial<Pick<OAuthConnectedCohortTable<any>, \"encodeInsert\">>;\n};\n\nexport type Mapping = OAuthConnectedMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>;\n\nexport type Revocations = OAuthConnectedRevocationMapping<any, any, any, any, any, any, any, any>;\nexport type Current = NonNullable<Effect.Success<ReturnType<typeof currentSubject>>>;\nexport const contextStorage = storage(M.OAuthConnectedTransactionContext);\nexport const flowStorage = storage(M.OAuthConnectedPendingFlow);\nexport const claimStorage = storage(M.OAuthConnectedClaim);\nexport const tokenContextStorage = storage(M.OAuthConnectedTokenContext);\nexport const sealedStorage = storage(M.OAuthConnectedSealedTokens);\nexport const grantStorage = storage(M.OAuthConnectedStoredGrant);\n\nexport const admissionStorage = storage(\n Schema.Struct({\n grant: M.OAuthConnectedStoredGrant,\n authorization: M.OAuthConnectedUseAuthorization,\n }),\n);\n\nexport const commandStorage = storage(\n Schema.Struct({\n context: M.OAuthConnectedTokenContext,\n originalDigest: Schema.String.check(Schema.isPattern(/^[A-Za-z0-9_-]{43}$/)),\n revocationJobId: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(256))),\n }),\n);\n\nexport const disconnectStorage = storage(M.OAuthConnectedDisconnectGrant);\nexport const refreshStorage = storage(M.OAuthConnectedRefreshClaim);\nexport const jobStorage = storage(M.OAuthConnectedRevocationJob);\nexport const summaryStorage = storage(M.OAuthConnectedSummary);\nexport const disconnectedStorage = storage(M.OAuthConnectedDisconnected);\nconst strings = storage(Schema.Array(Schema.String));\n\nconst safeInteger = Schema.Int.check(\n Schema.isBetween({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }),\n);\n\nconst orderParser = Schema.decodeSync(safeInteger);\nconst canonicalOrder = Schema.String.check(Schema.isPattern(/^(0|[1-9][0-9]{0,15})$/));\nconst orderTextParser = Schema.decodeSync(canonicalOrder);\n\nexport const orderNumber = (value: string) => {\n const number = orderParser(Number(orderTextParser(value)));\n\n invariant(String(number) === value);\n\n return number;\n};\n\nexport const nativeOrder = (mapping: Authority, value: unknown) =>\n orderParser(mapping.order.decode(value));\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\nconst key = Effect.fnUntraced(function* (domain: string, fields: ReadonlyArray<string>) {\n for (const value of fields) invariant(decoder.decode(encoder.encode(value)) === value);\n\n return \"v1:\" + (yield* digest(strings.encode([domain, ...fields])));\n});\n\nexport const clientKey = (configuration: M.OAuthConnectedConfiguration) =>\n key(\"effect-auth/oauth-connected-client/v1\", [\n configuration.provider,\n configuration.issuer,\n configuration.profile.clientRegistrationId,\n ]);\n\nexport const cohortKey = (client: string, identity: string) =>\n key(\"effect-auth/oauth-connected-cohort/v1\", [client, identity]);\n\nexport const initialGeneration = (cohort: string) =>\n digest(cohort).pipe(\n Effect.map((value) => M.OAuthConnectedTarget.fields.cohortGeneration.make(\"initial:\" + value)),\n );\n\nexport const configuration = (flow: M.OAuthConnectedPendingFlow): M.OAuthConnectedConfiguration =>\n snapshotOAuthSync(M.OAuthConnectedConfiguration, flow.context);\n\nexport const retainedUntil = (mapping: Authority, now: number) => {\n invariant(\n Number.isSafeInteger(mapping.retentionMillis) &&\n mapping.retentionMillis >= 120000 &&\n mapping.retentionMillis <= 2592000000,\n );\n\n return orderParser(now + mapping.retentionMillis);\n};\n\nexport const rowCount = Effect.fn(\"oauthConnected.rowCount\")(function* (table: Table, where: SQL) {\n const owner = yield* CurrentOAuthTransaction;\n\n const rows = yield* (\n owner.database\n .select({ value: sql<number>`count(*)`.mapWith(Number) })\n .from(table)\n .where(where) as Effect.Effect<ReadonlyArray<{ value: number }>, EffectDrizzleQueryError>\n ).pipe(Effect.mapError(unavailable));\n\n invariant(rows.length === 1);\n\n return orderParser(rows[0]!.value);\n});\n\nexport const countCondition = (table: Table, where: SQL, count: number) =>\n sql`(select count(*) from ${table} where ${where}) = ${count}`;\n\nexport const current = Effect.fn(\"oauthConnected.current\")(function* (\n mapping: Mapping,\n subject: OAuthAccountRevision[\"subjectId\"],\n) {\n const native = yield* mapping.subjectId.toNative(subject);\n\n return yield* currentSubject(mapping, native);\n});\n\nexport const nativeCopy = <N>(value: N): N => copiedRow({ value }).value as N;\n\nconst policyData = (input: OAuthConnectedPolicyInput<any>): OAuthConnectedPolicyInput<any> =>\n Object.freeze({\n ...input,\n subjectId: nativeCopy(input.subjectId),\n revision: snapshotOAuthSync(M.OAuthConnectedUseAuthorization.fields.revision, input.revision),\n ...(input.kind === \"sign-in\"\n ? {\n credential: snapshotOAuthSync(M.OAuthCredentialSnapshot, input.credential),\n configuration: snapshotOAuthSync(M.OAuthConnectedConfiguration, input.configuration),\n }\n : {\n authorization:\n input.kind === \"action\"\n ? snapshotOAuthSync(M.OAuthConnectedActionAuthorization, input.authorization)\n : snapshotOAuthSync(M.OAuthConnectedUseAuthorization, input.authorization),\n ...(input.kind === \"action\"\n ? {\n configuration: snapshotOAuthSync(\n M.OAuthConnectedConfiguration,\n input.configuration,\n ),\n }\n : {}),\n }),\n ...(input.grant === undefined\n ? {}\n : { grant: snapshotOAuthSync(M.OAuthConnectedTokenContext, input.grant) }),\n }) as OAuthConnectedPolicyInput<any>;\n\nexport const jobTable = (mapping: Authority) => {\n const direct = (mapping as Partial<Revocations>).job;\n const configured = (mapping as Partial<Mapping>).revocation;\n\n return direct ?? (configured?.mode === \"cohort\" ? configured.job : undefined);\n};\n\nexport const policy = Effect.fn(\"oauthConnected.policy\")(function* (\n mapping: Mapping,\n input: OAuthConnectedPolicyInput<any>,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n invariant((mapping.policy.guards?.length ?? 0) <= 32);\n for (const guard of mapping.policy.guards ?? []) {\n const read = yield* owner.read(guard.table, guard.condition(policyData(input)), {\n orderBy: col(guard.table, guard.orderBy),\n });\n\n invariant(read.rows.length > 0);\n }\n const condition = mapping.policy.condition(policyData(input));\n const accepted = yield* owner.check(condition);\n\n if (accepted) owner.postconditions.push(condition);\n\n return accepted;\n});\n\nexport const action = Effect.fn(\"oauthConnected.action\")(function* (\n mapping: Mapping,\n found: Current,\n authorization: M.OAuthConnectedActionAuthorization,\n operation: \"issue\" | \"claim\" | \"settle\" | \"disconnect\",\n expected: {\n readonly moduleId: string;\n readonly flowId: string;\n readonly commandId: string;\n readonly revision: OAuthAccountRevision;\n readonly intent: string;\n readonly maximumAgeMillis: number;\n readonly configuration: M.OAuthConnectedConfiguration;\n readonly grant?: M.OAuthConnectedTokenContext;\n },\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const challenge = authorization.challenge,\n evidence = authorization.evidence;\n\n const name =\n operation === \"issue\"\n ? \"connected-begin\"\n : operation === \"disconnect\"\n ? \"connected-disconnect\"\n : \"connected-complete\";\n\n const intentDigest = yield* digest(expected.intent);\n\n const binding = yield* digest(\n strings.encode([\n \"effect-auth/oauth-connected-action/v1\",\n expected.moduleId,\n name,\n expected.flowId,\n expected.commandId,\n intentDigest,\n ]),\n );\n\n if (\n challenge.moduleId !== expected.moduleId ||\n challenge.action !== name ||\n challenge.flowId !== expected.flowId ||\n challenge.commandId !== expected.commandId ||\n challenge.intentDigest !== intentDigest ||\n challenge.bindingDigest !== binding ||\n evidence.flowId !== expected.flowId ||\n evidence.bindingDigest !== binding ||\n !sameRevision(challenge.revision, expected.revision) ||\n !sameRevision(evidence.revision, expected.revision) ||\n !sameRevision(found.revision, expected.revision)\n )\n return false;\n const now = yield* owner.now(mapping.clock);\n\n const requirement = snapshotOAuthSync(\n AuthenticationRequirement,\n mapping.subject.decodeActionRequirement(copiedRow(found.row), name),\n );\n\n const revisions = new Map(\n found.revision.credentials.map((item) => [item.credentialId, item.revision]),\n );\n\n if (\n evidence.proofs.some(\n (proof) =>\n !revisions.has(proof.credentialId) || DateTime.toEpochMillis(proof.verifiedAt) > now,\n )\n )\n return false;\n for (const required of [authorization.requirement, requirement]) {\n const age = Math.min(expected.maximumAgeMillis, required.maximumAgeMillis);\n\n const fresh = evidence.proofs.filter(\n (proof) => now - DateTime.toEpochMillis(proof.verifiedAt) < age,\n );\n\n if (!satisfies(fresh, required)) return false;\n owner.postconditions.push(\n sql`${mapping.clock.engineNowMillis} >= ${now} and ${both(...fresh.map((proof) => sql`${mapping.clock.engineNowMillis} < ${DateTime.toEpochMillis(proof.verifiedAt) + age}`))}`,\n );\n }\n\n return yield* policy(mapping, {\n subjectId: found.nativeId,\n revision: found.revision,\n kind: \"action\",\n operation,\n authorization,\n configuration: expected.configuration,\n ...(expected.grant === undefined ? {} : { grant: expected.grant }),\n });\n});\n\nexport const useAuthority = Effect.fn(\"oauthConnected.useAuthority\")(function* (\n mapping: Mapping,\n authorization: M.OAuthConnectedUseAuthorization,\n kind: \"metadata\" | \"use\",\n grant?: M.OAuthConnectedTokenContext,\n) {\n const owner = yield* CurrentOAuthTransaction;\n const found = yield* current(mapping, authorization.revision.subjectId);\n const now = yield* owner.now(mapping.clock);\n\n if (\n found === undefined ||\n authorization.purpose !== kind ||\n !sameRevision(found.revision, authorization.revision) ||\n now >= authorization.expiresAtMillis ||\n (grant !== undefined &&\n (grant.moduleId !== authorization.moduleId ||\n grant.subjectId !== authorization.revision.subjectId ||\n (authorization.grantId !== undefined && authorization.grantId !== grant.grantId) ||\n (authorization.profileKey !== undefined &&\n authorization.profileKey !== grant.configuration.profile.key)))\n )\n return undefined;\n if (\n !(yield* policy(mapping, {\n subjectId: found.nativeId,\n revision: found.revision,\n kind,\n authorization,\n ...(grant === undefined ? {} : { grant }),\n }))\n )\n return undefined;\n owner.postconditions.push(\n sql`${mapping.clock.engineNowMillis} >= ${now} and ${mapping.clock.engineNowMillis} < ${authorization.expiresAtMillis}`,\n );\n\n return found;\n});\n\nexport const scopeKey = (provider: string, issuer: string) =>\n key(\"effect-auth/oauth-connected-provider-issuer/v1\", [provider, issuer]).pipe(\n Effect.map((value) => \"scope:\" + value),\n );\n\nexport interface ScopeAnchor {\n readonly id: string;\n row: Row;\n}\n\nexport interface ClientAnchor {\n readonly id: string;\n row: Row;\n counter: number;\n readonly scope: ScopeAnchor;\n}\n\nconst scopeCache = new WeakMap<OAuthOwner, Map<Table, Map<string, ScopeAnchor>>>();\nconst clientCache = new WeakMap<OAuthOwner, Map<Table, Map<string, ClientAnchor>>>();\n\nconst anchors = Effect.fn(\"oauthConnected.anchors\")(function* <A>(\n cache: WeakMap<OAuthOwner, Map<Table, Map<string, A>>>,\n table: Table,\n) {\n const owner = yield* CurrentOAuthTransaction;\n let tables = cache.get(owner);\n\n if (tables === undefined) {\n tables = new Map();\n cache.set(owner, tables);\n }\n let rows = tables.get(table);\n\n if (rows === undefined) {\n rows = new Map();\n tables.set(table, rows);\n }\n\n return rows;\n});\n\n/** Empty registration ID is impossible in the public profile label schema. The\n * distinct 52-byte key domain shares the physical table, never a client counter. */\nexport const scope = Effect.fn(\"oauthConnected.scope\")(function* (\n mapping: Authority,\n config: M.OAuthConnectedConfiguration,\n create: boolean,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const c = mapping.client,\n id = yield* scopeKey(config.provider, config.issuer),\n cache = yield* anchors(scopeCache, c.table);\n\n const existing = cache.get(id);\n\n if (existing !== undefined) return existing;\n const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 });\n\n if (read.rows.length === 0) {\n const related = [\n mapping.flow,\n mapping.grant,\n mapping.cohort,\n ...(jobTable(mapping) === undefined ? [] : [jobTable(mapping)!]),\n ];\n\n invariant(\n yield* owner.check(\n both(\n sql`not exists(select 1 from ${c.table} where ${owner.exact(c.table, { [c.provider]: config.provider, [c.issuer]: config.issuer })})`,\n ...related.map(\n (v) =>\n sql`not exists(select 1 from ${v.table} where not exists(select 1 from ${c.table} where ${col(c.table, c.clientKey)} = ${col(v.table, v.clientKey)}))`,\n ),\n ),\n ),\n );\n if (!create) return undefined;\n invariant(c.encodeInsert !== undefined);\n\n const inserted = yield* owner.insert(\n c.table,\n {\n ...c.encodeInsert(snapshotOAuthSync(M.OAuthConnectedConfiguration, config)),\n [c.clientKey]: id,\n [c.provider]: config.provider,\n [c.issuer]: config.issuer,\n [c.clientRegistrationId]: \"\",\n [c.counter]: mapping.order.encode(0),\n [c.version]: owner.marker,\n },\n { [c.clientKey]: id },\n true,\n );\n\n read.rows = inserted.rows;\n }\n const row = read.rows[0]!;\n\n invariant(\n row[c.provider] === config.provider &&\n row[c.issuer] === config.issuer &&\n row[c.clientRegistrationId] === \"\" &&\n nativeOrder(mapping, row[c.counter]) === 0,\n );\n const found = { id, row };\n\n cache.set(id, found);\n\n return found;\n});\n\nexport const touchScope = Effect.fn(\"oauthConnected.touchScope\")(function* (\n mapping: Authority,\n found: ScopeAnchor,\n) {\n const owner = yield* CurrentOAuthTransaction;\n const c = mapping.client;\n\n yield* owner.update(\n c.table,\n { [c.clientKey]: found.id, [c.version]: found.row[c.version] },\n { [c.version]: owner.marker },\n );\n found.row = { ...found.row, [c.version]: owner.marker };\n});\n\nexport const readScope = Effect.fn(\"oauthConnected.readScope\")(function* (\n mapping: Authority,\n provider: string,\n issuer: string,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const c = mapping.client,\n id = yield* scopeKey(provider, issuer),\n cache = yield* anchors(scopeCache, c.table),\n cached = cache.get(id);\n\n if (cached !== undefined) return cached;\n\n const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 }),\n row = read.rows[0];\n\n invariant(\n row !== undefined &&\n row[c.provider] === provider &&\n row[c.issuer] === issuer &&\n row[c.clientRegistrationId] === \"\" &&\n nativeOrder(mapping, row[c.counter]) === 0,\n );\n const found = { id, row };\n\n cache.set(id, found);\n\n return found;\n});\n\nexport const lockClientById = Effect.fn(\"oauthConnected.lockClientById\")(function* (\n mapping: Authority,\n id: string,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const c = mapping.client,\n cache = yield* anchors(clientCache, c.table),\n cached = cache.get(id);\n\n if (cached !== undefined) return cached;\n\n const discovery = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), {\n limit: 1,\n observe: false,\n lock: false,\n }),\n initial = discovery.rows[0];\n\n invariant(initial !== undefined);\n const scope = yield* readScope(mapping, initial[c.provider], initial[c.issuer]);\n\n const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 }),\n row = read.rows[0];\n\n invariant(\n row !== undefined &&\n row[c.clientRegistrationId] !== \"\" &&\n id ===\n (yield* key(\"effect-auth/oauth-connected-client/v1\", [\n row[c.provider],\n row[c.issuer],\n row[c.clientRegistrationId],\n ])) &&\n scope.id === (yield* scopeKey(row[c.provider], row[c.issuer])),\n );\n const found = { id, row, counter: nativeOrder(mapping, row[c.counter]), scope };\n\n cache.set(id, found);\n\n return found;\n});\n\nexport const heldScope = Effect.fnUntraced(function* (\n mapping: Authority,\n provider: string,\n issuer: string,\n) {\n const cache = yield* anchors(scopeCache, mapping.client.table);\n\n return cache.get(yield* scopeKey(provider, issuer));\n});\n\n/** Cleanup obtains every scope then every client before entering any tuple. */\nexport const prelockClients = Effect.fn(\"oauthConnected.prelockClients\")(function* (\n mapping: Authority,\n ids: ReadonlyArray<string>,\n releaseScopes: ReadonlyArray<{ readonly provider: string; readonly issuer: string }> = [],\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const unique = [...new Set(ids)].sort(),\n c = mapping.client;\n\n invariant(unique.length <= 4000);\n const scopes = new Map<string, { provider: string; issuer: string; required: boolean }>();\n\n for (const value of releaseScopes)\n scopes.set(yield* scopeKey(value.provider, value.issuer), { ...value, required: false });\n for (const id of unique) {\n const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), {\n limit: 1,\n lock: false,\n observe: false,\n }),\n row = read.rows[0];\n\n invariant(row !== undefined);\n scopes.set(yield* scopeKey(row[c.provider], row[c.issuer]), {\n provider: row[c.provider],\n issuer: row[c.issuer],\n required: true,\n });\n }\n for (const [id, { provider, issuer, required }] of [...scopes].sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n )) {\n if (required) yield* readScope(mapping, provider, issuer);\n else {\n const read = yield* owner.read(c.table, equal(c.table, { [c.clientKey]: id }), { limit: 1 }),\n row = read.rows[0];\n\n if (row !== undefined) {\n invariant(\n row[c.provider] === provider &&\n row[c.issuer] === issuer &&\n row[c.clientRegistrationId] === \"\" &&\n nativeOrder(mapping, row[c.counter]) === 0,\n );\n (yield* anchors(scopeCache, c.table)).set(id, { id, row });\n }\n }\n }\n for (const id of unique) yield* lockClientById(mapping, id);\n});\n\nexport const client = Effect.fn(\"oauthConnected.client\")(function* (\n mapping: Authority,\n config: M.OAuthConnectedConfiguration,\n create: boolean,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const c = mapping.client,\n id = yield* clientKey(config),\n where = { [c.clientKey]: id };\n\n const heldScope = yield* scope(mapping, config, create);\n\n if (heldScope === undefined) return undefined;\n\n const cache = yield* anchors(clientCache, c.table),\n cached = cache.get(id);\n\n if (cached !== undefined) return cached;\n let read = yield* owner.read(c.table, equal(c.table, where), { limit: 1 });\n\n if (read.rows.length === 0) {\n const related = [\n mapping.flow,\n mapping.grant,\n mapping.cohort,\n ...(jobTable(mapping) === undefined ? [] : [jobTable(mapping)!]),\n ];\n\n invariant(\n yield* owner.check(\n both(\n ...related.map(\n (v) =>\n sql`not exists(select 1 from ${v.table} where ${eq(col(v.table, v.clientKey), id)})`,\n ),\n ),\n ),\n );\n }\n if (read.rows.length === 0 && create) {\n const inserted = yield* owner.insert(\n c.table,\n {\n ...(invariant(c.encodeInsert !== undefined),\n c.encodeInsert(snapshotOAuthSync(M.OAuthConnectedConfiguration, config))),\n ...where,\n [c.provider]: config.provider,\n [c.issuer]: config.issuer,\n [c.clientRegistrationId]: config.profile.clientRegistrationId,\n [c.counter]: mapping.order.encode(0),\n [c.version]: owner.marker,\n },\n where,\n true,\n );\n\n read.rows = inserted.rows;\n }\n const row = read.rows[0];\n\n if (row === undefined) return undefined;\n invariant(\n row[c.provider] === config.provider &&\n row[c.issuer] === config.issuer &&\n row[c.clientRegistrationId] === config.profile.clientRegistrationId,\n );\n const found = { id, row, counter: nativeOrder(mapping, row[c.counter]), scope: heldScope };\n\n cache.set(id, found);\n\n return found;\n});\n\nexport const nextOrder = Effect.fn(\"oauthConnected.nextOrder\")(function* (\n mapping: Authority,\n found: NonNullable<Effect.Success<ReturnType<typeof client>>>,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const next = orderParser(found.counter + 1),\n c = mapping.client;\n\n yield* owner.update(\n c.table,\n { [c.clientKey]: found.id, [c.counter]: mapping.order.encode(found.counter) },\n { [c.counter]: mapping.order.encode(next), [c.version]: owner.marker },\n );\n found.counter = next;\n\n return next;\n});\n\nexport const cohort = Effect.fn(\"oauthConnected.cohort\")(function* (\n mapping: Authority,\n clientId: string,\n identityId: string,\n create: boolean,\n) {\n const owner = yield* CurrentOAuthTransaction;\n\n const c = mapping.cohort,\n id = yield* cohortKey(clientId, identityId),\n where = { [c.cohortKey]: id };\n\n let read = yield* owner.read(c.table, equal(c.table, where), { limit: 1 });\n\n if (read.rows.length === 0) {\n const related = [\n mapping.flow,\n mapping.grant,\n ...(jobTable(mapping) === undefined ? [] : [jobTable(mapping)!]),\n ];\n\n invariant(\n yield* owner.check(\n both(\n ...related.map(\n (v) =>\n sql`not exists(select 1 from ${v.table} where ${eq(col(v.table, v.cohortKey), id)})`,\n ),\n ),\n ),\n );\n }\n if (read.rows.length === 0 && create) {\n const inserted = yield* owner.insert(\n c.table,\n {\n ...(invariant(c.encodeInsert !== undefined),\n c.encodeInsert({ clientKey: clientId, identityKey: identityId })),\n ...where,\n [c.clientKey]: clientId,\n [c.identityKey]: identityId,\n [c.generation]: yield* initialGeneration(id),\n [c.cutoff]: mapping.order.encode(0),\n [c.state]: \"Open\",\n [c.version]: owner.marker,\n },\n where,\n true,\n );\n\n read.rows = inserted.rows;\n }\n const row = read.rows[0];\n\n if (row === undefined)\n return {\n id,\n row: undefined,\n generation: yield* initialGeneration(id),\n cutoff: 0,\n blocked: false,\n };\n invariant(\n row[c.clientKey] === clientId &&\n row[c.identityKey] === identityId &&\n [\"Open\", \"Blocked\"].includes(row[c.state]),\n );\n\n const generation = snapshotOAuthSync(\n M.OAuthConnectedTarget.fields.cohortGeneration,\n row[c.generation],\n );\n\n return {\n id,\n row,\n generation,\n cutoff: nativeOrder(mapping, row[c.cutoff]),\n blocked: row[c.state] === \"Blocked\",\n };\n});\n\nexport const readGrant = Effect.fn(\"oauthConnected.readGrant\")(function* (\n mapping: Authority,\n moduleId: string,\n grantId: string,\n lock = true,\n) {\n const owner = yield* CurrentOAuthTransaction;\n const g = mapping.grant;\n\n const read = yield* owner.read(\n g.table,\n equal(g.table, { [g.moduleId]: moduleId, [g.grantId]: grantId }),\n { limit: 1, lock, admissionOnly: lock, observe: false },\n );\n\n const row = read.rows[0];\n\n if (row === undefined) return undefined;\n if (lock) owner.observations.push(read);\n const context = tokenContextStorage.decode(row[g.context]);\n const native = yield* mapping.subjectId.toNative(context.subjectId);\n\n invariant(\n context.moduleId === moduleId &&\n context.grantId === grantId &&\n mapping.subjectId.equals(native, row[g.subjectId]) &&\n row[g.identityKey] === (yield* oauthIdentityKey(context.identity)) &&\n row[g.clientKey] === (yield* clientKey(context.configuration)) &&\n row[g.cohortKey] === (yield* cohortKey(row[g.clientKey], row[g.identityKey])) &&\n row[g.profileKey] === context.configuration.profile.key &&\n row[g.grantVersion] === context.grantVersion &&\n row[g.tokenVersion] === context.tokenVersion &&\n row[g.cohortGeneration] === context.cohortGeneration,\n );\n\n return {\n row,\n context,\n native,\n sealed: row[g.sealed] === null ? undefined : sealedStorage.decode(row[g.sealed]),\n };\n});\n\nexport const unknownWork = (mapping: Authority, clientId: string | SQL, cutoff?: number) => {\n const f = mapping.flow;\n\n return both(\n eq(col(f.table, f.clientKey), clientId),\n eq(col(f.table, f.work), \"Unresolved\"),\n isNull(col(f.table, f.cohortKey)),\n cutoff === undefined\n ? undefined\n : sql`${col(f.table, f.claimOrder)} <= ${mapping.order.encode(cutoff)}`,\n );\n};\n\nexport const cohortWork = (mapping: Authority, id: string | SQL) => {\n const f = mapping.flow,\n g = mapping.grant;\n\n return both(\n sql`not exists(select 1 from ${f.table} where ${and(eq(col(f.table, f.cohortKey), id), eq(col(f.table, f.work), \"Unresolved\"))})`,\n sql`not exists(select 1 from ${g.table} where ${and(eq(col(g.table, g.cohortKey), id), eq(col(g.table, g.refreshWork), \"Unresolved\"))})`,\n );\n};\n"],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { Row } from "./transaction-owner.mjs";
2
- import { CurrentOAuthTransaction } from "./oauth-owner.mjs";
3
- import { Effect } from "effect";
4
- import { OAuthClaim, OAuthCleanupInput, OAuthLinkClaim, OAuthLinkPendingFlow, OAuthPendingFlow, OAuthVerifiedExternalIdentity } from "@yielded/auth/OAuth";
5
- //#region src/drizzle/oauth-flow.d.ts
6
- /** Subject precedes credentials; the complete active credential vector is retained. */
7
- export declare const currentSubject: (mapping: any, nativeId: unknown) => Effect.Effect<{
8
- subject: import("@yielded/auth-persistence/Adapter").Observation;
9
- row: Row;
10
- authorities: import("@yielded/auth-persistence/Adapter").Observation;
11
- revision: {
12
- readonly subjectId: string & import("effect/Brand").Brand<"effect-auth/SubjectId">;
13
- readonly securityRevision: string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">;
14
- readonly credentials: readonly {
15
- readonly credentialId: string;
16
- readonly revision: string & import("effect/Brand").Brand<"effect-auth/SecurityRevision">;
17
- }[];
18
- };
19
- nativeId: unknown;
20
- } | undefined, import("@yielded/auth/OAuth").OAuthUnavailable | import("@yielded/auth-persistence/Adapter").PersistenceMappingError, CurrentOAuthTransaction>;
21
- //#endregion
22
- //# sourceMappingURL=oauth-flow.d.mts.map