realm-object-server
Version:
139 lines • 6.05 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);
};
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