UNPKG

@deepkit/framework

Version:

315 lines 19.8 kB
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