linxus fs fixes
This commit is contained in:
parent
ac23b70146
commit
0b7846fe67
292 changed files with 41947 additions and 41947 deletions
|
|
@ -1,202 +1,202 @@
|
|||
# @stock-bot/shutdown
|
||||
|
||||
Shutdown management library for Node.js applications in the Stock Bot platform.
|
||||
|
||||
## Features
|
||||
|
||||
- ✅ **Automatic Signal Handling** - SIGTERM, SIGINT, SIGUSR2 (Unix), uncaught exceptions
|
||||
- ✅ **Platform Support** - Windows and Unix/Linux compatible
|
||||
- ✅ **Multiple Callbacks** - Register multiple cleanup functions
|
||||
- ✅ **Timeout Protection** - Configurable shutdown timeout
|
||||
- ✅ **Error Handling** - Failed callbacks don't block shutdown
|
||||
- ✅ **TypeScript Support** - Full type definitions
|
||||
- ✅ **Zero Dependencies** - Lightweight and efficient
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
bun add @stock-bot/shutdown
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```typescript
|
||||
import { onShutdown, setShutdownTimeout } from '@stock-bot/shutdown';
|
||||
|
||||
// Configure shutdown timeout (optional, default: 30 seconds)
|
||||
setShutdownTimeout(15000); // 15 seconds
|
||||
|
||||
// Register cleanup callbacks
|
||||
onShutdown(async () => {
|
||||
console.log('Closing database connections...');
|
||||
await database.close();
|
||||
});
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Stopping background jobs...');
|
||||
await jobQueue.stop();
|
||||
});
|
||||
|
||||
onShutdown(() => {
|
||||
console.log('Final cleanup...');
|
||||
// Synchronous cleanup
|
||||
});
|
||||
|
||||
console.log('Application started. Press Ctrl+C to test graceful shutdown.');
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Convenience Functions
|
||||
|
||||
#### `onShutdown(callback)`
|
||||
Register a cleanup callback.
|
||||
|
||||
```typescript
|
||||
onShutdown(async () => {
|
||||
await cleanup();
|
||||
});
|
||||
```
|
||||
|
||||
#### `setShutdownTimeout(timeout)`
|
||||
Set shutdown timeout in milliseconds.
|
||||
|
||||
```typescript
|
||||
setShutdownTimeout(30000); // 30 seconds
|
||||
```
|
||||
|
||||
#### `initiateShutdown(signal?)`
|
||||
Manually trigger shutdown.
|
||||
|
||||
```typescript
|
||||
const result = await initiateShutdown('manual');
|
||||
console.log(result.success); // true/false
|
||||
```
|
||||
|
||||
#### `shutdownAndExit(signal?, exitCode?)`
|
||||
Trigger shutdown and exit process.
|
||||
|
||||
```typescript
|
||||
await shutdownAndExit('manual', 0);
|
||||
```
|
||||
|
||||
### Advanced Usage
|
||||
|
||||
#### Manual Instance Management
|
||||
|
||||
```typescript
|
||||
import { Shutdown } from '@stock-bot/shutdown';
|
||||
|
||||
const shutdown = new Shutdown({
|
||||
timeout: 20000,
|
||||
autoRegister: true
|
||||
});
|
||||
|
||||
shutdown.onShutdown(async () => {
|
||||
await cleanup();
|
||||
});
|
||||
|
||||
// Manual shutdown
|
||||
const result = await shutdown.shutdown('manual');
|
||||
```
|
||||
|
||||
#### Configuration Options
|
||||
|
||||
```typescript
|
||||
interface ShutdownOptions {
|
||||
timeout?: number; // Timeout in ms (default: 30000)
|
||||
autoRegister?: boolean; // Auto-register signals (default: true)
|
||||
}
|
||||
```
|
||||
|
||||
#### Shutdown Result
|
||||
|
||||
```typescript
|
||||
interface ShutdownResult {
|
||||
success: boolean;
|
||||
callbacksExecuted: number;
|
||||
callbacksFailed: number;
|
||||
duration: number;
|
||||
error?: string;
|
||||
}
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Express Server
|
||||
|
||||
```typescript
|
||||
import express from 'express';
|
||||
import { onShutdown, setShutdownTimeout } from '@stock-bot/shutdown';
|
||||
|
||||
const app = express();
|
||||
const server = app.listen(3000);
|
||||
|
||||
setShutdownTimeout(10000);
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Closing HTTP server...');
|
||||
await new Promise(resolve => server.close(resolve));
|
||||
});
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Closing database...');
|
||||
await database.close();
|
||||
});
|
||||
```
|
||||
|
||||
### Worker Process
|
||||
|
||||
```typescript
|
||||
import { onShutdown } from '@stock-bot/shutdown';
|
||||
|
||||
let isRunning = true;
|
||||
|
||||
onShutdown(() => {
|
||||
console.log('Stopping worker...');
|
||||
isRunning = false;
|
||||
});
|
||||
|
||||
// Worker loop
|
||||
while (isRunning) {
|
||||
await processJob();
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
}
|
||||
```
|
||||
|
||||
## Signal Handling
|
||||
|
||||
The library automatically handles these signals:
|
||||
|
||||
- **SIGTERM** - Termination request
|
||||
- **SIGINT** - Interrupt (Ctrl+C)
|
||||
- **SIGUSR2** - User-defined signal (Unix only)
|
||||
- **uncaughtException** - Unhandled exceptions
|
||||
- **unhandledRejection** - Unhandled promise rejections
|
||||
|
||||
On Windows, only SIGTERM and SIGINT are supported due to platform limitations.
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Register callbacks early** in your application startup
|
||||
2. **Keep callbacks simple** and focused on cleanup
|
||||
3. **Use appropriate timeouts** based on your cleanup needs
|
||||
4. **Handle errors gracefully** in callbacks
|
||||
5. **Test shutdown behavior** in your CI/CD pipeline
|
||||
|
||||
## Testing
|
||||
|
||||
```typescript
|
||||
import { resetShutdown, onShutdown } from '@stock-bot/shutdown';
|
||||
|
||||
beforeEach(() => {
|
||||
resetShutdown(); // Clear previous state
|
||||
});
|
||||
|
||||
test('should register shutdown callback', () => {
|
||||
let cleaned = false;
|
||||
onShutdown(() => { cleaned = true; });
|
||||
|
||||
// Test shutdown behavior
|
||||
});
|
||||
```
|
||||
# @stock-bot/shutdown
|
||||
|
||||
Shutdown management library for Node.js applications in the Stock Bot platform.
|
||||
|
||||
## Features
|
||||
|
||||
- ✅ **Automatic Signal Handling** - SIGTERM, SIGINT, SIGUSR2 (Unix), uncaught exceptions
|
||||
- ✅ **Platform Support** - Windows and Unix/Linux compatible
|
||||
- ✅ **Multiple Callbacks** - Register multiple cleanup functions
|
||||
- ✅ **Timeout Protection** - Configurable shutdown timeout
|
||||
- ✅ **Error Handling** - Failed callbacks don't block shutdown
|
||||
- ✅ **TypeScript Support** - Full type definitions
|
||||
- ✅ **Zero Dependencies** - Lightweight and efficient
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
bun add @stock-bot/shutdown
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```typescript
|
||||
import { onShutdown, setShutdownTimeout } from '@stock-bot/shutdown';
|
||||
|
||||
// Configure shutdown timeout (optional, default: 30 seconds)
|
||||
setShutdownTimeout(15000); // 15 seconds
|
||||
|
||||
// Register cleanup callbacks
|
||||
onShutdown(async () => {
|
||||
console.log('Closing database connections...');
|
||||
await database.close();
|
||||
});
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Stopping background jobs...');
|
||||
await jobQueue.stop();
|
||||
});
|
||||
|
||||
onShutdown(() => {
|
||||
console.log('Final cleanup...');
|
||||
// Synchronous cleanup
|
||||
});
|
||||
|
||||
console.log('Application started. Press Ctrl+C to test graceful shutdown.');
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Convenience Functions
|
||||
|
||||
#### `onShutdown(callback)`
|
||||
Register a cleanup callback.
|
||||
|
||||
```typescript
|
||||
onShutdown(async () => {
|
||||
await cleanup();
|
||||
});
|
||||
```
|
||||
|
||||
#### `setShutdownTimeout(timeout)`
|
||||
Set shutdown timeout in milliseconds.
|
||||
|
||||
```typescript
|
||||
setShutdownTimeout(30000); // 30 seconds
|
||||
```
|
||||
|
||||
#### `initiateShutdown(signal?)`
|
||||
Manually trigger shutdown.
|
||||
|
||||
```typescript
|
||||
const result = await initiateShutdown('manual');
|
||||
console.log(result.success); // true/false
|
||||
```
|
||||
|
||||
#### `shutdownAndExit(signal?, exitCode?)`
|
||||
Trigger shutdown and exit process.
|
||||
|
||||
```typescript
|
||||
await shutdownAndExit('manual', 0);
|
||||
```
|
||||
|
||||
### Advanced Usage
|
||||
|
||||
#### Manual Instance Management
|
||||
|
||||
```typescript
|
||||
import { Shutdown } from '@stock-bot/shutdown';
|
||||
|
||||
const shutdown = new Shutdown({
|
||||
timeout: 20000,
|
||||
autoRegister: true
|
||||
});
|
||||
|
||||
shutdown.onShutdown(async () => {
|
||||
await cleanup();
|
||||
});
|
||||
|
||||
// Manual shutdown
|
||||
const result = await shutdown.shutdown('manual');
|
||||
```
|
||||
|
||||
#### Configuration Options
|
||||
|
||||
```typescript
|
||||
interface ShutdownOptions {
|
||||
timeout?: number; // Timeout in ms (default: 30000)
|
||||
autoRegister?: boolean; // Auto-register signals (default: true)
|
||||
}
|
||||
```
|
||||
|
||||
#### Shutdown Result
|
||||
|
||||
```typescript
|
||||
interface ShutdownResult {
|
||||
success: boolean;
|
||||
callbacksExecuted: number;
|
||||
callbacksFailed: number;
|
||||
duration: number;
|
||||
error?: string;
|
||||
}
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Express Server
|
||||
|
||||
```typescript
|
||||
import express from 'express';
|
||||
import { onShutdown, setShutdownTimeout } from '@stock-bot/shutdown';
|
||||
|
||||
const app = express();
|
||||
const server = app.listen(3000);
|
||||
|
||||
setShutdownTimeout(10000);
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Closing HTTP server...');
|
||||
await new Promise(resolve => server.close(resolve));
|
||||
});
|
||||
|
||||
onShutdown(async () => {
|
||||
console.log('Closing database...');
|
||||
await database.close();
|
||||
});
|
||||
```
|
||||
|
||||
### Worker Process
|
||||
|
||||
```typescript
|
||||
import { onShutdown } from '@stock-bot/shutdown';
|
||||
|
||||
let isRunning = true;
|
||||
|
||||
onShutdown(() => {
|
||||
console.log('Stopping worker...');
|
||||
isRunning = false;
|
||||
});
|
||||
|
||||
// Worker loop
|
||||
while (isRunning) {
|
||||
await processJob();
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
}
|
||||
```
|
||||
|
||||
## Signal Handling
|
||||
|
||||
The library automatically handles these signals:
|
||||
|
||||
- **SIGTERM** - Termination request
|
||||
- **SIGINT** - Interrupt (Ctrl+C)
|
||||
- **SIGUSR2** - User-defined signal (Unix only)
|
||||
- **uncaughtException** - Unhandled exceptions
|
||||
- **unhandledRejection** - Unhandled promise rejections
|
||||
|
||||
On Windows, only SIGTERM and SIGINT are supported due to platform limitations.
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Register callbacks early** in your application startup
|
||||
2. **Keep callbacks simple** and focused on cleanup
|
||||
3. **Use appropriate timeouts** based on your cleanup needs
|
||||
4. **Handle errors gracefully** in callbacks
|
||||
5. **Test shutdown behavior** in your CI/CD pipeline
|
||||
|
||||
## Testing
|
||||
|
||||
```typescript
|
||||
import { resetShutdown, onShutdown } from '@stock-bot/shutdown';
|
||||
|
||||
beforeEach(() => {
|
||||
resetShutdown(); // Clear previous state
|
||||
});
|
||||
|
||||
test('should register shutdown callback', () => {
|
||||
let cleaned = false;
|
||||
onShutdown(() => { cleaned = true; });
|
||||
|
||||
// Test shutdown behavior
|
||||
});
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue