abort-leak-webfetch.ts 952 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { abortAfterAny } from "../../src/util/abort"
  2. const MB = 1024 * 1024
  3. const ITERATIONS = 50
  4. const heap = () => {
  5. Bun.gc(true)
  6. return process.memoryUsage().heapUsed / MB
  7. }
  8. const server = Bun.serve({
  9. port: 0,
  10. fetch() {
  11. return new Response("hello from local", {
  12. headers: {
  13. "content-type": "text/plain",
  14. },
  15. })
  16. },
  17. })
  18. const url = `http://127.0.0.1:${server.port}`
  19. async function run() {
  20. const { signal, clearTimeout } = abortAfterAny(30000, new AbortController().signal)
  21. try {
  22. const response = await fetch(url, { signal })
  23. await response.text()
  24. } finally {
  25. clearTimeout()
  26. }
  27. }
  28. try {
  29. await run()
  30. Bun.sleepSync(100)
  31. const baseline = heap()
  32. for (let i = 0; i < ITERATIONS; i++) {
  33. await run()
  34. }
  35. Bun.sleepSync(100)
  36. const after = heap()
  37. process.stdout.write(JSON.stringify({ baseline, after, growth: after - baseline }))
  38. } finally {
  39. server.stop(true)
  40. process.exit(0)
  41. }