accounts 0.6.1 → 0.6.2

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 (50) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/core/Schema.d.ts +12 -12
  3. package/dist/core/adapters/dialog.d.ts.map +1 -1
  4. package/dist/core/adapters/dialog.js +3 -1
  5. package/dist/core/adapters/dialog.js.map +1 -1
  6. package/dist/core/zod/rpc.d.ts +9 -9
  7. package/dist/core/zod/rpc.js +1 -1
  8. package/dist/core/zod/rpc.js.map +1 -1
  9. package/dist/server/CliAuth.d.ts +11 -11
  10. package/dist/server/CliAuth.js +1 -1
  11. package/dist/server/CliAuth.js.map +1 -1
  12. package/dist/server/Handler.d.ts +4 -252
  13. package/dist/server/Handler.d.ts.map +1 -1
  14. package/dist/server/Handler.js +4 -573
  15. package/dist/server/Handler.js.map +1 -1
  16. package/dist/server/internal/handlers/codeAuth.d.ts +41 -0
  17. package/dist/server/internal/handlers/codeAuth.d.ts.map +1 -0
  18. package/dist/server/internal/handlers/codeAuth.js +104 -0
  19. package/dist/server/internal/handlers/codeAuth.js.map +1 -0
  20. package/dist/server/internal/handlers/feePayer.d.ts +73 -0
  21. package/dist/server/internal/handlers/feePayer.d.ts.map +1 -0
  22. package/dist/server/internal/handlers/feePayer.js +184 -0
  23. package/dist/server/internal/handlers/feePayer.js.map +1 -0
  24. package/dist/server/internal/handlers/relay.d.ts +148 -0
  25. package/dist/server/internal/handlers/relay.d.ts.map +1 -0
  26. package/dist/server/internal/handlers/relay.js +600 -0
  27. package/dist/server/internal/handlers/relay.js.map +1 -0
  28. package/dist/server/internal/handlers/utils.d.ts +12 -0
  29. package/dist/server/internal/handlers/utils.d.ts.map +1 -0
  30. package/dist/server/internal/handlers/utils.js +80 -0
  31. package/dist/server/internal/handlers/utils.js.map +1 -0
  32. package/dist/server/internal/handlers/webAuthn.d.ts +57 -0
  33. package/dist/server/internal/handlers/webAuthn.d.ts.map +1 -0
  34. package/dist/server/internal/handlers/webAuthn.js +143 -0
  35. package/dist/server/internal/handlers/webAuthn.js.map +1 -0
  36. package/package.json +2 -2
  37. package/src/core/Provider.connect.browser.test.ts +23 -2
  38. package/src/core/adapters/dialog.ts +6 -1
  39. package/src/core/zod/rpc.ts +1 -1
  40. package/src/server/CliAuth.ts +1 -1
  41. package/src/server/Handler.test.ts +3 -418
  42. package/src/server/Handler.ts +5 -766
  43. package/src/server/internal/handlers/codeAuth.ts +148 -0
  44. package/src/server/internal/handlers/feePayer.test.ts +335 -0
  45. package/src/server/internal/handlers/feePayer.ts +271 -0
  46. package/src/server/internal/handlers/relay.test.ts +767 -0
  47. package/src/server/internal/handlers/relay.ts +817 -0
  48. package/src/server/internal/handlers/utils.ts +96 -0
  49. package/src/server/internal/handlers/webAuthn.test.ts +170 -0
  50. package/src/server/internal/handlers/webAuthn.ts +213 -0
@@ -1,9 +1,8 @@
1
1
  import { Hono } from 'hono';
2
- import { RpcRequest } from 'ox';
3
- import { type Chain, type Transport } from 'viem';
4
- import type { LocalAccount } from 'viem/accounts';
5
- import * as CliAuth from './CliAuth.js';
6
- import * as Kv from './Kv.js';
2
+ export { codeAuth } from './internal/handlers/codeAuth.js';
3
+ export { feePayer } from './internal/handlers/feePayer.js';
4
+ export { relay } from './internal/handlers/relay.js';
5
+ export { webAuthn } from './internal/handlers/webAuthn.js';
7
6
  export type Handler = Hono & {
8
7
  listener: (req: any, res: any) => void;
9
8
  };
@@ -48,251 +47,4 @@ export declare namespace from {
48
47
  maxAge?: number | undefined;
49
48
  };
50
49
  }
51
- /**
52
- * Instantiates a fee payer service request handler that can be used to
53
- * sponsor the fee for user transactions.
54
- *
55
- * @example
56
- * ### Cloudflare Worker
57
- *
58
- * ```ts
59
- * import { privateKeyToAccount } from 'viem/accounts'
60
- * import { Handler } from 'accounts/server'
61
- *
62
- * export default {
63
- * fetch(request) {
64
- * return Handler.feePayer({
65
- * account: privateKeyToAccount('0x...'),
66
- * }).fetch(request)
67
- * }
68
- * }
69
- * ```
70
- *
71
- * @example
72
- * ### Next.js
73
- *
74
- * ```ts
75
- * import { privateKeyToAccount } from 'viem/accounts'
76
- * import { Handler } from 'accounts/server'
77
- *
78
- * const handler = Handler.feePayer({
79
- * account: privateKeyToAccount('0x...'),
80
- * })
81
- *
82
- * export GET = handler.fetch
83
- * export POST = handler.fetch
84
- * ```
85
- *
86
- * @example
87
- * ### Hono
88
- *
89
- * ```ts
90
- * import { privateKeyToAccount } from 'viem/accounts'
91
- * import { Handler } from 'accounts/server'
92
- *
93
- * const handler = Handler.feePayer({
94
- * account: privateKeyToAccount('0x...'),
95
- * })
96
- *
97
- * const app = new Hono()
98
- * app.all('*', handler)
99
- *
100
- * export default app
101
- * ```
102
- *
103
- * @example
104
- * ### Node.js
105
- *
106
- * ```ts
107
- * import { privateKeyToAccount } from 'viem/accounts'
108
- * import { Handler } from 'accounts/server'
109
- *
110
- * const handler = Handler.feePayer({
111
- * account: privateKeyToAccount('0x...'),
112
- * })
113
- *
114
- * const server = createServer(handler.listener)
115
- * server.listen(3000)
116
- * ```
117
- *
118
- * @example
119
- * ### Bun
120
- *
121
- * ```ts
122
- * import { privateKeyToAccount } from 'viem/accounts'
123
- * import { Handler } from 'accounts/server'
124
- *
125
- * const handler = Handler.feePayer({
126
- * account: privateKeyToAccount('0x...'),
127
- * })
128
- *
129
- * Bun.serve(handler)
130
- * ```
131
- *
132
- * @example
133
- * ### Deno
134
- *
135
- * ```ts
136
- * import { privateKeyToAccount } from 'viem/accounts'
137
- * import { Handler } from 'accounts/server'
138
- *
139
- * const handler = Handler.feePayer({
140
- * account: privateKeyToAccount('0x...'),
141
- * })
142
- *
143
- * Deno.serve(handler)
144
- * ```
145
- *
146
- * @example
147
- * ### Express
148
- *
149
- * ```ts
150
- * import { privateKeyToAccount } from 'viem/accounts'
151
- * import { Handler } from 'accounts/server'
152
- *
153
- * const handler = Handler.feePayer({
154
- * account: privateKeyToAccount('0x...'),
155
- * })
156
- *
157
- * const app = express()
158
- * app.use(handler.listener)
159
- * app.listen(3000)
160
- * ```
161
- *
162
- * @example
163
- * ### Custom chains & transports
164
- *
165
- * ```ts
166
- * import { http } from 'viem'
167
- * import { privateKeyToAccount } from 'viem/accounts'
168
- * import { tempo, tempoModerato } from 'viem/chains'
169
- * import { Handler } from 'accounts/server'
170
- *
171
- * const handler = Handler.feePayer({
172
- * account: privateKeyToAccount('0x...'),
173
- * chains: [tempo, tempoModerato],
174
- * transports: {
175
- * [tempo.id]: http('https://rpc.tempo.xyz'),
176
- * [tempoModerato.id]: http('https://rpc.testnet.tempo.xyz'),
177
- * },
178
- * })
179
- * ```
180
- *
181
- * @param options - Options.
182
- * @returns Request handler.
183
- */
184
- export declare function feePayer(options: feePayer.Options): Handler;
185
- export declare namespace feePayer {
186
- type Options = from.Options & {
187
- /** Account to use as the fee payer. */
188
- account: LocalAccount;
189
- /**
190
- * Supported chains. The handler resolves the client based on the
191
- * `chainId` in the incoming transaction.
192
- * @default [tempo, tempoModerato]
193
- */
194
- chains?: readonly [Chain, ...Chain[]] | undefined;
195
- /** Function to call before handling the request. */
196
- onRequest?: (request: RpcRequest.RpcRequest) => Promise<void>;
197
- /** Path to use for the handler. */
198
- path?: string | undefined;
199
- /** Sponsor display name returned from `eth_fillTransaction`. */
200
- name?: string | undefined;
201
- /** Transports keyed by chain ID. Defaults to `http()` for each chain. */
202
- transports?: Record<number, Transport> | undefined;
203
- /** Sponsor URL returned from `eth_fillTransaction`. */
204
- url?: string | undefined;
205
- };
206
- }
207
- /**
208
- * Instantiates a generic device-code handler for access-key bootstrap.
209
- *
210
- * Exposes 4 endpoints:
211
- * - `GET /auth/pkce/pending/:code`
212
- * - `POST /auth/pkce/code`
213
- * - `POST /auth/pkce/poll/:code`
214
- * - `POST /auth/pkce`
215
- *
216
- * @param options - Options.
217
- * @returns Request handler.
218
- */
219
- export declare function codeAuth(options?: codeAuth.Options): Handler;
220
- export declare namespace codeAuth {
221
- type Options = from.Options & {
222
- /**
223
- * Supported chains. The handler resolves the client based on chain IDs carried
224
- * by device-code requests and key authorizations.
225
- * @default [tempo, tempoModerato]
226
- */
227
- chains?: readonly [Chain, ...Chain[]] | undefined;
228
- /** Time source used for TTL evaluation. */
229
- now?: (() => number) | undefined;
230
- /** Path prefix for the code auth endpoints. @default "/auth/pkce" */
231
- path?: string | undefined;
232
- /** Policy used to validate and default requested CLI auth fields. */
233
- policy?: CliAuth.Policy | undefined;
234
- /** Random byte generator used for device-code allocation. */
235
- random?: ((size: number) => Uint8Array) | undefined;
236
- /** Device-code store. */
237
- store?: CliAuth.Store | undefined;
238
- /** Transports keyed by chain ID. Defaults to `http()` for each chain. */
239
- transports?: Record<number, Transport> | undefined;
240
- /** Pending entry TTL in milliseconds. @default 600000 */
241
- ttlMs?: number | undefined;
242
- };
243
- }
244
- /**
245
- * Instantiates a WebAuthn ceremony handler that manages registration and
246
- * authentication flows server-side.
247
- *
248
- * Exposes 4 POST endpoints following the webauthx convention:
249
- * - `POST /register/options` — generate credential creation options
250
- * - `POST /register` — verify registration and store credential
251
- * - `POST /login/options` — generate credential request options
252
- * - `POST /login` — verify authentication
253
- *
254
- * @example
255
- * ```ts
256
- * import { Handler, Kv } from 'accounts/server'
257
- *
258
- * const handler = Handler.webAuthn({
259
- * kv: Kv.memory(),
260
- * origin: 'https://example.com',
261
- * rpId: 'example.com',
262
- * })
263
- *
264
- * export default handler
265
- * ```
266
- *
267
- * @param options - Options.
268
- * @returns Request handler.
269
- */
270
- export declare function webAuthn(options: webAuthn.Options): Handler;
271
- export declare namespace webAuthn {
272
- type Options = from.Options & {
273
- /** Maximum age of a challenge in seconds before it expires. @default 300 */
274
- challengeTtl?: number | undefined;
275
- /** Key-value store for challenges and credentials. */
276
- kv: Kv.Kv;
277
- /** Called after a successful registration. The returned response is merged onto the default JSON response. */
278
- onRegister?: (parameters: {
279
- credentialId: string;
280
- publicKey: string;
281
- request: Request;
282
- }) => Response | Promise<Response> | void | Promise<void>;
283
- /** Called after a successful authentication. The returned response is merged onto the default JSON response. */
284
- onAuthenticate?: (parameters: {
285
- credentialId: string;
286
- publicKey: string;
287
- userId?: string | undefined;
288
- request: Request;
289
- }) => Response | Promise<Response> | void | Promise<void>;
290
- /** Expected origin(s) (e.g. `"https://example.com"` or `["https://a.com", "https://b.com"]`). */
291
- origin: string | readonly string[];
292
- /** Path prefix for the WebAuthn endpoints (e.g. `"/webauthn"`). @default "" */
293
- path?: string | undefined;
294
- /** Relying Party ID (e.g. `"example.com"`). */
295
- rpId: string;
296
- };
297
- }
298
50
  //# sourceMappingURL=Handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Handler.d.ts","sourceRoot":"","sources":["../../src/server/Handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Handler.d.ts","sourceRoot":"","sources":["../../src/server/Handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAE1D,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;CACvC,CAAA;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,OAAY,GAAG,OAAO,CAmBxF;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,KAAY,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG;QACnC,uCAAuC;QACvC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,IAAI,CAAC,OAAY,GAAG,OAAO,CAiBxD;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,OAAO,GAAG;QACpB;;;;;WAKG;QACH,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAA;QACjC,sCAAsC;QACtC,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KACvD,CAAA;IAED,KAAY,IAAI,GAAG;QACjB,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;QACtC,wEAAwE;QACxE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,qDAAqD;QACrD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,oCAAoC;QACpC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACjC,wCAAwC;QACxC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC,8CAA8C;QAC9C,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC5B,CAAA;CACF"}