@arcblock/did-connect-service 4.0.5 → 4.0.6

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 (190) hide show
  1. package/assets/fonts/noto-sans-sc-regular.otf +0 -0
  2. package/dist/embedded.d.ts +32 -0
  3. package/dist/embedded.d.ts.map +1 -1
  4. package/dist/embedded.js +3 -0
  5. package/dist/embedded.js.map +1 -1
  6. package/dist/handlers/auth-handler.d.ts +5 -0
  7. package/dist/handlers/auth-handler.d.ts.map +1 -1
  8. package/dist/handlers/auth-handler.js +1 -22
  9. package/dist/handlers/auth-handler.js.map +1 -1
  10. package/dist/handlers/branding-handler.d.ts +17 -0
  11. package/dist/handlers/branding-handler.d.ts.map +1 -1
  12. package/dist/handlers/branding-handler.js +107 -5
  13. package/dist/handlers/branding-handler.js.map +1 -1
  14. package/dist/identity/gravatar.d.ts +0 -2
  15. package/dist/identity/gravatar.d.ts.map +1 -1
  16. package/dist/identity/gravatar.js +0 -9
  17. package/dist/identity/gravatar.js.map +1 -1
  18. package/dist/og/emoji.d.ts +12 -0
  19. package/dist/og/emoji.d.ts.map +1 -0
  20. package/dist/og/emoji.js +71 -0
  21. package/dist/og/emoji.js.map +1 -0
  22. package/dist/og/generator.d.ts +3 -0
  23. package/dist/og/generator.d.ts.map +1 -0
  24. package/dist/og/generator.js +338 -0
  25. package/dist/og/generator.js.map +1 -0
  26. package/dist/og/index.d.ts +6 -0
  27. package/dist/og/index.d.ts.map +1 -0
  28. package/dist/og/index.js +4 -0
  29. package/dist/og/index.js.map +1 -0
  30. package/dist/og/passport-svg.d.ts +52 -0
  31. package/dist/og/passport-svg.d.ts.map +1 -0
  32. package/dist/og/passport-svg.js +157 -0
  33. package/dist/og/passport-svg.js.map +1 -0
  34. package/dist/og/ssrf-guard.d.ts +38 -0
  35. package/dist/og/ssrf-guard.d.ts.map +1 -0
  36. package/dist/og/ssrf-guard.js +188 -0
  37. package/dist/og/ssrf-guard.js.map +1 -0
  38. package/dist/og/templates.d.ts +26 -0
  39. package/dist/og/templates.d.ts.map +1 -0
  40. package/dist/og/templates.js +302 -0
  41. package/dist/og/templates.js.map +1 -0
  42. package/dist/og/types.d.ts +74 -0
  43. package/dist/og/types.d.ts.map +1 -0
  44. package/dist/og/types.js +14 -0
  45. package/dist/og/types.js.map +1 -0
  46. package/package.json +18 -4
  47. package/dist/access-key-handler.d.ts +0 -37
  48. package/dist/access-key-handler.d.ts.map +0 -1
  49. package/dist/access-key-handler.js +0 -316
  50. package/dist/access-key-handler.js.map +0 -1
  51. package/dist/access-key-util.d.ts +0 -19
  52. package/dist/access-key-util.d.ts.map +0 -1
  53. package/dist/access-key-util.js +0 -45
  54. package/dist/access-key-util.js.map +0 -1
  55. package/dist/access-policy.d.ts +0 -53
  56. package/dist/access-policy.d.ts.map +0 -1
  57. package/dist/access-policy.js +0 -153
  58. package/dist/access-policy.js.map +0 -1
  59. package/dist/auth-client.d.ts +0 -20
  60. package/dist/auth-client.d.ts.map +0 -1
  61. package/dist/auth-client.js +0 -42
  62. package/dist/auth-client.js.map +0 -1
  63. package/dist/auth-entrypoint.d.ts +0 -45
  64. package/dist/auth-entrypoint.d.ts.map +0 -1
  65. package/dist/auth-entrypoint.js +0 -31
  66. package/dist/auth-entrypoint.js.map +0 -1
  67. package/dist/auth-handler.d.ts +0 -136
  68. package/dist/auth-handler.d.ts.map +0 -1
  69. package/dist/auth-handler.js +0 -408
  70. package/dist/auth-handler.js.map +0 -1
  71. package/dist/auth-rpc-types.d.ts +0 -139
  72. package/dist/auth-rpc-types.d.ts.map +0 -1
  73. package/dist/auth-rpc-types.js +0 -11
  74. package/dist/auth-rpc-types.js.map +0 -1
  75. package/dist/auth-rpc.d.ts +0 -80
  76. package/dist/auth-rpc.d.ts.map +0 -1
  77. package/dist/auth-rpc.js +0 -257
  78. package/dist/auth-rpc.js.map +0 -1
  79. package/dist/auth-worker.d.ts +0 -42
  80. package/dist/auth-worker.d.ts.map +0 -1
  81. package/dist/auth-worker.js +0 -120
  82. package/dist/auth-worker.js.map +0 -1
  83. package/dist/blocklet-js-handler.d.ts +0 -22
  84. package/dist/blocklet-js-handler.d.ts.map +0 -1
  85. package/dist/blocklet-js-handler.js +0 -205
  86. package/dist/blocklet-js-handler.js.map +0 -1
  87. package/dist/branding-handler.d.ts +0 -42
  88. package/dist/branding-handler.d.ts.map +0 -1
  89. package/dist/branding-handler.js +0 -326
  90. package/dist/branding-handler.js.map +0 -1
  91. package/dist/d1-token-storage.d.ts +0 -31
  92. package/dist/d1-token-storage.d.ts.map +0 -1
  93. package/dist/d1-token-storage.js +0 -83
  94. package/dist/d1-token-storage.js.map +0 -1
  95. package/dist/did-connect-handler.d.ts +0 -57
  96. package/dist/did-connect-handler.d.ts.map +0 -1
  97. package/dist/did-connect-handler.js +0 -182
  98. package/dist/did-connect-handler.js.map +0 -1
  99. package/dist/did.d.ts +0 -14
  100. package/dist/did.d.ts.map +0 -1
  101. package/dist/did.js +0 -17
  102. package/dist/did.js.map +0 -1
  103. package/dist/email-login-handler.d.ts +0 -50
  104. package/dist/email-login-handler.d.ts.map +0 -1
  105. package/dist/email-login-handler.js +0 -238
  106. package/dist/email-login-handler.js.map +0 -1
  107. package/dist/federation-utils.d.ts +0 -23
  108. package/dist/federation-utils.d.ts.map +0 -1
  109. package/dist/federation-utils.js +0 -25
  110. package/dist/federation-utils.js.map +0 -1
  111. package/dist/handler.d.ts +0 -90
  112. package/dist/handler.d.ts.map +0 -1
  113. package/dist/handler.js +0 -591
  114. package/dist/handler.js.map +0 -1
  115. package/dist/identity/invitation-util.d.ts +0 -7
  116. package/dist/identity/invitation-util.d.ts.map +0 -1
  117. package/dist/identity/invitation-util.js +0 -66
  118. package/dist/identity/invitation-util.js.map +0 -1
  119. package/dist/instance-role.d.ts +0 -10
  120. package/dist/instance-role.d.ts.map +0 -1
  121. package/dist/instance-role.js +0 -20
  122. package/dist/instance-role.js.map +0 -1
  123. package/dist/jwt.d.ts +0 -7
  124. package/dist/jwt.d.ts.map +0 -1
  125. package/dist/jwt.js +0 -72
  126. package/dist/jwt.js.map +0 -1
  127. package/dist/login-entry.d.ts +0 -9
  128. package/dist/login-entry.d.ts.map +0 -1
  129. package/dist/login-entry.js +0 -9
  130. package/dist/login-entry.js.map +0 -1
  131. package/dist/membership-handler.d.ts +0 -27
  132. package/dist/membership-handler.d.ts.map +0 -1
  133. package/dist/membership-handler.js +0 -111
  134. package/dist/membership-handler.js.map +0 -1
  135. package/dist/oauth-callback-page.d.ts +0 -9
  136. package/dist/oauth-callback-page.d.ts.map +0 -1
  137. package/dist/oauth-callback-page.js +0 -31
  138. package/dist/oauth-callback-page.js.map +0 -1
  139. package/dist/oauth-handler.d.ts +0 -72
  140. package/dist/oauth-handler.d.ts.map +0 -1
  141. package/dist/oauth-handler.js +0 -423
  142. package/dist/oauth-handler.js.map +0 -1
  143. package/dist/page.d.ts +0 -33
  144. package/dist/page.d.ts.map +0 -1
  145. package/dist/page.js +0 -59
  146. package/dist/page.js.map +0 -1
  147. package/dist/pages/auth-script.d.ts +0 -18
  148. package/dist/pages/auth-script.d.ts.map +0 -1
  149. package/dist/pages/auth-script.js +0 -185
  150. package/dist/pages/auth-script.js.map +0 -1
  151. package/dist/pages/design-tokens.d.ts +0 -86
  152. package/dist/pages/design-tokens.d.ts.map +0 -1
  153. package/dist/pages/design-tokens.js +0 -159
  154. package/dist/pages/design-tokens.js.map +0 -1
  155. package/dist/pages/did-connect-script.d.ts +0 -16
  156. package/dist/pages/did-connect-script.d.ts.map +0 -1
  157. package/dist/pages/did-connect-script.js +0 -105
  158. package/dist/pages/did-connect-script.js.map +0 -1
  159. package/dist/pages/shared-styles.d.ts +0 -6
  160. package/dist/pages/shared-styles.d.ts.map +0 -1
  161. package/dist/pages/shared-styles.js +0 -109
  162. package/dist/pages/shared-styles.js.map +0 -1
  163. package/dist/rbac.d.ts +0 -19
  164. package/dist/rbac.d.ts.map +0 -1
  165. package/dist/rbac.js +0 -76
  166. package/dist/rbac.js.map +0 -1
  167. package/dist/session-context.d.ts +0 -35
  168. package/dist/session-context.d.ts.map +0 -1
  169. package/dist/session-context.js +0 -39
  170. package/dist/session-context.js.map +0 -1
  171. package/dist/store.d.ts +0 -222
  172. package/dist/store.d.ts.map +0 -1
  173. package/dist/store.js +0 -1366
  174. package/dist/store.js.map +0 -1
  175. package/dist/team-handler.d.ts +0 -90
  176. package/dist/team-handler.d.ts.map +0 -1
  177. package/dist/team-handler.js +0 -1225
  178. package/dist/team-handler.js.map +0 -1
  179. package/dist/ticket-handler.d.ts +0 -28
  180. package/dist/ticket-handler.d.ts.map +0 -1
  181. package/dist/ticket-handler.js +0 -74
  182. package/dist/ticket-handler.js.map +0 -1
  183. package/dist/wallet-identity.d.ts +0 -32
  184. package/dist/wallet-identity.d.ts.map +0 -1
  185. package/dist/wallet-identity.js +0 -43
  186. package/dist/wallet-identity.js.map +0 -1
  187. package/dist/webauthn.d.ts +0 -65
  188. package/dist/webauthn.d.ts.map +0 -1
  189. package/dist/webauthn.js +0 -112
  190. package/dist/webauthn.js.map +0 -1
