UNPKG

realm-object-server

Version:

Realm Object Server

139 lines 6.05 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); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const Logger_1 = require("../shared/Logger"); const websocket_1 = require("../shared/websocket"); const decorators_1 = require("../decorators"); const Server_1 = require("../Server"); const CircularBuffer = require("circular-buffer"); const http_1 = require("http"); const net_1 = require("net"); let LogService = class LogService { constructor() { this.logger = new Logger_1.MuteLogger(); this.rootLogger = new Logger_1.MuteLogger(); this.buffers = {}; for (const level in Logger_1.levels) { this.buffers[level] = new CircularBuffer(1000); } } streamLogs(req, socket, head) { return __awaiter(this, void 0, void 0, function* () { const client = yield this.wss.upgradeAuthenticated(req, socket, head, true); const level = req.params.level; const listener = (messageLevel, message, context = {}) => { if (this.isRelevantLevel(messageLevel, level) && client.readyState === client.OPEN) { if (!context.timestamp) { context.timestamp = new Date(); } const entry = { level: messageLevel, message, context }; client.send(JSON.stringify([entry])); } }; this.logger.debug("WebSocket client connected, adding a listener"); client.on("close", () => { this.logger.debug("WebSocket closed, removing the listener"); this.rootLogger.removeListener("message", listener); }); this.rootLogger.addListener("message", listener); const entries = this.buffers[level].toarray().map(({ level, msg, ctx }) => { return { level, message: msg, context: ctx || {} }; }); client.send(JSON.stringify(entries)); }); } setRootLogger(l) { this.rootLogger = l; } setLogger(l) { this.logger = l; if (this.wss) { this.wss.setLogger(l); } } message(level, msg, ctx) { for (const bufferLevel in this.buffers) { if (this.isRelevantLevel(level, bufferLevel)) { const timestampedCtx = Object.assign({}, ctx, { timestamp: new Date() }); this.buffers[bufferLevel].enq({ level, msg, ctx: timestampedCtx }); } } } isRelevantLevel(actualLevel, targetLevel) { return Logger_1.levels[targetLevel] >= Logger_1.levels[actualLevel]; } start(server) { return __awaiter(this, void 0, void 0, function* () { this.listener = this.message.bind(this); this.rootLogger.on("message", this.listener); this.wss = new websocket_1.ServiceWebSocketServer(this.logger, server.tokenValidator); }); } stop() { return __awaiter(this, void 0, void 0, function* () { this.rootLogger.removeListener("message", this.listener); this.wss.close(); }); } }; __decorate([ decorators_1.Upgrade("/:level"), __metadata("design:type", Function), __metadata("design:paramtypes", [http_1.IncomingMessage, net_1.Socket, ArrayBuffer]), __metadata("design:returntype", Promise) ], LogService.prototype, "streamLogs", null); __decorate([ decorators_1.Unmute(false), __metadata("design:type", Function), __metadata("design:paramtypes", [Logger_1.Logger]), __metadata("design:returntype", void 0) ], LogService.prototype, "setRootLogger", null); __decorate([ decorators_1.Unmute(), __metadata("design:type", Function), __metadata("design:paramtypes", [Logger_1.Logger]), __metadata("design:returntype", void 0) ], LogService.prototype, "setLogger", null); __decorate([ decorators_1.Start(), __metadata("design:type", Function), __metadata("design:paramtypes", [Server_1.Server]), __metadata("design:returntype", Promise) ], LogService.prototype, "start", null); __decorate([ decorators_1.Stop(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], LogService.prototype, "stop", null); LogService = __decorate([ decorators_1.BaseRoute("/log", { allowAnonymous: false }), decorators_1.ServiceName("log"), __metadata("design:paramtypes", []) ], LogService); exports.LogService = LogService; //# sourceMappingURL=LogService.js.map