-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Web/document server #1129
Web/document server #1129
Changes from all commits
38b70de
fcb81b4
858008e
bc84873
63ab289
111141e
df731c0
25ddf0b
f043950
9ee8b43
b17494d
db22118
e1b1af3
21f2686
68b8b43
ce049cd
eb2ca75
43fa362
7568e0e
075f338
dcb300e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
NODE_ENV=development | ||
NODE_OPTIONS="--trace-warnings --inspect --experimental-strip-types --experimental-transform-types --watch-preserve-output" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
NODE_ENV=production | ||
NODE_OPTIONS=--trace-warnings --inspect --experimental-strip-types --experimental-transform-types |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📝 [hadolint] <DL3059> reported by reviewdog 🐶 suddenlygiovanni.dev/apps/web/Dockerfile Line 10 in 075f338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
suddenlygiovanni.dev/apps/web/Dockerfile Line 25 in 075f338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📝 [hadolint] <DL3059> reported by reviewdog 🐶 suddenlygiovanni.dev/apps/web/Dockerfile Line 42 in 075f338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
suddenlygiovanni.dev/apps/web/Dockerfile Line 60 in 075f338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
suddenlygiovanni.dev/apps/web/Dockerfile Line 60 in 075f338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📝 [hadolint] <DL3059> reported by reviewdog 🐶 suddenlygiovanni.dev/apps/web/Dockerfile Line 68 in 075f338
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { http, type HttpHandler } from 'msw' | ||
|
||
export const handlers = [ | ||
http.all('*', ({ request }) => { | ||
console.log(request.method, request.url) | ||
}), | ||
] satisfies HttpHandler[] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
import { setupServer } from 'msw/node' | ||
|
||
import { handlers } from './handlers.ts' | ||
|
||
export const server = setupServer(...handlers) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
# Server Setup Documentation | ||
|
||
## Overview | ||
|
||
The server is an Express application that serves a React Router build. It supports both development and production environments, dynamically configuring the server port and host. | ||
|
||
## Key Components | ||
|
||
### Configuration (`Config` class) | ||
|
||
- Manages environment variables and server build path. | ||
- Uses `effect` library for schema validation. | ||
|
||
### Source Map Support | ||
|
||
- Uses `source-map-support` to enhance error stack traces. | ||
|
||
### Express Application | ||
|
||
- Uses `compression` for response compression. | ||
- Uses `morgan` for HTTP request logging. | ||
- Serves static files and handles all incoming requests. | ||
|
||
### Development Mode | ||
|
||
- Uses `vite` for development server with middleware mode. | ||
- Dynamically loads and handles requests using Vite's SSR capabilities. | ||
|
||
### Production Mode | ||
|
||
- Serves static assets with caching. | ||
- Loads the server build from the specified path. | ||
|
||
### Request Handling | ||
|
||
- Uses `react-router` for handling requests and responses. | ||
- Custom request handler created using `react-router-express`. | ||
|
||
## Middleware Behavior | ||
|
||
### Compression Middleware (`compression`) | ||
|
||
- Compresses response bodies for all requests. | ||
- Adds `Content-Encoding` headers and compresses the body. | ||
|
||
### Morgan Middleware (`morgan`) | ||
|
||
- Logs HTTP requests. | ||
- Does not modify the `Request` or `Response` but logs details like method, URL, status, and response time. | ||
|
||
### Static File Serving (`express.static`) | ||
|
||
- Serves static files from the specified directories. | ||
- Adds appropriate headers (e.g., `Cache-Control`) and serves files. | ||
|
||
### Vite Dev Server Middleware (`viteDevServer.middlewares`) | ||
|
||
- Handles requests in development mode. | ||
- Attaches custom middlewares and acts as a handler function for custom HTTP servers. | ||
- Provides features like HMR, module loading, and development-specific optimizations. | ||
|
||
## Vite Dev Server in Development Mode | ||
|
||
- A connect app instance that attaches custom middlewares to the dev server. | ||
- Acts as a handler function for custom HTTP servers or as middleware in connect-style Node.js frameworks. | ||
- Provides HMR, module loading, and development-specific optimizations. | ||
|
||
## `viteDevServer.ssrLoadModule('./server/app.ts')` and `app.ts` | ||
|
||
### `ssrLoadModule` | ||
|
||
- Loads a given URL as an instantiated module for SSR. | ||
|
||
### `app.ts` | ||
|
||
- Sets up the Express application and request handler. | ||
- Defines a request handler using `createRequestHandler` from `react-router-express`. | ||
- Configures the request handler to load the server build and provide context values. | ||
|
||
## Handling OS Signals for Graceful Shutdown | ||
|
||
- Listens for termination signals (`SIGTERM` and `SIGINT`). | ||
- Closes the server instance and cleans up resources when a signal is received. | ||
|
||
## Additional Details | ||
|
||
### Configuration | ||
|
||
- Dynamically configures the port and host based on environment variables or default settings. | ||
|
||
### Source Map Support | ||
|
||
- Enhances error stack traces by retrieving source maps for better debugging. | ||
|
||
### Request Handling | ||
|
||
- Uses `react-router` to handle requests and responses, providing SSR capabilities. | ||
|
||
## External Dependencies | ||
|
||
- `compression`: Middleware for response compression. | ||
- `effect`: Library for schema validation. | ||
- `express`: Web framework for building the server. | ||
- `get-port`: Utility to get an available port. | ||
- `morgan`: HTTP request logger. | ||
- `source-map-support`: Enhances error stack traces. | ||
- `vite`: Development server and build tool. | ||
- `react-router`: Library for handling routing and SSR. | ||
|
||
# Unit Tests | ||
|
||
## Objectives | ||
|
||
- Validate the configuration schema and default values. | ||
- Ensure the server starts correctly in both development and production modes. | ||
- Verify middleware and request handling logic. | ||
- Test static file serving and caching behavior. | ||
- Validate error handling and logging. | ||
|
||
## Test Cases | ||
|
||
### Configuration Tests | ||
|
||
- Validate default values for `NODE_ENV`, `PORT`, and `HOST`. | ||
- Test schema validation for different configurations. | ||
|
||
### Server Initialization Tests | ||
|
||
- Ensure the server starts on the specified port and host. | ||
- Verify the correct middleware is applied based on the environment. | ||
|
||
### Middleware Tests | ||
|
||
- Test `compression` middleware for response compression. | ||
- Verify `morgan` logs HTTP requests correctly. | ||
|
||
### Request Handling Tests | ||
|
||
- Test request handling in development mode using Vite. | ||
- Verify request handling in production mode with static file serving. | ||
|
||
### Static File Serving Tests | ||
|
||
- Ensure static assets are served with correct caching headers. | ||
- Test serving of client-side assets from the build directory. | ||
|
||
### Error Handling Tests | ||
|
||
- Verify error handling and logging for different scenarios. | ||
- Test source map support for enhanced error stack traces. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
import { type MockInstance, afterAll, afterEach, beforeEach, describe, it, vi } from 'vitest' | ||
|
||
describe('server setup', () => { | ||
let consoleErrorSpy: MockInstance<(...args: unknown[]) => void> | ||
|
||
beforeEach(() => { | ||
vi.stubEnv('NODE_ENV', undefined) | ||
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}) | ||
vi.spyOn(process, 'exit').mockImplementation((code?: number) => { | ||
throw new Error(`process.exit(${code})`) | ||
}) | ||
}) | ||
|
||
afterEach(() => { | ||
vi.resetAllMocks() | ||
vi.unstubAllEnvs() | ||
vi.unstubAllGlobals() | ||
}) | ||
|
||
afterAll(() => { | ||
vi.restoreAllMocks() | ||
}) | ||
|
||
describe('configuration tests', () => { | ||
it.todo('should validate default values for NODE_ENV, PORT, and HOST') | ||
|
||
it.todo('should test schema validation for different configurations') | ||
}) | ||
|
||
describe('server Initialization Tests', () => { | ||
it.todo('should ensure the server starts on the specified port and host') | ||
|
||
it.todo('should verify the correct middleware is applied based on the environment') | ||
}) | ||
|
||
describe('middleware Tests', () => { | ||
it.todo('should test compression middleware for response compression') | ||
|
||
it.todo('should verify morgan logs HTTP requests correctly') | ||
}) | ||
|
||
describe('request Handling Tests', () => { | ||
it.todo('should test request handling in development mode using Vite') | ||
|
||
it.todo('should verify request handling in production mode with static file serving') | ||
}) | ||
|
||
describe('static File Serving Tests', () => { | ||
it.todo('should ensure static assets are served with correct caching headers') | ||
|
||
it.todo('should test serving of client-side assets from the build directory') | ||
}) | ||
|
||
describe('error Handling Tests', () => { | ||
it.todo('should verify error handling and logging for different scenarios') | ||
|
||
it.todo('should test source map support for enhanced error stack traces') | ||
}) | ||
|
||
describe('graceful Shutdown Tests', () => { | ||
it.todo('should handle OS signals to gracefully shut down the server') | ||
}) | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pin versions in apk add. Instead of
apk add <package>
useapk add <package>=<version>
suddenlygiovanni.dev/apps/web/Dockerfile
Line 8 in 075f338