@@ -1,238 +0,0 @@
1
- /**
2
- * EmailLoginHandler — email code + magic link login for Cloudflare Workers.
3
- *
4
- * Flow:
5
- * 1. POST /sendCode — generate 6-digit code, send via Resend, return { id }
6
- * 2. GET /status — poll whether code has been verified (for UX)
7
- * 3. POST /login — verify code (or magic token JWT), derive DID, issue JWT
8
- *
9
- * Routes (under /.well-known/service/api/email):
10
- * POST /sendCode
11
- * GET /status
12
- * POST /login
13
- */
14
- import { LOGIN_PROVIDER } from "./constants.js";
15
- import { deriveDID } from "./identity/federation.js";
16
- import { signJWT, verifyJWT } from "./identity/jwt.js";
17
- const PREFIX = "/.well-known/service/api/email";
18
- export class EmailLoginHandler {
19
- options;
20
- constructor(options) {
21
- this.options = options;
22
- }
23
- /** Resolve email config: constructor options take priority, fall back to D1 email:config. */
24
- async resolveEmailConfig() {
25
- if (this.options.resendApiKey && this.options.emailFrom) {
26
- return { resendApiKey: this.options.resendApiKey, emailFrom: this.options.emailFrom };
27
- }
28
- // Fall back to D1 settings
29
- const did = this.options.instanceDid;
30
- if (!did)
31
- return null;
32
- try {
33
- const raw = await this.options.store.getSetting(did, "email:config");
34
- if (!raw)
35
- return null;
36
- const config = JSON.parse(raw);
37
- if (config.resendApiKey && config.fromAddress) {
38
- return { resendApiKey: config.resendApiKey, emailFrom: config.fromAddress };
39
- }
40
- }
41
- catch {
42
- // ignore
43
- }
44
- return null;
45
- }
46
- /** Check whether email login is available (config exists in env or D1). */
47
- async isEnabled() {
48
- return (await this.resolveEmailConfig()) !== null;
49
- }
50
- async fetch(request) {
51
- const url = new URL(request.url);
52
- const path = url.pathname;
53
- if (path === `${PREFIX}/sendCode` && request.method === "POST") {
54
- return this.sendCode(request);
55
- }
56
- if (path === `${PREFIX}/status` && request.method === "GET") {
57
- return this.checkStatus(request);
58
- }
59
- if (path === `${PREFIX}/login` && request.method === "POST") {
60
- return this.login(request);
61
- }
62
- return null;
63
- }
64
- /** POST /sendCode — generate code, send email, return { id }. */
65
- async sendCode(request) {
66
- const emailConfig = await this.resolveEmailConfig();
67
- if (!emailConfig) {
68
- return jsonResponse({ error: "Email login is not configured" }, 503);
69
- }
70
- let body;
71
- try {
72
- body = await request.json();
73
- }
74
- catch {
75
- return jsonResponse({ error: "Invalid request body" }, 400);
76
- }
77
- const email = body.email?.toLowerCase().trim();
78
- if (!email || !email.includes("@")) {
79
- return jsonResponse({ error: "Invalid email address" }, 400);
80
- }
81
- // Rate limit: 1 code per email per minute
82
- if (await this.options.store.isVerifyCodeSent(email)) {
83
- return jsonResponse({ error: "Code already sent, please wait" }, 429);
84
- }
85
- // Generate 6-digit code
86
- const code = Array.from({ length: 6 }, () => Math.floor(Math.random() * 10)).join("");
87
- const id = await this.options.store.createVerifyCode(code, email, "login");
88
- // Generate magic link JWT (30 min)
89
- const origin = new URL(request.url).origin;
90
- const magicToken = await signJWT({ id, code }, this.options.jwtSecret, 1800);
91
- const magicLink = `${origin}/.well-known/service/login?magicToken=${magicToken}`;
92
- // Send via Resend API
93
- try {
94
- const res = await fetch("https://api.resend.com/emails", {
95
- method: "POST",
96
- headers: {
97
- Authorization: `Bearer ${emailConfig.resendApiKey}`,
98
- "Content-Type": "application/json",
99
- },
100
- body: JSON.stringify({
101
- from: emailConfig.emailFrom,
102
- to: email,
103
- subject: "Your login code",
104
- html: renderVerifyCodeEmail(code, magicLink),
105
- }),
106
- });
107
- if (!res.ok) {
108
- const text = await res.text();
109
- return jsonResponse({ error: `Failed to send email: ${text}` }, 500);
110
- }
111
- }
112
- catch (err) {
113
- const message = err instanceof Error ? err.message : "Email send failed";
114
- return jsonResponse({ error: message }, 500);
115
- }
116
- await this.options.store.markVerifyCodeSent(code);
117
- return jsonResponse({ id });
118
- }
119
- /** GET /status — check if a verification code has been used. */
120
- async checkStatus(request) {
121
- const url = new URL(request.url);
122
- const id = url.searchParams.get("id");
123
- if (!id)
124
- return jsonResponse({ error: "Missing id parameter" }, 400);
125
- // Status is implicit: if the code has been consumed, user is logged in
126
- // This endpoint is a placeholder for frontend polling
127
- return jsonResponse({ status: "pending" });
128
- }
129
- /** POST /login — verify code or magic token, derive DID, issue JWT. */
130
- async login(request) {
131
- let body;
132
- try {
133
- body = await request.json();
134
- }
135
- catch {
136
- return jsonResponse({ error: "Invalid request body" }, 400);
137
- }
138
- // Resolve the verification code
139
- let verifyCode;
140
- if (body.magicToken) {
141
- const payload = await verifyJWT(body.magicToken, this.options.jwtSecret);
142
- if (!payload || typeof payload.code !== "string") {
143
- return jsonResponse({ error: "Invalid or expired magic link" }, 400);
144
- }
145
- verifyCode = payload.code;
146
- }
147
- else if (body.code) {
148
- verifyCode = body.code;
149
- }
150
- else {
151
- return jsonResponse({ error: "Missing code or magicToken" }, 400);
152
- }
153
- // Consume verify code (single-use)
154
- const record = await this.options.store.consumeVerifyCode(verifyCode);
155
- if (!record) {
156
- return jsonResponse({ error: "Invalid or expired code" }, 400);
157
- }
158
- // Derive DID from email (delegates to master in federated mode)
159
- const sub = `email|${record.subject}`;
160
- const wallet = await deriveDID(sub, {
161
- appSk: this.options.appSk,
162
- authMaster: this.options.authMaster,
163
- });
164
- const userDid = wallet.did;
165
- const userPk = wallet.pk;
166
- // Create or update user
167
- const { store } = this.options;
168
- const existingUser = await store.getUserByDid(userDid);
169
- const isNewUser = !existingUser;
170
- if (isNewUser) {
171
- await store.createUser({
172
- did: userDid,
173
- pk: userPk,
174
- fullName: record.subject.split("@")[0],
175
- email: record.subject,
176
- sourceProvider: LOGIN_PROVIDER.EMAIL,
177
- });
178
- const userCount = await store.getUserCount();
179
- if (userCount === 1) {
180
- await store.updateUserRole(userDid, "owner");
181
- }
182
- }
183
- else {
184
- await store.updateLastLogin(userDid);
185
- }
186
- // Upsert connected account
187
- await store.upsertConnectedAccount({
188
- did: userDid,
189
- pk: userPk,
190
- userDid,
191
- provider: "email",
192
- id: sub,
193
- });
194
- // Audit log
195
- await store.createAuditLog({
196
- action: isNewUser ? "user.register" : "user.login",
197
- operatorDid: userDid,
198
- metadata: { provider: "email" },
199
- });
200
- // Sign JWT and set cookie
201
- const user = await store.getUserByDid(userDid);
202
- const payload = { did: userDid, pk: userPk };
203
- if (user?.fullName)
204
- payload.displayName = user.fullName;
205
- if (user?.role)
206
- payload.role = user.role;
207
- const jwt = await signJWT(payload, this.options.jwtSecret, this.options.jwtExpiresIn);
208
- let cookie = `${this.options.cookieName}=${jwt}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=${this.options.jwtExpiresIn}`;
209
- const cookieDomain = typeof this.options.rpID === "string" ? this.options.rpID : undefined;
210
- if (cookieDomain?.includes("."))
211
- cookie += `; Domain=${cookieDomain}`;
212
- return new Response(JSON.stringify({ ok: true, did: userDid }), {
213
- status: 200,
214
- headers: {
215
- "Content-Type": "application/json",
216
- "Set-Cookie": cookie,
217
- "Cache-Control": "private, no-store",
218
- },
219
- });
220
- }
221
- }
222
- function jsonResponse(data, status = 200) {
223
- return new Response(JSON.stringify(data), {
224
- status,
225
- headers: { "Content-Type": "application/json", "Cache-Control": "private, no-store" },
226
- });
227
- }
228
- function renderVerifyCodeEmail(code, magicLink) {
229
- return `<!DOCTYPE html>
230
- <html><body style="font-family: sans-serif; max-width: 480px; margin: 0 auto; padding: 20px;">
231
- <h2>Your Login Code</h2>
232
- <p style="font-size: 32px; font-weight: bold; letter-spacing: 8px; text-align: center; padding: 20px; background: #f5f5f5; border-radius: 8px;">${code}</p>
233
- <p>Enter this code in the login form, or click the link below:</p>
234
- <p><a href="${magicLink}" style="color: #0066cc;">Sign in with magic link</a></p>
235
- <p style="color: #666; font-size: 12px;">This code expires in 30 minutes.</p>
236
- </body></html>`;
237
- }
238
- //# sourceMappingURL=email-login-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-login-handler.js","sourceRoot":"","sources":["../src/email-login-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAoBvD,MAAM,MAAM,GAAG,gCAAgC,CAAC;AAEhD,MAAM,OAAO,iBAAiB;IACpB,OAAO,CAA2B;IAE1C,YAAY,OAAiC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,6FAA6F;IAC7F,KAAK,CAAC,kBAAkB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxD,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACxF,CAAC;QACD,2BAA2B;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoD,CAAC;YAClF,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,SAAS;QACb,OAAO,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,IAAI,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE1B,IAAI,IAAI,KAAK,GAAG,MAAM,WAAW,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,MAAM,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,MAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACzD,KAAK,CAAC,QAAQ,CAAC,OAAgB;QACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,0CAA0C;QAC1C,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAE3E,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,GAAG,MAAM,yCAAyC,UAAU,EAAE,CAAC;QAEjF,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,WAAW,CAAC,YAAY,EAAE;oBACnD,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,WAAW,CAAC,SAAS;oBAC3B,EAAE,EAAE,KAAK;oBACT,OAAO,EAAE,iBAAiB;oBAC1B,IAAI,EAAE,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC;iBAC7C,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,yBAAyB,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;YACzE,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,gEAAgE;IACxD,KAAK,CAAC,WAAW,CAAC,OAAgB;QACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,uEAAuE;QACvE,sDAAsD;QACtD,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,KAAK,CAAC,OAAgB;QAClC,IAAI,IAA4C,CAAC;QACjD,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,gCAAgC;QAChC,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;YACD,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;QAED,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,gEAAgE;QAChE,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAClC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;SACpC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAEzB,wBAAwB;QACxB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,CAAC,YAAY,CAAC;QAEhC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,UAAU,CAAC;gBACrB,GAAG,EAAE,OAAO;gBACZ,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,OAAO;gBACrB,cAAc,EAAE,cAAc,CAAC,KAAK;aACrC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,2BAA2B;QAC3B,MAAM,KAAK,CAAC,sBAAsB,CAAC;YACjC,GAAG,EAAE,OAAO;YACZ,EAAE,EAAE,MAAM;YACV,OAAO;YACP,QAAQ,EAAE,OAAO;YACjB,EAAE,EAAE,GAAG;SACR,CAAC,CAAC;QAEH,YAAY;QACZ,MAAM,KAAK,CAAC,cAAc,CAAC;YACzB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;YAClD,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;SAChC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAA4B,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACtE,IAAI,IAAI,EAAE,QAAQ;YAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxD,IAAI,IAAI,EAAE,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEtF,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,qDAAqD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC/H,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,YAAY,YAAY,EAAE,CAAC;QAEtE,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;YAC9D,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,MAAM;gBACpB,eAAe,EAAE,mBAAmB;aACrC;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE;KACtF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IAC5D,OAAO;;;oJAG2I,IAAI;;gBAExI,SAAS;;eAEV,CAAC;AAChB,CAAC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * Federation utilities — DID derivation delegation for multi-site auth.
3
- *
4
- * In standalone mode, DID is derived locally via fromAppDid(sub, localSK).
5
- * In federated mode, DID derivation is delegated to the master worker via
6
- * Service Binding RPC (zero-latency, same-thread call).
7
- */
8
- import type { AuthEntrypointInterface } from "./auth-entrypoint.js";
9
- /**
10
- * Derive a user DID from a subject identifier.
11
- *
12
- * @param sub - Provider-prefixed subject (e.g. "google-oauth2|123", "email|user@example.com")
13
- * @param options.appSk - Local app secret key (standalone mode)
14
- * @param options.authMaster - Service Binding to master worker (federated mode)
15
- */
16
- export declare function deriveDID(sub: string, options: {
17
- appSk: string;
18
- authMaster?: AuthEntrypointInterface;
19
- }): Promise<{
20
- did: string;
21
- pk: string;
22
- }>;
23
- //# sourceMappingURL=federation-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation-utils.d.ts","sourceRoot":"","sources":["../src/federation-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,uBAAuB,CAAA;CAAE,GAC/D,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Federation utilities — DID derivation delegation for multi-site auth.
3
- *
4
- * In standalone mode, DID is derived locally via fromAppDid(sub, localSK).
5
- * In federated mode, DID derivation is delegated to the master worker via
6
- * Service Binding RPC (zero-latency, same-thread call).
7
- */
8
- import { fromAppDid } from "@arcblock/did-ext";
9
- /**
10
- * Derive a user DID from a subject identifier.
11
- *
12
- * @param sub - Provider-prefixed subject (e.g. "google-oauth2|123", "email|user@example.com")
13
- * @param options.appSk - Local app secret key (standalone mode)
14
- * @param options.authMaster - Service Binding to master worker (federated mode)
15
- */
16
- export async function deriveDID(sub, options) {
17
- if (options.authMaster) {
18
- // Federated mode: RPC call to master (zero-delay, same thread)
19
- return options.authMaster.deriveDID(sub);
20
- }
21
- // Standalone mode: local derivation
22
- const wallet = fromAppDid(sub, options.appSk);
23
- return { did: wallet.address, pk: wallet.publicKey };
24
- }
25
- //# sourceMappingURL=federation-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"federation-utils.js","sourceRoot":"","sources":["../src/federation-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,OAAgE;IAEhE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,+DAA+D;QAC/D,OAAO,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IACD,oCAAoC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AACvD,CAAC"}
package/dist/handler.d.ts DELETED
@@ -1,90 +0,0 @@
1
- /**
2
- * Auth — Core auth handler for Cloudflare Workers.
3
- *
4
- * Routes (prefix-stripped, under /.well-known/service/api/passkey):
5
- * GET /register — Generate registration challenge options
6
- * POST /register — Verify registration credential, create user, issue JWT
7
- * GET /auth — Generate authentication challenge options
8
- * POST /auth — Verify authentication credential, issue JWT
9
- *
10
- * Session and logout are handled by auth-handler at /did/session and /did/logout.
11
- */
12
- import type { D1Store } from "./store/d1-store.js";
13
- import type { AuthOptions, CallerIdentity, Role } from "./types.js";
14
- /**
15
- * Extract Bearer token from Authorization header and resolve access key caller.
16
- * Returns null if no access key token or if validation fails.
17
- */
18
- export declare function resolveAccessKeyCaller(request: Request, store: D1Store, instanceDid?: string): Promise<{
19
- did: string;
20
- pk: string;
21
- role: Role;
22
- displayName?: string;
23
- blocked: boolean;
24
- accessKeyId: string;
25
- } | null>;
26
- export declare class Auth {
27
- private store;
28
- private jwtSecret;
29
- private rpName;
30
- private rpID?;
31
- private jwtExpiresIn;
32
- private cookieName;
33
- constructor(options: AuthOptions);
34
- /** Expose the store for sharing with TeamHandler. */
35
- getStore(): D1Store;
36
- /**
37
- * Handle auth API requests. Expects the prefix to be already stripped —
38
- * internally matches /register (GET/POST) and /auth (GET/POST).
39
- */
40
- fetch(request: Request): Promise<Response>;
41
- /** Verify JWT from cookie — hot path, pure crypto, no D1. */
42
- verify(request: Request): Promise<CallerIdentity | null>;
43
- /**
44
- * Full verification: access key (Bearer) first, then JWT + DB check.
45
- * Returns null if neither auth method succeeds, or if user is blocked/deleted.
46
- */
47
- verifyFull(request: Request): Promise<CallerIdentity | null>;
48
- /**
49
- * Verify access key from Authorization: Bearer header.
50
- * Returns CallerIdentity with the key's role, or null.
51
- */
52
- verifyAccessKey(request: Request): Promise<CallerIdentity | null>;
53
- /** Return the login page HTML, filtering methods by builtin-providers settings. */
54
- getLoginPage(instanceDid?: string, overrides?: {
55
- methods?: string[];
56
- oauthProviders?: Array<{
57
- name: string;
58
- icon?: string;
59
- }>;
60
- }): Promise<Response>;
61
- /** GET /register — Generate registration challenge options.
62
- * Always returns options (even when registration is gated) because:
63
- * - Re-registration of existing passkeys bypasses the gate
64
- * - The registrationAllowed flag lets the client show/hide UI
65
- * - The actual gate is enforced at POST /register time */
66
- private handleRegisterRequest;
67
- /** POST /register — Verify registration credential, create user, issue JWT. */
68
- private handleRegisterResponse;
69
- /** GET /auth — Generate authentication challenge options. */
70
- private handleAuthRequest;
71
- /** POST /auth — Verify authentication credential, issue JWT. */
72
- private handleAuthResponse;
73
- private handleRegistrationVerify;
74
- private handleAuthenticationVerify;
75
- /** Clear auth cookie. GET → redirect to /, POST → JSON response. */
76
- logout(request: Request): Response;
77
- /**
78
- * Determine if passkey registration should be allowed.
79
- *
80
- * Returns true if ANY of:
81
- * 1. No users exist (first user becomes owner)
82
- * 2. Default access policy is "public"
83
- * 3. A valid invitation is presented
84
- */
85
- private checkRegistrationEligibility;
86
- private issueJWT;
87
- private getRPID;
88
- private extractCookie;
89
- }
90
- //# sourceMappingURL=handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA8CpE;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,CAoCR;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAC,CAA0C;IACvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,WAAW;IAShC,qDAAqD;IACrD,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBhD,6DAA6D;IACvD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiB9D;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAmBlE;;;OAGG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAYvE,mFAAmF;IAC7E,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+DxJ;;;;+DAI2D;YAC7C,qBAAqB;IA4BnC,+EAA+E;YACjE,sBAAsB;IAkDpC,6DAA6D;YAC/C,iBAAiB;IAoB/B,gEAAgE;YAClD,kBAAkB;YA2ClB,wBAAwB;YAyHxB,0BAA0B;IAgExC,oEAAoE;IACpE,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ;IAsBlC;;;;;;;OAOG;YACW,4BAA4B;YAwB5B,QAAQ;IAqBtB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,aAAa;CAWtB"}