feat: 초기 프로젝트 설정 및 룰.md 파일 추가

This commit is contained in:
2025-07-28 09:53:31 +09:00
commit 09a4d38512
8165 changed files with 1021855 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
import { Feature } from '../featureManager';
export declare class DependenciesFeature implements Feature {
private transport;
private logger;
init(): void;
destroy(): void;
}

View File

@@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DependenciesFeature = void 0;
const serviceManager_1 = require("../serviceManager");
const Debug = require("debug");
const configuration_1 = require("../configuration");
const fs_1 = require("fs");
class DependenciesFeature {
constructor() {
this.logger = Debug('axm:features:dependencies');
}
init() {
this.transport = serviceManager_1.ServiceManager.get('transport');
this.logger('init');
const pkgPath = configuration_1.default.findPackageJson();
if (typeof pkgPath !== 'string')
return this.logger('failed to found pkg.json path');
this.logger(`found pkg.json in ${pkgPath}`);
(0, fs_1.readFile)(pkgPath, (err, data) => {
if (err)
return this.logger(`failed to read pkg.json`, err);
try {
const pkg = JSON.parse(data.toString());
if (typeof pkg.dependencies !== 'object') {
return this.logger(`failed to find deps in pkg.json`);
}
const dependencies = Object.keys(pkg.dependencies)
.reduce((list, name) => {
list[name] = { version: pkg.dependencies[name] };
return list;
}, {});
this.logger(`collected ${Object.keys(dependencies).length} dependencies`);
this.transport.send('application:dependencies', dependencies);
this.logger('sent dependencies list');
}
catch (err) {
return this.logger(`failed to parse pkg.json`, err);
}
});
}
destroy() {
this.logger('destroy');
}
}
exports.DependenciesFeature = DependenciesFeature;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmVzL2RlcGVuZGVuY2llcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBa0Q7QUFDbEQsK0JBQThCO0FBRzlCLG9EQUE0QztBQUM1QywyQkFBNkI7QUFLN0IsTUFBYSxtQkFBbUI7SUFBaEM7UUFHVSxXQUFNLEdBQWEsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFrQy9ELENBQUM7SUFoQ0MsSUFBSTtRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsK0JBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVuQixNQUFNLE9BQU8sR0FBRyx1QkFBYSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQy9DLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDM0MsSUFBQSxhQUFRLEVBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzlCLElBQUksR0FBRztnQkFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDM0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN6QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtnQkFDdkQsQ0FBQztnQkFDRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUErQixDQUFDO3FCQUNsRSxNQUFNLENBQUMsQ0FBQyxJQUFvQixFQUFFLElBQVksRUFBRSxFQUFFO29CQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFBO29CQUNoRCxPQUFPLElBQUksQ0FBQTtnQkFDYixDQUFDLEVBQUUsRUFBb0IsQ0FBQyxDQUFBO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxDQUFBO2dCQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsQ0FBQTtnQkFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1lBQ3ZDLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNyRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDeEIsQ0FBQztDQUNGO0FBckNELGtEQXFDQyJ9

View File

@@ -0,0 +1,11 @@
import { IOConfig } from '../pmx';
export declare class Entrypoint {
private io;
constructor();
events(): void;
sensors(): void;
actuators(): void;
onStart(cb: Function): void;
onStop(err: Error, cb: Function, code: number, signal: string): any;
conf(): IOConfig | undefined;
}

View File

@@ -0,0 +1,53 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Entrypoint = void 0;
const IO_KEY = Symbol.for('@pm2/io');
class Entrypoint {
constructor() {
try {
this.io = global[IO_KEY].init(this.conf());
this.onStart(err => {
if (err) {
console.error(err);
process.exit(1);
}
this.sensors();
this.events();
this.actuators();
this.io.onExit((code, signal) => {
this.onStop(err, () => {
this.io.destroy();
}, code, signal);
});
if (process && process.send)
process.send('ready');
});
}
catch (e) {
if (this.io) {
this.io.destroy();
}
throw (e);
}
}
events() {
return;
}
sensors() {
return;
}
actuators() {
return;
}
onStart(cb) {
throw new Error('Entrypoint onStart() not specified');
}
onStop(err, cb, code, signal) {
return cb();
}
conf() {
return undefined;
}
}
exports.Entrypoint = Entrypoint;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnlwb2ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlcy9lbnRyeXBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFcEMsTUFBYSxVQUFVO0lBR3JCO1FBQ0UsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRTFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDakIsQ0FBQztnQkFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO2dCQUNiLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtnQkFFaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTt3QkFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtvQkFDbkIsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtnQkFDbEIsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUk7b0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwRCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBRVgsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNuQixDQUFDO1lBRUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTTtJQUNSLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTTtJQUNSLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTTtJQUNSLENBQUM7SUFFRCxPQUFPLENBQUUsRUFBWTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVELE1BQU0sQ0FBRSxHQUFVLEVBQUUsRUFBWSxFQUFFLElBQVksRUFBRSxNQUFjO1FBQzVELE9BQU8sRUFBRSxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7Q0FDRjtBQTFERCxnQ0EwREMifQ==

