accounts 0.3.0 → 0.4.1

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 (168) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +97 -0
  4. package/dist/core/AccessKey.d.ts +55 -0
  5. package/dist/core/AccessKey.d.ts.map +1 -0
  6. package/dist/core/AccessKey.js +69 -0
  7. package/dist/core/AccessKey.js.map +1 -0
  8. package/dist/core/Account.d.ts +91 -0
  9. package/dist/core/Account.d.ts.map +1 -0
  10. package/dist/core/Account.js +64 -0
  11. package/dist/core/Account.js.map +1 -0
  12. package/dist/core/Adapter.d.ts +187 -0
  13. package/dist/core/Adapter.d.ts.map +1 -0
  14. package/dist/core/Adapter.js +7 -0
  15. package/dist/core/Adapter.js.map +1 -0
  16. package/dist/core/Ceremony.d.ts +109 -0
  17. package/dist/core/Ceremony.d.ts.map +1 -0
  18. package/dist/core/Ceremony.js +104 -0
  19. package/dist/core/Ceremony.js.map +1 -0
  20. package/dist/core/Client.d.ts +16 -0
  21. package/dist/core/Client.d.ts.map +1 -0
  22. package/dist/core/Client.js +18 -0
  23. package/dist/core/Client.js.map +1 -0
  24. package/dist/core/Dialog.d.ts +52 -0
  25. package/dist/core/Dialog.d.ts.map +1 -0
  26. package/dist/core/Dialog.js +342 -0
  27. package/dist/core/Dialog.js.map +1 -0
  28. package/dist/core/Expiry.d.ts +15 -0
  29. package/dist/core/Expiry.d.ts.map +1 -0
  30. package/dist/core/Expiry.js +29 -0
  31. package/dist/core/Expiry.js.map +1 -0
  32. package/dist/core/Messenger.d.ts +86 -0
  33. package/dist/core/Messenger.d.ts.map +1 -0
  34. package/dist/core/Messenger.js +127 -0
  35. package/dist/core/Messenger.js.map +1 -0
  36. package/dist/core/Provider.d.ts +69 -0
  37. package/dist/core/Provider.d.ts.map +1 -0
  38. package/dist/core/Provider.js +401 -0
  39. package/dist/core/Provider.js.map +1 -0
  40. package/dist/core/Remote.d.ts +114 -0
  41. package/dist/core/Remote.d.ts.map +1 -0
  42. package/dist/core/Remote.js +116 -0
  43. package/dist/core/Remote.js.map +1 -0
  44. package/dist/core/Schema.d.ts +805 -0
  45. package/dist/core/Schema.d.ts.map +1 -0
  46. package/dist/core/Schema.js +43 -0
  47. package/dist/core/Schema.js.map +1 -0
  48. package/dist/core/Storage.d.ts +42 -0
  49. package/dist/core/Storage.d.ts.map +1 -0
  50. package/dist/core/Storage.js +173 -0
  51. package/dist/core/Storage.js.map +1 -0
  52. package/dist/core/Store.d.ts +58 -0
  53. package/dist/core/Store.d.ts.map +1 -0
  54. package/dist/core/Store.js +58 -0
  55. package/dist/core/Store.js.map +1 -0
  56. package/dist/core/adapters/dangerous_secp256k1.d.ts +30 -0
  57. package/dist/core/adapters/dangerous_secp256k1.d.ts.map +1 -0
  58. package/dist/core/adapters/dangerous_secp256k1.js +39 -0
  59. package/dist/core/adapters/dangerous_secp256k1.js.map +1 -0
  60. package/dist/core/adapters/dialog.d.ts +31 -0
  61. package/dist/core/adapters/dialog.d.ts.map +1 -0
  62. package/dist/core/adapters/dialog.js +306 -0
  63. package/dist/core/adapters/dialog.js.map +1 -0
  64. package/dist/core/adapters/local.d.ts +33 -0
  65. package/dist/core/adapters/local.d.ts.map +1 -0
  66. package/dist/core/adapters/local.js +227 -0
  67. package/dist/core/adapters/local.js.map +1 -0
  68. package/dist/core/adapters/webAuthn.d.ts +36 -0
  69. package/dist/core/adapters/webAuthn.d.ts.map +1 -0
  70. package/dist/core/adapters/webAuthn.js +93 -0
  71. package/dist/core/adapters/webAuthn.js.map +1 -0
  72. package/dist/core/internal/withDedupe.d.ts +12 -0
  73. package/dist/core/internal/withDedupe.d.ts.map +1 -0
  74. package/dist/core/internal/withDedupe.js +12 -0
  75. package/dist/core/internal/withDedupe.js.map +1 -0
  76. package/dist/core/zod/request.d.ts +31 -0
  77. package/dist/core/zod/request.d.ts.map +1 -0
  78. package/dist/core/zod/request.js +41 -0
  79. package/dist/core/zod/request.js.map +1 -0
  80. package/dist/core/zod/rpc.d.ts +603 -0
  81. package/dist/core/zod/rpc.d.ts.map +1 -0
  82. package/dist/core/zod/rpc.js +293 -0
  83. package/dist/core/zod/rpc.js.map +1 -0
  84. package/dist/core/zod/utils.d.ts +18 -0
  85. package/dist/core/zod/utils.d.ts.map +1 -0
  86. package/dist/core/zod/utils.js +21 -0
  87. package/dist/core/zod/utils.js.map +1 -0
  88. package/dist/index.d.ts +15 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +15 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/internal/types.d.ts +284 -0
  93. package/dist/internal/types.d.ts.map +1 -0
  94. package/dist/internal/types.js +2 -0
  95. package/dist/internal/types.js.map +1 -0
  96. package/dist/server/Handler.d.ts +257 -0
  97. package/dist/server/Handler.d.ts.map +1 -0
  98. package/dist/server/Handler.js +433 -0
  99. package/dist/server/Handler.js.map +1 -0
  100. package/dist/server/Kv.d.ts +16 -0
  101. package/dist/server/Kv.d.ts.map +1 -0
  102. package/dist/server/Kv.js +30 -0
  103. package/dist/server/Kv.js.map +1 -0
  104. package/dist/server/index.d.ts +3 -0
  105. package/dist/server/index.d.ts.map +1 -0
  106. package/dist/server/index.js +3 -0
  107. package/dist/server/index.js.map +1 -0
  108. package/dist/server/internal/requestListener.d.ts +124 -0
  109. package/dist/server/internal/requestListener.d.ts.map +1 -0
  110. package/dist/server/internal/requestListener.js +173 -0
  111. package/dist/server/internal/requestListener.js.map +1 -0
  112. package/dist/wagmi/Connector.d.ts +93 -0
  113. package/dist/wagmi/Connector.d.ts.map +1 -0
  114. package/dist/wagmi/Connector.js +238 -0
  115. package/dist/wagmi/Connector.js.map +1 -0
  116. package/dist/wagmi/index.d.ts +3 -0
  117. package/dist/wagmi/index.d.ts.map +1 -0
  118. package/dist/wagmi/index.js +3 -0
  119. package/dist/wagmi/index.js.map +1 -0
  120. package/package.json +56 -2
  121. package/src/core/AccessKey.test.ts +257 -0
  122. package/src/core/AccessKey.ts +123 -0
  123. package/src/core/Account.test.ts +309 -0
  124. package/src/core/Account.ts +152 -0
  125. package/src/core/Adapter.ts +238 -0
  126. package/src/core/Ceremony.browser.test.ts +239 -0
  127. package/src/core/Ceremony.test.ts +151 -0
  128. package/src/core/Ceremony.ts +203 -0
  129. package/src/core/Client.ts +36 -0
  130. package/src/core/Dialog.browser.test.ts +309 -0
  131. package/src/core/Dialog.test-d.ts +19 -0
  132. package/src/core/Dialog.ts +442 -0
  133. package/src/core/Expiry.ts +34 -0
  134. package/src/core/Messenger.ts +206 -0
  135. package/src/core/Provider.browser.test.ts +774 -0
  136. package/src/core/Provider.connect.browser.test.ts +415 -0
  137. package/src/core/Provider.test-d.ts +53 -0
  138. package/src/core/Provider.test.ts +1566 -0
  139. package/src/core/Provider.ts +559 -0
  140. package/src/core/Remote.ts +262 -0
  141. package/src/core/Schema.test-d.ts +211 -0
  142. package/src/core/Schema.ts +143 -0
  143. package/src/core/Storage.ts +213 -0
  144. package/src/core/Store.test.ts +287 -0
  145. package/src/core/Store.ts +129 -0
  146. package/src/core/adapters/dangerous_secp256k1.ts +53 -0
  147. package/src/core/adapters/dialog.ts +379 -0
  148. package/src/core/adapters/local.test.ts +97 -0
  149. package/src/core/adapters/local.ts +277 -0
  150. package/src/core/adapters/webAuthn.ts +129 -0
  151. package/src/core/internal/withDedupe.test.ts +116 -0
  152. package/src/core/internal/withDedupe.ts +20 -0
  153. package/src/core/mppx.test.ts +83 -0
  154. package/src/core/zod/request.test.ts +121 -0
  155. package/src/core/zod/request.ts +70 -0
  156. package/src/core/zod/rpc.ts +374 -0
  157. package/src/core/zod/utils.test.ts +69 -0
  158. package/src/core/zod/utils.ts +40 -0
  159. package/src/index.ts +14 -0
  160. package/src/internal/types.ts +378 -0
  161. package/src/server/Handler.test.ts +1014 -0
  162. package/src/server/Handler.ts +605 -0
  163. package/src/server/Kv.ts +46 -0
  164. package/src/server/index.ts +2 -0
  165. package/src/server/internal/requestListener.ts +273 -0
  166. package/src/tsconfig.json +9 -0
  167. package/src/wagmi/Connector.ts +287 -0
  168. package/src/wagmi/index.ts +2 -0
