@deepkit/framework
Version:
315 lines • 19.8 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
/*@ts-ignore*/
import { __ΩHttpRegExp } from '@deepkit/http';
/*@ts-ignore*/
import { __ΩClassType } from '@deepkit/core';
function __assignType(fn, args) {
fn.__type = args;
return fn;
}
/*
* Deepkit Framework
* Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the MIT License.
*
* You should have received a copy of the MIT License along with this program.
*/
import { isClass, isPrototypeOfBase, ProcessLocker } from '@deepkit/core';
import { EventDispatcher } from '@deepkit/event';
import { isAbsolute, join } from 'path';
import { ApplicationServer, LogStartupListener, onServerShutdown } from './application-server.js';
import { DebugRouterController } from './cli/debug-router.js';
import { DebugDIController } from './cli/debug-di.js';
import { ServerStartController } from './cli/server-start.js';
import { DebugController } from './debug/debug.controller.js';
import { registerDebugHttpController } from './debug/http-debug.controller.js';
import { http, HttpLogger, HttpModule, HttpRequest, HttpResponse, serveStaticListener } from '@deepkit/http';
import { InjectorContext } from '@deepkit/injector';
import { BrokerConfig, FrameworkConfig } from './module.config.js';
import { Logger } from '@deepkit/logger';
import { SessionHandler } from './session.js';
import { RpcServer, WebWorkerFactory } from './worker.js';
import { Stopwatch, StopwatchStore } from '@deepkit/stopwatch';
import { OrmBrowserController } from './orm-browser/controller.js';
import { DatabaseListener } from './database/database-listener.js';
import { Database, DatabaseRegistry } from '@deepkit/orm';
import { MigrationCreateController, MigrationDownCommand, MigrationPendingCommand, MigrationProvider, MigrationUpCommand, } from '@deepkit/sql/commands';
import { FileStopwatchStore } from './debug/stopwatch/store.js';
import { DebugProfileFramesCommand } from './cli/debug-debug-frames.js';
import { rpcClass, RpcKernel, RpcKernelBaseConnection, RpcKernelConnection, RpcKernelSecurity, SessionState } from '@deepkit/rpc';
import { DebugConfigController } from './cli/app-config.js';
import { Zone } from './zone.js';
import { DebugBrokerBus } from './debug/broker.js';
import { ApiConsoleModule } from '@deepkit/api-console-module';
import { AppModule, createModuleClass, onAppShutdown } from '@deepkit/app';
import { RpcControllers, RpcInjectorContext, RpcKernelWithStopwatch } from './rpc.js';
import { normalizeDirectory } from './utils.js';
import { FilesystemRegistry, PublicFilesystem } from './filesystem.js';
import { Filesystem } from '@deepkit/filesystem';
import { MediaController } from './debug/media.controller.js';
import { DebugHttpController } from './debug/debug-http.controller.js';
import { BrokerServer } from './broker/broker.js';
import { BrokerListener } from './broker/listener.js';
import { BrokerBus, BrokerCache, BrokerDeepkitAdapter, BrokerKeyValue, BrokerLock, BrokerQueue } from '@deepkit/broker';
import { getBrokerServers } from './broker.js';
export class FrameworkModule extends createModuleClass({
name: 'framework',
config: FrameworkConfig,
providers: [
ProcessLocker,
ApplicationServer,
WebWorkerFactory,
RpcServer,
MigrationProvider,
DebugController,
BrokerServer,
FilesystemRegistry,
{ provide: DatabaseRegistry, useFactory: __assignType((ic) => new DatabaseRegistry(ic), [() => InjectorContext, 'ic', '', 'PP7!2""/#']) },
{
provide: RpcKernel,
useFactory: __assignType(function useFactory(rpcControllers, injectorContext, logger, stopwatch) {
const classType = stopwatch ? RpcKernelWithStopwatch : RpcKernel;
const kernel = new classType(injectorContext, logger.scoped('rpc'));
if (kernel instanceof RpcKernelWithStopwatch) {
kernel.stopwatch = stopwatch;
}
for (const [name, info] of rpcControllers.controllers.entries()) {
kernel.registerController(info.controller, name, info.module);
}
return kernel;
}, [() => RpcControllers, 'rpcControllers', () => InjectorContext, 'injectorContext', () => Logger, 'logger', () => Stopwatch, 'stopwatch', 'useFactory', 'PP7!2"P7#2$P7%2&P7\'2(8"/)']),
},
{
provide: BrokerDeepkitAdapter,
useFactory: __assignType((config) => new BrokerDeepkitAdapter({ servers: getBrokerServers(config) }), [() => BrokerConfig, 'config', '', 'PP7!2""/#']),
},
{ provide: BrokerCache, useFactory: __assignType((adapter) => new BrokerCache(adapter), [() => BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: BrokerLock, useFactory: __assignType((adapter) => new BrokerLock(adapter), [() => BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: BrokerQueue, useFactory: __assignType((adapter) => new BrokerQueue(adapter), [() => BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: BrokerBus, useFactory: __assignType((adapter) => new BrokerBus(adapter), [() => BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: BrokerKeyValue, useFactory: __assignType((adapter) => new BrokerKeyValue(adapter), [() => BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
//move to HttpModule?
{ provide: SessionHandler, scope: 'http' },
// { provide: LiveDatabase, scope: 'rpc' },
{ provide: RpcKernelSecurity, scope: 'rpc' },
//all of these will be set on scope creation
{ provide: HttpRequest, scope: 'rpc', useValue: undefined },
{ provide: RpcInjectorContext, scope: 'rpc', useValue: undefined },
{ provide: SessionState, scope: 'rpc', useValue: undefined },
{ provide: RpcKernelBaseConnection, scope: 'rpc', useValue: undefined },
{ provide: RpcKernelConnection, scope: 'rpc', useValue: undefined },
],
listeners: [
DatabaseListener,
BrokerListener,
],
controllers: [
ServerStartController,
DebugRouterController,
DebugDIController,
DebugProfileFramesCommand,
DebugConfigController,
MigrationUpCommand,
MigrationDownCommand,
MigrationPendingCommand,
MigrationCreateController,
],
exports: [
ProcessLocker,
ApplicationServer,
WebWorkerFactory,
RpcServer,
RpcKernelSecurity,
RpcKernel,
MigrationProvider,
DatabaseRegistry,
SessionHandler,
HttpRequest,
RpcInjectorContext,
SessionState,
RpcKernelConnection,
RpcKernelBaseConnection,
BrokerDeepkitAdapter,
BrokerCache,
BrokerLock,
BrokerQueue,
BrokerBus,
BrokerKeyValue,
BrokerServer,
FilesystemRegistry,
HttpModule,
],
}) {
constructor(options) {
super(options);
this.imports = [
new HttpModule(),
];
this.name = 'framework';
this.dbs = [];
this.filesystems = [];
this.rpcControllers = new RpcControllers;
}
process() {
this.addImport();
this.addProvider({ provide: RpcControllers, useValue: this.rpcControllers });
(this.configureProvider.Ω = [[() => MigrationProvider, 'P7!']], this.configureProvider(__assignType(v => v.setMigrationDir(this.config.migrationDir), ['v', '', 'P"2!"/"'])));
(this.configureProvider.Ω = [[() => DatabaseRegistry, 'P7!']], this.configureProvider(__assignType(v => v.setMigrateOnStartup(this.config.migrateOnStartup), ['v', '', 'P"2!"/"'])));
if (this.config.httpLog) {
this.addListener(HttpLogger);
}
this.getImportedModuleByClass(HttpModule).configure(this.config.http);
if (this.config.logStartup) {
this.addListener(LogStartupListener);
}
if (this.config.publicDir) {
const localPublicDir = isAbsolute(this.config.publicDir) ? this.config.publicDir :
join(process.cwd(), this.config.publicDir);
this.addListener(serveStaticListener(this, normalizeDirectory(this.config.publicDirPrefix), localPublicDir));
this.addProvider({
provide: PublicFilesystem, useFactory: () => {
return new PublicFilesystem(localPublicDir, this.config.publicDirPrefix);
},
});
}
if (this.config.debug) {
Zone.enable();
this.addProvider({
provide: OrmBrowserController,
useFactory: __assignType((registry) => new OrmBrowserController(registry.getDatabases()), [() => DatabaseRegistry, 'registry', '', 'PP7!2""/#']),
});
this.addController(DebugController);
this.addController(MediaController);
this.addController(OrmBrowserController);
registerDebugHttpController(this, this.config.debugUrl);
let ScopedDebugHttpController = class ScopedDebugHttpController extends DebugHttpController {
};
ScopedDebugHttpController.__type = [() => DebugHttpController, 'ScopedDebugHttpController', 'P7!5w"'];
ScopedDebugHttpController = __decorate([
http.controller(this.config.debugUrl)
], ScopedDebugHttpController);
this.addController(ScopedDebugHttpController);
//only register the RPC controller
this.addImport(new ApiConsoleModule({ listen: false, markdown: '' }).rename('internalApi'));
// this.setupProvider(LiveDatabase).enableChangeFeed(DebugRequest);
}
if (this.config.httpRpcBasePath) {
const rpcBaseUrl = this.config.httpRpcBasePath;
let HttpRpcController = class HttpRpcController {
constructor(rpcKernel) {
this.rpcKernel = rpcKernel;
}
async handle(controller, method, request, response) {
const connection = this.rpcKernel.createConnection({
write: __assignType((data) => {
}, ['data', '', 'P"2!"/"']),
bufferedAmount: __assignType(function bufferedAmount() {
return 0;
}, ['bufferedAmount', 'P"/!']),
close: __assignType(function close() {
}, ['close', 'P"/!']),
clientAddress: __assignType(function clientAddress() {
return request.socket.remoteAddress || '';
}, ['clientAddress', 'P"/!']),
});
request.body = await request.readBody();
await connection.onRequest(rpcBaseUrl, request, response);
return response;
}
};
HttpRpcController.__type = [() => RpcKernel, 'rpcKernel', 'constructor', () => __ΩHttpRegExp, ".*", 'controller', 'method', () => HttpRequest, 'request', () => HttpResponse, 'response', 'handle', 'HttpRpcController', 'PP7!2"<"0#P&.%o$#2&&2\'P7(2)P7*2+"0,5w-'];
__decorate([
http.GET(':controller/:method'),
http.POST(':controller/:method'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String, HttpRequest,
HttpResponse]),
__metadata("design:returntype", Promise)
], HttpRpcController.prototype, "handle", null);
HttpRpcController = __decorate([
http.controller(rpcBaseUrl),
__metadata("design:paramtypes", [RpcKernel])
], HttpRpcController);
this.addController(HttpRpcController);
}
const disconnect = __assignType(async (event, broker, store) => {
await store.close();
await broker.adapter.disconnect();
}, ['event', () => DebugBrokerBus, 'broker', () => StopwatchStore, 'store', '', 'P#2!P7"2#P7$2%"/&']);
this.addListener(onAppShutdown.listen(disconnect));
// Registering at onServerShutdown also so that ApplicationServer.close disconnects all connections.
this.addListener(onServerShutdown.listen(disconnect));
this.addProvider(DebugBrokerBus);
this.addProvider({ provide: StopwatchStore, useClass: FileStopwatchStore });
const stopwatch = (this.configureProvider.Ω = [[() => Stopwatch, 'P7!']], this.configureProvider(__assignType(stopwatch => {
if (this.config.profile || this.config.debug) {
stopwatch.enable();
}
else {
stopwatch.disable();
}
}, ['stopwatch', '', 'P"2!"/"']), { global: true }));
this.addExport(DebugBrokerBus, StopwatchStore);
}
postProcess() {
//all providers are known at this point
this.setupDatabase();
(this.configureProvider.Ω = [[() => FilesystemRegistry, 'P7!']], this.configureProvider(__assignType(v => {
for (const fs of this.filesystems) {
v.addFilesystem(fs.classType, fs.module);
}
}, ['v', '', 'P"2!"/"'])));
}
setupDatabase() {
for (const db of this.dbs) {
(this.configureProvider.Ω = [[() => DatabaseRegistry, 'P7!']], this.configureProvider(__assignType(v => v.addDatabase(db.classType, {}, db.module), ['v', '', 'P"2!"/"'])));
db.module.configureProvider(__assignType((db, eventDispatcher, logger, stopwatch) => {
db.setEventDispatcher(eventDispatcher);
db.setLogger(logger);
db.stopwatch = stopwatch;
}, [() => Database, 'db', () => EventDispatcher, 'eventDispatcher', () => Logger, 'logger', () => Stopwatch, 'stopwatch', '', 'PP7!2"P7#2$P7%2&P7\'2("/)']), {}, db.classType);
}
}
processProvider(module, token, provider) {
if (!isClass(token))
return;
if (isPrototypeOfBase(token, Database)) {
this.dbs.push({ classType: token, module });
}
if (isPrototypeOfBase(token, Filesystem)) {
this.filesystems.push({ classType: token, module });
}
}
processController(module, config) {
const controller = config.controller;
if (!controller)
return;
const rpcConfig = rpcClass._fetch(controller);
if (!rpcConfig)
return;
if (!module.isProvided(controller))
module.addProvider({ provide: controller, scope: 'rpc' });
if (this.rpcControllers.controllers.has(rpcConfig.getPath())) {
throw new Error(`Already an RPC controller with the name ${rpcConfig.getPath()} registered.`);
}
this.rpcControllers.controllers.set(rpcConfig.getPath(), { controller, module });
}
}
FrameworkModule.__type = [() => createModuleClass({ name: "framework", config: FrameworkConfig, providers: [ProcessLocker, ApplicationServer, WebWorkerFactory, RpcServer, MigrationProvider, DebugController, BrokerServer, FilesystemRegistry, { provide: DatabaseRegistry, useFactory: __assignType(ic => new DatabaseRegistry(ic), [() => InjectorContext, "ic", "", "PP7!2\"\"/#"]) }, { provide: RpcKernel, useFactory: __assignType(function useFactory(rpcControllers, injectorContext, logger, stopwatch) { const classType = stopwatch ? RpcKernelWithStopwatch : RpcKernel; const kernel = new classType(injectorContext, logger.scoped("rpc")); if (kernel instanceof RpcKernelWithStopwatch) {
kernel.stopwatch = stopwatch;
} for (const [name, info] of rpcControllers.controllers.entries()) {
kernel.registerController(info.controller, name, info.module);
} return kernel; }, [() => RpcControllers, "rpcControllers", () => InjectorContext, "injectorContext", () => Logger, "logger", () => Stopwatch, "stopwatch", "useFactory", "PP7!2\"P7#2$P7%2&P7'2(8\"/)"]) }, { provide: BrokerDeepkitAdapter, useFactory: __assignType(config => new BrokerDeepkitAdapter({ servers: getBrokerServers(config) }), [() => BrokerConfig, "config", "", "PP7!2\"\"/#"]) }, { provide: BrokerCache, useFactory: __assignType(adapter => new BrokerCache(adapter), [() => BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: BrokerLock, useFactory: __assignType(adapter => new BrokerLock(adapter), [() => BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: BrokerQueue, useFactory: __assignType(adapter => new BrokerQueue(adapter), [() => BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: BrokerBus, useFactory: __assignType(adapter => new BrokerBus(adapter), [() => BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: BrokerKeyValue, useFactory: __assignType(adapter => new BrokerKeyValue(adapter), [() => BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: SessionHandler, scope: "http" }, { provide: RpcKernelSecurity, scope: "rpc" }, { provide: HttpRequest, scope: "rpc", useValue: undefined }, { provide: RpcInjectorContext, scope: "rpc", useValue: undefined }, { provide: SessionState, scope: "rpc", useValue: undefined }, { provide: RpcKernelBaseConnection, scope: "rpc", useValue: undefined }, { provide: RpcKernelConnection, scope: "rpc", useValue: undefined }], listeners: [DatabaseListener, BrokerListener], controllers: [ServerStartController, DebugRouterController, DebugDIController, DebugProfileFramesCommand, DebugConfigController, MigrationUpCommand, MigrationDownCommand, MigrationPendingCommand, MigrationCreateController], exports: [ProcessLocker, ApplicationServer, WebWorkerFactory, RpcServer, RpcKernelSecurity, RpcKernel, MigrationProvider, DatabaseRegistry, SessionHandler, HttpRequest, RpcInjectorContext, SessionState, RpcKernelConnection, RpcKernelBaseConnection, BrokerDeepkitAdapter, BrokerCache, BrokerLock, BrokerQueue, BrokerBus, BrokerKeyValue, BrokerServer, FilesystemRegistry, HttpModule] }), 'imports', function () { return [
new HttpModule(),
]; }, 'name', function () { return 'framework'; }, () => AppModule, 'module', () => __ΩClassType, 'classType', 'dbs', function () { return []; }, () => AppModule, () => __ΩClassType, 'filesystems', function () { return []; }, 'rpcControllers', function () { return new RpcControllers; }, 'DeepPartial', 'options', 'constructor', 'process', 'postProcess', 'setupDatabase', () => AppModule, 'Token', 'token', 'ProviderWithScope', 'provider', 'processProvider', () => AppModule, 'ControllerConfig', 'config', 'processController', 'FrameworkModule', 'P7!!3">#&3$>%PP"7&4\'n(4)MF3*<>+PP"7,4\'n-4)MF3.<>/!30<>1P"w2238"04P"05P"06P"07<PP"782\'"w92:"w;2<"0=PP"7>2\'"w?2@"0A5wB'];
//# sourceMappingURL=module.js.map