UNPKG

@deepkit/framework

Version:

319 lines 21.8 kB
"use strict"; 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