@draftlab/auth 0.15.1 → 0.16.0

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 (272) hide show
  1. package/dist/esm/allow.js +26 -0
  2. package/dist/esm/client.js +254 -0
  3. package/dist/esm/core.js +597 -0
  4. package/dist/esm/css.d.js +0 -0
  5. package/dist/esm/error.js +88 -0
  6. package/dist/esm/index.js +5 -0
  7. package/dist/esm/keys.js +126 -0
  8. package/dist/esm/mutex.js +53 -0
  9. package/dist/esm/pkce.js +87 -0
  10. package/dist/esm/provider/apple.js +15 -0
  11. package/dist/esm/provider/code.js +62 -0
  12. package/dist/esm/provider/discord.js +15 -0
  13. package/dist/esm/provider/facebook.js +15 -0
  14. package/dist/esm/provider/github.js +15 -0
  15. package/dist/esm/provider/gitlab.js +15 -0
  16. package/dist/esm/provider/google.js +16 -0
  17. package/dist/esm/provider/linkedin.js +15 -0
  18. package/dist/esm/provider/magiclink.js +83 -0
  19. package/dist/esm/provider/microsoft.js +15 -0
  20. package/dist/esm/provider/oauth2.js +130 -0
  21. package/dist/esm/provider/password.js +331 -0
  22. package/dist/esm/provider/provider.js +18 -0
  23. package/dist/esm/provider/reddit.js +15 -0
  24. package/dist/esm/provider/slack.js +15 -0
  25. package/dist/esm/provider/spotify.js +15 -0
  26. package/dist/esm/provider/twitch.js +15 -0
  27. package/dist/esm/provider/vercel.js +17 -0
  28. package/dist/esm/random.js +40 -0
  29. package/dist/esm/revocation.js +27 -0
  30. package/dist/esm/storage/memory.js +110 -0
  31. package/dist/esm/storage/storage.js +56 -0
  32. package/dist/esm/storage/turso.js +93 -0
  33. package/dist/esm/storage/unstorage.js +78 -0
  34. package/dist/esm/subject.js +7 -0
  35. package/dist/esm/themes/theme.js +115 -0
  36. package/dist/esm/toolkit/client.js +119 -0
  37. package/dist/esm/toolkit/index.js +25 -0
  38. package/dist/esm/toolkit/providers/facebook.js +11 -0
  39. package/dist/esm/toolkit/providers/github.js +11 -0
  40. package/dist/esm/toolkit/providers/google.js +11 -0
  41. package/dist/esm/toolkit/providers/strategy.js +0 -0
  42. package/dist/esm/toolkit/storage.js +81 -0
  43. package/dist/esm/toolkit/utils.js +18 -0
  44. package/dist/esm/types.js +0 -0
  45. package/dist/esm/ui/base.js +478 -0
  46. package/dist/esm/ui/code.js +186 -0
  47. package/dist/esm/ui/form.js +46 -0
  48. package/dist/esm/ui/icon.js +242 -0
  49. package/dist/esm/ui/magiclink.js +158 -0
  50. package/dist/esm/ui/password.js +435 -0
  51. package/dist/esm/ui/select.js +102 -0
  52. package/dist/esm/util.js +59 -0
  53. package/dist/{allow.d.mts → types/allow.d.ts} +9 -11
  54. package/dist/types/allow.d.ts.map +1 -0
  55. package/dist/types/client.d.ts +462 -0
  56. package/dist/types/client.d.ts.map +1 -0
  57. package/dist/types/core.d.ts +113 -0
  58. package/dist/types/core.d.ts.map +1 -0
  59. package/dist/{error.d.mts → types/error.d.ts} +95 -97
  60. package/dist/types/error.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +2 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/{keys.d.mts → types/keys.d.ts} +20 -23
  64. package/dist/types/keys.d.ts.map +1 -0
  65. package/dist/types/mutex.d.ts +42 -0
  66. package/dist/types/mutex.d.ts.map +1 -0
  67. package/dist/{pkce.d.mts → types/pkce.d.ts} +10 -11
  68. package/dist/types/pkce.d.ts.map +1 -0
  69. package/dist/types/provider/apple.d.ts +197 -0
  70. package/dist/types/provider/apple.d.ts.map +1 -0
  71. package/dist/types/provider/code.d.ts +288 -0
  72. package/dist/types/provider/code.d.ts.map +1 -0
  73. package/dist/types/provider/discord.d.ts +206 -0
  74. package/dist/types/provider/discord.d.ts.map +1 -0
  75. package/dist/types/provider/facebook.d.ts +200 -0
  76. package/dist/types/provider/facebook.d.ts.map +1 -0
  77. package/dist/types/provider/github.d.ts +220 -0
  78. package/dist/types/provider/github.d.ts.map +1 -0
  79. package/dist/types/provider/gitlab.d.ts +180 -0
  80. package/dist/types/provider/gitlab.d.ts.map +1 -0
  81. package/dist/types/provider/google.d.ts +158 -0
  82. package/dist/types/provider/google.d.ts.map +1 -0
  83. package/dist/types/provider/linkedin.d.ts +190 -0
  84. package/dist/types/provider/linkedin.d.ts.map +1 -0
  85. package/dist/types/provider/magiclink.d.ts +141 -0
  86. package/dist/types/provider/magiclink.d.ts.map +1 -0
  87. package/dist/types/provider/microsoft.d.ts +247 -0
  88. package/dist/types/provider/microsoft.d.ts.map +1 -0
  89. package/dist/types/provider/oauth2.d.ts +229 -0
  90. package/dist/types/provider/oauth2.d.ts.map +1 -0
  91. package/dist/types/provider/password.d.ts +408 -0
  92. package/dist/types/provider/password.d.ts.map +1 -0
  93. package/dist/types/provider/provider.d.ts +226 -0
  94. package/dist/types/provider/provider.d.ts.map +1 -0
  95. package/dist/types/provider/reddit.d.ts +159 -0
  96. package/dist/types/provider/reddit.d.ts.map +1 -0
  97. package/dist/types/provider/slack.d.ts +171 -0
  98. package/dist/types/provider/slack.d.ts.map +1 -0
  99. package/dist/types/provider/spotify.d.ts +168 -0
  100. package/dist/types/provider/spotify.d.ts.map +1 -0
  101. package/dist/types/provider/twitch.d.ts +163 -0
  102. package/dist/types/provider/twitch.d.ts.map +1 -0
  103. package/dist/types/provider/vercel.d.ts +294 -0
  104. package/dist/types/provider/vercel.d.ts.map +1 -0
  105. package/dist/{random.d.mts → types/random.d.ts} +4 -6
  106. package/dist/types/random.d.ts.map +1 -0
  107. package/dist/types/revocation.d.ts +76 -0
  108. package/dist/types/revocation.d.ts.map +1 -0
  109. package/dist/{storage/memory.d.mts → types/storage/memory.d.ts} +17 -20
  110. package/dist/types/storage/memory.d.ts.map +1 -0
  111. package/dist/types/storage/storage.d.ts +177 -0
  112. package/dist/types/storage/storage.d.ts.map +1 -0
  113. package/dist/{storage/turso.d.mts → types/storage/turso.d.ts} +4 -7
  114. package/dist/types/storage/turso.d.ts.map +1 -0
  115. package/dist/{storage/unstorage.d.mts → types/storage/unstorage.d.ts} +12 -10
  116. package/dist/types/storage/unstorage.d.ts.map +1 -0
  117. package/dist/types/subject.d.ts +115 -0
  118. package/dist/types/subject.d.ts.map +1 -0
  119. package/dist/types/themes/theme.d.ts +207 -0
  120. package/dist/types/themes/theme.d.ts.map +1 -0
  121. package/dist/types/toolkit/client.d.ts +235 -0
  122. package/dist/types/toolkit/client.d.ts.map +1 -0
  123. package/dist/types/toolkit/index.d.ts +45 -0
  124. package/dist/types/toolkit/index.d.ts.map +1 -0
  125. package/dist/types/toolkit/providers/facebook.d.ts +8 -0
  126. package/dist/types/toolkit/providers/facebook.d.ts.map +1 -0
  127. package/dist/types/toolkit/providers/github.d.ts +8 -0
  128. package/dist/types/toolkit/providers/github.d.ts.map +1 -0
  129. package/dist/types/toolkit/providers/google.d.ts +8 -0
  130. package/dist/types/toolkit/providers/google.d.ts.map +1 -0
  131. package/dist/types/toolkit/providers/strategy.d.ts +38 -0
  132. package/dist/types/toolkit/providers/strategy.d.ts.map +1 -0
  133. package/dist/{toolkit/storage.d.mts → types/toolkit/storage.d.ts} +37 -39
  134. package/dist/types/toolkit/storage.d.ts.map +1 -0
  135. package/dist/{toolkit/utils.d.mts → types/toolkit/utils.d.ts} +2 -4
  136. package/dist/types/toolkit/utils.d.ts.map +1 -0
  137. package/dist/types/types.d.ts +92 -0
  138. package/dist/types/types.d.ts.map +1 -0
  139. package/dist/types/ui/base.d.ts +18 -0
  140. package/dist/types/ui/base.d.ts.map +1 -0
  141. package/dist/types/ui/code.d.ts +43 -0
  142. package/dist/types/ui/code.d.ts.map +1 -0
  143. package/dist/types/ui/form.d.ts +24 -0
  144. package/dist/types/ui/form.d.ts.map +1 -0
  145. package/dist/types/ui/icon.d.ts +60 -0
  146. package/dist/types/ui/icon.d.ts.map +1 -0
  147. package/dist/types/ui/magiclink.d.ts +41 -0
  148. package/dist/types/ui/magiclink.d.ts.map +1 -0
  149. package/dist/types/ui/password.d.ts +43 -0
  150. package/dist/types/ui/password.d.ts.map +1 -0
  151. package/dist/types/ui/select.d.ts +33 -0
  152. package/dist/types/ui/select.d.ts.map +1 -0
  153. package/dist/{util.d.mts → types/util.d.ts} +11 -12
  154. package/dist/types/util.d.ts.map +1 -0
  155. package/package.json +10 -16
  156. package/dist/adapters/node.d.mts +0 -17
  157. package/dist/adapters/node.mjs +0 -69
  158. package/dist/allow.mjs +0 -63
  159. package/dist/client.d.mts +0 -462
  160. package/dist/client.mjs +0 -284
  161. package/dist/core.d.mts +0 -109
  162. package/dist/core.mjs +0 -595
  163. package/dist/error.mjs +0 -237
  164. package/dist/index.d.mts +0 -2
  165. package/dist/index.mjs +0 -3
  166. package/dist/keys.mjs +0 -146
  167. package/dist/mutex.d.mts +0 -44
  168. package/dist/mutex.mjs +0 -110
  169. package/dist/pkce.mjs +0 -157
  170. package/dist/provider/apple.d.mts +0 -110
  171. package/dist/provider/apple.mjs +0 -164
  172. package/dist/provider/code.d.mts +0 -218
  173. package/dist/provider/code.mjs +0 -246
  174. package/dist/provider/discord.d.mts +0 -145
  175. package/dist/provider/discord.mjs +0 -156
  176. package/dist/provider/facebook.d.mts +0 -141
  177. package/dist/provider/facebook.mjs +0 -150
  178. package/dist/provider/github.d.mts +0 -139
  179. package/dist/provider/github.mjs +0 -169
  180. package/dist/provider/gitlab.d.mts +0 -105
  181. package/dist/provider/gitlab.mjs +0 -147
  182. package/dist/provider/google.d.mts +0 -111
  183. package/dist/provider/google.mjs +0 -109
  184. package/dist/provider/linkedin.d.mts +0 -131
  185. package/dist/provider/linkedin.mjs +0 -142
  186. package/dist/provider/magiclink.d.mts +0 -79
  187. package/dist/provider/magiclink.mjs +0 -143
  188. package/dist/provider/microsoft.d.mts +0 -177
  189. package/dist/provider/microsoft.mjs +0 -177
  190. package/dist/provider/oauth2.d.mts +0 -175
  191. package/dist/provider/oauth2.mjs +0 -222
  192. package/dist/provider/passkey.d.mts +0 -103
  193. package/dist/provider/passkey.mjs +0 -320
  194. package/dist/provider/password.d.mts +0 -384
  195. package/dist/provider/password.mjs +0 -363
  196. package/dist/provider/provider.d.mts +0 -225
  197. package/dist/provider/provider.mjs +0 -44
  198. package/dist/provider/reddit.d.mts +0 -106
  199. package/dist/provider/reddit.mjs +0 -127
  200. package/dist/provider/slack.d.mts +0 -113
  201. package/dist/provider/slack.mjs +0 -138
  202. package/dist/provider/spotify.d.mts +0 -112
  203. package/dist/provider/spotify.mjs +0 -135
  204. package/dist/provider/totp.d.mts +0 -111
  205. package/dist/provider/totp.mjs +0 -191
  206. package/dist/provider/twitch.d.mts +0 -107
  207. package/dist/provider/twitch.mjs +0 -131
  208. package/dist/provider/vercel.d.mts +0 -176
  209. package/dist/provider/vercel.mjs +0 -230
  210. package/dist/random.mjs +0 -86
  211. package/dist/revocation.d.mts +0 -54
  212. package/dist/revocation.mjs +0 -63
  213. package/dist/router/context.d.mts +0 -21
  214. package/dist/router/context.mjs +0 -193
  215. package/dist/router/cookies.d.mts +0 -8
  216. package/dist/router/cookies.mjs +0 -13
  217. package/dist/router/index.d.mts +0 -21
  218. package/dist/router/index.mjs +0 -107
  219. package/dist/router/matcher.d.mts +0 -15
  220. package/dist/router/matcher.mjs +0 -76
  221. package/dist/router/middleware/cors.d.mts +0 -15
  222. package/dist/router/middleware/cors.mjs +0 -114
  223. package/dist/router/safe-request.d.mts +0 -52
  224. package/dist/router/safe-request.mjs +0 -160
  225. package/dist/router/types.d.mts +0 -67
  226. package/dist/router/types.mjs +0 -1
  227. package/dist/router/variables.d.mts +0 -12
  228. package/dist/router/variables.mjs +0 -20
  229. package/dist/storage/memory.mjs +0 -125
  230. package/dist/storage/storage.d.mts +0 -179
  231. package/dist/storage/storage.mjs +0 -104
  232. package/dist/storage/turso.mjs +0 -117
  233. package/dist/storage/unstorage.mjs +0 -103
  234. package/dist/subject.d.mts +0 -61
  235. package/dist/subject.mjs +0 -36
  236. package/dist/themes/theme.d.mts +0 -209
  237. package/dist/themes/theme.mjs +0 -120
  238. package/dist/toolkit/client.d.mts +0 -168
  239. package/dist/toolkit/client.mjs +0 -209
  240. package/dist/toolkit/index.d.mts +0 -9
  241. package/dist/toolkit/index.mjs +0 -9
  242. package/dist/toolkit/providers/facebook.d.mts +0 -11
  243. package/dist/toolkit/providers/facebook.mjs +0 -16
  244. package/dist/toolkit/providers/github.d.mts +0 -11
  245. package/dist/toolkit/providers/github.mjs +0 -16
  246. package/dist/toolkit/providers/google.d.mts +0 -11
  247. package/dist/toolkit/providers/google.mjs +0 -20
  248. package/dist/toolkit/providers/strategy.d.mts +0 -40
  249. package/dist/toolkit/providers/strategy.mjs +0 -1
  250. package/dist/toolkit/storage.mjs +0 -157
  251. package/dist/toolkit/utils.mjs +0 -30
  252. package/dist/types.d.mts +0 -94
  253. package/dist/types.mjs +0 -1
  254. package/dist/ui/base.d.mts +0 -29
  255. package/dist/ui/base.mjs +0 -407
  256. package/dist/ui/code.d.mts +0 -42
  257. package/dist/ui/code.mjs +0 -173
  258. package/dist/ui/form.d.mts +0 -31
  259. package/dist/ui/form.mjs +0 -49
  260. package/dist/ui/icon.d.mts +0 -57
  261. package/dist/ui/icon.mjs +0 -247
  262. package/dist/ui/magiclink.d.mts +0 -40
  263. package/dist/ui/magiclink.mjs +0 -152
  264. package/dist/ui/passkey.d.mts +0 -26
  265. package/dist/ui/passkey.mjs +0 -323
  266. package/dist/ui/password.d.mts +0 -41
  267. package/dist/ui/password.mjs +0 -402
  268. package/dist/ui/select.d.mts +0 -33
  269. package/dist/ui/select.mjs +0 -98
  270. package/dist/ui/totp.d.mts +0 -33
  271. package/dist/ui/totp.mjs +0 -270
  272. package/dist/util.mjs +0 -128
