Add us_listen_socket_close and graceful shutdown example
This commit is contained in:
parent
ab829af8ce
commit
0fb6ec9034
39
examples/GracefulShutdown.js
Normal file
39
examples/GracefulShutdown.js
Normal file
@ -0,0 +1,39 @@
|
||||
/* Minimal example that shuts down gracefully */
|
||||
|
||||
const uWS = require('../dist/uws.js');
|
||||
const port = 9001;
|
||||
|
||||
/* We store the listen socket here, so that we can shut it down later */
|
||||
let listenSocket;
|
||||
|
||||
const app = uWS./*SSL*/App({
|
||||
key_file_name: 'misc/key.pem',
|
||||
cert_file_name: 'misc/cert.pem',
|
||||
passphrase: '1234'
|
||||
}).get('/shutdown', (res, req) => {
|
||||
if (listenSocket) {
|
||||
res.end('Okay, shutting down now!');
|
||||
/* This function is provided directly by µSockets */
|
||||
uWS.us_listen_socket_close(listenSocket);
|
||||
listenSocket = null;
|
||||
} else {
|
||||
/* We just refuse if alrady shutting down */
|
||||
res.close();
|
||||
}
|
||||
}).listen(port, (token) => {
|
||||
/* Save the listen socket for later shut down */
|
||||
listenSocket = token;
|
||||
/* Did we even manage to listen? */
|
||||
if (token) {
|
||||
console.log('Listening to port ' + port);
|
||||
|
||||
/* Stop listening soon */
|
||||
setTimeout(() => {
|
||||
console.log('Shutting down now');
|
||||
uWS.us_listen_socket_close(listenSocket);
|
||||
listenSocket = null;
|
||||
}, 1000);
|
||||
} else {
|
||||
console.log('Failed to listen to port ' + port);
|
||||
}
|
||||
});
|
@ -160,7 +160,7 @@ void uWS_App_listen(const FunctionCallbackInfo<Value> &args) {
|
||||
int port = args[0]->Uint32Value(args.GetIsolate()->GetCurrentContext()).ToChecked();
|
||||
|
||||
app->listen(port, [&args](auto *token) {
|
||||
Local<Value> argv[] = {Boolean::New(isolate, token)};
|
||||
Local<Value> argv[] = {External::New(isolate, token)};
|
||||
Local<Function>::Cast(args[1])->Call(isolate->GetCurrentContext()->Global(), 1, argv);
|
||||
});
|
||||
|
||||
|
@ -53,16 +53,21 @@ void emptyNextTickQueue(Isolate *isolate) {
|
||||
}
|
||||
}
|
||||
|
||||
/* todo: Put this function and all inits of it in its own header */
|
||||
void uWS_us_listen_socket_close(const FunctionCallbackInfo<Value> &args) {
|
||||
us_listen_socket_close((struct us_listen_socket *) External::Cast(*args[0])->Value());
|
||||
}
|
||||
|
||||
void Main(Local<Object> exports) {
|
||||
/* I guess we store this statically */
|
||||
isolate = exports->GetIsolate();
|
||||
|
||||
/* Register our own nextTick handler */
|
||||
/* Register our own nextTick handlers */
|
||||
uWS::Loop::defaultLoop()->setPostHandler([](uWS::Loop *) {
|
||||
emptyNextTickQueue(isolate);
|
||||
});
|
||||
|
||||
/* Also empty in pre, it doesn't matter */
|
||||
/* We also do need it on pre */
|
||||
uWS::Loop::defaultLoop()->setPreHandler([](uWS::Loop *) {
|
||||
emptyNextTickQueue(isolate);
|
||||
});
|
||||
@ -75,7 +80,8 @@ void Main(Local<Object> exports) {
|
||||
exports->Set(String::NewFromUtf8(isolate, "SSLApp"), FunctionTemplate::New(isolate, uWS_App<uWS::SSLApp>)->GetFunction());
|
||||
exports->Set(String::NewFromUtf8(isolate, "nextTick"), FunctionTemplate::New(isolate, nextTick)->GetFunction());
|
||||
|
||||
// these inits should probably happen elsewhere (in their respective struct's constructor)?
|
||||
/* Expose some µSockets functions directly under uWS namespace */
|
||||
exports->Set(String::NewFromUtf8(isolate, "us_listen_socket_close"), FunctionTemplate::New(isolate, uWS_us_listen_socket_close)->GetFunction());
|
||||
|
||||
/* The template for websockets */
|
||||
WebSocketWrapper::initWsTemplate<0>();
|
||||
|
Loading…
Reference in New Issue
Block a user