UNPKG

@sodacore/cli

Version:

Sodacore CLI is a plugin that offers CLI functionality within the framework.

98 lines (97 loc) 4.41 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); }; import { listen } from 'bun'; import { BaseService, Service } from '@sodacore/core'; import { Inject, Utils } from '@sodacore/di'; import { Registry } from '@sodacore/registry'; let CliService = class CliService extends BaseService { constructor() { super(...arguments); this.connections = new Map(); this.controllers = []; } async init() { // Let's look for controllers/middleware. const modules = Registry.all(); for (const module of modules) { // Define the variables const type = Utils.getMeta('type', 'autowire')(module.constructor); const services = Utils.getMeta('services', 'controller')(module.constructor, undefined, []); // Check for valid type and service it is for. if (!type || !services.includes('cli')) continue; // If a controller type. if (type === 'controller') { this.controllers.push({ namespace: Utils.getMeta('namespace', 'cli')(module.constructor), methods: Utils.getMeta('methods', 'cli')(module.constructor, undefined, []), module, }); } } } async start() { this.logger.info('[CLI]: Starting CLI service...'); this.server = listen({ port: this.config.port ?? 36445, hostname: this.config.host ?? 'localhost', socket: { open: socket => { this.logger.info(`[CLI]: Received a new connection from: ${socket.remoteAddress}.`); const uid = Symbol('CLI/SOCKET/CONNECTION'); socket.data.uid = uid; this.connections.set(uid, socket); }, close: socket => { this.logger.info(`[CLI]: Connection: ${socket.remoteAddress} has disconnected.`); const uid = socket.data.uid; if (uid) this.connections.delete(uid); else this.logger.warn(`[CLI]: Connection: ${socket.remoteAddress} does not have a valid UID.`); }, data: (socket, data) => { this.handle(socket, data.toJSON()); }, drain: socket => { this.logger.info(`[CLI]: Connection: ${socket.remoteAddress} has drained.`); }, error: (socket, error) => { this.logger.error(`[CLI]: Error on connection: ${socket.remoteAddress}, error: ${error.message}.`); const uid = socket.data.uid; if (uid) this.connections.delete(uid); else this.logger.warn(`[CLI]: Connection: ${socket.remoteAddress} does not have a valid UID.`); socket.terminate(); }, }, }); this.logger.info(`[CLI]: CLI service started on port: ${this.config.host ?? 'localhost'}:${this.config.port ?? 36445}.`); } async stop() { this.logger.info('[CLI]: Stopping CLI service.'); if (!this.server) return; this.server.stop(true); this.server = undefined; } async handle(socket, data) { console.log('CLI:HANDLE', data, typeof socket, socket.data); } }; __decorate([ Inject('@cli:config'), __metadata("design:type", Object) ], CliService.prototype, "config", void 0); CliService = __decorate([ Service() ], CliService); export default CliService;