Skip to content

Commit 56d9477

Browse files
committed
feat: proxy
1 parent 3c0fdab commit 56d9477

File tree

8 files changed

+1168
-13
lines changed

8 files changed

+1168
-13
lines changed

.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
API_BASE_URL=http://localhost:3000
22
DEBUG=true
3+
CA_KEY_PATH=./certs/key.pem
4+
CA_CERT_PATH=./certs/cert.pem
35

46
# filesystem
57
STORAGE_DRIVER=filesystem

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ data/
1010
.data
1111
.idea
1212
.DS_Store
13-
tests/temp/
13+
tests/temp/
14+
certs/*
15+
!certs/.gitkeep

certs/.gitkeep

Whitespace-only changes.

lib/env.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { z } from 'zod'
22

33
const booleanSchema = z.string().transform((v) => v.toLowerCase() === 'true')
4+
const portSchema = z.coerce.number().int().min(1).max(65_535)
45

56
const envSchema = z.object({
67
ENABLE_DIRECT_DOWNLOADS: booleanSchema.default('false'),
@@ -9,6 +10,10 @@ const envSchema = z.object({
910
STORAGE_DRIVER: z.string().toLowerCase().default('filesystem'),
1011
DB_DRIVER: z.string().toLowerCase().default('sqlite'),
1112
DEBUG: booleanSchema.default('false'),
13+
PROXY_PORT: portSchema.default(8000),
14+
NITRO_PORT: portSchema.default(3000),
15+
CA_KEY_PATH: z.string(),
16+
CA_CERT_PATH: z.string(),
1217
TEMP_DIR: z.string().default(tmpdir()),
1318
})
1419

lib/proxy.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import mockttp from 'mockttp'
2+
import { ENV } from './env'
3+
import { logger } from './logger'
4+
5+
export async function initializeProxy() {
6+
const port = ENV.PROXY_PORT
7+
logger.info(`Starting proxy server on port ${port}...`)
8+
9+
// generate ca with `openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365`
10+
const server = mockttp.getLocal({
11+
https: {
12+
keyPath: ENV.CA_KEY_PATH,
13+
certPath: ENV.CA_CERT_PATH,
14+
tlsPassthrough: [
15+
{
16+
hostname: 'broker.actions.githubusercontent.com',
17+
},
18+
],
19+
},
20+
})
21+
22+
await server
23+
.forAnyRequest()
24+
.withUrlMatching(
25+
/(twirp\/github\.actions\.results\.api\.v1\.CacheService)|(_apis\/artifactcache)/,
26+
)
27+
.thenForwardTo(`http://localhost:${ENV.NITRO_PORT}`)
28+
29+
await server.forUnmatchedRequest().thenPassThrough()
30+
31+
await server.start(port)
32+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"execa": "^9.5.2",
3636
"h3": "^1.14.0",
3737
"kysely": "^0.27.5",
38+
"mockttp": "^3.16.0",
3839
"mysql2": "^3.12.0",
3940
"nitropack": "^2.10.4",
4041
"pg": "^8.13.1",

plugins/setup.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import { H3Error } from 'h3'
33
import { initializeDatabase, useDB } from '~/lib/db'
44
import { ENV } from '~/lib/env'
55
import { logger } from '~/lib/logger'
6+
import { initializeProxy } from '~/lib/proxy'
67
import { initializeStorage, useStorageAdapter } from '~/lib/storage'
78

89
export default defineNitroPlugin(async (nitro) => {
910
const version = useRuntimeConfig().version
1011
logger.info(`🚀 Starting GitHub Actions Cache Server (${version})`)
1112

13+
await initializeProxy()
1214
await initializeDatabase()
1315
await initializeStorage()
1416

0 commit comments

Comments
 (0)