feat: stopping the server

ref pnpm/pnpm#960
This commit is contained in:
Zoltan Kochan
2018-01-15 03:36:25 +02:00
parent 15f59aaf24
commit bf9bdbfee2
5 changed files with 95 additions and 10 deletions

View File

@@ -10,12 +10,16 @@ import pLimit = require('p-limit')
import {StoreController} from 'package-store'
import uuid = require('uuid')
export type StoreServerController = StoreController & {
stop (): Promise<void>,
}
export default function (
initOpts: {
remotePrefix: string,
concurrency?: number,
},
): Promise<StoreController> {
): Promise<StoreServerController> {
const remotePrefix = initOpts.remotePrefix
const limitedFetch = fetch.bind(null, pLimit(initOpts.concurrency || 100))
@@ -39,6 +43,7 @@ export default function (
saveState: async () => {
await limitedFetch(`${remotePrefix}/saveState`, {})
},
stop: () => limitedFetch(`${remotePrefix}/stop`, {}),
updateConnections: async (prefix: string, opts: {addDependencies: string[], removeDependencies: string[], prune: boolean}) => {
await limitedFetch(`${remotePrefix}/updateConnections`, {
opts,

View File

@@ -1,7 +1,10 @@
import logger from '@pnpm/logger'
import {
RequestPackageOptions,
WantedDependency,
} from '@pnpm/package-requester'
import http = require('http')
import {IncomingMessage, Server, ServerResponse} from 'http'
import {RequestPackageOptions, WantedDependency} from '@pnpm/package-requester'
import {StoreController} from 'package-store'
interface RequestBody {
@@ -22,6 +25,7 @@ export default function (
path?: string,
port?: number,
hostname?: string,
ignoreStopRequests?: boolean,
},
) {
const manifestPromises = {}
@@ -97,6 +101,17 @@ export default function (
await store.importPackage(importPackageBody.from, importPackageBody.to, importPackageBody.opts)
res.end(JSON.stringify('OK'))
break
case '/stop':
if (opts.ignoreStopRequests) {
res.statusCode = 403
res.end()
break
}
logger.info('Got request to stop the server')
await close()
res.end(JSON.stringify('OK'))
logger.info('Server stopped')
break
default:
res.statusCode = 404
res.end(`${req.url} does not match any route`)
@@ -114,7 +129,10 @@ export default function (
listener = server.listen(opts.port, opts.hostname)
}
return {
close: () => listener.close(() => { return }),
return { close }
function close () {
listener.close()
return store.close()
}
}