@arcblock/did-connect-service 4.0.4 → 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 +33 -0
  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/csrf.d.ts +17 -0
  15. package/dist/identity/csrf.d.ts.map +1 -0
  16. package/dist/identity/csrf.js +56 -0
  17. package/dist/identity/csrf.js.map +1 -0
  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,83 +0,0 @@
1
- /**
2
- * D1TokenStorage — DID Connect token storage backed by D1 (strongly consistent).
3
- *
4
- * Drop-in replacement for CloudflareKVStorage. D1 is a single-writer database
5
- * with consistent reads, avoiding the KV eventual consistency problem where
6
- * browser polls and wallet writes hit different edge nodes.
7
- *
8
- * The `connect_tokens` table schema is managed by D1Store (SCHEMA_SQL).
9
- * Expired rows are cleaned up lazily on read and probabilistically on create().
10
- */
11
- import { EventEmitter } from "events";
12
- export class D1TokenStorage extends EventEmitter {
13
- db;
14
- ttl;
15
- constructor(db, options = {}) {
16
- super();
17
- this.db = db;
18
- this.ttl = options.ttl ?? 300;
19
- }
20
- async create(token, status = "created") {
21
- const record = { token, status };
22
- const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
23
- await this.db
24
- .prepare("INSERT OR REPLACE INTO connect_tokens (token, data, expiresAt) VALUES (?, ?, ?)")
25
- .bind(token, JSON.stringify(record), expiresAt)
26
- .run();
27
- this.emit("create", record);
28
- // Probabilistic cleanup: ~5% chance per create
29
- if (Math.random() < 0.05) {
30
- this.cleanup().catch(() => { });
31
- }
32
- return record;
33
- }
34
- async read(token) {
35
- const row = await this.db
36
- .prepare("SELECT data, expiresAt FROM connect_tokens WHERE token = ?")
37
- .bind(token)
38
- .first();
39
- if (!row)
40
- return null;
41
- // Check expiry
42
- if (row.expiresAt < Math.floor(Date.now() / 1000)) {
43
- await this.db.prepare("DELETE FROM connect_tokens WHERE token = ?").bind(token).run();
44
- return null;
45
- }
46
- return JSON.parse(row.data);
47
- }
48
- async update(token, updates) {
49
- const existing = await this.read(token);
50
- if (!existing)
51
- return null;
52
- delete updates.token; // prevent token field overwrite
53
- const merged = { ...existing, ...updates };
54
- const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
55
- await this.db
56
- .prepare("UPDATE connect_tokens SET data = ?, expiresAt = ? WHERE token = ?")
57
- .bind(JSON.stringify(merged), expiresAt, token)
58
- .run();
59
- this.emit("update", merged);
60
- return merged;
61
- }
62
- async delete(token) {
63
- const existing = await this.read(token);
64
- if (existing) {
65
- this.emit("destroy", existing);
66
- }
67
- await this.db.prepare("DELETE FROM connect_tokens WHERE token = ?").bind(token).run();
68
- }
69
- async exist(token, did) {
70
- const record = await this.read(token);
71
- if (!record)
72
- return false;
73
- if (did)
74
- return record.did === did;
75
- return true;
76
- }
77
- /** Remove expired rows. Called probabilistically from create(). */
78
- async cleanup() {
79
- const now = Math.floor(Date.now() / 1000);
80
- await this.db.prepare("DELETE FROM connect_tokens WHERE expiresAt < ?").bind(now).run();
81
- }
82
- }
83
- //# sourceMappingURL=d1-token-storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"d1-token-storage.js","sourceRoot":"","sources":["../src/d1-token-storage.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- /**
2
- * DIDConnectHandler — DID Wallet authentication for Cloudflare Workers.
3
- *
4
- * Uses WalletAuthenticator + WalletHandlers from connect-server with an
5
- * internal Hono app. The browser polls for status, then calls /complete
6
- * to receive a JWT cookie.
7
- *
8
- * Routes (under /.well-known/service/api/did):
9
- * GET/POST /login/token — create new connect session
10
- * GET /login/status — poll session status
11
- * GET /login/timeout — expire session
12
- * GET /login/auth — wallet fetches auth request
13
- * POST /login/auth — wallet submits auth response
14
- * POST /connect/complete — browser claims JWT cookie after succeed
15
- */
16
- import type { D1Store } from "./store/d1-store.js";
17
- export interface DIDConnectHandlerOptions {
18
- store: D1Store;
19
- db: D1Database;
20
- appSk: string;
21
- jwtSecret: string;
22
- jwtExpiresIn: number;
23
- cookieName: string;
24
- rpID?: string | ((request: Request) => string);
25
- appInfo?: {
26
- name: string;
27
- description?: string;
28
- icon?: string;
29
- };
30
- /** Federation: delegator must use { address, pk } (not { did, pk })
31
- * because WalletAuthenticator internally calls toDid(delegator.address). */
32
- delegator?: {
33
- address: string;
34
- pk: string;
35
- };
36
- /** Federation: master-signed delegation JWT. */
37
- delegation?: string;
38
- /** Permanent secret key (PSK) — for auto-delegation when SK has been rotated. */
39
- appPsk?: string;
40
- }
41
- export declare class DIDConnectHandler {
42
- private app;
43
- private storage;
44
- private options;
45
- constructor(options: DIDConnectHandlerOptions);
46
- /**
47
- * Handle an incoming request. Returns a Response if matched, null otherwise.
48
- * Hono returns 404 for unmatched routes — we convert that to null so the
49
- * caller can fall through to the next handler.
50
- */
51
- fetch(request: Request): Promise<Response | null>;
52
- /** onAuth callback — create/update user, upsert connected account, audit log. */
53
- private handleAuth;
54
- /** Exchange a succeed token for a JWT cookie (called by browser after status poll). */
55
- private handleComplete;
56
- }
57
- //# sourceMappingURL=did-connect-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"did-connect-handler.d.ts","sourceRoot":"","sources":["../src/did-connect-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE;iFAC6E;IAC7E,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAO;IAClB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IA2D7C;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAMvD,iFAAiF;YACnE,UAAU;IAqDxB,uFAAuF;YACzE,cAAc;CA+C7B"}
@@ -1,182 +0,0 @@
1
- /**
2
- * DIDConnectHandler — DID Wallet authentication for Cloudflare Workers.
3
- *
4
- * Uses WalletAuthenticator + WalletHandlers from connect-server with an
5
- * internal Hono app. The browser polls for status, then calls /complete
6
- * to receive a JWT cookie.
7
- *
8
- * Routes (under /.well-known/service/api/did):
9
- * GET/POST /login/token — create new connect session
10
- * GET /login/status — poll session status
11
- * GET /login/timeout — expire session
12
- * GET /login/auth — wallet fetches auth request
13
- * POST /login/auth — wallet submits auth response
14
- * POST /connect/complete — browser claims JWT cookie after succeed
15
- */
16
- import { WalletAuthenticator, WalletHandlers } from "@arcblock/did-connect-js";
17
- import { fromSecretKey } from "@ocap/wallet";
18
- import { Hono } from "hono";
19
- import { LOGIN_PROVIDER } from "./constants.js";
20
- import { D1TokenStorage } from "./store/d1-token-storage.js";
21
- import { signJWT } from "./identity/jwt.js";
22
- import { generateDelegation, resolveWalletIdentity } from "./identity/wallet-identity.js";
23
- export class DIDConnectHandler {
24
- app;
25
- storage;
26
- options;
27
- constructor(options) {
28
- this.options = options;
29
- const identity = resolveWalletIdentity(options.appSk, options.appPsk);
30
- this.storage = new D1TokenStorage(options.db, { ttl: 300 });
31
- // Delegation priority: explicit > auto (from appPsk) > none
32
- const hasDelegation = !!(options.delegator || options.delegation);
33
- const useAutoDelegation = !hasDelegation && identity.needsDelegation;
34
- let delegationJwt;
35
- if (useAutoDelegation) {
36
- // Cache the delegation JWT promise — resolved lazily on first call
37
- const delegationPromise = generateDelegation(identity);
38
- delegationJwt = undefined; // Will be set asynchronously
39
- delegationPromise.then((jwt) => {
40
- delegationJwt = jwt;
41
- });
42
- }
43
- const authenticator = new WalletAuthenticator({
44
- wallet: identity.wallet,
45
- appInfo: ({ baseUrl }) => ({
46
- name: options.appInfo?.name || "App",
47
- description: options.appInfo?.description || "",
48
- icon: options.appInfo?.icon || `${baseUrl}/favicon.ico`,
49
- link: baseUrl,
50
- }),
51
- chainInfo: { type: "arcblock", host: "none", id: "none" },
52
- ...(options.delegator && { delegator: () => options.delegator }),
53
- ...(options.delegation && { delegation: () => options.delegation }),
54
- ...(useAutoDelegation && {
55
- delegator: () => ({
56
- address: identity.permanentWallet.address,
57
- pk: identity.permanentWallet.pk,
58
- }),
59
- delegation: () => delegationJwt || "",
60
- }),
61
- });
62
- const handlers = new WalletHandlers({
63
- tokenStorage: this.storage,
64
- authenticator,
65
- options: { prefix: "/.well-known/service/api/did" },
66
- });
67
- this.app = new Hono();
68
- handlers.attach({
69
- app: this.app,
70
- action: "login",
71
- claims: {
72
- profile: () => ({ fields: ["fullName", "email", "avatar"] }),
73
- },
74
- onAuth: ({ userDid, userPk, claims }) => this.handleAuth(userDid, userPk, claims),
75
- });
76
- this.app.post("/.well-known/service/api/did/connect/complete", (c) => this.handleComplete(c));
77
- }
78
- /**
79
- * Handle an incoming request. Returns a Response if matched, null otherwise.
80
- * Hono returns 404 for unmatched routes — we convert that to null so the
81
- * caller can fall through to the next handler.
82
- */
83
- async fetch(request) {
84
- const response = await this.app.fetch(request);
85
- if (response.status === 404)
86
- return null;
87
- return response;
88
- }
89
- /** onAuth callback — create/update user, upsert connected account, audit log. */
90
- async handleAuth(userDid, userPk, claims) {
91
- const { store } = this.options;
92
- // claims is an array of claim objects — find the profile claim
93
- const profileClaim = Array.isArray(claims)
94
- ? claims.find((c) => c.type === "profile")
95
- : claims?.profile;
96
- const profile = profileClaim || {};
97
- const existingUser = await store.getUserByDid(userDid);
98
- const isNewUser = !existingUser;
99
- if (isNewUser) {
100
- await store.createUser({
101
- did: userDid,
102
- pk: userPk,
103
- fullName: profile.fullName,
104
- email: profile.email,
105
- sourceProvider: LOGIN_PROVIDER.WALLET,
106
- });
107
- // First user becomes owner
108
- const userCount = await store.getUserCount();
109
- if (userCount === 1) {
110
- await store.updateUserRole(userDid, "owner");
111
- }
112
- }
113
- else {
114
- await store.updateLastLogin(userDid);
115
- // Update profile if wallet provided new data
116
- if (profile.fullName || profile.email || profile.avatar) {
117
- await store.updateUserProfile(userDid, {
118
- fullName: profile.fullName,
119
- email: profile.email,
120
- avatar: profile.avatar,
121
- });
122
- }
123
- }
124
- await store.upsertConnectedAccount({
125
- did: userDid,
126
- pk: userPk,
127
- userDid,
128
- provider: "did-connect",
129
- id: userDid,
130
- });
131
- await store.createAuditLog({
132
- action: isNewUser ? "user.register" : "user.login",
133
- operatorDid: userDid,
134
- metadata: { provider: "did-connect" },
135
- });
136
- }
137
- /** Exchange a succeed token for a JWT cookie (called by browser after status poll). */
138
- async handleComplete(c) {
139
- let body;
140
- try {
141
- body = await c.req.json();
142
- }
143
- catch {
144
- return c.json({ error: "Invalid request body" }, 400);
145
- }
146
- const token = body?.token;
147
- if (!token) {
148
- return c.json({ error: "Missing token" }, 400);
149
- }
150
- // Read session — must be in "succeed" status
151
- const session = await this.storage.read(token);
152
- if (!session || session.status !== "succeed") {
153
- return c.json({ error: "Invalid or incomplete session" }, 400);
154
- }
155
- const userDid = session.did;
156
- const userPk = session.pk;
157
- if (!userDid || !userPk) {
158
- return c.json({ error: "Session missing user info" }, 400);
159
- }
160
- // Look up user for role + display name
161
- const user = await this.options.store.getUserByDid(userDid);
162
- if (!user) {
163
- return c.json({ error: "User not found" }, 400);
164
- }
165
- const payload = { did: userDid, pk: userPk };
166
- if (user.fullName)
167
- payload.displayName = user.fullName;
168
- if (user.role)
169
- payload.role = user.role;
170
- const jwt = await signJWT(payload, this.options.jwtSecret, this.options.jwtExpiresIn);
171
- const isSecure = new URL(c.req.url).protocol === "https:";
172
- const securePart = isSecure ? " Secure;" : "";
173
- let cookie = `${this.options.cookieName}=${jwt}; Path=/; HttpOnly;${securePart} SameSite=Lax; Max-Age=${this.options.jwtExpiresIn}`;
174
- const cookieDomain = typeof this.options.rpID === "string" ? this.options.rpID : undefined;
175
- if (cookieDomain?.includes("."))
176
- cookie += `; Domain=${cookieDomain}`;
177
- await this.storage.delete(token);
178
- c.header("Set-Cookie", cookie);
179
- return c.json({ ok: true, did: userDid });
180
- }
181
- }
182
- //# sourceMappingURL=did-connect-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"did-connect-handler.js","sourceRoot":"","sources":["../src/did-connect-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAoB1F,MAAM,OAAO,iBAAiB;IACpB,GAAG,CAAO;IACV,OAAO,CAAiB;IACxB,OAAO,CAA2B;IAE1C,YAAY,OAAiC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5D,4DAA4D;QAC5D,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,iBAAiB,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC,eAAe,CAAC;QACrE,IAAI,aAAiC,CAAC;QACtC,IAAI,iBAAiB,EAAE,CAAC;YACtB,mEAAmE;YACnE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACvD,aAAa,GAAG,SAAS,CAAC,CAAC,6BAA6B;YACxD,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7B,aAAa,GAAG,GAAG,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC;YAC5C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE,CAAC,CAAC;gBAC9C,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK;gBACpC,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE;gBAC/C,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG,OAAO,cAAc;gBACvD,IAAI,EAAE,OAAO;aACd,CAAC;YACF,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;YACzD,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAU,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAW,EAAE,CAAC;YACpE,GAAG,CAAC,iBAAiB,IAAI;gBACvB,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;oBAChB,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,OAAO;oBACzC,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE;iBAChC,CAAC;gBACF,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa,IAAI,EAAE;aACtC,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;YAClC,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,aAAa;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,8BAA8B,EAAE;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEtB,QAAQ,CAAC,MAAM,CAAC;YACd,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,OAAO;YACf,MAAM,EAAE;gBACN,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;aAC7D;YACD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAoD,EAAE,EAAE,CACxF,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;SAC3C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+CAA+C,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iFAAiF;IACzE,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,MAAc,EAAE,MAAW;QACnE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE/B,+DAA+D;QAC/D,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;YAC/C,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC;QACpB,MAAM,OAAO,GAAG,YAAY,IAAI,EAAE,CAAC;QAEnC,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,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,cAAc,EAAE,cAAc,CAAC,MAAM;aACtC,CAAC,CAAC;YAEH,2BAA2B;YAC3B,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;YACrC,6CAA6C;YAC7C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxD,MAAM,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE;oBACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC,sBAAsB,CAAC;YACjC,GAAG,EAAE,OAAO;YACZ,EAAE,EAAE,MAAM;YACV,OAAO;YACP,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,OAAO;SACZ,CAAC,CAAC;QAEH,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,aAAa,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;IAED,uFAAuF;IAC/E,KAAK,CAAC,cAAc,CAAC,CAAU;QACrC,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,6CAA6C;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,uCAAuC;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,OAAO,GAA4B,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,sBAAsB,UAAU,0BAA0B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACpI,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,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF"}
package/dist/did.d.ts DELETED
@@ -1,14 +0,0 @@
1
- /**
2
- * DID derivation from passkey public key using @arcblock/did.
3
- *
4
- * Matches blocklet-server's pattern: pass raw Uint8Array to fromPublicKey.
5
- * Uses @noble/hashes (pure JS SHA-256) — Workers compatible.
6
- */
7
- /**
8
- * Derive a `did:abt` DID from a WebAuthn credential public key.
9
- *
10
- * @param publicKey - The COSE public key bytes from WebAuthn registration
11
- * @returns DID string (e.g. "z1abc...")
12
- */
13
- export declare function derivePasskeyDID(publicKey: Uint8Array): string;
14
- //# sourceMappingURL=did.d.ts.map
package/dist/did.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAE9D"}
package/dist/did.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * DID derivation from passkey public key using @arcblock/did.
3
- *
4
- * Matches blocklet-server's pattern: pass raw Uint8Array to fromPublicKey.
5
- * Uses @noble/hashes (pure JS SHA-256) — Workers compatible.
6
- */
7
- import { fromPublicKey } from "@arcblock/did";
8
- /**
9
- * Derive a `did:abt` DID from a WebAuthn credential public key.
10
- *
11
- * @param publicKey - The COSE public key bytes from WebAuthn registration
12
- * @returns DID string (e.g. "z1abc...")
13
- */
14
- export function derivePasskeyDID(publicKey) {
15
- return fromPublicKey(publicKey, "passkey");
16
- }
17
- //# sourceMappingURL=did.js.map
package/dist/did.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAqB;IACpD,OAAO,aAAa,CAAC,SAAS,EAAE,SAAS,CAAW,CAAC;AACvD,CAAC"}
@@ -1,50 +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 type { AuthEntrypointInterface } from "./identity/auth-entrypoint.js";
15
- import type { D1Store } from "./store/d1-store.js";
16
- export interface EmailLoginHandlerOptions {
17
- store: D1Store;
18
- appSk: string;
19
- jwtSecret: string;
20
- jwtExpiresIn: number;
21
- cookieName: string;
22
- rpID?: string | ((request: Request) => string);
23
- /** Resend API key for sending emails. Falls back to D1 email:config at runtime. */
24
- resendApiKey?: string;
25
- /** From address for verification emails. Falls back to D1 email:config at runtime. */
26
- emailFrom?: string;
27
- /** Instance DID for loading settings from D1. */
28
- instanceDid?: string;
29
- /** Service Binding to master Worker (federated mode). */
30
- authMaster?: AuthEntrypointInterface;
31
- }
32
- export declare class EmailLoginHandler {
33
- private options;
34
- constructor(options: EmailLoginHandlerOptions);
35
- /** Resolve email config: constructor options take priority, fall back to D1 email:config. */
36
- resolveEmailConfig(): Promise<{
37
- resendApiKey: string;
38
- emailFrom: string;
39
- } | null>;
40
- /** Check whether email login is available (config exists in env or D1). */
41
- isEnabled(): Promise<boolean>;
42
- fetch(request: Request): Promise<Response | null>;
43
- /** POST /sendCode — generate code, send email, return { id }. */
44
- private sendCode;
45
- /** GET /status — check if a verification code has been used. */
46
- private checkStatus;
47
- /** POST /login — verify code or magic token, derive DID, issue JWT. */
48
- private login;
49
- }
50
- //# sourceMappingURL=email-login-handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"email-login-handler.d.ts","sourceRoot":"","sources":["../src/email-login-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAI7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IAC/C,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IAI7C,6FAA6F;IACvF,kBAAkB,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAoBvF,2EAA2E;IACrE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBvD,iEAAiE;YACnD,QAAQ;IA6DtB,gEAAgE;YAClD,WAAW;IASzB,uEAAuE;YACzD,KAAK;CA+FpB"}