@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.
Files changed (51) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +140 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index-C7OaqqbZ.js +865 -0
  6. package/dist/index-C7OaqqbZ.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +41 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/server-CHT47EXr.js +618 -0
  12. package/dist/server-CHT47EXr.js.map +1 -0
  13. package/dist/server.d.ts +6 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/server.js +9 -0
  16. package/dist/server.js.map +1 -0
  17. package/dist/setup/agent.d.ts +17 -0
  18. package/dist/setup/agent.d.ts.map +1 -0
  19. package/dist/setup/audit.d.ts +10 -0
  20. package/dist/setup/audit.d.ts.map +1 -0
  21. package/dist/setup/ddev.d.ts +27 -0
  22. package/dist/setup/ddev.d.ts.map +1 -0
  23. package/dist/setup/docker.d.ts +13 -0
  24. package/dist/setup/docker.d.ts.map +1 -0
  25. package/dist/setup/hardening.d.ts +29 -0
  26. package/dist/setup/hardening.d.ts.map +1 -0
  27. package/dist/setup/index.d.ts +12 -0
  28. package/dist/setup/index.d.ts.map +1 -0
  29. package/dist/setup/steps.d.ts +51 -0
  30. package/dist/setup/steps.d.ts.map +1 -0
  31. package/dist/setup/types.d.ts +37 -0
  32. package/dist/setup/types.d.ts.map +1 -0
  33. package/dist/setup/user.d.ts +9 -0
  34. package/dist/setup/user.d.ts.map +1 -0
  35. package/dist/tasks/stop-idle.d.ts +11 -0
  36. package/dist/tasks/stop-idle.d.ts.map +1 -0
  37. package/dist/types.d.ts +99 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/utils/auth.d.ts +25 -0
  40. package/dist/utils/auth.d.ts.map +1 -0
  41. package/dist/utils/config.d.ts +14 -0
  42. package/dist/utils/config.d.ts.map +1 -0
  43. package/dist/utils/db.d.ts +43 -0
  44. package/dist/utils/db.d.ts.map +1 -0
  45. package/dist/utils/ddev.d.ts +35 -0
  46. package/dist/utils/ddev.d.ts.map +1 -0
  47. package/dist/utils/project-config.d.ts +23 -0
  48. package/dist/utils/project-config.d.ts.map +1 -0
  49. package/package.json +56 -0
  50. package/templates/error.html +59 -0
  51. 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>