diff --git a/config/presets/setup.json b/config/presets/setup.json index e8372d060..65d1bb0cc 100644 --- a/config/presets/setup.json +++ b/config/presets/setup.json @@ -4,17 +4,8 @@ { "@id": "urn:solid-server:default", "@type": "Setup", - "Setup:_serverFactory": { - "@id": "urn:solid-server:default:ServerFactory" - }, "Setup:_initializer": { "@id": "urn:solid-server:default:Initializer" - }, - "Setup:_base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "Setup:_port": { - "@id": "urn:solid-server:default:variable:port" } }, { @@ -38,6 +29,15 @@ "AclInitializer:_aclManager": { "@id": "urn:solid-server:default:AclManager" } + }, + { + "@type": "ServerInitializer", + "ServerInitializer:_serverFactory": { + "@id": "urn:solid-server:default:ServerFactory" + }, + "ServerInitializer:_port": { + "@id": "urn:solid-server:default:variable:port" + } } ] } diff --git a/src/index.ts b/src/index.ts index 137bf337c..a9d870861 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ export * from './init/AclInitializer'; export * from './init/CliRunner'; export * from './init/Initializer'; export * from './init/LoggerInitializer'; +export * from './init/ServerInitializer'; export * from './init/Setup'; // LDP/HTTP/Metadata diff --git a/src/init/CliRunner.ts b/src/init/CliRunner.ts index 8e73c4bcc..34daf38a0 100644 --- a/src/init/CliRunner.ts +++ b/src/init/CliRunner.ts @@ -3,12 +3,9 @@ import type { ReadStream, WriteStream } from 'tty'; import type { LoaderProperties } from 'componentsjs'; import { Loader } from 'componentsjs'; import yargs from 'yargs'; -import { getLoggerFor } from '../logging/LogUtil'; import { ensureTrailingSlash } from '../util/PathUtil'; import type { Setup } from './Setup'; -const logger = getLoggerFor('CliRunner'); - /** * Generic run function for starting the server from a given config * @param args - Command line arguments. @@ -41,7 +38,7 @@ export const runCli = function({ }) .help(); - (async(): Promise => { + (async(): Promise => { // Load provided or default config file const configPath = params.config ? path.join(process.cwd(), params.config) : @@ -63,10 +60,8 @@ export const runCli = function({ params.podTemplateFolder ?? path.join(__dirname, '../../templates'), }, }) as Setup; - return await setup.setup(); - })().then((baseUrl: string): void => { - logger.info(`Running at ${baseUrl}`); - }).catch((error): void => { + await setup.setup(); + })().catch((error): void => { // This is the only time we can *not* use the logger to print error messages, as dependency injection has failed. stderr.write(`${error}\n`); }); diff --git a/src/init/ServerInitializer.ts b/src/init/ServerInitializer.ts new file mode 100644 index 000000000..6320dae61 --- /dev/null +++ b/src/init/ServerInitializer.ts @@ -0,0 +1,20 @@ +import type { HttpServerFactory } from '../server/HttpServerFactory'; +import { Initializer } from './Initializer'; + +/** + * Creates and starts an HTTP server. + */ +export class ServerInitializer extends Initializer { + private readonly serverFactory: HttpServerFactory; + private readonly port: number; + + public constructor(serverFactory: HttpServerFactory, port: number) { + super(); + this.serverFactory = serverFactory; + this.port = port; + } + + public async handle(): Promise { + this.serverFactory.startServer(this.port); + } +} diff --git a/src/init/Setup.ts b/src/init/Setup.ts index 7e49ce33e..1d0a17f80 100644 --- a/src/init/Setup.ts +++ b/src/init/Setup.ts @@ -1,33 +1,13 @@ -import type { HttpServerFactory } from '../server/HttpServerFactory'; import type { Initializer } from './Initializer'; -/** - * Invokes all logic to setup a server. - */ export class Setup { - private readonly serverFactory: HttpServerFactory; private readonly initializer: Initializer; - private readonly base: string; - private readonly port: number; - public constructor( - initializer: Initializer, - serverFactory: HttpServerFactory, - base: string, - port: number, - ) { + public constructor(initializer: Initializer) { this.initializer = initializer; - this.serverFactory = serverFactory; - this.base = base; - this.port = port; } - /** - * Set up a server. - */ - public async setup(): Promise { + public async setup(): Promise { await this.initializer.handleSafe(); - this.serverFactory.startServer(this.port); - return this.base; } } diff --git a/src/server/ExpressHttpServerFactory.ts b/src/server/ExpressHttpServerFactory.ts index 3c0224189..db5249d85 100644 --- a/src/server/ExpressHttpServerFactory.ts +++ b/src/server/ExpressHttpServerFactory.ts @@ -16,6 +16,7 @@ export class ExpressHttpServerFactory implements HttpServerFactory { } public startServer(port: number): Server { + this.logger.info(`Starting server at http://localhost:${port}/`); return this.createApp().listen(port); } diff --git a/test/unit/init/ServerInitializer.test.ts b/test/unit/init/ServerInitializer.test.ts new file mode 100644 index 000000000..8eecc089a --- /dev/null +++ b/test/unit/init/ServerInitializer.test.ts @@ -0,0 +1,18 @@ +import { ServerInitializer } from '../../../src/init/ServerInitializer'; +import type { HttpServerFactory } from '../../../src/server/HttpServerFactory'; + +describe('ServerInitializer', (): void => { + const serverFactory: jest.Mocked = { + startServer: jest.fn(), + }; + + let initializer: ServerInitializer; + beforeAll(async(): Promise => { + initializer = new ServerInitializer(serverFactory, 3000); + }); + + it('starts an HTTP server.', async(): Promise => { + await initializer.handle(); + expect(serverFactory.startServer).toHaveBeenCalledWith(3000); + }); +}); diff --git a/test/unit/init/Setup.test.ts b/test/unit/init/Setup.test.ts index cab4f7835..320a24a8c 100644 --- a/test/unit/init/Setup.test.ts +++ b/test/unit/init/Setup.test.ts @@ -1,24 +1,16 @@ import type { Initializer } from '../../../src/init/Initializer'; import { Setup } from '../../../src/init/Setup'; -import type { HttpServerFactory } from '../../../src/server/HttpServerFactory'; describe('Setup', (): void => { - const serverFactory: jest.Mocked = { - startServer: jest.fn(), - }; const initializer: jest.Mocked = { handleSafe: jest.fn(), } as any; beforeAll(async(): Promise => { - const setup = new Setup(initializer, serverFactory, 'http://localhost:3000/', 3000); + const setup = new Setup(initializer); await setup.setup(); }); - it('starts an HTTP server.', async(): Promise => { - expect(serverFactory.startServer).toHaveBeenCalledWith(3000); - }); - it('calls the initializer.', async(): Promise => { expect(initializer.handleSafe).toHaveBeenCalledTimes(1); });