package/dist/client.mjs DELETED
@@ -1,284 +0,0 @@
1
- import { InvalidAccessTokenError, InvalidAuthorizationCodeError, InvalidRefreshTokenError, InvalidSubjectError } from "./error.mjs";
2
- import { generatePKCE } from "./pkce.mjs";
3
- import { createLocalJWKSet, errors, jwtVerify } from "jose";
4
-
5
- //#region src/client.ts
6
- /**
7
- * Draft Auth client for OAuth 2.0 authentication.
8
- *
9
- * ## Quick Start
10
- *
11
- * First, create a client.
12
- *
13
- * ```ts title="client.ts"
14
- * import { createClient } from "@draftlab/auth/client"
15
- *
16
- * const client = createClient({
17
- * clientID: "my-client",
18
- * issuer: "https://auth.myserver.com"
19
- * })
20
- * ```
21
- *
22
- * Start the OAuth flow by calling `authorize`.
23
- *
24
- * ```ts
25
- * const result = await client.authorize(
26
- * "https://myapp.com/callback",
27
- * "code"
28
- * )
29
- * if (result.success) {
30
- * window.location.href = result.data.url
31
- * }
32
- * ```
33
- *
34
- * When the user completes the flow, exchange the code for tokens.
35
- *
36
- * ```ts
37
- * const result = await client.exchange(code, redirectUri)
38
- * if (result.success) {
39
- * const { access, refresh } = result.data
40
- * // Store tokens securely
41
- * }
42
- * ```
43
- *
44
- * Verify tokens to get user information.
45
- *
46
- * ```ts
47
- * const result = await client.verify(subjects, accessToken)
48
- * if (result.success) {
49
- * // Access user properties: result.data.subject.properties
50
- * }
51
- * ```
52
- *
53
- * @packageDocumentation
54
- */
55
- /**
56
- * Create a Draft Auth client.
57
- *
58
- * @param input - Client configuration
59
- * @returns Configured client instance
60
- *
61
- * @example Basic setup
62
- * ```ts
63
- * const client = createClient({
64
- * clientID: "my-web-app",
65
- * issuer: "https://auth.mycompany.com"
66
- * })
67
- * ```
68
- */
69
- const createClient = (input) => {
70
- const jwksCache = /* @__PURE__ */ new Map();
71
- const issuerCache = /* @__PURE__ */ new Map();
72
- const issuer = input.issuer;
73
- if (!issuer) throw new Error("No issuer configured");
74
- const f = input.fetch ?? fetch;
75
- const getIssuer = async () => {
76
- const cached = issuerCache.get(issuer);
77
- if (cached) return cached;
78
- const wellKnown = await f(`${issuer}/.well-known/oauth-authorization-server`).then((r) => r.json());
79
- issuerCache.set(issuer, wellKnown);
80
- return wellKnown;
81
- };
82
- const getJWKS = async () => {
83
- const wk = await getIssuer();
84
- const cached = jwksCache.get(issuer);
85
- if (cached) return cached;
86
- const result = createLocalJWKSet(await f(wk.jwks_uri).then((r) => r.json()));
87
- jwksCache.set(issuer, result);
88
- return result;
89
- };
90
- const client = {
91
- async authorize(redirectURI, response, opts) {
92
- try {
93
- const wk = await getIssuer();
94
- const authUrl = new URL(wk.authorization_endpoint);
95
- const challenge = { state: crypto.randomUUID() };
96
- authUrl.searchParams.set("client_id", input.clientID);
97
- authUrl.searchParams.set("redirect_uri", redirectURI);
98
- authUrl.searchParams.set("response_type", response);
99
- authUrl.searchParams.set("state", challenge.state);
100
- if (opts?.provider) authUrl.searchParams.set("provider", opts.provider);
101
- if (opts?.pkce && response === "code") {
102
- const pkce = await generatePKCE();
103
- authUrl.searchParams.set("code_challenge_method", "S256");
104
- authUrl.searchParams.set("code_challenge", pkce.challenge);
105
- challenge.verifier = pkce.verifier;
106
- }
107
- return {
108
- success: true,
109
- data: {
110
- challenge,
111
- url: authUrl.toString()
112
- }
113
- };
114
- } catch (error) {
115
- return {
116
- success: false,
117
- error
118
- };
119
- }
120
- },
121
- async exchange(code, redirectURI, verifier) {
122
- try {
123
- const response = await f((await getIssuer()).token_endpoint, {
124
- method: "POST",
125
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
126
- body: new URLSearchParams({
127
- code,
128
- redirect_uri: redirectURI,
129
- grant_type: "authorization_code",
130
- client_id: input.clientID,
131
- ...verifier ? { code_verifier: verifier } : {}
132
- }).toString()
133
- });
134
- if (!response.ok) return {
135
- success: false,
136
- error: new InvalidAuthorizationCodeError()
137
- };
138
- const responseText = await response.text();
139
- let json;
140
- try {
141
- json = JSON.parse(responseText);
142
- } catch {
143
- return {
144
- success: false,
145
- error: new InvalidAuthorizationCodeError()
146
- };
147
- }
148
- const tokenResponse = json;
149
- return {
150
- success: true,
151
- data: {
152
- access: tokenResponse.access_token,
153
- refresh: tokenResponse.refresh_token,
154
- expiresIn: tokenResponse.expires_in
155
- }
156
- };
157
- } catch {
158
- return {
159
- success: false,
160
- error: new InvalidAuthorizationCodeError()
161
- };
162
- }
163
- },
164
- async refresh(refresh, opts) {
165
- try {
166
- if (opts?.access) try {
167
- const jwks = await getJWKS();
168
- await jwtVerify(opts.access, jwks, { issuer });
169
- return {
170
- success: true,
171
- data: {}
172
- };
173
- } catch {}
174
- const response = await f((await getIssuer()).token_endpoint, {
175
- method: "POST",
176
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
177
- body: new URLSearchParams({
178
- refresh_token: refresh,
179
- grant_type: "refresh_token"
180
- }).toString()
181
- });
182
- if (!response.ok) return {
183
- success: false,
184
- error: new InvalidRefreshTokenError()
185
- };
186
- const tokenResponse = await response.json();
187
- return {
188
- success: true,
189
- data: { tokens: {
190
- access: tokenResponse.access_token,
191
- refresh: tokenResponse.refresh_token,
192
- expiresIn: tokenResponse.expires_in
193
- } }
194
- };
195
- } catch {
196
- return {
197
- success: false,
198
- error: new InvalidRefreshTokenError()
199
- };
200
- }
201
- },
202
- async verify(subjects, token, options) {
203
- try {
204
- const jwtResult = await jwtVerify(token, await getJWKS(), {
205
- issuer: options?.issuer ?? issuer,
206
- audience: options?.audience ?? input.clientID
207
- });
208
- const validated = await subjects[jwtResult.payload.type]?.["~standard"].validate(jwtResult.payload.properties);
209
- if (!validated?.issues && jwtResult.payload.mode === "access") return {
210
- success: true,
211
- data: {
212
- aud: jwtResult.payload.aud,
213
- sub: jwtResult.payload.sub,
214
- subject: {
215
- type: jwtResult.payload.type,
216
- properties: validated?.value
217
- }
218
- }
219
- };
220
- return {
221
- success: false,
222
- error: new InvalidSubjectError()
223
- };
224
- } catch (e) {
225
- if (e instanceof errors.JWTExpired && options?.refresh) {
226
- const refreshed = await client.refresh(options.refresh);
227
- if (!refreshed.success) return refreshed;
228
- if (!refreshed.data.tokens) return {
229
- success: false,
230
- error: new InvalidAccessTokenError()
231
- };
232
- const verified = await client.verify(subjects, refreshed.data.tokens.access, {
233
- refresh: refreshed.data.tokens.refresh,
234
- issuer: options?.issuer,
235
- audience: options?.audience,
236
- fetch: options?.fetch
237
- });
238
- if (!verified.success) return verified;
239
- return {
240
- success: true,
241
- data: {
242
- ...verified.data,
243
- tokens: refreshed.data.tokens
244
- }
245
- };
246
- }
247
- return {
248
- success: false,
249
- error: new InvalidAccessTokenError()
250
- };
251
- }
252
- },
253
- async revoke(token, opts) {
254
- try {
255
- const wk = await getIssuer();
256
- const body = new URLSearchParams({
257
- token,
258
- ...opts?.tokenTypeHint ? { token_type_hint: opts.tokenTypeHint } : {}
259
- });
260
- if ((await f(wk.token_endpoint.replace("/token", "/revoke"), {
261
- method: "POST",
262
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
263
- body: body.toString()
264
- })).ok) return {
265
- success: true,
266
- data: void 0
267
- };
268
- return {
269
- success: false,
270
- error: /* @__PURE__ */ new Error("Failed to revoke token")
271
- };
272
- } catch (error) {
273
- return {
274
- success: false,
275
- error
276
- };
277
- }
278
- }
279
- };
280
- return client;
281
- };
282
-
283
- //#endregion
284
- export { createClient };
package/dist/core.d.mts DELETED
@@ -1,109 +0,0 @@
1
- import { AllowCheckInput } from "./allow.mjs";
2
- import { UnknownStateError } from "./error.mjs";
3
- import { Prettify } from "./util.mjs";
4
- import { SubjectPayload, SubjectSchema } from "./subject.mjs";
5
- import { Router } from "./router/index.mjs";
6
- import { StorageAdapter } from "./storage/storage.mjs";
7
- import { Provider } from "./provider/provider.mjs";
8
- import { Theme } from "./themes/theme.mjs";
9
- import { AuthorizationState } from "./types.mjs";
10
-
11
- //#region src/core.d.ts
12
- /**
13
- * Sets the subject payload in the JWT token and returns the response.
14
- */
15
- interface OnSuccessResponder<T extends {
16
- type: string;
17
- properties: unknown;
18
- }> {
19
- subject<Type extends T["type"]>(type: Type, properties: Extract<T, {
20
- type: Type;
21
- }>["properties"], opts?: {
22
- ttl?: {
23
- access?: number;
24
- refresh?: number;
25
- };
26
- subject?: string;
27
- }): Promise<Response>;
28
- }
29
- /**
30
- * Main issuer input configuration interface.
31
- */
32
- interface IssuerInput<Providers extends Record<string, Provider<unknown>>, Subjects extends SubjectSchema, Result = { [Key in keyof Providers]: Prettify<{
33
- provider: Key;
34
- } & (Providers[Key] extends Provider<infer T> ? T : Record<string, unknown>)> }[keyof Providers]> {
35
- /** The storage adapter for persisting tokens and sessions */
36
- storage: StorageAdapter;
37
- /** Auth providers configuration */
38
- providers: Providers;
39
- /** Subject schemas for token validation */
40
- subjects: Subjects;
41
- /** Base path for embedded scenarios */
42
- basePath?: string;
43
- /** Success callback for completed authentication */
44
- success(response: OnSuccessResponder<SubjectPayload<Subjects>>, input: Result, req: Request, clientID: string): Promise<Response>;
45
- /** Theme configuration for UI */
46
- theme?: Theme;
47
- /** TTL configuration for tokens and sessions */
48
- ttl?: {
49
- access?: number;
50
- refresh?: number;
51
- reuse?: number;
52
- retention?: number;
53
- };
54
- /** Provider selection UI function */
55
- select?(providers: Record<string, string>, req: Request): Promise<Response>;
56
- /** Optional start callback */
57
- start?(req: Request): Promise<void>;
58
- /** Error handling callback */
59
- error?(error: UnknownStateError, req: Request): Promise<Response>;
60
- /** Client authorization check function */
61
- allow?(input: AllowCheckInput, req: Request): Promise<boolean>;
62
- /**
63
- * Refresh callback for updating user claims.
64
- *
65
- * @example
66
- * ```typescript
67
- * refresh: async (payload, req) => {
68
- * const user = await getUserBySubject(payload.subject)
69
- * if (!user || !user.active) {
70
- * return undefined // Revoke the token
71
- * }
72
- *
73
- * return {
74
- * type: payload.type,
75
- * properties: {
76
- * userID: user.id,
77
- * role: user.role,
78
- * permissions: user.permissions,
79
- * lastLogin: new Date().toISOString()
80
- * }
81
- * }
82
- * }
83
- * ```
84
- */
85
- refresh?(payload: {
86
- type: SubjectPayload<Subjects>["type"];
87
- properties: SubjectPayload<Subjects>["properties"];
88
- subject: string;
89
- clientID: string;
90
- scopes?: string[];
91
- }, req: Request): Promise<{
92
- type: SubjectPayload<Subjects>["type"];
93
- properties: SubjectPayload<Subjects>["properties"];
94
- subject?: string;
95
- scopes?: string[];
96
- } | undefined>;
97
- }
98
- /**
99
- * Create an Draft Auth server, a Router app that handles OAuth 2.0 flows.
100
- */
101
- declare const issuer: <Providers extends Record<string, Provider<unknown>>, Subjects extends SubjectSchema, Result = { [key in keyof Providers]: {
102
- provider: key;
103
- } & (Providers[key] extends Provider<infer T> ? T : Record<string, unknown>) }[keyof Providers]>(input: IssuerInput<Providers, Subjects, Result>) => Router<{
104
- Variables: {
105
- authorization: AuthorizationState;
106
- };
107
- }>;
108
- //#endregion
109
- export { OnSuccessResponder, issuer };