Skip to content

Commit ee96767

Browse files
author
Antoine Tremblay
committed
Make it possible to export container dependant variables
This patch introduces the Backend/FrontendApplicationInitializeContribution the contributions are called as the first thing the application does. This enables the logger module to export a logger object fetched via container.get<ILogger>(ILogger) such that this new logger object can be exported to code that does not use injection. Signed-off-by: Antoine Tremblay <[email protected]>
1 parent a6a68d0 commit ee96767

File tree

6 files changed

+51
-5
lines changed

6 files changed

+51
-5
lines changed

packages/core/src/browser/frontend-application-module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
MessageService
1919
} from "../common";
2020
import { MessageClient, messageServicePath } from '../common/message-service-protocol';
21-
import { FrontendApplication, FrontendApplicationContribution } from './frontend-application';
21+
import { FrontendApplication, FrontendApplicationContribution, FrontendApplicationInitializeContribution } from './frontend-application';
2222
import { DefaultOpenerService, OpenerService, OpenHandler } from './opener-service';
2323
import { HumaneMessageClient } from './humane-message-client';
2424
import { WebSocketConnectionProvider } from './messaging';
@@ -33,6 +33,7 @@ import 'font-awesome/css/font-awesome.min.css';
3333

3434
export const frontendApplicationModule = new ContainerModule((bind, unbind, isBound, rebind) => {
3535
bind(FrontendApplication).toSelf().inSingletonScope();
36+
bindContributionProvider(bind, FrontendApplicationInitializeContribution);
3637
bindContributionProvider(bind, FrontendApplicationContribution);
3738

3839
bindContributionProvider(bind, OpenHandler);

packages/core/src/browser/frontend-application.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ export interface FrontendApplicationContribution {
3030
onStop?(app: FrontendApplication): void;
3131
}
3232

33+
export const FrontendApplicationInitializeContribution = Symbol("FrontendApplicationInitializeContribution");
34+
export interface FrontendApplicationInitializeContribution {
35+
initialize(): void;
36+
}
37+
3338
@injectable()
3439
export class FrontendApplication {
3540

@@ -40,9 +45,17 @@ export class FrontendApplication {
4045
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry,
4146
@inject(KeybindingRegistry) protected readonly keybindings: KeybindingRegistry,
4247
@inject(ILogger) protected readonly logger: ILogger,
48+
@inject(ContributionProvider) @named(FrontendApplicationInitializeContribution)
49+
protected readonly initializeContributionProvider: ContributionProvider<FrontendApplicationInitializeContribution>,
4350
@inject(ContributionProvider) @named(FrontendApplicationContribution)
4451
protected readonly contributions: ContributionProvider<FrontendApplicationContribution>
45-
) { }
52+
) {
53+
for (const contribution of this.initializeContributionProvider.getContributions()) {
54+
if (contribution.initialize) {
55+
contribution.initialize();
56+
}
57+
}
58+
}
4659

4760
get shell(): ApplicationShell {
4861
if (this._shell) {

packages/core/src/common/logger.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ export enum LogLevel {
1818
TRACE = 10
1919
}
2020

21+
/* This is to be initialized from container composition root.
22+
It can be used outside of the inversify context. */
23+
export let logger: ILogger;
24+
25+
export function setRootLogger(alogger: ILogger) {
26+
logger = alogger;
27+
}
28+
2129
export type Log = (message: string, ...params: any[]) => void;
2230
export type Loggable = (log: Log) => void;
2331

@@ -365,4 +373,4 @@ export class Logger extends AbstractLogger implements ILogger {
365373
child(obj: object): ILogger {
366374
return this.factory(obj);
367375
}
368-
}
376+
}

packages/core/src/node/backend-application-module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
import { ContainerModule } from "inversify";
99
import { bindContributionProvider, ConnectionHandler, JsonRpcConnectionHandler, MessageService } from '../common';
1010
import { MessageClient, DispatchingMessageClient, messageServicePath } from '../common/message-service-protocol';
11-
import { BackendApplication, BackendApplicationContribution } from "./backend-application";
11+
import { BackendApplication, BackendApplicationContribution, BackendApplicationInitializeContribution } from "./backend-application";
1212

1313
export const backendApplicationModule = new ContainerModule(bind => {
1414
bind(BackendApplication).toSelf().inSingletonScope();
15+
bindContributionProvider(bind, BackendApplicationInitializeContribution);
1516
bindContributionProvider(bind, BackendApplicationContribution);
1617

1718
bind(DispatchingMessageClient).toSelf().inSingletonScope();

packages/core/src/node/backend-application.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ export interface BackendApplicationContribution {
1616
onStart?(server: http.Server): void;
1717
}
1818

19+
export const BackendApplicationInitializeContribution = Symbol("BackendApplicationInitializeContribution");
20+
export interface BackendApplicationInitializeContribution {
21+
initialize(): void;
22+
}
23+
1924
/**
2025
* The main entry point for Theia applications.
2126
*/
@@ -25,6 +30,8 @@ export class BackendApplication {
2530
protected readonly app: express.Application = express();
2631

2732
constructor(
33+
@inject(ContributionProvider) @named(BackendApplicationInitializeContribution)
34+
protected readonly initializeContributionProvider: ContributionProvider<BackendApplicationInitializeContribution>,
2835
@inject(ContributionProvider) @named(BackendApplicationContribution)
2936
protected readonly contributionsProvider: ContributionProvider<BackendApplicationContribution>,
3037
@inject(ILogger) protected readonly logger: ILogger
@@ -37,6 +44,13 @@ export class BackendApplication {
3744
}
3845
}
3946
});
47+
48+
for (const contribution of this.initializeContributionProvider.getContributions()) {
49+
if (contribution.initialize) {
50+
contribution.initialize();
51+
}
52+
}
53+
4054
for (const contribution of this.contributionsProvider.getContributions()) {
4155
if (contribution.configure) {
4256
contribution.configure(this.app);

packages/core/src/node/logger-backend-module.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,22 @@
77

88
import { ContainerModule, Container } from 'inversify';
99
import { ConnectionHandler, JsonRpcConnectionHandler } from "../common/messaging";
10-
import { ILogger, LoggerFactory, LoggerOptions, Logger } from '../common/logger';
10+
import { ILogger, LoggerFactory, LoggerOptions, Logger, setRootLogger } from '../common/logger';
1111
import { ILoggerServer, ILoggerClient, loggerPath, LoggerServerOptions } from '../common/logger-protocol';
1212
import { BunyanLoggerServer } from './bunyan-logger-server';
1313
import { LoggerWatcher } from '../common/logger-watcher';
14+
import { BackendApplicationInitializeContribution } from './backend-application';
15+
1416
import * as yargs from 'yargs';
1517

1618
export const loggerBackendModule = new ContainerModule(bind => {
19+
bind(BackendApplicationInitializeContribution).toDynamicValue(ctx =>
20+
({
21+
initialize() {
22+
setRootLogger(ctx.container.get<ILogger>(ILogger));
23+
}
24+
}));
25+
1726
bind(ILogger).to(Logger).inSingletonScope().whenTargetIsDefault();
1827
bind(LoggerWatcher).toSelf().inSingletonScope();
1928
bind(ILoggerServer).to(BunyanLoggerServer).inSingletonScope();

0 commit comments

Comments
 (0)