@open-core/framework 1.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +350 -0
- package/dist/client/client-bootstrap.d.ts +1 -0
- package/dist/client/client-bootstrap.js +53 -0
- package/dist/client/client-container.d.ts +2 -0
- package/dist/client/client-container.js +6 -0
- package/dist/client/client-core.d.ts +18 -0
- package/dist/client/client-core.js +52 -0
- package/dist/client/decorators/controller.d.ts +3 -0
- package/dist/client/decorators/controller.js +14 -0
- package/dist/client/decorators/export.d.ts +7 -0
- package/dist/client/decorators/export.js +15 -0
- package/dist/client/decorators/gameEvent.d.ts +47 -0
- package/dist/client/decorators/gameEvent.js +54 -0
- package/dist/client/decorators/index.d.ts +10 -0
- package/dist/client/decorators/index.js +26 -0
- package/dist/client/decorators/interval.d.ts +7 -0
- package/dist/client/decorators/interval.js +15 -0
- package/dist/client/decorators/key.d.ts +2 -0
- package/dist/client/decorators/key.js +10 -0
- package/dist/client/decorators/localEvent.d.ts +7 -0
- package/dist/client/decorators/localEvent.js +15 -0
- package/dist/client/decorators/nui.d.ts +1 -0
- package/dist/client/decorators/nui.js +9 -0
- package/dist/client/decorators/onNet.d.ts +1 -0
- package/dist/client/decorators/onNet.js +9 -0
- package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
- package/dist/client/decorators/resourceLifecycle.js +24 -0
- package/dist/client/decorators/tick.d.ts +1 -0
- package/dist/client/decorators/tick.js +9 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +22 -0
- package/dist/client/loaders/exports.loader.d.ts +1 -0
- package/dist/client/loaders/exports.loader.js +13 -0
- package/dist/client/player/player.d.ts +262 -0
- package/dist/client/player/player.js +480 -0
- package/dist/client/player/player.loader.d.ts +1 -0
- package/dist/client/player/player.loader.js +22 -0
- package/dist/client/services/core/index.d.ts +1 -0
- package/dist/client/services/core/index.js +17 -0
- package/dist/client/services/core/spawn.service.d.ts +20 -0
- package/dist/client/services/core/spawn.service.js +143 -0
- package/dist/client/services/index.d.ts +4 -0
- package/dist/client/services/index.js +24 -0
- package/dist/client/services/streaming/index.d.ts +1 -0
- package/dist/client/services/streaming/index.js +17 -0
- package/dist/client/services/streaming/streaming.service.d.ts +165 -0
- package/dist/client/services/streaming/streaming.service.js +341 -0
- package/dist/client/services/ui/index.d.ts +3 -0
- package/dist/client/services/ui/index.js +19 -0
- package/dist/client/services/ui/notification.service.d.ts +76 -0
- package/dist/client/services/ui/notification.service.js +111 -0
- package/dist/client/services/ui/progress.service.d.ts +82 -0
- package/dist/client/services/ui/progress.service.js +210 -0
- package/dist/client/services/ui/textui.service.d.ts +82 -0
- package/dist/client/services/ui/textui.service.js +156 -0
- package/dist/client/services/world/blip.service.d.ts +112 -0
- package/dist/client/services/world/blip.service.js +215 -0
- package/dist/client/services/world/index.d.ts +4 -0
- package/dist/client/services/world/index.js +20 -0
- package/dist/client/services/world/marker.service.d.ts +94 -0
- package/dist/client/services/world/marker.service.js +153 -0
- package/dist/client/services/world/ped.service.d.ts +182 -0
- package/dist/client/services/world/ped.service.js +302 -0
- package/dist/client/services/world/vehicle.service.d.ts +168 -0
- package/dist/client/services/world/vehicle.service.js +296 -0
- package/dist/client/system/metadata-client.keys.d.ts +13 -0
- package/dist/client/system/metadata-client.keys.js +16 -0
- package/dist/client/system/processors/export.processor.d.ts +7 -0
- package/dist/client/system/processors/export.processor.js +39 -0
- package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
- package/dist/client/system/processors/gameEvent.processor.js +58 -0
- package/dist/client/system/processors/interval.processor.d.ts +7 -0
- package/dist/client/system/processors/interval.processor.js +43 -0
- package/dist/client/system/processors/key.processor.d.ts +8 -0
- package/dist/client/system/processors/key.processor.js +27 -0
- package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/localEvent.processor.js +38 -0
- package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
- package/dist/client/system/processors/netEvent.processor.js +38 -0
- package/dist/client/system/processors/nui.processor.d.ts +7 -0
- package/dist/client/system/processors/nui.processor.js +40 -0
- package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
- package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
- package/dist/client/system/processors/tick.processor.d.ts +5 -0
- package/dist/client/system/processors/tick.processor.js +37 -0
- package/dist/client/system/processors.register.d.ts +1 -0
- package/dist/client/system/processors.register.js +27 -0
- package/dist/client/types/game-events.d.ts +126 -0
- package/dist/client/types/game-events.js +83 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/client/types/index.js +17 -0
- package/dist/client/ui-bridge.d.ts +116 -0
- package/dist/client/ui-bridge.js +201 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +46 -0
- package/dist/server/bootstrap.d.ts +16 -0
- package/dist/server/bootstrap.js +57 -0
- package/dist/server/bus/core-event-bus.d.ts +6 -0
- package/dist/server/bus/core-event-bus.js +31 -0
- package/dist/server/configs/api.config.d.ts +71 -0
- package/dist/server/configs/api.config.js +81 -0
- package/dist/server/configs/config.base.d.ts +63 -0
- package/dist/server/configs/config.base.js +64 -0
- package/dist/server/configs/index.d.ts +2 -0
- package/dist/server/configs/index.js +18 -0
- package/dist/server/container.d.ts +2 -0
- package/dist/server/container.js +6 -0
- package/dist/server/controllers/chat.controller.d.ts +10 -0
- package/dist/server/controllers/chat.controller.js +50 -0
- package/dist/server/controllers/command.controller.d.ts +7 -0
- package/dist/server/controllers/command.controller.js +47 -0
- package/dist/server/core.d.ts +1 -0
- package/dist/server/core.js +7 -0
- package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
- package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
- package/dist/server/database/database.contract.d.ts +128 -0
- package/dist/server/database/database.contract.js +29 -0
- package/dist/server/database/database.service.d.ts +216 -0
- package/dist/server/database/database.service.js +301 -0
- package/dist/server/database/index.d.ts +53 -0
- package/dist/server/database/index.js +70 -0
- package/dist/server/database/types.d.ts +67 -0
- package/dist/server/database/types.js +7 -0
- package/dist/server/database.d.ts +7 -0
- package/dist/server/database.js +23 -0
- package/dist/server/decorators/bind.d.ts +2 -0
- package/dist/server/decorators/bind.js +15 -0
- package/dist/server/decorators/command.d.ts +19 -0
- package/dist/server/decorators/command.js +18 -0
- package/dist/server/decorators/controller.d.ts +3 -0
- package/dist/server/decorators/controller.js +14 -0
- package/dist/server/decorators/coreEvent.d.ts +2 -0
- package/dist/server/decorators/coreEvent.js +9 -0
- package/dist/server/decorators/export.d.ts +1 -0
- package/dist/server/decorators/export.js +9 -0
- package/dist/server/decorators/guard.d.ts +5 -0
- package/dist/server/decorators/guard.js +39 -0
- package/dist/server/decorators/index.d.ts +10 -0
- package/dist/server/decorators/index.js +26 -0
- package/dist/server/decorators/netEvent.d.ts +36 -0
- package/dist/server/decorators/netEvent.js +40 -0
- package/dist/server/decorators/onTick.d.ts +1 -0
- package/dist/server/decorators/onTick.js +9 -0
- package/dist/server/decorators/public.d.ts +16 -0
- package/dist/server/decorators/public.js +25 -0
- package/dist/server/decorators/requiresState.d.ts +55 -0
- package/dist/server/decorators/requiresState.js +62 -0
- package/dist/server/decorators/throttle.d.ts +9 -0
- package/dist/server/decorators/throttle.js +36 -0
- package/dist/server/decorators/utils.d.ts +7 -0
- package/dist/server/decorators/utils.js +13 -0
- package/dist/server/entities/index.d.ts +1 -0
- package/dist/server/entities/index.js +17 -0
- package/dist/server/entities/player.d.ts +157 -0
- package/dist/server/entities/player.js +217 -0
- package/dist/server/error-handler.d.ts +2 -0
- package/dist/server/error-handler.js +43 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +29 -0
- package/dist/server/loaders/exports.loader.d.ts +0 -0
- package/dist/server/loaders/exports.loader.js +23 -0
- package/dist/server/loaders/playerSession.loader.d.ts +1 -0
- package/dist/server/loaders/playerSession.loader.js +42 -0
- package/dist/server/services/access-control.service.d.ts +56 -0
- package/dist/server/services/access-control.service.js +99 -0
- package/dist/server/services/chat.service.d.ts +7 -0
- package/dist/server/services/chat.service.js +31 -0
- package/dist/server/services/command.service.d.ts +15 -0
- package/dist/server/services/command.service.js +74 -0
- package/dist/server/services/config.service.d.ts +75 -0
- package/dist/server/services/config.service.js +116 -0
- package/dist/server/services/default/default-security.handler.d.ts +6 -0
- package/dist/server/services/default/default-security.handler.js +26 -0
- package/dist/server/services/http/http.service.d.ts +50 -0
- package/dist/server/services/http/http.service.js +126 -0
- package/dist/server/services/index.d.ts +10 -0
- package/dist/server/services/index.js +26 -0
- package/dist/server/services/parallel/index.d.ts +49 -0
- package/dist/server/services/parallel/index.js +67 -0
- package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
- package/dist/server/services/parallel/parallel-compute.service.js +449 -0
- package/dist/server/services/parallel/types.d.ts +188 -0
- package/dist/server/services/parallel/types.js +7 -0
- package/dist/server/services/parallel/worker-pool.d.ts +83 -0
- package/dist/server/services/parallel/worker-pool.js +350 -0
- package/dist/server/services/parallel/worker.d.ts +19 -0
- package/dist/server/services/parallel/worker.js +49 -0
- package/dist/server/services/persistence.service.d.ts +59 -0
- package/dist/server/services/persistence.service.js +166 -0
- package/dist/server/services/player.service.d.ts +96 -0
- package/dist/server/services/player.service.js +132 -0
- package/dist/server/services/rate-limiter.service.d.ts +5 -0
- package/dist/server/services/rate-limiter.service.js +39 -0
- package/dist/server/services/registers.d.ts +1 -0
- package/dist/server/services/registers.js +18 -0
- package/dist/server/setup.d.ts +9 -0
- package/dist/server/setup.js +28 -0
- package/dist/server/system/metadata-server.keys.d.ts +9 -0
- package/dist/server/system/metadata-server.keys.js +12 -0
- package/dist/server/system/processors/command.processor.d.ts +9 -0
- package/dist/server/system/processors/command.processor.js +31 -0
- package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
- package/dist/server/system/processors/coreEvent.processor.js +38 -0
- package/dist/server/system/processors/export.processor.d.ts +7 -0
- package/dist/server/system/processors/export.processor.js +26 -0
- package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
- package/dist/server/system/processors/netEvent.processor.js +100 -0
- package/dist/server/system/processors/tick.processor.d.ts +5 -0
- package/dist/server/system/processors/tick.processor.js +36 -0
- package/dist/server/system/processors.register.d.ts +1 -0
- package/dist/server/system/processors.register.js +21 -0
- package/dist/server/templates/admin/admin.controller-template.d.ts +10 -0
- package/dist/server/templates/admin/admin.controller-template.js +2 -0
- package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
- package/dist/server/templates/auth/auth-provider.contract.js +23 -0
- package/dist/server/templates/index.d.ts +8 -0
- package/dist/server/templates/index.js +21 -0
- package/dist/server/templates/persistence/index.d.ts +30 -0
- package/dist/server/templates/persistence/index.js +34 -0
- package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
- package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
- package/dist/server/templates/repository/index.d.ts +57 -0
- package/dist/server/templates/repository/index.js +61 -0
- package/dist/server/templates/repository/repository.contract.d.ts +224 -0
- package/dist/server/templates/repository/repository.contract.js +342 -0
- package/dist/server/templates/repository/repository.types.d.ts +51 -0
- package/dist/server/templates/repository/repository.types.js +7 -0
- package/dist/server/templates/security/permission.types.d.ts +32 -0
- package/dist/server/templates/security/permission.types.js +2 -0
- package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
- package/dist/server/templates/security/principal-provider.contract.js +19 -0
- package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
- package/dist/server/templates/security/security-handler.contract.js +6 -0
- package/dist/server/types/core-events.d.ts +17 -0
- package/dist/server/types/core-events.js +2 -0
- package/dist/server/types/security.types.d.ts +7 -0
- package/dist/server/types/security.types.js +2 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +17 -0
- package/dist/shared/logger/core-logger.d.ts +35 -0
- package/dist/shared/logger/core-logger.js +52 -0
- package/dist/shared/logger/index.d.ts +11 -0
- package/dist/shared/logger/index.js +26 -0
- package/dist/shared/logger/logger.config.d.ts +47 -0
- package/dist/shared/logger/logger.config.js +33 -0
- package/dist/shared/logger/logger.service.d.ts +161 -0
- package/dist/shared/logger/logger.service.js +279 -0
- package/dist/shared/logger/logger.types.d.ts +85 -0
- package/dist/shared/logger/logger.types.js +74 -0
- package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
- package/dist/shared/logger/transports/buffered.transport.js +174 -0
- package/dist/shared/logger/transports/console.transport.d.ts +37 -0
- package/dist/shared/logger/transports/console.transport.js +134 -0
- package/dist/shared/logger/transports/index.d.ts +3 -0
- package/dist/shared/logger/transports/index.js +19 -0
- package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
- package/dist/shared/logger/transports/transport.interface.js +2 -0
- package/dist/system/class-constructor.d.ts +1 -0
- package/dist/system/class-constructor.js +2 -0
- package/dist/system/decorator-processor.d.ts +4 -0
- package/dist/system/decorator-processor.js +2 -0
- package/dist/system/metadata.scanner.d.ts +7 -0
- package/dist/system/metadata.scanner.js +45 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/result.d.ts +12 -0
- package/dist/utils/result.js +10 -0
- package/dist/utils/rgb.d.ts +5 -0
- package/dist/utils/rgb.js +2 -0
- package/dist/utils/vector3.d.ts +13 -0
- package/dist/utils/vector3.js +27 -0
- package/package.json +70 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ChildLogger = exports.LoggerService = void 0;
|
|
13
|
+
const tsyringe_1 = require("tsyringe");
|
|
14
|
+
const logger_config_1 = require("./logger.config");
|
|
15
|
+
const logger_types_1 = require("./logger.types");
|
|
16
|
+
/**
|
|
17
|
+
* Central logging service for the framework.
|
|
18
|
+
*
|
|
19
|
+
* Provides structured logging with support for multiple transports,
|
|
20
|
+
* log levels, and contextual metadata for traceability.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Using with dependency injection
|
|
25
|
+
* @injectable()
|
|
26
|
+
* class MyController {
|
|
27
|
+
* constructor(private logger: LoggerService) {}
|
|
28
|
+
*
|
|
29
|
+
* doSomething() {
|
|
30
|
+
* this.logger.info('Operation started', { source: 'MyController' })
|
|
31
|
+
* this.logger.debug('Processing data', { playerId: 123 })
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // Manual instantiation with custom config
|
|
39
|
+
* const logger = new LoggerService({
|
|
40
|
+
* minLevel: LogLevel.INFO,
|
|
41
|
+
* transports: [new ConsoleTransport(), new FileTransport()]
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
let LoggerService = class LoggerService {
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.config = (0, logger_config_1.createLoggerConfig)(config !== null && config !== void 0 ? config : {});
|
|
48
|
+
}
|
|
49
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
// Log Methods
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* Log a TRACE level message. Most verbose, for deep debugging.
|
|
54
|
+
*/
|
|
55
|
+
trace(message, context) {
|
|
56
|
+
this.log(logger_types_1.LogLevel.TRACE, message, context);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Log a DEBUG level message. Development-time information.
|
|
60
|
+
*/
|
|
61
|
+
debug(message, context) {
|
|
62
|
+
this.log(logger_types_1.LogLevel.DEBUG, message, context);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Log an INFO level message. General operational information.
|
|
66
|
+
*/
|
|
67
|
+
info(message, context) {
|
|
68
|
+
this.log(logger_types_1.LogLevel.INFO, message, context);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Log a WARN level message. Something unexpected but not necessarily wrong.
|
|
72
|
+
*/
|
|
73
|
+
warn(message, context) {
|
|
74
|
+
this.log(logger_types_1.LogLevel.WARN, message, context);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Log an ERROR level message. Something went wrong but the app can continue.
|
|
78
|
+
*/
|
|
79
|
+
error(message, context, error) {
|
|
80
|
+
this.log(logger_types_1.LogLevel.ERROR, message, context, error);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Log a FATAL level message. Critical error, the app may need to stop.
|
|
84
|
+
*/
|
|
85
|
+
fatal(message, context, error) {
|
|
86
|
+
this.log(logger_types_1.LogLevel.FATAL, message, context, error);
|
|
87
|
+
}
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
// Transport Management
|
|
90
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Add a new transport to receive log entries.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* logger.addTransport(new FileTransport({ path: './logs/app.log' }))
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
addTransport(transport) {
|
|
100
|
+
this.config.transports.push(transport);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Remove a transport by name.
|
|
104
|
+
*/
|
|
105
|
+
removeTransport(name) {
|
|
106
|
+
var _a;
|
|
107
|
+
const index = this.config.transports.findIndex((t) => t.name === name);
|
|
108
|
+
if (index === -1)
|
|
109
|
+
return false;
|
|
110
|
+
const [removed] = this.config.transports.splice(index, 1);
|
|
111
|
+
(_a = removed === null || removed === void 0 ? void 0 : removed.destroy) === null || _a === void 0 ? void 0 : _a.call(removed);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get all registered transports.
|
|
116
|
+
*/
|
|
117
|
+
getTransports() {
|
|
118
|
+
return this.config.transports;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Clear all transports.
|
|
122
|
+
*/
|
|
123
|
+
clearTransports() {
|
|
124
|
+
var _a;
|
|
125
|
+
for (const transport of this.config.transports) {
|
|
126
|
+
(_a = transport.destroy) === null || _a === void 0 ? void 0 : _a.call(transport);
|
|
127
|
+
}
|
|
128
|
+
this.config.transports = [];
|
|
129
|
+
}
|
|
130
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
131
|
+
// Configuration
|
|
132
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* Update the global minimum log level.
|
|
135
|
+
*/
|
|
136
|
+
setMinLevel(level) {
|
|
137
|
+
this.config.minLevel = level;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the current minimum log level.
|
|
141
|
+
*/
|
|
142
|
+
getMinLevel() {
|
|
143
|
+
return this.config.minLevel;
|
|
144
|
+
}
|
|
145
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
146
|
+
// Domain-specific Loggers
|
|
147
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
148
|
+
/**
|
|
149
|
+
* Create a server-level logger for server-side application code.
|
|
150
|
+
* These logs will be tagged with [SERVER] domain.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* const authLogger = logger.server('AuthController')
|
|
155
|
+
* authLogger.info('User logged in') // [SERVER] INFO [AuthController] User logged in
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
server(source) {
|
|
159
|
+
return new ChildLogger(this, source, logger_types_1.LogDomain.SERVER);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create a framework-level logger for internal OpenCore logging.
|
|
163
|
+
* These logs will be tagged with [CORE] domain.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* const coreLogger = logger.framework('Bootstrap')
|
|
168
|
+
* coreLogger.error('Missing config') // [CORE] ERROR [Bootstrap] Missing config
|
|
169
|
+
* ```
|
|
170
|
+
*/
|
|
171
|
+
framework(source) {
|
|
172
|
+
return new ChildLogger(this, source, logger_types_1.LogDomain.FRAMEWORK);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create a client-level logger for client-side code.
|
|
176
|
+
* These logs will be tagged with [CLIENT] domain.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* const hudLogger = logger.client('HUD')
|
|
181
|
+
* hudLogger.debug('Rendering') // [CLIENT] DEBUG [HUD] Rendering
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
client(source) {
|
|
185
|
+
return new ChildLogger(this, source, logger_types_1.LogDomain.CLIENT);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create an external services logger for third-party APIs, databases, etc.
|
|
189
|
+
* These logs will be tagged with [EXTERNAL] domain.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* const stripeLogger = logger.external('StripeAPI')
|
|
194
|
+
* stripeLogger.warn('Rate limit') // [EXTERNAL] WARN [StripeAPI] Rate limit
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
external(source) {
|
|
198
|
+
return new ChildLogger(this, source, logger_types_1.LogDomain.EXTERNAL);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a child logger with custom domain.
|
|
202
|
+
* Use this when you need a specific domain not covered by the convenience methods.
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```typescript
|
|
206
|
+
* const customLogger = logger.child('MyModule', LogDomain.EXTERNAL)
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
child(source, domain) {
|
|
210
|
+
return new ChildLogger(this, source, domain);
|
|
211
|
+
}
|
|
212
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
// Internal
|
|
214
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
215
|
+
log(level, message, context, error) {
|
|
216
|
+
var _a, _b;
|
|
217
|
+
// Check global minimum level
|
|
218
|
+
if (level < this.config.minLevel)
|
|
219
|
+
return;
|
|
220
|
+
const entry = {
|
|
221
|
+
level,
|
|
222
|
+
domain: (_a = context === null || context === void 0 ? void 0 : context.domain) !== null && _a !== void 0 ? _a : this.config.defaultDomain,
|
|
223
|
+
message,
|
|
224
|
+
timestamp: new Date().toISOString(),
|
|
225
|
+
context: Object.assign({ source: (_b = context === null || context === void 0 ? void 0 : context.source) !== null && _b !== void 0 ? _b : this.config.defaultSource }, context),
|
|
226
|
+
error,
|
|
227
|
+
};
|
|
228
|
+
// Dispatch to all transports that accept this level
|
|
229
|
+
for (const transport of this.config.transports) {
|
|
230
|
+
if (level >= transport.minLevel) {
|
|
231
|
+
try {
|
|
232
|
+
transport.write(entry);
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
// Avoid infinite loops - just console.error transport failures
|
|
236
|
+
console.error(`[Logger] Transport "${transport.name}" failed:`, err);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
exports.LoggerService = LoggerService;
|
|
243
|
+
exports.LoggerService = LoggerService = __decorate([
|
|
244
|
+
(0, tsyringe_1.injectable)(),
|
|
245
|
+
__metadata("design:paramtypes", [Object])
|
|
246
|
+
], LoggerService);
|
|
247
|
+
/**
|
|
248
|
+
* A lightweight logger wrapper with a preset source and domain context.
|
|
249
|
+
* Created via LoggerService.child(), .framework(), .client(), or .external()
|
|
250
|
+
*/
|
|
251
|
+
class ChildLogger {
|
|
252
|
+
constructor(parent, source, domain) {
|
|
253
|
+
this.parent = parent;
|
|
254
|
+
this.source = source;
|
|
255
|
+
this.domain = domain;
|
|
256
|
+
}
|
|
257
|
+
buildContext(context) {
|
|
258
|
+
return Object.assign(Object.assign(Object.assign({}, context), { source: this.source }), (this.domain && { domain: this.domain }));
|
|
259
|
+
}
|
|
260
|
+
trace(message, context) {
|
|
261
|
+
this.parent.trace(message, this.buildContext(context));
|
|
262
|
+
}
|
|
263
|
+
debug(message, context) {
|
|
264
|
+
this.parent.debug(message, this.buildContext(context));
|
|
265
|
+
}
|
|
266
|
+
info(message, context) {
|
|
267
|
+
this.parent.info(message, this.buildContext(context));
|
|
268
|
+
}
|
|
269
|
+
warn(message, context) {
|
|
270
|
+
this.parent.warn(message, this.buildContext(context));
|
|
271
|
+
}
|
|
272
|
+
error(message, context, error) {
|
|
273
|
+
this.parent.error(message, this.buildContext(context), error);
|
|
274
|
+
}
|
|
275
|
+
fatal(message, context, error) {
|
|
276
|
+
this.parent.fatal(message, this.buildContext(context), error);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.ChildLogger = ChildLogger;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log severity levels ordered from most verbose to most critical.
|
|
3
|
+
* The numeric values allow for easy comparison and filtering.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum LogLevel {
|
|
6
|
+
TRACE = 0,
|
|
7
|
+
DEBUG = 1,
|
|
8
|
+
INFO = 2,
|
|
9
|
+
WARN = 3,
|
|
10
|
+
ERROR = 4,
|
|
11
|
+
FATAL = 5,
|
|
12
|
+
OFF = 6
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Human-readable labels for each log level.
|
|
16
|
+
*/
|
|
17
|
+
export declare const LogLevelLabels: Record<LogLevel, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Domain/origin of the log entry.
|
|
20
|
+
* Helps identify where the log originates from for better traceability.
|
|
21
|
+
*/
|
|
22
|
+
export declare enum LogDomain {
|
|
23
|
+
/**
|
|
24
|
+
* Internal framework logs (OpenCore internals).
|
|
25
|
+
* Used for core errors, bootstrap messages, decorator processing, etc.
|
|
26
|
+
*/
|
|
27
|
+
FRAMEWORK = "framework",
|
|
28
|
+
/**
|
|
29
|
+
* Server-side application logs.
|
|
30
|
+
* Used by resource developers for their server logic.
|
|
31
|
+
*/
|
|
32
|
+
SERVER = "server",
|
|
33
|
+
/**
|
|
34
|
+
* Client-side application logs.
|
|
35
|
+
* Used by resource developers for their client logic.
|
|
36
|
+
*/
|
|
37
|
+
CLIENT = "client",
|
|
38
|
+
/**
|
|
39
|
+
* External service logs.
|
|
40
|
+
* Used for third-party APIs, databases, HTTP requests, etc.
|
|
41
|
+
*/
|
|
42
|
+
EXTERNAL = "external"
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Human-readable labels for each log domain.
|
|
46
|
+
*/
|
|
47
|
+
export declare const LogDomainLabels: Record<LogDomain, string>;
|
|
48
|
+
/**
|
|
49
|
+
* Additional contextual information that can be attached to any log entry.
|
|
50
|
+
* Useful for tracing, debugging, and correlation.
|
|
51
|
+
*/
|
|
52
|
+
export interface LogContext {
|
|
53
|
+
/** Domain/origin of the log (framework, server, client, external) */
|
|
54
|
+
domain?: LogDomain;
|
|
55
|
+
/** Source module, controller or service name */
|
|
56
|
+
source?: string;
|
|
57
|
+
/** Unique identifier for tracing related operations */
|
|
58
|
+
traceId?: string;
|
|
59
|
+
/** Player ID if the log is related to a player action */
|
|
60
|
+
playerId?: number;
|
|
61
|
+
/** Any additional metadata */
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Represents a single log entry with all its metadata.
|
|
66
|
+
* This is what gets passed to transports for processing.
|
|
67
|
+
*/
|
|
68
|
+
export interface LogEntry {
|
|
69
|
+
/** Severity level of this log */
|
|
70
|
+
level: LogLevel;
|
|
71
|
+
/** Domain/origin of the log */
|
|
72
|
+
domain: LogDomain;
|
|
73
|
+
/** The main log message */
|
|
74
|
+
message: string;
|
|
75
|
+
/** ISO 8601 timestamp when the log was created */
|
|
76
|
+
timestamp: string;
|
|
77
|
+
/** Optional contextual data */
|
|
78
|
+
context?: LogContext;
|
|
79
|
+
/** Optional error object if logging an error */
|
|
80
|
+
error?: Error;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Configuration for parsing log level from string (useful for env vars).
|
|
84
|
+
*/
|
|
85
|
+
export declare function parseLogLevel(value: string): LogLevel;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LogDomainLabels = exports.LogDomain = exports.LogLevelLabels = exports.LogLevel = void 0;
|
|
4
|
+
exports.parseLogLevel = parseLogLevel;
|
|
5
|
+
/**
|
|
6
|
+
* Log severity levels ordered from most verbose to most critical.
|
|
7
|
+
* The numeric values allow for easy comparison and filtering.
|
|
8
|
+
*/
|
|
9
|
+
var LogLevel;
|
|
10
|
+
(function (LogLevel) {
|
|
11
|
+
LogLevel[LogLevel["TRACE"] = 0] = "TRACE";
|
|
12
|
+
LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG";
|
|
13
|
+
LogLevel[LogLevel["INFO"] = 2] = "INFO";
|
|
14
|
+
LogLevel[LogLevel["WARN"] = 3] = "WARN";
|
|
15
|
+
LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
|
|
16
|
+
LogLevel[LogLevel["FATAL"] = 5] = "FATAL";
|
|
17
|
+
LogLevel[LogLevel["OFF"] = 6] = "OFF";
|
|
18
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
19
|
+
/**
|
|
20
|
+
* Human-readable labels for each log level.
|
|
21
|
+
*/
|
|
22
|
+
exports.LogLevelLabels = {
|
|
23
|
+
[LogLevel.TRACE]: 'TRACE',
|
|
24
|
+
[LogLevel.DEBUG]: 'DEBUG',
|
|
25
|
+
[LogLevel.INFO]: 'INFO',
|
|
26
|
+
[LogLevel.WARN]: 'WARN',
|
|
27
|
+
[LogLevel.ERROR]: 'ERROR',
|
|
28
|
+
[LogLevel.FATAL]: 'FATAL',
|
|
29
|
+
[LogLevel.OFF]: 'OFF',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Domain/origin of the log entry.
|
|
33
|
+
* Helps identify where the log originates from for better traceability.
|
|
34
|
+
*/
|
|
35
|
+
var LogDomain;
|
|
36
|
+
(function (LogDomain) {
|
|
37
|
+
/**
|
|
38
|
+
* Internal framework logs (OpenCore internals).
|
|
39
|
+
* Used for core errors, bootstrap messages, decorator processing, etc.
|
|
40
|
+
*/
|
|
41
|
+
LogDomain["FRAMEWORK"] = "framework";
|
|
42
|
+
/**
|
|
43
|
+
* Server-side application logs.
|
|
44
|
+
* Used by resource developers for their server logic.
|
|
45
|
+
*/
|
|
46
|
+
LogDomain["SERVER"] = "server";
|
|
47
|
+
/**
|
|
48
|
+
* Client-side application logs.
|
|
49
|
+
* Used by resource developers for their client logic.
|
|
50
|
+
*/
|
|
51
|
+
LogDomain["CLIENT"] = "client";
|
|
52
|
+
/**
|
|
53
|
+
* External service logs.
|
|
54
|
+
* Used for third-party APIs, databases, HTTP requests, etc.
|
|
55
|
+
*/
|
|
56
|
+
LogDomain["EXTERNAL"] = "external";
|
|
57
|
+
})(LogDomain || (exports.LogDomain = LogDomain = {}));
|
|
58
|
+
/**
|
|
59
|
+
* Human-readable labels for each log domain.
|
|
60
|
+
*/
|
|
61
|
+
exports.LogDomainLabels = {
|
|
62
|
+
[LogDomain.FRAMEWORK]: 'CORE',
|
|
63
|
+
[LogDomain.SERVER]: 'SERVER',
|
|
64
|
+
[LogDomain.CLIENT]: 'CLIENT',
|
|
65
|
+
[LogDomain.EXTERNAL]: 'EXTERNAL',
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Configuration for parsing log level from string (useful for env vars).
|
|
69
|
+
*/
|
|
70
|
+
function parseLogLevel(value) {
|
|
71
|
+
const upper = value.toUpperCase();
|
|
72
|
+
const level = LogLevel[upper];
|
|
73
|
+
return level !== undefined ? level : LogLevel.INFO;
|
|
74
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { LogLevel, type LogEntry } from '../logger.types';
|
|
2
|
+
import type { LogTransport } from './transport.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Output format for exported logs.
|
|
5
|
+
*/
|
|
6
|
+
export type LogOutputFormat = 'json' | 'text' | 'csv';
|
|
7
|
+
export interface BufferedTransportOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Minimum log level to buffer. Defaults to DEBUG.
|
|
10
|
+
*/
|
|
11
|
+
minLevel?: LogLevel;
|
|
12
|
+
/**
|
|
13
|
+
* Maximum number of entries to keep in buffer.
|
|
14
|
+
* Older entries are removed when limit is reached (FIFO).
|
|
15
|
+
* @default 1000
|
|
16
|
+
*/
|
|
17
|
+
maxEntries?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Callback triggered when buffer reaches maxEntries.
|
|
20
|
+
* Useful for auto-flushing to external storage.
|
|
21
|
+
*/
|
|
22
|
+
onBufferFull?: (entries: LogEntry[]) => void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A transport that buffers log entries in memory for later export.
|
|
26
|
+
*
|
|
27
|
+
* Use this when you need to:
|
|
28
|
+
* - Export logs to a file via FiveM's SaveResourceFile
|
|
29
|
+
* - Send logs to an external API in batches
|
|
30
|
+
* - Display logs in a UI
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const buffered = new BufferedTransport({
|
|
35
|
+
* minLevel: LogLevel.INFO,
|
|
36
|
+
* maxEntries: 500,
|
|
37
|
+
* onBufferFull: (entries) => {
|
|
38
|
+
* // Auto-save when buffer is full
|
|
39
|
+
* const content = buffered.export('text')
|
|
40
|
+
* SaveResourceFile(GetCurrentResourceName(), 'logs/app.log', content, -1)
|
|
41
|
+
* buffered.clear()
|
|
42
|
+
* }
|
|
43
|
+
* })
|
|
44
|
+
*
|
|
45
|
+
* logger.addTransport(buffered)
|
|
46
|
+
*
|
|
47
|
+
* // Later, export manually
|
|
48
|
+
* const jsonLogs = buffered.export('json')
|
|
49
|
+
* const textLogs = buffered.export('text')
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare class BufferedTransport implements LogTransport {
|
|
53
|
+
readonly name = "buffered";
|
|
54
|
+
minLevel: LogLevel;
|
|
55
|
+
private buffer;
|
|
56
|
+
private maxEntries;
|
|
57
|
+
private onBufferFull?;
|
|
58
|
+
constructor(options?: BufferedTransportOptions);
|
|
59
|
+
write(entry: LogEntry): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get all buffered entries.
|
|
62
|
+
*/
|
|
63
|
+
getEntries(): readonly LogEntry[];
|
|
64
|
+
/**
|
|
65
|
+
* Get the current buffer size.
|
|
66
|
+
*/
|
|
67
|
+
size(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Clear the buffer.
|
|
70
|
+
*/
|
|
71
|
+
clear(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Export buffered logs in the specified format.
|
|
74
|
+
*
|
|
75
|
+
* @param format - Output format: 'json', 'text', or 'csv'
|
|
76
|
+
* @returns Formatted string ready for saving
|
|
77
|
+
*/
|
|
78
|
+
export(format?: LogOutputFormat): string;
|
|
79
|
+
/**
|
|
80
|
+
* Export and clear buffer in one operation.
|
|
81
|
+
*/
|
|
82
|
+
flush(format?: LogOutputFormat): string;
|
|
83
|
+
private exportJson;
|
|
84
|
+
private exportText;
|
|
85
|
+
private exportCsv;
|
|
86
|
+
private cleanContext;
|
|
87
|
+
destroy(): void;
|
|
88
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.BufferedTransport = void 0;
|
|
15
|
+
const logger_types_1 = require("../logger.types");
|
|
16
|
+
/**
|
|
17
|
+
* A transport that buffers log entries in memory for later export.
|
|
18
|
+
*
|
|
19
|
+
* Use this when you need to:
|
|
20
|
+
* - Export logs to a file via FiveM's SaveResourceFile
|
|
21
|
+
* - Send logs to an external API in batches
|
|
22
|
+
* - Display logs in a UI
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const buffered = new BufferedTransport({
|
|
27
|
+
* minLevel: LogLevel.INFO,
|
|
28
|
+
* maxEntries: 500,
|
|
29
|
+
* onBufferFull: (entries) => {
|
|
30
|
+
* // Auto-save when buffer is full
|
|
31
|
+
* const content = buffered.export('text')
|
|
32
|
+
* SaveResourceFile(GetCurrentResourceName(), 'logs/app.log', content, -1)
|
|
33
|
+
* buffered.clear()
|
|
34
|
+
* }
|
|
35
|
+
* })
|
|
36
|
+
*
|
|
37
|
+
* logger.addTransport(buffered)
|
|
38
|
+
*
|
|
39
|
+
* // Later, export manually
|
|
40
|
+
* const jsonLogs = buffered.export('json')
|
|
41
|
+
* const textLogs = buffered.export('text')
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
class BufferedTransport {
|
|
45
|
+
constructor(options = {}) {
|
|
46
|
+
var _a, _b;
|
|
47
|
+
this.name = 'buffered';
|
|
48
|
+
this.buffer = [];
|
|
49
|
+
this.minLevel = (_a = options.minLevel) !== null && _a !== void 0 ? _a : logger_types_1.LogLevel.DEBUG;
|
|
50
|
+
this.maxEntries = (_b = options.maxEntries) !== null && _b !== void 0 ? _b : 1000;
|
|
51
|
+
this.onBufferFull = options.onBufferFull;
|
|
52
|
+
}
|
|
53
|
+
write(entry) {
|
|
54
|
+
this.buffer.push(entry);
|
|
55
|
+
// Check buffer limit
|
|
56
|
+
if (this.buffer.length >= this.maxEntries) {
|
|
57
|
+
if (this.onBufferFull) {
|
|
58
|
+
this.onBufferFull([...this.buffer]);
|
|
59
|
+
}
|
|
60
|
+
// Remove oldest entries to make room
|
|
61
|
+
this.buffer = this.buffer.slice(-Math.floor(this.maxEntries * 0.8));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all buffered entries.
|
|
66
|
+
*/
|
|
67
|
+
getEntries() {
|
|
68
|
+
return this.buffer;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the current buffer size.
|
|
72
|
+
*/
|
|
73
|
+
size() {
|
|
74
|
+
return this.buffer.length;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clear the buffer.
|
|
78
|
+
*/
|
|
79
|
+
clear() {
|
|
80
|
+
this.buffer = [];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Export buffered logs in the specified format.
|
|
84
|
+
*
|
|
85
|
+
* @param format - Output format: 'json', 'text', or 'csv'
|
|
86
|
+
* @returns Formatted string ready for saving
|
|
87
|
+
*/
|
|
88
|
+
export(format = 'text') {
|
|
89
|
+
switch (format) {
|
|
90
|
+
case 'json':
|
|
91
|
+
return this.exportJson();
|
|
92
|
+
case 'csv':
|
|
93
|
+
return this.exportCsv();
|
|
94
|
+
case 'text':
|
|
95
|
+
default:
|
|
96
|
+
return this.exportText();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Export and clear buffer in one operation.
|
|
101
|
+
*/
|
|
102
|
+
flush(format = 'text') {
|
|
103
|
+
const content = this.export(format);
|
|
104
|
+
this.clear();
|
|
105
|
+
return content;
|
|
106
|
+
}
|
|
107
|
+
exportJson() {
|
|
108
|
+
const entries = this.buffer.map((entry) => {
|
|
109
|
+
var _a;
|
|
110
|
+
return ({
|
|
111
|
+
timestamp: entry.timestamp,
|
|
112
|
+
level: logger_types_1.LogLevelLabels[entry.level],
|
|
113
|
+
domain: logger_types_1.LogDomainLabels[entry.domain],
|
|
114
|
+
source: (_a = entry.context) === null || _a === void 0 ? void 0 : _a.source,
|
|
115
|
+
message: entry.message,
|
|
116
|
+
context: this.cleanContext(entry.context),
|
|
117
|
+
error: entry.error
|
|
118
|
+
? {
|
|
119
|
+
name: entry.error.name,
|
|
120
|
+
message: entry.error.message,
|
|
121
|
+
stack: entry.error.stack,
|
|
122
|
+
}
|
|
123
|
+
: undefined,
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
return JSON.stringify(entries, null, 2);
|
|
127
|
+
}
|
|
128
|
+
exportText() {
|
|
129
|
+
return this.buffer
|
|
130
|
+
.map((entry) => {
|
|
131
|
+
var _a, _b;
|
|
132
|
+
const time = entry.timestamp.replace('T', ' ').slice(0, 23);
|
|
133
|
+
const level = logger_types_1.LogLevelLabels[entry.level].padEnd(5);
|
|
134
|
+
const domain = logger_types_1.LogDomainLabels[entry.domain].padEnd(8);
|
|
135
|
+
const source = ((_a = entry.context) === null || _a === void 0 ? void 0 : _a.source) ? `[${entry.context.source}]` : '';
|
|
136
|
+
let line = `${time} | ${domain} | ${level} | ${source} ${entry.message}`;
|
|
137
|
+
const ctx = this.cleanContext(entry.context);
|
|
138
|
+
if (Object.keys(ctx).length > 0) {
|
|
139
|
+
line += ` | ctx: ${JSON.stringify(ctx)}`;
|
|
140
|
+
}
|
|
141
|
+
if ((_b = entry.error) === null || _b === void 0 ? void 0 : _b.stack) {
|
|
142
|
+
line += `\n └─ ${entry.error.stack.replace(/\n/g, '\n ')}`;
|
|
143
|
+
}
|
|
144
|
+
return line;
|
|
145
|
+
})
|
|
146
|
+
.join('\n');
|
|
147
|
+
}
|
|
148
|
+
exportCsv() {
|
|
149
|
+
const headers = ['timestamp', 'level', 'domain', 'source', 'message', 'context', 'error'];
|
|
150
|
+
const rows = this.buffer.map((entry) => {
|
|
151
|
+
var _a, _b, _c, _d;
|
|
152
|
+
return [
|
|
153
|
+
entry.timestamp,
|
|
154
|
+
logger_types_1.LogLevelLabels[entry.level],
|
|
155
|
+
logger_types_1.LogDomainLabels[entry.domain],
|
|
156
|
+
(_b = (_a = entry.context) === null || _a === void 0 ? void 0 : _a.source) !== null && _b !== void 0 ? _b : '',
|
|
157
|
+
`"${entry.message.replace(/"/g, '""')}"`,
|
|
158
|
+
JSON.stringify(this.cleanContext(entry.context)),
|
|
159
|
+
(_d = (_c = entry.error) === null || _c === void 0 ? void 0 : _c.message) !== null && _d !== void 0 ? _d : '',
|
|
160
|
+
];
|
|
161
|
+
});
|
|
162
|
+
return [headers.join(','), ...rows.map((row) => row.join(','))].join('\n');
|
|
163
|
+
}
|
|
164
|
+
cleanContext(context) {
|
|
165
|
+
if (!context)
|
|
166
|
+
return {};
|
|
167
|
+
const { source, domain } = context, rest = __rest(context, ["source", "domain"]);
|
|
168
|
+
return rest;
|
|
169
|
+
}
|
|
170
|
+
destroy() {
|
|
171
|
+
this.clear();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.BufferedTransport = BufferedTransport;
|