View File

@@ -0,0 +1,8 @@
import { Feature } from '../featureManager';
export declare class EventsFeature implements Feature {
private transport;
private logger;
init(): void;
emit(name?: string, data?: any): any;
destroy(): void;
}

View File

@@ -0,0 +1,45 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventsFeature = void 0;
const serviceManager_1 = require("../serviceManager");
const Debug = require("debug");
class EventsFeature {
constructor() {
this.logger = Debug('axm:features:events');
}
init() {
this.transport = serviceManager_1.ServiceManager.get('transport');
this.logger('init');
}
emit(name, data) {
if (typeof name !== 'string') {
console.error('event name must be a string');
return console.trace();
}
if (typeof data !== 'object') {
console.error('event data must be an object');
return console.trace();
}
if (data instanceof Array) {
console.error(`event data cannot be an array`);
return console.trace();
}
let inflightObj = {};
try {
inflightObj = JSON.parse(JSON.stringify(data));
}
catch (err) {
return console.log('Failed to serialize the event data', err.message);
}
inflightObj.__name = name;
if (this.transport === undefined) {
return this.logger('Failed to send event as transporter isnt available');
}
this.transport.send('human:event', inflightObj);
}
destroy() {
this.logger('destroy');
}
}
exports.EventsFeature = EventsFeature;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmVzL2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBa0Q7QUFHbEQsK0JBQThCO0FBRTlCLE1BQWEsYUFBYTtJQUExQjtRQUdVLFdBQU0sR0FBYSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQXNDekQsQ0FBQztJQXBDQyxJQUFJO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRywrQkFBYyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFFRCxJQUFJLENBQUUsSUFBYSxFQUFFLElBQVU7UUFDN0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7WUFDNUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDeEIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQzdDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3hCLENBQUM7UUFDRCxJQUFJLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7WUFDOUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDeEIsQ0FBQztRQUVELElBQUksV0FBVyxHQUFpQixFQUFFLENBQUE7UUFDbEMsSUFBSSxDQUFDO1lBQ0gsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FDRjtBQXpDRCxzQ0F5Q0MifQ==

View File

@@ -0,0 +1,24 @@
import { Feature } from '../featureManager';
import { EventLoopMetricOption } from '../metrics/eventLoopMetrics';
import { NetworkTrafficConfig } from '../metrics/network';
import { HttpMetricsConfig } from '../metrics/httpMetrics';
import { V8MetricsConfig } from '../metrics/v8';
import { RuntimeMetricsOptions } from '../metrics/runtime';
export declare const defaultMetricConf: MetricConfig;
export declare class MetricConfig {
v8?: V8MetricsConfig | boolean;
runtime?: RuntimeMetricsOptions | boolean;
http?: HttpMetricsConfig | boolean;
network?: NetworkTrafficConfig | boolean;
eventLoop?: EventLoopMetricOption | boolean;
}
export interface MetricInterface {
init(config?: Object | boolean): void;
destroy(): void;
}
export declare class MetricsFeature implements Feature {
private logger;
init(options?: Object): void;
get(name: string): MetricInterface | undefined;
destroy(): void;
}

View File

@@ -0,0 +1,90 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetricsFeature = exports.MetricConfig = exports.defaultMetricConf = void 0;
const debug_1 = require("debug");
const featureManager_1 = require("../featureManager");
const eventLoopMetrics_1 = require("../metrics/eventLoopMetrics");
const network_1 = require("../metrics/network");
const httpMetrics_1 = require("../metrics/httpMetrics");
const v8_1 = require("../metrics/v8");
const runtime_1 = require("../metrics/runtime");
exports.defaultMetricConf = {
eventLoop: true,
network: false,
http: true,
runtime: true,
v8: true
};
class MetricConfig {
}
exports.MetricConfig = MetricConfig;
class AvailableMetric {
}
const availableMetrics = [
{
name: 'eventloop',
module: eventLoopMetrics_1.default,
optionsPath: 'eventLoop'
},
{
name: 'http',
module: httpMetrics_1.default,
optionsPath: 'http'
},
{
name: 'network',
module: network_1.default,
optionsPath: 'network'
},
{
name: 'v8',
module: v8_1.default,
optionsPath: 'v8'
},
{
name: 'runtime',
module: runtime_1.default,
optionsPath: 'runtime'
}
];
class MetricsFeature {
constructor() {
this.logger = (0, debug_1.default)('axm:features:metrics');
}
init(options) {
if (typeof options !== 'object')
options = {};
this.logger('init');
for (let availableMetric of availableMetrics) {
const metric = new availableMetric.module();
let config = undefined;
if (typeof availableMetric.optionsPath !== 'string') {
config = {};
}
else if (availableMetric.optionsPath === '.') {
config = options;
}
else {
config = (0, featureManager_1.getObjectAtPath)(options, availableMetric.optionsPath);
}
metric.init(config);
availableMetric.instance = metric;
}
}
get(name) {
const metric = availableMetrics.find(metric => metric.name === name);
if (metric === undefined)
return undefined;
return metric.instance;
}
destroy() {
this.logger('destroy');
for (let availableMetric of availableMetrics) {
if (availableMetric.instance === undefined)
continue;
availableMetric.instance.destroy();
}
}
}
exports.MetricsFeature = MetricsFeature;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlcy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUF5QjtBQUN6QixzREFBNEQ7QUFDNUQsa0VBQW1HO0FBQ25HLGdEQUF3RTtBQUN4RSx3REFBdUU7QUFDdkUsc0NBQXlEO0FBQ3pELGdEQUEwRTtBQUU3RCxRQUFBLGlCQUFpQixHQUFpQjtJQUM3QyxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxLQUFLO0lBQ2QsSUFBSSxFQUFFLElBQUk7SUFDVixPQUFPLEVBQUUsSUFBSTtJQUNiLEVBQUUsRUFBRSxJQUFJO0NBQ1QsQ0FBQTtBQUVELE1BQWEsWUFBWTtDQXVCeEI7QUF2QkQsb0NBdUJDO0FBRUQsTUFBTSxlQUFlO0NBcUJwQjtBQUVELE1BQU0sZ0JBQWdCLEdBQXNCO0lBQzFDO1FBQ0UsSUFBSSxFQUFFLFdBQVc7UUFDakIsTUFBTSxFQUFFLDBCQUE4QjtRQUN0QyxXQUFXLEVBQUUsV0FBVztLQUN6QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUscUJBQVc7UUFDbkIsV0FBVyxFQUFFLE1BQU07S0FDcEI7SUFDRDtRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLGlCQUFhO1FBQ3JCLFdBQVcsRUFBRSxTQUFTO0tBQ3ZCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsSUFBSTtRQUNWLE1BQU0sRUFBRSxZQUFRO1FBQ2hCLFdBQVcsRUFBRSxJQUFJO0tBQ2xCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxpQkFBYztRQUN0QixXQUFXLEVBQUUsU0FBUztLQUN2QjtDQUNGLENBQUE7QUFPRCxNQUFhLGNBQWM7SUFBM0I7UUFFVSxXQUFNLEdBQWEsSUFBQSxlQUFLLEVBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQXFDMUQsQ0FBQztJQW5DQyxJQUFJLENBQUUsT0FBZ0I7UUFDcEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1lBQUUsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRW5CLEtBQUssSUFBSSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUMzQyxJQUFJLE1BQU0sR0FBUSxTQUFTLENBQUE7WUFDM0IsSUFBSSxPQUFPLGVBQWUsQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sR0FBRyxFQUFFLENBQUE7WUFDYixDQUFDO2lCQUFNLElBQUksZUFBZSxDQUFDLFdBQVcsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxHQUFHLE9BQU8sQ0FBQTtZQUNsQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLElBQUEsZ0NBQWUsRUFBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ2hFLENBQUM7WUFJRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ25CLGVBQWUsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsR0FBRyxDQUFFLElBQVk7UUFDZixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFBO1FBQ3BFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFDeEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3RCLEtBQUssSUFBSSxlQUFlLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QyxJQUFJLGVBQWUsQ0FBQyxRQUFRLEtBQUssU0FBUztnQkFBRSxTQUFRO1lBQ3BELGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDcEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZDRCx3Q0F1Q0MifQ==

View File

