@sodacore/cli
Version:
Sodacore CLI is a plugin that offers CLI functionality within the framework.
98 lines (97 loc) • 4.41 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);
};
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;