瀏覽代碼

Added graceful shutdown

Efren Yevale Varela 1 月之前
父節點
當前提交
bcf811eae1
共有 2 個文件被更改,包括 28 次插入2 次删除
  1. 12 0
      README.md
  2. 16 2
      src/hooks.server.js

+ 12 - 0
README.md

@@ -122,6 +122,18 @@ The `config.json` file (copied from `config.json.example`) controls server and d
 - **`database.sqlite3.timeout`** — Query timeout in milliseconds
 - **`database.sqlite3.performance`** — Performance tuning options (WAL mode, foreign keys, etc.)
 
+## Exit Codes
+
+The application uses the following exit codes for process termination:
+
+| Code | Meaning | Trigger |
+|------|---------|---------|
+| `0` | Success / Graceful shutdown | `SIGTERM`, `SIGINT` signals |
+| `1` | Runtime error | Uncaught exceptions or unhandled promise rejections |
+| `2` | Cleanup error | Error during graceful shutdown cleanup logic |
+
+Exit codes are defined in `src/hooks.server.js` and are emitted when the process receives termination signals or encounters runtime errors.
+
 ## Links
 
 - [SvelteKit Documentation](https://svelte.dev/docs/kit)

+ 16 - 2
src/hooks.server.js

@@ -1,12 +1,26 @@
-import { getTextDirection } from '$lib/paraglide/runtime';
+import { getTextDirection    } from '$lib/paraglide/runtime';
 import { paraglideMiddleware } from '$lib/paraglide/server';
 
 /** @type {import('@sveltejs/kit').Handle} */ const handleParaglide = ({ event, resolve }) => paraglideMiddleware(event.request, ({ request, locale }) => {
 	event.request = request;
-
 	return resolve(event, {
 		transformPageChunk: ({ html }) => html.replace('%paraglide.lang%', locale).replace('%paraglide.dir%', getTextDirection(locale))
 	});
 });
 
 export /** @type {import('@sveltejs/kit').Handle} */ const handle = handleParaglide;
+
+async function gracefulShutdown(exitCode = 0, signal = null) {
+	try {
+		// Add cleanup logic here
+	} catch (error) {
+		console.error('Error during cleanup:', error);
+		exitCode = 2;
+	}
+	process.exit(exitCode);
+}
+
+process.on('SIGTERM',            ()               => gracefulShutdown(0, 'SIGTERM')            );
+process.on('SIGINT',             ()               => gracefulShutdown(0, 'SIGINT')             );
+process.on('uncaughtException',  (error)          => gracefulShutdown(1, 'uncaughtException')  );
+process.on('unhandledRejection', (reason,promise) => gracefulShutdown(1, 'unhandledRejection') );