@@ -0,0 +1,433 @@
1
+ import { createRouter, } from '@remix-run/fetch-router';
2
+ import { Base64, Bytes, Hex, RpcRequest, RpcResponse } from 'ox';
3
+ import { Credential } from 'ox/webauthn';
4
+ import { createClient, http } from 'viem';
5
+ import { signTransaction } from 'viem/actions';
6
+ import { tempo, tempoModerato } from 'viem/chains';
7
+ import { Transaction } from 'viem/tempo';
8
+ import { Authentication, Registration, } from 'webauthx/server';
9
+ import * as RequestListener from './internal/requestListener.js';
10
+ export function compose(handlers, options = {}) {
11
+ const path = options.path ?? '/';
12
+ return from({
13
+ ...options,
14
+ async defaultHandler(context) {
15
+ const url = new URL(context.request.url);
16
+ if (!url.pathname.startsWith(path))
17
+ return new Response('Not Found', { status: 404 });
18
+ url.pathname = url.pathname.replace(path, '');
19
+ for (const handler of handlers) {
20
+ const request = new Request(url, context.request.clone());
21
+ const response = await handler.fetch(request);
22
+ if (response.status !== 404)
23
+ return response;
24
+ }
25
+ return new Response('Not Found', { status: 404 });
26
+ },
27
+ });
28
+ }
29
+ /**
30
+ * Instantiates a new request handler.
31
+ *
32
+ * @param options - constructor options
33
+ * @returns Handler instance
34
+ */
35
+ export function from(options = {}) {
36
+ const corsHeaders = corsToHeaders(options.cors);
37
+ const mergedHeaders = new Headers(corsHeaders);
38
+ for (const [key, value] of normalizeHeaders(options.headers).entries())
39
+ mergedHeaders.set(key, value);
40
+ const router = createRouter({
41
+ ...options,
42
+ middleware: [headers(mergedHeaders), preflight(mergedHeaders)],
43
+ });
44
+ return {
45
+ ...router,
46
+ listener: RequestListener.fromFetchHandler((request) => {
47
+ return router.fetch(request);
48
+ }),
49
+ };
50
+ }
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.moderato.tempo.xyz'),
177
+ * },
178
+ * })
179
+ * ```
180
+ *
181
+ * @param options - Options.
182
+ * @returns Request handler.
183
+ */
184
+ export function feePayer(options) {
185
+ const { account, chains = [tempo, tempoModerato], onRequest, path = '/', transports = {}, } = options;
186
+ const clients = new Map();
187
+ for (const chain of chains) {
188
+ const transport = transports[chain.id] ?? http();
189
+ clients.set(chain.id, createClient({ chain, transport }));
190
+ }
191
+ function getClient(chainId) {
192
+ if (chainId) {
193
+ const client = clients.get(chainId);
194
+ if (!client)
195
+ throw new Error(`Chain ${chainId} not configured`);
196
+ return client;
197
+ }
198
+ return clients.get(chains[0].id);
199
+ }
200
+ const router = from(options);
201
+ router.post(path, async ({ request: req }) => {
202
+ const request = RpcRequest.from((await req.json()));
203
+ try {
204
+ await onRequest?.(request);
205
+ const method = request.method;
206
+ if (method !== 'eth_signRawTransaction' &&
207
+ method !== 'eth_sendRawTransaction' &&
208
+ method !== 'eth_sendRawTransactionSync')
209
+ return Response.json(RpcResponse.from({
210
+ error: new RpcResponse.MethodNotSupportedError({
211
+ message: `Method not supported: ${request.method}`,
212
+ }),
213
+ }, { request }));
214
+ const serialized = request.params?.[0];
215
+ if (!serialized?.startsWith('0x76') && !serialized?.startsWith('0x78'))
216
+ throw new RpcResponse.InvalidParamsError({
217
+ message: 'Only Tempo (0x76/0x78) transactions are supported.',
218
+ });
219
+ const transaction = Transaction.deserialize(serialized);
220
+ if (!transaction.signature || !transaction.from)
221
+ throw new RpcResponse.InvalidParamsError({
222
+ message: 'Transaction must be signed by the sender before fee payer signing.',
223
+ });
224
+ const client = getClient(transaction.chainId);
225
+ const serializedTransaction = await signTransaction(client, {
226
+ ...transaction,
227
+ account,
228
+ feePayer: account,
229
+ });
230
+ if (method === 'eth_signRawTransaction')
231
+ return Response.json(RpcResponse.from({ result: serializedTransaction }, { request }));
232
+ const result = await client.request({
233
+ method,
234
+ params: [serializedTransaction],
235
+ });
236
+ return Response.json(RpcResponse.from({ result }, { request }));
237
+ }
238
+ catch (error) {
239
+ return Response.json(RpcResponse.from({
240
+ error: new RpcResponse.InternalError({
241
+ message: error.message,
242
+ }),
243
+ }, { request }));
244
+ }
245
+ });
246
+ return router;
247
+ }
248
+ /**
249
+ * Instantiates a WebAuthn ceremony handler that manages registration and
250
+ * authentication flows server-side.
251
+ *
252
+ * Exposes 4 POST endpoints following the webauthx convention:
253
+ * - `POST /register/options` — generate credential creation options
254
+ * - `POST /register` — verify registration and store credential
255
+ * - `POST /login/options` — generate credential request options
256
+ * - `POST /login` — verify authentication
257
+ *
258
+ * @example
259
+ * ```ts
260
+ * import { Handler, Kv } from 'accounts/server'
261
+ *
262
+ * const handler = Handler.webauthn({
263
+ * kv: Kv.memory(),
264
+ * origin: 'https://example.com',
265
+ * rpId: 'example.com',
266
+ * })
267
+ *
268
+ * export default handler
269
+ * ```
270
+ *
271
+ * @param options - Options.
272
+ * @returns Request handler.
273
+ */
274
+ export function webauthn(options) {
275
+ const { challengeTtl = 300, kv, onAuthenticate, onRegister, path = '', rpId, ...rest } = options;
276
+ const origin = options.origin;
277
+ const router = from(rest);
278
+ router.post(`${path}/register/options`, async ({ request: req }) => {
279
+ try {
280
+ const body = await req.json();
281
+ const { excludeCredentialIds, name, userId } = body;
282
+ const { challenge, options } = Registration.getOptions({
283
+ excludeCredentialIds,
284
+ name,
285
+ rp: { id: rpId, name: rpId },
286
+ ...(userId ? { user: { id: new TextEncoder().encode(userId), name } } : undefined),
287
+ });
288
+ await kv.set(`challenge:${challenge}`, Date.now());
289
+ return Response.json({ options });
290
+ }
291
+ catch (error) {
292
+ return Response.json({ error: error.message }, { status: 400 });
293
+ }
294
+ });
295
+ router.post(`${path}/register`, async ({ request: req }) => {
296
+ try {
297
+ const credential = (await req.json());
298
+ const deserialized = Credential.deserialize(credential);
299
+ const clientData = JSON.parse(Bytes.toString(new Uint8Array(deserialized.clientDataJSON)));
300
+ const challenge = Hex.fromBytes(Base64.toBytes(clientData.challenge));
301
+ const stored = await kv.get(`challenge:${challenge}`);
302
+ if (!stored || Date.now() - stored > challengeTtl * 1_000)
303
+ throw new Error('Missing or expired challenge');
304
+ await kv.delete(`challenge:${challenge}`);
305
+ const result = Registration.verify(credential, {
306
+ challenge,
307
+ origin,
308
+ rpId,
309
+ });
310
+ const { publicKey } = result.credential;
311
+ const credentialId = credential.id;
312
+ await kv.set(`credential:${credentialId}`, { publicKey });
313
+ const json = { credentialId, publicKey };
314
+ const hook = await onRegister?.({ credentialId, publicKey, request: req });
315
+ return mergeResponse(json, hook);
316
+ }
317
+ catch (error) {
318
+ return Response.json({ error: error.message }, { status: 400 });
319
+ }
320
+ });
321
+ router.post(`${path}/login/options`, async ({ request: req }) => {
322
+ try {
323
+ const body = await req.json();
324
+ const { allowCredentialIds, challenge: requestChallenge, credentialId, mediation, } = body;
325
+ const { challenge, options: authOptions } = Authentication.getOptions({
326
+ challenge: requestChallenge,
327
+ credentialId: allowCredentialIds ?? credentialId,
328
+ rpId,
329
+ });
330
+ const options = mediation ? { ...authOptions, mediation } : authOptions;
331
+ await kv.set(`challenge:${challenge}`, Date.now());
332
+ return Response.json({ options });
333
+ }
334
+ catch (error) {
335
+ return Response.json({ error: error.message }, { status: 400 });
336
+ }
337
+ });
338
+ router.post(`${path}/login`, async ({ request: req }) => {
339
+ try {
340
+ const response = (await req.json());
341
+ const clientData = JSON.parse(response.metadata.clientDataJSON);
342
+ const challenge = Hex.fromBytes(Base64.toBytes(clientData.challenge));
343
+ const stored = await kv.get(`challenge:${challenge}`);
344
+ if (!stored || Date.now() - stored > challengeTtl * 1_000)
345
+ throw new Error('Missing or expired challenge');
346
+ await kv.delete(`challenge:${challenge}`);
347
+ const credentialData = await kv.get(`credential:${response.id}`);
348
+ if (!credentialData)
349
+ throw new Error('Unknown credential');
350
+ const valid = Authentication.verify(response, {
351
+ challenge,
352
+ origin,
353
+ publicKey: credentialData.publicKey,
354
+ rpId,
355
+ });
356
+ if (!valid)
357
+ throw new Error('Authentication failed');
358
+ const rawResponse = response.raw?.response;
359
+ const userHandle = rawResponse?.userHandle;
360
+ const json = {
361
+ credentialId: response.id,
362
+ publicKey: credentialData.publicKey,
363
+ ...(userHandle && userHandle.length > 0 ? { userId: userHandle } : undefined),
364
+ };
365
+ const hook = await onAuthenticate?.({ ...json, request: req });
366
+ return mergeResponse(json, hook);
367
+ }
368
+ catch (error) {
369
+ return Response.json({ error: error.message }, { status: 400 });
370
+ }
371
+ });
372
+ return router;
373
+ }
374
+ /** @internal */
375
+ async function mergeResponse(json, hook) {
376
+ if (!hook)
377
+ return Response.json(json);
378
+ const extra = (await hook.json().catch(() => ({})));
379
+ const headers = new Headers(hook.headers);
380
+ headers.set('content-type', 'application/json');
381
+ return new Response(JSON.stringify({ ...json, ...extra }), {
382
+ headers,
383
+ status: hook.status,
384
+ });
385
+ }
386
+ /** @internal */
387
+ function normalizeHeaders(headers) {
388
+ if (!headers)
389
+ return new Headers();
390
+ if (headers instanceof Headers)
391
+ return headers;
392
+ return new Headers(headers);
393
+ }
394
+ /** @internal */
395
+ function corsToHeaders(cors) {
396
+ if (cors === false)
397
+ return new Headers();
398
+ const config = cors === true || cors === undefined ? {} : cors;
399
+ const headers = new Headers();
400
+ const origin = Array.isArray(config.origin) ? config.origin.join(', ') : (config.origin ?? '*');
401
+ headers.set('Access-Control-Allow-Origin', origin);
402
+ headers.set('Access-Control-Allow-Methods', config.methods ?? 'GET, POST, PUT, DELETE, OPTIONS');
403
+ headers.set('Access-Control-Allow-Headers', config.headers ?? 'Content-Type');
404
+ if (config.credentials)
405
+ headers.set('Access-Control-Allow-Credentials', 'true');
406
+ if (config.exposeHeaders)
407
+ headers.set('Access-Control-Expose-Headers', config.exposeHeaders);
408
+ if (config.maxAge !== undefined)
409
+ headers.set('Access-Control-Max-Age', String(config.maxAge));
410
+ return headers;
411
+ }
412
+ /** @internal */
413
+ function headers(headers) {
414
+ return async (_, next) => {
415
+ const response = await next();
416
+ const responseHeaders = new Headers(response.headers);
417
+ for (const [key, value] of headers.entries())
418
+ responseHeaders.set(key, value);
419
+ return new Response(response.body, {
420
+ headers: responseHeaders,
421
+ status: response.status,
422
+ statusText: response.statusText,
423
+ });
424
+ };
425
+ }
426
+ /** @internal */
427
+ function preflight(headers) {
428
+ return async (context) => {
429
+ if (context.request.method === 'OPTIONS')
430
+ return new Response(null, { headers });
431
+ };
432
+ }
433
+ //# sourceMappingURL=Handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Handler.js","sourceRoot":"","sources":["../../src/server/Handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type Kv = {
2
+ get: <value = unknown>(key: string) => Promise<value>;
3
+ set: (key: string, value: unknown) => Promise<void>;
4
+ delete: (key: string) => Promise<void>;
5
+ };
6
+ export declare function from<kv extends Kv>(kv: kv): kv;
7
+ export declare function cloudflare(kv: cloudflare.Parameters): Kv;
8
+ export declare namespace cloudflare {
9
+ type Parameters = {
10
+ get: <value = unknown>(key: string, format: 'json') => Promise<value>;
11
+ put: (key: string, value: string) => Promise<void>;
12
+ delete: (key: string) => Promise<void>;
13
+ };
14
+ }
15
+ export declare function memory(): Kv;
16
+ //# sourceMappingURL=Kv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kv.d.ts","sourceRoot":"","sources":["../../src/server/Kv.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,EAAE,GAAG;IACf,GAAG,EAAE,CAAC,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IACrD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC,CAAA;AAED,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAE9C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,UAAU,GAAG,EAAE,CAUxD;AAED,MAAM,CAAC,OAAO,WAAW,UAAU,CAAC;IAClC,KAAY,UAAU,GAAG;QACvB,GAAG,EAAE,CAAC,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;QACrE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KACvC,CAAA;CACF;AAED,wBAAgB,MAAM,IAAI,EAAE,CAa3B"}
@@ -0,0 +1,30 @@
1
+ import { Json } from 'ox';
2
+ export function from(kv) {
3
+ return kv;
4
+ }
5
+ export function cloudflare(kv) {
6
+ return from({
7
+ delete: kv.delete.bind(kv),
8
+ async get(key) {
9
+ return kv.get(key, 'json');
10
+ },
11
+ async set(key, value) {
12
+ return kv.put(key, Json.stringify(value));
13
+ },
14
+ });
15
+ }
16
+ export function memory() {
17
+ const store = new Map();
18
+ return from({
19
+ async delete(key) {
20
+ Promise.resolve(store.delete(key));
21
+ },
22
+ async get(key) {
23
+ return store.get(key);
24
+ },
25
+ async set(key, value) {
26
+ store.set(key, value);
27
+ },
28
+ });
29
+ }
30
+ //# sourceMappingURL=Kv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kv.js","sourceRoot":"","sources":["../../src/server/Kv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAQzB,MAAM,UAAU,IAAI,CAAgB,EAAM;IACxC,OAAO,EAAE,CAAA;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAyB;IAClD,OAAO,IAAI,CAAC;QACV,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC5B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK;YAClB,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAC3C,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAUD,MAAM,UAAU,MAAM;IACpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAA;IACxC,OAAO,IAAI,CAAC;QACV,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAQ,CAAA;QAC9B,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK;YAClB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACvB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * as Handler from './Handler.js';
2
+ export * as Kv from './Kv.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * as Handler from './Handler.js';
2
+ export * as Kv from './Kv.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,124 @@
1
+ import type * as http from 'node:http';
2
+ import type * as http2 from 'node:http2';
3
+ export interface RequestListenerOptions {
4
+ /**
5
+ * Overrides the host portion of the incoming request URL. By default the request URL host is
6
+ * derived from the HTTP `Host` header.
7
+ *
8
+ * For example, if you have a `$HOST` environment variable that contains the hostname of your
9
+ * server, you can use it to set the host of all incoming request URLs like so:
10
+ *
11
+ * ```ts
12
+ * createRequestListener(handler, { host: process.env.HOST })
13
+ * ```
14
+ */
15
+ host?: string;
16
+ /**
17
+ * An error handler that determines the response when the request handler throws an error. By
18
+ * default a 500 Internal Server Error response will be sent.
19
+ */
20
+ onError?: ErrorHandler;
21
+ /**
22
+ * Overrides the protocol of the incoming request URL. By default the request URL protocol is
23
+ * derived from the connection protocol. So e.g. when serving over HTTPS (using
24
+ * `https.createServer()`), the request URL will begin with `https:`.
25
+ */
26
+ protocol?: string;
27
+ }
28
+ /**
29
+ * Wraps a fetch handler in a Node.js request listener that can be used with:
30
+ *
31
+ * - [`http.createServer()`](https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener)
32
+ * - [`https.createServer()`](https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener)
33
+ * - [`http2.createServer()`](https://nodejs.org/api/http2.html#http2createserveroptions-onrequesthandler)
34
+ * - [`http2.createSecureServer()`](https://nodejs.org/api/http2.html#http2createsecureserveroptions-onrequesthandler)
35
+ *
36
+ * Example:
37
+ *
38
+ * ```ts
39
+ * import * as http from 'node:http';
40
+ * import { createRequestListener } from '@mjackson/node-fetch-server';
41
+ *
42
+ * async function handler(request) {
43
+ * return new Response('Hello, world!');
44
+ * }
45
+ *
46
+ * let server = http.createServer(
47
+ * createRequestListener(handler)
48
+ * );
49
+ *
50
+ * server.listen(3000);
51
+ * ```
52
+ *
53
+ * @param handler The fetch handler to use for processing incoming requests.
54
+ * @param options Request listener options.
55
+ * @returns A Node.js request listener function.
56
+ */
57
+ export declare function fromFetchHandler(handler: FetchHandler, options?: RequestListenerOptions): http.RequestListener;
58
+ export type RequestOptions = Omit<RequestListenerOptions, 'onError'>;
59
+ /**
60
+ * Creates a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object from
61
+ *
62
+ * - a [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage)/[`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse) pair
63
+ * - a [`http2.Http2ServerRequest`](https://nodejs.org/api/http2.html#class-http2http2serverrequest)/[`http2.Http2ServerResponse`](https://nodejs.org/api/http2.html#class-http2http2serverresponse) pair
64
+ *
65
+ * @param req The incoming request object.
66
+ * @param res The server response object.
67
+ * @param options
68
+ * @returns A request object.
69
+ */
70
+ export declare function createRequest(req: http.IncomingMessage | http2.Http2ServerRequest, res: http.ServerResponse | http2.Http2ServerResponse, options?: RequestOptions): Request;
71
+ /**
72
+ * Creates a [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) object from the headers in a Node.js
73
+ * [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage)/[`http2.Http2ServerRequest`](https://nodejs.org/api/http2.html#class-http2http2serverrequest).
74
+ *
75
+ * @param req The incoming request object.
76
+ * @returns A headers object.
77
+ */
78
+ export declare function createHeaders(req: http.IncomingMessage | http2.Http2ServerRequest): Headers;
79
+ /**
80
+ * Sends a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) to the client using a Node.js
81
+ * [`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse)/[`http2.Http2ServerResponse`](https://nodejs.org/api/http2.html#class-http2http2serverresponse)
82
+ * object.
83
+ *
84
+ * @param res The server response object.
85
+ * @param response The response to send.
86
+ */
87
+ export declare function sendResponse(res: http.ServerResponse | http2.Http2ServerResponse, response: Response): Promise<void>;
88
+ export declare function readStream(stream: ReadableStream<Uint8Array>): AsyncIterable<Uint8Array>;
89
+ export interface ClientAddress {
90
+ /**
91
+ * The IP address of the client that sent the request.
92
+ *
93
+ * [Node.js Reference](https://nodejs.org/api/net.html#socketremoteaddress)
94
+ */
95
+ address: string;
96
+ /**
97
+ * The family of the client IP address.
98
+ *
99
+ * [Node.js Reference](https://nodejs.org/api/net.html#socketremotefamily)
100
+ */
101
+ family: 'IPv4' | 'IPv6';
102
+ /**
103
+ * The remote port of the client that sent the request.
104
+ *
105
+ * [Node.js Reference](https://nodejs.org/api/net.html#socketremoteport)
106
+ */
107
+ port: number;
108
+ }
109
+ /**
110
+ * A function that handles an error that occurred during request handling. May return a response to
111
+ * send to the client, or `undefined` to allow the server to send a default error response.
112
+ *
113
+ * [MDN `Response` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response)
114
+ */
115
+ export type ErrorHandler = (error: unknown) => undefined | Response | Promise<undefined | Response>;
116
+ /**
117
+ * A function that handles an incoming request and returns a response.
118
+ *
119
+ * [MDN `Request` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Request)
120
+ *
121
+ * [MDN `Response` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response)
122
+ */
123
+ export type FetchHandler = (request: Request, client: ClientAddress) => Response | Promise<Response>;
124
+ //# sourceMappingURL=requestListener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestListener.d.ts","sourceRoot":"","sources":["../../../src/server/internal/requestListener.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,KAAK,KAAK,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,IAAI,CAAC,eAAe,CAyBtB;AAuBD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAA;AAEpE;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,kBAAkB,EACpD,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,mBAAmB,EACpD,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAoCT;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAU3F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,mBAAmB,EACpD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAuB,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAQ/F;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAA;AAEnG;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA"}