@deepkit/framework
Version:
319 lines • 21.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);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FrameworkModule = void 0;
/*@ts-ignore*/
const { __ΩHttpRegExp } = require('@deepkit/http');
/*@ts-ignore*/
const { __ΩClassType } = require('@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.
*/
const core_1 = require("@deepkit/core");
const event_1 = require("@deepkit/event");
const path_1 = require("path");
const application_server_js_1 = require("./application-server.js");
const debug_router_js_1 = require("./cli/debug-router.js");
const debug_di_js_1 = require("./cli/debug-di.js");
const server_start_js_1 = require("./cli/server-start.js");
const debug_controller_js_1 = require("./debug/debug.controller.js");
const http_debug_controller_js_1 = require("./debug/http-debug.controller.js");
const http_1 = require("@deepkit/http");
const injector_1 = require("@deepkit/injector");
const module_config_js_1 = require("./module.config.js");
const logger_1 = require("@deepkit/logger");
const session_js_1 = require("./session.js");
const worker_js_1 = require("./worker.js");
const stopwatch_1 = require("@deepkit/stopwatch");
const controller_js_1 = require("./orm-browser/controller.js");
const database_listener_js_1 = require("./database/database-listener.js");
const orm_1 = require("@deepkit/orm");
const commands_1 = require("@deepkit/sql/commands");
const store_js_1 = require("./debug/stopwatch/store.js");
const debug_debug_frames_js_1 = require("./cli/debug-debug-frames.js");
const rpc_1 = require("@deepkit/rpc");
const app_config_js_1 = require("./cli/app-config.js");
const zone_js_1 = require("./zone.js");
const broker_js_1 = require("./debug/broker.js");
const api_console_module_1 = require("@deepkit/api-console-module");
const app_1 = require("@deepkit/app");
const rpc_js_1 = require("./rpc.js");
const utils_js_1 = require("./utils.js");
const filesystem_js_1 = require("./filesystem.js");
const filesystem_1 = require("@deepkit/filesystem");
const media_controller_js_1 = require("./debug/media.controller.js");
const debug_http_controller_js_1 = require("./debug/debug-http.controller.js");
const broker_js_2 = require("./broker/broker.js");
const listener_js_1 = require("./broker/listener.js");
const broker_1 = require("@deepkit/broker");
const broker_js_3 = require("./broker.js");
class FrameworkModule extends (0, app_1.createModuleClass)({
name: 'framework',
config: module_config_js_1.FrameworkConfig,
providers: [
core_1.ProcessLocker,
application_server_js_1.ApplicationServer,
worker_js_1.WebWorkerFactory,
worker_js_1.RpcServer,
commands_1.MigrationProvider,
debug_controller_js_1.DebugController,
broker_js_2.BrokerServer,
filesystem_js_1.FilesystemRegistry,
{ provide: orm_1.DatabaseRegistry, useFactory: __assignType((ic) => new orm_1.DatabaseRegistry(ic), [() => injector_1.InjectorContext, 'ic', '', 'PP7!2""/#']) },
{
provide: rpc_1.RpcKernel,
useFactory: __assignType(function useFactory(rpcControllers, injectorContext, logger, stopwatch) {
const classType = stopwatch ? rpc_js_1.RpcKernelWithStopwatch : rpc_1.RpcKernel;
const kernel = new classType(injectorContext, logger.scoped('rpc'));
if (kernel instanceof rpc_js_1.RpcKernelWithStopwatch) {
kernel.stopwatch = stopwatch;
}
for (const [name, info] of rpcControllers.controllers.entries()) {
kernel.registerController(info.controller, name, info.module);
}
return kernel;
}, [() => rpc_js_1.RpcControllers, 'rpcControllers', () => injector_1.InjectorContext, 'injectorContext', () => logger_1.Logger, 'logger', () => stopwatch_1.Stopwatch, 'stopwatch', 'useFactory', 'PP7!2"P7#2$P7%2&P7\'2(8"/)']),
},
{
provide: broker_1.BrokerDeepkitAdapter,
useFactory: __assignType((config) => new broker_1.BrokerDeepkitAdapter({ servers: (0, broker_js_3.getBrokerServers)(config) }), [() => module_config_js_1.BrokerConfig, 'config', '', 'PP7!2""/#']),
},
{ provide: broker_1.BrokerCache, useFactory: __assignType((adapter) => new broker_1.BrokerCache(adapter), [() => broker_1.BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: broker_1.BrokerLock, useFactory: __assignType((adapter) => new broker_1.BrokerLock(adapter), [() => broker_1.BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: broker_1.BrokerQueue, useFactory: __assignType((adapter) => new broker_1.BrokerQueue(adapter), [() => broker_1.BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: broker_1.BrokerBus, useFactory: __assignType((adapter) => new broker_1.BrokerBus(adapter), [() => broker_1.BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
{ provide: broker_1.BrokerKeyValue, useFactory: __assignType((adapter) => new broker_1.BrokerKeyValue(adapter), [() => broker_1.BrokerDeepkitAdapter, 'adapter', '', 'PP7!2""/#']) },
//move to HttpModule?
{ provide: session_js_1.SessionHandler, scope: 'http' },
// { provide: LiveDatabase, scope: 'rpc' },
{ provide: rpc_1.RpcKernelSecurity, scope: 'rpc' },
//all of these will be set on scope creation
{ provide: http_1.HttpRequest, scope: 'rpc', useValue: undefined },
{ provide: rpc_js_1.RpcInjectorContext, scope: 'rpc', useValue: undefined },
{ provide: rpc_1.SessionState, scope: 'rpc', useValue: undefined },
{ provide: rpc_1.RpcKernelBaseConnection, scope: 'rpc', useValue: undefined },
{ provide: rpc_1.RpcKernelConnection, scope: 'rpc', useValue: undefined },
],
listeners: [
database_listener_js_1.DatabaseListener,
listener_js_1.BrokerListener,
],
controllers: [
server_start_js_1.ServerStartController,
debug_router_js_1.DebugRouterController,
debug_di_js_1.DebugDIController,
debug_debug_frames_js_1.DebugProfileFramesCommand,
app_config_js_1.DebugConfigController,
commands_1.MigrationUpCommand,
commands_1.MigrationDownCommand,
commands_1.MigrationPendingCommand,
commands_1.MigrationCreateController,
],
exports: [
core_1.ProcessLocker,
application_server_js_1.ApplicationServer,
worker_js_1.WebWorkerFactory,
worker_js_1.RpcServer,
rpc_1.RpcKernelSecurity,
rpc_1.RpcKernel,
commands_1.MigrationProvider,
orm_1.DatabaseRegistry,
session_js_1.SessionHandler,
http_1.HttpRequest,
rpc_js_1.RpcInjectorContext,
rpc_1.SessionState,
rpc_1.RpcKernelConnection,
rpc_1.RpcKernelBaseConnection,
broker_1.BrokerDeepkitAdapter,
broker_1.BrokerCache,
broker_1.BrokerLock,
broker_1.BrokerQueue,
broker_1.BrokerBus,
broker_1.BrokerKeyValue,
broker_js_2.BrokerServer,
filesystem_js_1.FilesystemRegistry,
http_1.HttpModule,
],
}) {
constructor(options) {
super(options);
this.imports = [
new http_1.HttpModule(),
];
this.name = 'framework';
this.dbs = [];
this.filesystems = [];
this.rpcControllers = new rpc_js_1.RpcControllers;
}
process() {
this.addImport();
this.addProvider({ provide: rpc_js_1.RpcControllers, useValue: this.rpcControllers });
(this.configureProvider.Ω = [[() => commands_1.MigrationProvider, 'P7!']], this.configureProvider(__assignType(v => v.setMigrationDir(this.config.migrationDir), ['v', '', 'P"2!"/"'])));
(this.configureProvider.Ω = [[() => orm_1.DatabaseRegistry, 'P7!']], this.configureProvider(__assignType(v => v.setMigrateOnStartup(this.config.migrateOnStartup), ['v', '', 'P"2!"/"'])));
if (this.config.httpLog) {
this.addListener(http_1.HttpLogger);
}
this.getImportedModuleByClass(http_1.HttpModule).configure(this.config.http);
if (this.config.logStartup) {
this.addListener(application_server_js_1.LogStartupListener);
}
if (this.config.publicDir) {
const localPublicDir = (0, path_1.isAbsolute)(this.config.publicDir) ? this.config.publicDir :
(0, path_1.join)(process.cwd(), this.config.publicDir);
this.addListener((0, http_1.serveStaticListener)(this, (0, utils_js_1.normalizeDirectory)(this.config.publicDirPrefix), localPublicDir));
this.addProvider({
provide: filesystem_js_1.PublicFilesystem, useFactory: () => {
return new filesystem_js_1.PublicFilesystem(localPublicDir, this.config.publicDirPrefix);
},
});
}
if (this.config.debug) {
zone_js_1.Zone.enable();
this.addProvider({
provide: controller_js_1.OrmBrowserController,
useFactory: __assignType((registry) => new controller_js_1.OrmBrowserController(registry.getDatabases()), [() => orm_1.DatabaseRegistry, 'registry', '', 'PP7!2""/#']),
});
this.addController(debug_controller_js_1.DebugController);
this.addController(media_controller_js_1.MediaController);
this.addController(controller_js_1.OrmBrowserController);
(0, http_debug_controller_js_1.registerDebugHttpController)(this, this.config.debugUrl);
let ScopedDebugHttpController = class ScopedDebugHttpController extends debug_http_controller_js_1.DebugHttpController {
};
ScopedDebugHttpController.__type = [() => debug_http_controller_js_1.DebugHttpController, 'ScopedDebugHttpController', 'P7!5w"'];
ScopedDebugHttpController = __decorate([
http_1.http.controller(this.config.debugUrl)
], ScopedDebugHttpController);
this.addController(ScopedDebugHttpController);
//only register the RPC controller
this.addImport(new api_console_module_1.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 = [() => rpc_1.RpcKernel, 'rpcKernel', 'constructor', () => __ΩHttpRegExp, ".*", 'controller', 'method', () => http_1.HttpRequest, 'request', () => http_1.HttpResponse, 'response', 'handle', 'HttpRpcController', 'PP7!2"<"0#P&.%o$#2&&2\'P7(2)P7*2+"0,5w-'];
__decorate([
http_1.http.GET(':controller/:method'),
http_1.http.POST(':controller/:method'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String, http_1.HttpRequest,
http_1.HttpResponse]),
__metadata("design:returntype", Promise)
], HttpRpcController.prototype, "handle", null);
HttpRpcController = __decorate([
http_1.http.controller(rpcBaseUrl),
__metadata("design:paramtypes", [rpc_1.RpcKernel])
], HttpRpcController);
this.addController(HttpRpcController);
}
const disconnect = __assignType(async (event, broker, store) => {
await store.close();
await broker.adapter.disconnect();
}, ['event', () => broker_js_1.DebugBrokerBus, 'broker', () => stopwatch_1.StopwatchStore, 'store', '', 'P#2!P7"2#P7$2%"/&']);
this.addListener(app_1.onAppShutdown.listen(disconnect));
// Registering at onServerShutdown also so that ApplicationServer.close disconnects all connections.
this.addListener(application_server_js_1.onServerShutdown.listen(disconnect));
this.addProvider(broker_js_1.DebugBrokerBus);
this.addProvider({ provide: stopwatch_1.StopwatchStore, useClass: store_js_1.FileStopwatchStore });
const stopwatch = (this.configureProvider.Ω = [[() => stopwatch_1.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(broker_js_1.DebugBrokerBus, stopwatch_1.StopwatchStore);
}
postProcess() {
//all providers are known at this point
this.setupDatabase();
(this.configureProvider.Ω = [[() => filesystem_js_1.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.Ω = [[() => orm_1.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;
}, [() => orm_1.Database, 'db', () => event_1.EventDispatcher, 'eventDispatcher', () => logger_1.Logger, 'logger', () => stopwatch_1.Stopwatch, 'stopwatch', '', 'PP7!2"P7#2$P7%2&P7\'2("/)']), {}, db.classType);
}
}
processProvider(module, token, provider) {
if (!(0, core_1.isClass)(token))
return;
if ((0, core_1.isPrototypeOfBase)(token, orm_1.Database)) {
this.dbs.push({ classType: token, module });
}
if ((0, core_1.isPrototypeOfBase)(token, filesystem_1.Filesystem)) {
this.filesystems.push({ classType: token, module });
}
}
processController(module, config) {
const controller = config.controller;
if (!controller)
return;
const rpcConfig = rpc_1.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 });
}
}
exports.FrameworkModule = FrameworkModule;
FrameworkModule.__type = [() => (0, app_1.createModuleClass)({ name: "framework", config: module_config_js_1.FrameworkConfig, providers: [core_1.ProcessLocker, application_server_js_1.ApplicationServer, worker_js_1.WebWorkerFactory, worker_js_1.RpcServer, commands_1.MigrationProvider, debug_controller_js_1.DebugController, broker_js_2.BrokerServer, filesystem_js_1.FilesystemRegistry, { provide: orm_1.DatabaseRegistry, useFactory: __assignType(ic => new orm_1.DatabaseRegistry(ic), [() => injector_1.InjectorContext, "ic", "", "PP7!2\"\"/#"]) }, { provide: rpc_1.RpcKernel, useFactory: __assignType(function useFactory(rpcControllers, injectorContext, logger, stopwatch) { const classType = stopwatch ? rpc_js_1.RpcKernelWithStopwatch : rpc_1.RpcKernel; const kernel = new classType(injectorContext, logger.scoped("rpc")); if (kernel instanceof rpc_js_1.RpcKernelWithStopwatch) {
kernel.stopwatch = stopwatch;
} for (const [name, info] of rpcControllers.controllers.entries()) {
kernel.registerController(info.controller, name, info.module);
} return kernel; }, [() => rpc_js_1.RpcControllers, "rpcControllers", () => injector_1.InjectorContext, "injectorContext", () => logger_1.Logger, "logger", () => stopwatch_1.Stopwatch, "stopwatch", "useFactory", "PP7!2\"P7#2$P7%2&P7'2(8\"/)"]) }, { provide: broker_1.BrokerDeepkitAdapter, useFactory: __assignType(config => new broker_1.BrokerDeepkitAdapter({ servers: (0, broker_js_3.getBrokerServers)(config) }), [() => module_config_js_1.BrokerConfig, "config", "", "PP7!2\"\"/#"]) }, { provide: broker_1.BrokerCache, useFactory: __assignType(adapter => new broker_1.BrokerCache(adapter), [() => broker_1.BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: broker_1.BrokerLock, useFactory: __assignType(adapter => new broker_1.BrokerLock(adapter), [() => broker_1.BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: broker_1.BrokerQueue, useFactory: __assignType(adapter => new broker_1.BrokerQueue(adapter), [() => broker_1.BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: broker_1.BrokerBus, useFactory: __assignType(adapter => new broker_1.BrokerBus(adapter), [() => broker_1.BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: broker_1.BrokerKeyValue, useFactory: __assignType(adapter => new broker_1.BrokerKeyValue(adapter), [() => broker_1.BrokerDeepkitAdapter, "adapter", "", "PP7!2\"\"/#"]) }, { provide: session_js_1.SessionHandler, scope: "http" }, { provide: rpc_1.RpcKernelSecurity, scope: "rpc" }, { provide: http_1.HttpRequest, scope: "rpc", useValue: undefined }, { provide: rpc_js_1.RpcInjectorContext, scope: "rpc", useValue: undefined }, { provide: rpc_1.SessionState, scope: "rpc", useValue: undefined }, { provide: rpc_1.RpcKernelBaseConnection, scope: "rpc", useValue: undefined }, { provide: rpc_1.RpcKernelConnection, scope: "rpc", useValue: undefined }], listeners: [database_listener_js_1.DatabaseListener, listener_js_1.BrokerListener], controllers: [server_start_js_1.ServerStartController, debug_router_js_1.DebugRouterController, debug_di_js_1.DebugDIController, debug_debug_frames_js_1.DebugProfileFramesCommand, app_config_js_1.DebugConfigController, commands_1.MigrationUpCommand, commands_1.MigrationDownCommand, commands_1.MigrationPendingCommand, commands_1.MigrationCreateController], exports: [core_1.ProcessLocker, application_server_js_1.ApplicationServer, worker_js_1.WebWorkerFactory, worker_js_1.RpcServer, rpc_1.RpcKernelSecurity, rpc_1.RpcKernel, commands_1.MigrationProvider, orm_1.DatabaseRegistry, session_js_1.SessionHandler, http_1.HttpRequest, rpc_js_1.RpcInjectorContext, rpc_1.SessionState, rpc_1.RpcKernelConnection, rpc_1.RpcKernelBaseConnection, broker_1.BrokerDeepkitAdapter, broker_1.BrokerCache, broker_1.BrokerLock, broker_1.BrokerQueue, broker_1.BrokerBus, broker_1.BrokerKeyValue, broker_js_2.BrokerServer, filesystem_js_1.FilesystemRegistry, http_1.HttpModule] }), 'imports', function () { return [
new http_1.HttpModule(),
]; }, 'name', function () { return 'framework'; }, () => app_1.AppModule, 'module', () => __ΩClassType, 'classType', 'dbs', function () { return []; }, () => app_1.AppModule, () => __ΩClassType, 'filesystems', function () { return []; }, 'rpcControllers', function () { return new rpc_js_1.RpcControllers; }, 'DeepPartial', 'options', 'constructor', 'process', 'postProcess', 'setupDatabase', () => app_1.AppModule, 'Token', 'token', 'ProviderWithScope', 'provider', 'processProvider', () => app_1.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
;