Skip to content

Commit a1c875f

Browse files
committed
add idler code
1 parent 76a74ad commit a1c875f

File tree

7 files changed

+1855
-1
lines changed

7 files changed

+1855
-1
lines changed

Dockerfile

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FROM node:18-alpine
2+
ENV NODE_ENV=production
3+
WORKDIR /app
4+
5+
COPY dist /app
6+
COPY package.json /app/package.json
7+
COPY node_modules /app/node_modules
8+
9+
10+
CMD [ "node", "index.js" ]

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
# idler
1+
# idler
2+
3+
This is a simple image to run while your image is build by Kubero. It will wait for the image to be ready and then reload with your app.

index.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import express, { Express, Request, Response } from 'express';
2+
//import resolve from 'path'
3+
import debug from 'debug';
4+
const app: Express = express();
5+
import http from 'http';
6+
7+
const port: String = process.env.PORT || "8080";
8+
9+
app.use(
10+
express.static('public')
11+
);
12+
13+
app.get('/status', (req: Request, res: Response) => {
14+
res.send('OK')
15+
});
16+
17+
const server = http.createServer(app);
18+
19+
server.listen(port, () => debug.log(`⚡️[server]: Server is running at http://0.0.0.0:${port}`));

package.json

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"name": "kubero-idler",
3+
"version": "1.0.0",
4+
"description": "Template to start a Express App ",
5+
"main": "index.js",
6+
"scripts": {
7+
"build": "npx tsc",
8+
"start": "node dist/index.js",
9+
"dev": "concurrently \"npx tsc --watch\" \"nodemon -q --ext 'ts,json' dist/index.js\""
10+
},
11+
"repository": {
12+
"type": "git",
13+
"url": "git+https://github.com/kubero-dev/idler.git"
14+
},
15+
"author": "Gianni Carafa",
16+
"license": "GPL v3",
17+
"bugs": {
18+
"url": "https://github.com/kubero-dev/kubero/issues"
19+
},
20+
"homepage": "https://github.com/kubero-dev/kubero",
21+
"dependencies": {
22+
"@types/node": "^20.3.1",
23+
"dotenv": "^16.2.0",
24+
"express": "^4.18.1",
25+
"path": "^0.12.7",
26+
"typescript": "^5.1.3"
27+
},
28+
"devDependencies": {
29+
"@types/debug": "^4.1.7",
30+
"@types/express": "^4.17.13",
31+
"@types/node": "^17.0.34",
32+
"concurrently": "^8.2.0",
33+
"eslint": "^8.11.0",
34+
"nodemon": "^2.0.22",
35+
"ts-node": "^10.9.1"
36+
}
37+
}

public/index.html

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Loading Page</title>
5+
<style>
6+
body {
7+
background: linear-gradient(to bottom, #E6E6FA, #8A2BE2);
8+
display: flex;
9+
flex-direction: column;
10+
justify-content: center;
11+
align-items: center;
12+
height: 100vh;
13+
font-family: Arial, sans-serif;
14+
color: #FFFFFF;
15+
}
16+
17+
.loader {
18+
width: 120px;
19+
height: 120px;
20+
position: relative;
21+
}
22+
23+
.loader .pulse {
24+
position: absolute;
25+
top: 0;
26+
left: 0;
27+
right: 0;
28+
bottom: 0;
29+
border-radius: 50%;
30+
background-color: rgba(255, 255, 255, 0.2);
31+
animation: pulse 2s infinite;
32+
}
33+
34+
@keyframes pulse {
35+
0% { transform: scale(0.5); opacity: 0.5; }
36+
50% { transform: scale(1); opacity: 1; }
37+
100% { transform: scale(0.5); opacity: 0.5; }
38+
}
39+
40+
.loader .segment {
41+
position: absolute;
42+
top: 0;
43+
left: 0;
44+
right: 0;
45+
bottom: 0;
46+
border-radius: 50%;
47+
border: 16px solid transparent;
48+
border-top-color: #4B0082;
49+
animation: spin 2s linear infinite;
50+
}
51+
52+
@keyframes spin {
53+
0% { transform: rotate(0deg); }
54+
100% { transform: rotate(360deg); }
55+
}
56+
57+
.loading-text {
58+
font-size: 24px;
59+
margin-top: 20px;
60+
}
61+
</style>
62+
<script>
63+
// iterate every 2 seconds to check if a http
64+
// endpoints answers with a 200 status code
65+
// if not, redirect to the main page
66+
var interval = setInterval(function() {
67+
var xhr = new XMLHttpRequest();
68+
xhr.open("GET", "/status", true);
69+
xhr.onreadystatechange = function() {
70+
if (xhr.readyState == 4) {
71+
if (xhr.status != 200) {
72+
window.location.href = "/";
73+
}
74+
}
75+
}
76+
xhr.send();
77+
}, 2000);
78+
</script>
79+
</head>
80+
<body>
81+
<div class="loader">
82+
<div class="pulse"></div>
83+
<!--<div class="segment"></div>-->
84+
</div>
85+
<div class="loading-text">BUILDING YOUR IMAGE</div>
86+
</body>
87+
</html>

tsconfig.json

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
{
2+
"compilerOptions": {
3+
"outDir": "dist",
4+
/* Visit https://aka.ms/tsconfig.json to read more about this file */
5+
6+
/* Projects */
7+
// "incremental": true, /* Enable incremental compilation */
8+
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
9+
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
10+
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
11+
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
12+
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
13+
14+
/* Language and Environment */
15+
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
16+
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
17+
// "jsx": "preserve", /* Specify what JSX code is generated. */
18+
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
19+
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
20+
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
21+
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
22+
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
23+
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
24+
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
25+
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
26+
27+
/* Modules */
28+
"module": "commonjs", /* Specify what module code is generated. */
29+
//"rootDir": "./src/", /* Specify the root folder within your source files. */
30+
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
31+
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
32+
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
33+
"rootDirs": ["./src/", "./client/src/"], /* Allow multiple folders to be treated as one when resolving modules. */
34+
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
35+
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
36+
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
37+
// "resolveJsonModule": true, /* Enable importing .json files */
38+
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
39+
40+
/* JavaScript Support */
41+
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
42+
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
43+
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
44+
45+
/* Emit */
46+
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
47+
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
48+
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
49+
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
50+
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
51+
// "outDir": "./", /* Specify an output folder for all emitted files. */
52+
// "removeComments": true, /* Disable emitting comments. */
53+
// "noEmit": true, /* Disable emitting files from a compilation. */
54+
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
55+
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
56+
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
57+
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
58+
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
59+
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
60+
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
61+
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
62+
// "newLine": "crlf", /* Set the newline character for emitting files. */
63+
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
64+
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
65+
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
66+
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
67+
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
68+
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
69+
70+
/* Interop Constraints */
71+
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
72+
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
73+
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
74+
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
75+
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
76+
77+
/* Type Checking */
78+
"strict": true, /* Enable all strict type-checking options. */
79+
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
80+
// "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
81+
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
82+
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
83+
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
84+
// "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
85+
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
86+
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
87+
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
88+
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
89+
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
90+
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
91+
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
92+
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
93+
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
94+
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
95+
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
96+
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
97+
98+
/* Completeness */
99+
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
100+
"skipLibCheck": true /* Skip type checking all .d.ts files. */
101+
}
102+
}

0 commit comments

Comments
 (0)