weifuwu 0.2.2 → 0.2.3

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 (45) hide show
  1. package/README.md +56 -5
  2. package/dist/compress.d.ts +6 -0
  3. package/dist/cookie.d.ts +12 -0
  4. package/dist/index.d.ts +21 -0
  5. package/dist/index.js +1420 -0
  6. package/dist/middleware.d.ts +21 -0
  7. package/dist/rate-limit.d.ts +8 -0
  8. package/dist/router.d.ts +55 -0
  9. package/dist/serve.d.ts +19 -0
  10. package/dist/static.d.ts +7 -0
  11. package/dist/tsx.d.ts +17 -0
  12. package/dist/types.d.ts +9 -0
  13. package/dist/upload.d.ts +14 -0
  14. package/dist/validate.d.ts +9 -0
  15. package/package.json +14 -2
  16. package/AGENTS.md +0 -105
  17. package/compress.ts +0 -69
  18. package/cookie.ts +0 -58
  19. package/index.ts +0 -21
  20. package/middleware.ts +0 -178
  21. package/rate-limit.ts +0 -68
  22. package/router.ts +0 -701
  23. package/serve.ts +0 -126
  24. package/static.ts +0 -113
  25. package/test/compress.test.ts +0 -106
  26. package/test/cookie.test.ts +0 -79
  27. package/test/fixtures/pages/about/page.tsx +0 -3
  28. package/test/fixtures/pages/blog/[slug]/load.ts +0 -3
  29. package/test/fixtures/pages/blog/[slug]/page.tsx +0 -3
  30. package/test/fixtures/pages/blog/[slug]/route.ts +0 -7
  31. package/test/fixtures/pages/blog/layout.tsx +0 -3
  32. package/test/fixtures/pages/layout.tsx +0 -12
  33. package/test/fixtures/pages/page.tsx +0 -3
  34. package/test/middleware.test.ts +0 -407
  35. package/test/rate-limit.test.ts +0 -94
  36. package/test/static.test.ts +0 -93
  37. package/test/tsx.test.ts +0 -285
  38. package/test/unode.test.ts +0 -401
  39. package/test/upload.test.ts +0 -130
  40. package/test/validate.test.ts +0 -133
  41. package/tsconfig.json +0 -13
  42. package/tsx.ts +0 -374
  43. package/types.ts +0 -23
  44. package/upload.ts +0 -101
  45. package/validate.ts +0 -88
package/rate-limit.ts DELETED
@@ -1,68 +0,0 @@
1
- import type { Middleware } from './types.ts'
2
-
3
- export interface RateLimitOptions {
4
- max?: number
5
- window?: number
6
- key?: (req: Request) => string
7
- message?: string
8
- }
9
-
10
- export function rateLimit(options?: RateLimitOptions): Middleware {
11
- const max = options?.max ?? 100
12
- const window = options?.window ?? 60_000
13
- const getKey = options?.key ?? ((req) => {
14
- const forwarded = req.headers.get('x-forwarded-for')
15
- if (forwarded) return forwarded.split(',')[0]!.trim()
16
- return new URL(req.url).hostname
17
- })
18
- const message = options?.message ?? 'Too Many Requests'
19
-
20
- const hits = new Map<string, { count: number; reset: number }>()
21
-
22
- const interval = setInterval(() => {
23
- const now = Date.now()
24
- for (const [key, entry] of hits) {
25
- if (entry.reset < now) hits.delete(key)
26
- }
27
- }, window)
28
-
29
- if (interval.unref) interval.unref()
30
-
31
- return async (req, ctx, next) => {
32
- const key = getKey(req)
33
- const now = Date.now()
34
- const entry = hits.get(key)
35
-
36
- if (!entry || entry.reset < now) {
37
- hits.set(key, { count: 1, reset: now + window })
38
- const res = await next(req, ctx)
39
- const headers = new Headers(res.headers)
40
- headers.set('X-RateLimit-Limit', String(max))
41
- headers.set('X-RateLimit-Remaining', String(max - 1))
42
- headers.set('X-RateLimit-Reset', String(Math.ceil((now + window) / 1000)))
43
- return new Response(res.body, { status: res.status, statusText: res.statusText, headers })
44
- }
45
-
46
- entry.count++
47
- const remaining = Math.max(0, max - entry.count)
48
-
49
- if (entry.count > max) {
50
- return new Response(message, {
51
- status: 429,
52
- headers: {
53
- 'Retry-After': String(Math.ceil((entry.reset - now) / 1000)),
54
- 'X-RateLimit-Limit': String(max),
55
- 'X-RateLimit-Remaining': '0',
56
- 'X-RateLimit-Reset': String(Math.ceil(entry.reset / 1000)),
57
- },
58
- })
59
- }
60
-
61
- const res = await next(req, ctx)
62
- const headers = new Headers(res.headers)
63
- headers.set('X-RateLimit-Limit', String(max))
64
- headers.set('X-RateLimit-Remaining', String(remaining))
65
- headers.set('X-RateLimit-Reset', String(Math.ceil(entry.reset / 1000)))
66
- return new Response(res.body, { status: res.status, statusText: res.statusText, headers })
67
- }
68
- }