@@ -0,0 +1,23 @@
import { Feature } from '../featureManager';
export declare class NotifyOptions {
catchExceptions: boolean;
}
export declare class ErrorContext {
http?: Object;
custom?: Object;
}
export declare class NotifyFeature implements Feature {
private logger;
private transport;
private cache;
private stackParser;
init(options?: NotifyOptions): any;
destroy(): void;
getSafeError(err: any): Error;
notifyError(err: Error | string | {}, context?: ErrorContext): any;
private onUncaughtException;
private onUnhandledRejection;
private catchAll;
expressErrorHandler(): (err: any, req: any, res: any, next: any) => any;
koaErrorHandler(): (ctx: any, next: any) => Promise<void>;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
import { Feature } from '../featureManager';
export interface ProfilerType {
init(): void;
register(): void;
destroy(): void;
}
export declare class ProfilingConfig {
cpuJS: boolean;
heapSnapshot: boolean;
heapSampling: boolean;
implementation?: string;
}
export declare class ProfilingFeature implements Feature {
private profiler;
private logger;
init(config?: ProfilingConfig | boolean): any;
destroy(): void;
}

View File

@@ -0,0 +1,69 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProfilingFeature = exports.ProfilingConfig = void 0;
const addonProfiler_1 = require("../profilers/addonProfiler");
const inspectorProfiler_1 = require("../profilers/inspectorProfiler");
const constants_1 = require("../constants");
const Debug = require("debug");
class ProfilingConfig {
}
exports.ProfilingConfig = ProfilingConfig;
const defaultProfilingConfig = {
cpuJS: true,
heapSnapshot: true,
heapSampling: true,
implementation: 'both'
};
const disabledProfilingConfig = {
cpuJS: false,
heapSnapshot: false,
heapSampling: false,
implementation: 'none'
};
class ProfilingFeature {
constructor() {
this.logger = Debug('axm:features:profiling');
}
init(config) {
if (config === true) {
config = defaultProfilingConfig;
}
else if (config === false) {
config = disabledProfilingConfig;
}
else if (config === undefined) {
config = defaultProfilingConfig;
}
if (process.env.PM2_PROFILING_FORCE_FALLBACK === 'true') {
config.implementation = 'addon';
}
if (config.implementation === undefined || config.implementation === 'both') {
config.implementation = (0, constants_1.canUseInspector)() === true ? 'inspector' : 'addon';
}
switch (config.implementation) {
case 'inspector': {
this.logger('using inspector implementation');
this.profiler = new inspectorProfiler_1.default();
break;
}
case 'addon': {
this.logger('using addon implementation');
this.profiler = new addonProfiler_1.default();
break;
}
default: {
return this.logger(`Invalid profiler implementation choosen: ${config.implementation}`);
}
}
this.logger('init');
this.profiler.init();
}
destroy() {
this.logger('destroy');
if (this.profiler === undefined)
return;
this.profiler.destroy();
}
}
exports.ProfilingFeature = ProfilingFeature;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmVzL3Byb2ZpbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw4REFBc0Q7QUFDdEQsc0VBQThEO0FBQzlELDRDQUE4QztBQUM5QywrQkFBOEI7QUFROUIsTUFBYSxlQUFlO0NBSzNCO0FBTEQsMENBS0M7QUFFRCxNQUFNLHNCQUFzQixHQUFvQjtJQUM5QyxLQUFLLEVBQUUsSUFBSTtJQUNYLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGNBQWMsRUFBRSxNQUFNO0NBQ3ZCLENBQUE7QUFFRCxNQUFNLHVCQUF1QixHQUFvQjtJQUMvQyxLQUFLLEVBQUUsS0FBSztJQUNaLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQVksRUFBRSxLQUFLO0lBQ25CLGNBQWMsRUFBRSxNQUFNO0NBQ3ZCLENBQUE7QUFFRCxNQUFhLGdCQUFnQjtJQUE3QjtRQUdVLFdBQU0sR0FBYSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQTRDNUQsQ0FBQztJQTFDQyxJQUFJLENBQUUsTUFBa0M7UUFDdEMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEIsTUFBTSxHQUFHLHNCQUFzQixDQUFBO1FBQ2pDLENBQUM7YUFBTSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsdUJBQXVCLENBQUE7UUFDbEMsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQTtRQUNqQyxDQUFDO1FBR0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFBO1FBQ2pDLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDNUUsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFBLDJCQUFlLEdBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO1FBQzVFLENBQUM7UUFFRCxRQUFRLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QixLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtnQkFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDJCQUFpQixFQUFFLENBQUE7Z0JBQ3ZDLE1BQUs7WUFDUCxDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtnQkFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUFhLEVBQUUsQ0FBQTtnQkFDbkMsTUFBSztZQUNQLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyw0Q0FBNEMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7WUFDekYsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTTtRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3pCLENBQUM7Q0FDRjtBQS9DRCw0Q0ErQ0MifQ==