public function destroy()
{
$state = $this->getState();
if ($state === Runtime::STATE_DESTROYED) {
return Promise::doResolve('Runtime has been already destroyed.');
}
$controller = $this;
return $controller->stop()->then(function () {
return Promise::doResolve()->then(function () {
return $this->getRuntimeManager()->getRuntimes();
})->then(function ($runtimes) {
return $this->getRuntimeManager()->destroyRuntimes($runtimes, Runtime::DESTROY_FORCE);
});
})->then(function () use($controller) {
$promise = new Promise();
$emitter = $controller->getEventEmitter();
$emitter->emit('beforeDestroy');
$emitter->emit('destroy');
$controller->getLoop()->onTick(function () use($controller, $promise) {
$controller->setState(Runtime::STATE_DESTROYED);
$controller->setLoopState(self::LOOP_STATE_STOPPED);
$controller->stopLoop();
$emitter = $controller->getEventEmitter();
$emitter->emit('afterDestroy');
$promise->resolve();
});
return $promise->then(function () {
return 'Runtime has been destroyed.';
});
});
}