mirror of
https://github.com/pockethost/pockethost.git
synced 2025-07-05 20:32:29 +00:00
enh: port pool
This commit is contained in:
parent
90c6a75928
commit
cf63b15e32
@ -51,6 +51,8 @@ export const NODE_ENV = env('NODE_ENV', '')
|
||||
export const DEBUG = envb('DEBUG', NODE_ENV === 'development')
|
||||
export const TRACE = envb('TRACE', false)
|
||||
|
||||
export const DAEMON_MAX_PORTS = envi(`DAEMON_MAX_PORTS`, 500)
|
||||
|
||||
export const DAEMON_PB_BACKUP_SLEEP = envi(`DAEMON_PB_BACKUP_SLEEP`, 100)
|
||||
export const DAEMON_PB_BACKUP_PAGE_COUNT = envi(
|
||||
`DAEMON_PB_BACKUP_PAGE_COUNT`,
|
||||
|
@ -1,4 +1,5 @@
|
||||
import {
|
||||
DAEMON_MAX_PORTS,
|
||||
DAEMON_PB_PORT_BASE,
|
||||
DAEMON_PB_SEMVER,
|
||||
DEBUG,
|
||||
@ -102,7 +103,8 @@ global.EventSource = require('eventsource')
|
||||
await instanceService({
|
||||
logger,
|
||||
instanceApiCheckIntervalMs: 50,
|
||||
instanceApiTimeoutMs: 1000,
|
||||
instanceApiTimeoutMs: 5000,
|
||||
maxPorts: DAEMON_MAX_PORTS,
|
||||
})
|
||||
await centralDbService({ logger })
|
||||
// gen:service
|
||||
|
@ -30,7 +30,7 @@ import { AsyncReturnType } from 'type-fest'
|
||||
import { instanceLoggerService } from '../InstanceLoggerService'
|
||||
import { pocketbase } from '../PocketBaseService'
|
||||
import { createDenoProcess } from './Deno/DenoProcess'
|
||||
import { portManager } from './PortManager'
|
||||
import { portManager, PortManagerConfig } from './PortManager'
|
||||
|
||||
enum InstanceApiStatus {
|
||||
Starting = 'starting',
|
||||
@ -48,12 +48,17 @@ type InstanceApi = {
|
||||
export type InstanceServiceConfig = SingletonBaseConfig & {
|
||||
instanceApiTimeoutMs: number
|
||||
instanceApiCheckIntervalMs: number
|
||||
}
|
||||
} & PortManagerConfig
|
||||
|
||||
export type InstanceServiceApi = AsyncReturnType<typeof instanceService>
|
||||
export const instanceService = mkSingleton(
|
||||
async (config: InstanceServiceConfig) => {
|
||||
const { logger, instanceApiTimeoutMs, instanceApiCheckIntervalMs } = config
|
||||
const {
|
||||
logger,
|
||||
instanceApiTimeoutMs,
|
||||
instanceApiCheckIntervalMs,
|
||||
maxPorts,
|
||||
} = config
|
||||
const instanceServiceLogger = logger.create('InstanceService')
|
||||
const { dbg, raw, error, warn } = instanceServiceLogger
|
||||
const { client } = await clientService()
|
||||
@ -202,9 +207,6 @@ export const instanceService = mkSingleton(
|
||||
Obtain empty port
|
||||
*/
|
||||
dbg(`Obtaining port`)
|
||||
healthyGuard()
|
||||
await updateInstanceStatus(instance.id, InstanceStatus.Port)
|
||||
healthyGuard()
|
||||
const [newPort, releasePort] = getNextPort()
|
||||
shutdownManager.add(() => {
|
||||
dbg(`Releasing port`)
|
||||
@ -507,7 +509,7 @@ export const instanceService = mkSingleton(
|
||||
`InstanceService`
|
||||
)
|
||||
|
||||
const { getNextPort } = await portManager({})
|
||||
const { getNextPort } = await portManager({ maxPorts })
|
||||
|
||||
const shutdown = async () => {
|
||||
dbg(`Shutting down instance manager`)
|
||||
|
@ -6,7 +6,12 @@ import getPort from 'get-port'
|
||||
|
||||
export type PortResult = [number, () => void]
|
||||
|
||||
export const portManager = mkSingleton(async () => {
|
||||
export type PortManagerConfig = {
|
||||
maxPorts: number
|
||||
}
|
||||
|
||||
export const portManager = mkSingleton(async (cfg: PortManagerConfig) => {
|
||||
const { maxPorts } = cfg
|
||||
const _logger = logger().create(`PortManager`)
|
||||
const { dbg, error } = _logger
|
||||
|
||||
@ -41,7 +46,7 @@ export const portManager = mkSingleton(async () => {
|
||||
})()
|
||||
|
||||
const ports = await (
|
||||
await Promise.all<PortResult>(range(500).map(getNextPort))
|
||||
await Promise.all<PortResult>(range(maxPorts).map(getNextPort))
|
||||
).map((portInfo) => portInfo[0])
|
||||
|
||||
return {
|
||||
|
Loading…
x
Reference in New Issue
Block a user