Skip to content

Commit

Permalink
Add a test proxy server so we won't hit Node.js dist so much (#976)
Browse files Browse the repository at this point in the history
  • Loading branch information
Schniz committed Jun 30, 2023
1 parent 4c5aca7 commit 10ad688
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ feature_tests/.tmp
*.log
/site/public
.vercel
.proxy
1 change: 1 addition & 0 deletions e2e/shellcode/script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class Script {
.filter(Boolean)
.join(path.delimiter),
FNM_DIR: this.config.fnmDir,
FNM_NODE_DIST_MIRROR: "http://localhost:8080",
}

delete newProcessEnv.NODE_OPTIONS
Expand Down
3 changes: 3 additions & 0 deletions jest.config.cjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: "ts-jest/presets/default-esm",
globalSetup: "./jest.global-setup.js",
globalTeardown: "./jest.global-teardown.js",
testEnvironment: "node",
testTimeout: 120000,
extensionsToTreatAsEsm: [".ts"],
testPathIgnorePatterns: ["/node_modules/", "/dist/", "/target/"],
moduleNameMapper: {
"^(\\.{1,2}/.*)\\.js$": "$1",
"#ansi-styles": "ansi-styles/index.js",
Expand Down
5 changes: 5 additions & 0 deletions jest.global-setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { server } from "./tests/proxy-server/index.mjs"

export default function () {
server.listen(8080)
}
5 changes: 5 additions & 0 deletions jest.global-teardown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { server } from "./tests/proxy-server/index.mjs"

export default () => {
server.close()
}
65 changes: 65 additions & 0 deletions tests/proxy-server/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// @ts-check

import { createServer } from "node:http"
import path from "node:path"
import fs from "node:fs"
import crypto from "node:crypto"
import fetch from "node-fetch"
import chalk from "chalk"

const baseDir = path.join(process.cwd(), ".proxy")
try {
fs.mkdirSync(baseDir, { recursive: true })
} catch (e) {}

/** @type {Map<string, Promise<{ headers: Record<string, string>, body: ArrayBuffer }>>} */
const cache = new Map()

export const server = createServer((req, res) => {
const pathname = req.url ?? "/"
const hash = crypto
.createHash("sha1")
.update(pathname ?? "/")
.digest("hex")
const extension = path.extname(pathname)
const filename = path.join(baseDir, hash) + extension
const headersFilename = path.join(baseDir, hash) + ".headers.json"
try {
const headers = JSON.parse(fs.readFileSync(headersFilename, "utf-8"))
const body = fs.createReadStream(filename)
console.log(chalk.green.dim(`[proxy] hit: ${pathname} -> ${filename}`))
res.writeHead(200, headers)
body.pipe(res)
} catch {
let promise = cache.get(filename)
if (!promise) {
console.log(chalk.red.dim(`[proxy] miss: ${pathname} -> ${filename}`))
promise = fetch(
"https://nodejs.org/dist/" + pathname.replace(/^\/+/, ""),
{
compress: false,
}
).then(async (response) => {
const headers = Object.fromEntries(response.headers.entries())
const body = await response.arrayBuffer()
fs.writeFileSync(headersFilename, JSON.stringify(headers))
fs.writeFileSync(filename, Buffer.from(body))
return { headers, body }
})
cache.set(filename, promise)
promise.finally(() => cache.delete(filename))
}

promise.then(
({ headers, body }) => {
res.writeHead(200, headers)
res.end(Buffer.from(body))
},
(err) => {
console.error(err)
res.writeHead(500)
res.end()
}
)
}
})

1 comment on commit 10ad688

@ailadas
Copy link

@ailadas ailadas commented on 10ad688 Aug 9, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.