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,20 @@
export declare class Action {
handler: Function;
name: string;
type: string;
isScoped: boolean;
callback?: Function;
arity: number;
opts: Object | null | undefined;
}
export declare class ActionService {
private timer;
private transport;
private actions;
private logger;
private listener;
init(): void;
destroy(): void;
registerAction(actionName?: string, opts?: Object | undefined | Function, handler?: Function): void;
scopedAction(actionName?: string, handler?: Function): any;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
/// <reference types="node" />
import * as inspector from 'inspector';
export declare class InspectorService {
private session;
private logger;
init(): inspector.Session;
getSession(): inspector.Session;
destroy(): void;
}

View File

@@ -0,0 +1,43 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InspectorService = void 0;
const inspector = require("inspector");
const debug_1 = require("debug");
class InspectorService {
constructor() {
this.session = null;
this.logger = (0, debug_1.default)('axm:services:inspector');
}
init() {
this.logger(`Creating new inspector session`);
this.session = new inspector.Session();
this.session.connect();
this.logger('Connected to inspector');
this.session.post('Profiler.enable');
this.session.post('HeapProfiler.enable');
return this.session;
}
getSession() {
if (this.session === null) {
this.session = this.init();
return this.session;
}
else {
return this.session;
}
}
destroy() {
if (this.session !== null) {
this.session.post('Profiler.disable');
this.session.post('HeapProfiler.disable');
this.session.disconnect();
this.session = null;
}
else {
this.logger('No open session');
}
}
}
exports.InspectorService = InspectorService;
module.exports = InspectorService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2luc3BlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBc0M7QUFDdEMsaUNBQXlCO0FBRXpCLE1BQWEsZ0JBQWdCO0lBQTdCO1FBRVUsWUFBTyxHQUE2QixJQUFJLENBQUE7UUFDeEMsV0FBTSxHQUFhLElBQUEsZUFBSyxFQUFDLHdCQUF3QixDQUFDLENBQUE7SUErQjVELENBQUM7SUE3QkMsSUFBSTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDckIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDMUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3JCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7WUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNyQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUNoQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbENELDRDQWtDQztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUEifQ==

View File

@@ -0,0 +1,63 @@
import Meter from '../utils/metrics/meter';
import Counter from '../utils/metrics/counter';
import Histogram from '../utils/metrics/histogram';
import { Service } from '../serviceManager';
import Gauge from '../utils/metrics/gauge';
export declare enum MetricType {
'meter' = "meter",
'histogram' = "histogram",
'counter' = "counter",
'gauge' = "gauge",
'metric' = "metric"
}
export declare enum MetricMeasurements {
'min' = "min",
'max' = "max",
'sum' = "sum",
'count' = "count",
'variance' = "variance",
'mean' = "mean",
'stddev' = "stddev",
'median' = "median",
'p75' = "p75",
'p95' = "p95",
'p99' = "p99",
'p999' = "p999"
}
export interface InternalMetric {
name?: string;
type?: MetricType;
id?: string;
historic?: boolean;
unit?: string;
handler: Function;
implementation: any;
value?: number;
}
export declare class Metric {
name?: string;
id?: string;
historic?: boolean;
unit?: string;
value?: () => number;
}
export declare class MetricBulk extends Metric {
type: MetricType;
}
export declare class HistogramOptions extends Metric {
measurement: MetricMeasurements;
}
export declare class MetricService implements Service {
private metrics;
private timer;
private transport;
private logger;
init(): void;
registerMetric(metric: InternalMetric): void;
meter(opts: Metric): Meter;
counter(opts: Metric): Counter;
histogram(opts: HistogramOptions): Histogram;
metric(opts: Metric): Gauge;
deleteMetric(name: string): boolean;
destroy(): void;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
import { EventEmitter2 } from 'eventemitter2';
export declare class RuntimeStatsService extends EventEmitter2 {
private logger;
private handle;
private noduleInstance;
private enabled;
init(): any;
isEnabled(): boolean;
destroy(): void;
}

View File

@@ -0,0 +1,50 @@
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.RuntimeStatsService = void 0;
const debug_1 = require("debug");
const module_1 = require("../utils/module");
const eventemitter2_1 = require("eventemitter2");
class RuntimeStatsService extends eventemitter2_1.EventEmitter2 {
constructor() {
super(...arguments);
this.logger = (0, debug_1.default)('axm:services:runtimeStats');
this.enabled = false;
}
init() {
this.logger('init');
if (process.env.PM2_APM_DISABLE_RUNTIME_STATS === 'true') {
return this.logger('disabling service because of the environment flag');
}
const modulePath = module_1.default.detectModule('@pm2/node-runtime-stats');
if (typeof modulePath !== 'string')
return;
const RuntimeStats = module_1.default.loadModule(modulePath);
if (RuntimeStats instanceof Error) {
return this.logger(`Failed to require module @pm2/node-runtime-stats: ${RuntimeStats.message}`);
}
this.noduleInstance = new RuntimeStats({
delay: 1000
});
this.logger('starting runtime stats');
this.noduleInstance.start();
this.handle = (data) => {
this.logger('received runtime stats', data);
this.emit('data', data);
};
this.noduleInstance.on('sense', this.handle);
this.enabled = true;
}
isEnabled() {
return this.enabled;
}
destroy() {
if (this.noduleInstance !== undefined && this.noduleInstance !== null) {
this.logger('removing listener on runtime stats service');
this.noduleInstance.removeListener('sense', this.handle);
this.noduleInstance.stop();
}
this.logger('destroy');
}
}
exports.RuntimeStatsService = RuntimeStatsService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3J1bnRpbWVTdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUE7OztBQUVaLGlDQUF5QjtBQUN6Qiw0Q0FBbUM7QUFDbkMsaURBQTZDO0FBRTdDLE1BQWEsbUJBQW9CLFNBQVEsNkJBQWE7SUFBdEQ7O1FBRVUsV0FBTSxHQUFRLElBQUEsZUFBSyxFQUFDLDJCQUEyQixDQUFDLENBQUE7UUFHaEQsWUFBTyxHQUFZLEtBQUssQ0FBQTtJQTZDbEMsQ0FBQztJQTNDQyxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1EQUFtRCxDQUFDLENBQUE7UUFDekUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLGdCQUFLLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDaEUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO1lBQUUsT0FBTTtRQUUxQyxNQUFNLFlBQVksR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNqRCxJQUFJLFlBQVksWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMscURBQXFELFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ2pHLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxDQUFDO1lBQ3JDLEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFBO1FBR0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDO0lBS0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FDRjtBQWxERCxrREFrREMifQ==

View File

@@ -0,0 +1,22 @@
import { Action } from './actions';
import { InternalMetric } from './metrics';
import { EventEmitter2 } from 'eventemitter2';
export declare class TransportConfig {
publicKey: string;
secretKey: string;
appName: string;
serverName?: string;
sendLogs?: Boolean;
logFilter?: string | RegExp;
disableLogs?: Boolean;
proxy?: string;
}
export interface Transport extends EventEmitter2 {
init: (config: TransportConfig) => Transport;
destroy: () => void;
send: (channel: string, payload: Object) => void;
addAction: (action: Action) => void;
setMetrics: (metrics: InternalMetric[]) => void;
setOptions: (options: any) => void;
}
export declare function createTransport(name: string, config: TransportConfig): Transport;

View File

@@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTransport = exports.TransportConfig = void 0;
const IPCTransport_1 = require("../transports/IPCTransport");
class TransportConfig {
}
exports.TransportConfig = TransportConfig;
function createTransport(name, config) {
const transport = new IPCTransport_1.IPCTransport();
transport.init(config);
return transport;
}
exports.createTransport = createTransport;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3RyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSw2REFBeUQ7QUFJekQsTUFBYSxlQUFlO0NBMEMzQjtBQTFDRCwwQ0EwQ0M7QUFnQ0QsU0FBZ0IsZUFBZSxDQUFFLElBQVksRUFBRSxNQUF1QjtJQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLDJCQUFZLEVBQUUsQ0FBQTtJQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RCLE9BQU8sU0FBUyxDQUFBO0FBZWxCLENBQUM7QUFsQkQsMENBa0JDIn0=