@studiometa/trafic-agent 0.1.0
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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +140 -0
- package/dist/cli.js.map +1 -0
- package/dist/index-C7OaqqbZ.js +865 -0
- package/dist/index-C7OaqqbZ.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/server-CHT47EXr.js +618 -0
- package/dist/server-CHT47EXr.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -0
- package/dist/setup/agent.d.ts +17 -0
- package/dist/setup/agent.d.ts.map +1 -0
- package/dist/setup/audit.d.ts +10 -0
- package/dist/setup/audit.d.ts.map +1 -0
- package/dist/setup/ddev.d.ts +27 -0
- package/dist/setup/ddev.d.ts.map +1 -0
- package/dist/setup/docker.d.ts +13 -0
- package/dist/setup/docker.d.ts.map +1 -0
- package/dist/setup/hardening.d.ts +29 -0
- package/dist/setup/hardening.d.ts.map +1 -0
- package/dist/setup/index.d.ts +12 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/steps.d.ts +51 -0
- package/dist/setup/steps.d.ts.map +1 -0
- package/dist/setup/types.d.ts +37 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/user.d.ts +9 -0
- package/dist/setup/user.d.ts.map +1 -0
- package/dist/tasks/stop-idle.d.ts +11 -0
- package/dist/tasks/stop-idle.d.ts.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/auth.d.ts +25 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/db.d.ts +43 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/ddev.d.ts +35 -0
- package/dist/utils/ddev.d.ts.map +1 -0
- package/dist/utils/project-config.d.ts +23 -0
- package/dist/utils/project-config.d.ts.map +1 -0
- package/package.json +56 -0
- package/templates/error.html +59 -0
- package/templates/wait.html +86 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-project Trafic configuration
|
|
3
|
+
* Read from .ddev/config.trafic.yaml
|
|
4
|
+
*/
|
|
5
|
+
export interface ProjectConfig {
|
|
6
|
+
/** Auth policy override: allow | deny | basic | token */
|
|
7
|
+
auth_policy?: "allow" | "deny" | "basic" | "token";
|
|
8
|
+
/** Idle timeout override: "never" or duration like "30m", "4h" */
|
|
9
|
+
idle_timeout?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load project-specific Trafic config from .ddev/config.trafic.yaml
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadProjectConfig(projectDir: string): ProjectConfig;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a project should never be stopped (idle_timeout = "never")
|
|
17
|
+
*/
|
|
18
|
+
export declare function shouldNeverStop(config: ProjectConfig): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Get idle timeout in milliseconds, or undefined to use global default
|
|
21
|
+
*/
|
|
22
|
+
export declare function getIdleTimeoutMs(config: ProjectConfig): number | undefined;
|
|
23
|
+
//# sourceMappingURL=project-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/utils/project-config.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACnD,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CA+BnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAe1E"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@studiometa/trafic-agent",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Server agent for DDEV preview environments — auth, scale-to-zero, auto-start",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent",
|
|
7
|
+
"auth",
|
|
8
|
+
"ddev",
|
|
9
|
+
"scale-to-zero",
|
|
10
|
+
"traefik"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"author": "Studio Meta",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/studiometa/trafic",
|
|
17
|
+
"directory": "packages/trafic-agent"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"trafic-agent": "./dist/cli.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"templates"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"dev": "vite build --watch",
|
|
40
|
+
"build": "vite build && tsc --emitDeclarationOnly",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"test:ci": "vitest run --coverage",
|
|
44
|
+
"typecheck": "tsc --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"better-sqlite3": "^11.0.0",
|
|
48
|
+
"smol-toml": "^1.3.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/better-sqlite3": "^7.6.0"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=24.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Error</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
15
|
+
background: #1a1a2e;
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
color: #fff;
|
|
21
|
+
}
|
|
22
|
+
.container {
|
|
23
|
+
text-align: center;
|
|
24
|
+
padding: 2rem;
|
|
25
|
+
}
|
|
26
|
+
.icon {
|
|
27
|
+
font-size: 4rem;
|
|
28
|
+
margin-bottom: 1rem;
|
|
29
|
+
}
|
|
30
|
+
h1 {
|
|
31
|
+
font-size: 1.5rem;
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
margin-bottom: 0.5rem;
|
|
34
|
+
}
|
|
35
|
+
p {
|
|
36
|
+
opacity: 0.7;
|
|
37
|
+
font-size: 0.9rem;
|
|
38
|
+
max-width: 400px;
|
|
39
|
+
line-height: 1.5;
|
|
40
|
+
}
|
|
41
|
+
.code {
|
|
42
|
+
font-family: monospace;
|
|
43
|
+
background: rgba(255,255,255,0.1);
|
|
44
|
+
padding: 0.2rem 0.5rem;
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
margin-top: 1rem;
|
|
47
|
+
display: inline-block;
|
|
48
|
+
}
|
|
49
|
+
</style>
|
|
50
|
+
</head>
|
|
51
|
+
<body>
|
|
52
|
+
<div class="container">
|
|
53
|
+
<div class="icon">🚦</div>
|
|
54
|
+
<h1>{{message}}</h1>
|
|
55
|
+
<p>The project you're looking for doesn't exist on this server, or it may have been removed.</p>
|
|
56
|
+
<div class="code">Powered by Trafic</div>
|
|
57
|
+
</div>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Starting {{project}}...</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
15
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
16
|
+
min-height: 100vh;
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
color: #fff;
|
|
21
|
+
}
|
|
22
|
+
.container {
|
|
23
|
+
text-align: center;
|
|
24
|
+
padding: 2rem;
|
|
25
|
+
}
|
|
26
|
+
.spinner {
|
|
27
|
+
width: 60px;
|
|
28
|
+
height: 60px;
|
|
29
|
+
border: 4px solid rgba(255,255,255,0.3);
|
|
30
|
+
border-top-color: #fff;
|
|
31
|
+
border-radius: 50%;
|
|
32
|
+
animation: spin 1s linear infinite;
|
|
33
|
+
margin: 0 auto 2rem;
|
|
34
|
+
}
|
|
35
|
+
@keyframes spin {
|
|
36
|
+
to { transform: rotate(360deg); }
|
|
37
|
+
}
|
|
38
|
+
h1 {
|
|
39
|
+
font-size: 1.5rem;
|
|
40
|
+
font-weight: 600;
|
|
41
|
+
margin-bottom: 0.5rem;
|
|
42
|
+
}
|
|
43
|
+
p {
|
|
44
|
+
opacity: 0.8;
|
|
45
|
+
font-size: 0.9rem;
|
|
46
|
+
}
|
|
47
|
+
.project {
|
|
48
|
+
font-family: monospace;
|
|
49
|
+
background: rgba(255,255,255,0.2);
|
|
50
|
+
padding: 0.2rem 0.5rem;
|
|
51
|
+
border-radius: 4px;
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
54
|
+
</head>
|
|
55
|
+
<body>
|
|
56
|
+
<div class="container">
|
|
57
|
+
<div class="spinner"></div>
|
|
58
|
+
<h1>Starting your environment...</h1>
|
|
59
|
+
<p><span class="project">{{project}}</span> is waking up</p>
|
|
60
|
+
<p style="margin-top: 1rem; font-size: 0.8rem;">This page will refresh automatically</p>
|
|
61
|
+
</div>
|
|
62
|
+
<script>
|
|
63
|
+
// Poll for status
|
|
64
|
+
const project = '{{project}}';
|
|
65
|
+
const hostname = '{{hostname}}';
|
|
66
|
+
|
|
67
|
+
async function checkStatus() {
|
|
68
|
+
try {
|
|
69
|
+
const res = await fetch(`/__status__?project=${encodeURIComponent(project)}`);
|
|
70
|
+
const data = await res.json();
|
|
71
|
+
if (data.ready) {
|
|
72
|
+
window.location.reload();
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {
|
|
75
|
+
// Ignore errors, keep polling
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check every 2 seconds
|
|
80
|
+
setInterval(checkStatus, 2000);
|
|
81
|
+
|
|
82
|
+
// Also reload after 30 seconds as fallback
|
|
83
|
+
setTimeout(() => window.location.reload(), 30000);
|
|
84
|
+
</script>
|
|
85
|
+
</body>
|
|
86
|
+
</html>
|