@open-core/framework 0.1.0-alpha.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.
Files changed (281) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +360 -0
  3. package/dist/client/client-bootstrap.d.ts +1 -0
  4. package/dist/client/client-bootstrap.js +50 -0
  5. package/dist/client/client-container.d.ts +2 -0
  6. package/dist/client/client-container.js +6 -0
  7. package/dist/client/client-core.d.ts +1 -0
  8. package/dist/client/client-core.js +7 -0
  9. package/dist/client/controllers/spawner.controller.d.ts +12 -0
  10. package/dist/client/controllers/spawner.controller.js +51 -0
  11. package/dist/client/decorators/controller.d.ts +3 -0
  12. package/dist/client/decorators/controller.js +14 -0
  13. package/dist/client/decorators/export.d.ts +7 -0
  14. package/dist/client/decorators/export.js +15 -0
  15. package/dist/client/decorators/gameEvent.d.ts +47 -0
  16. package/dist/client/decorators/gameEvent.js +54 -0
  17. package/dist/client/decorators/index.d.ts +10 -0
  18. package/dist/client/decorators/index.js +26 -0
  19. package/dist/client/decorators/interval.d.ts +7 -0
  20. package/dist/client/decorators/interval.js +15 -0
  21. package/dist/client/decorators/key.d.ts +2 -0
  22. package/dist/client/decorators/key.js +10 -0
  23. package/dist/client/decorators/localEvent.d.ts +7 -0
  24. package/dist/client/decorators/localEvent.js +15 -0
  25. package/dist/client/decorators/nui.d.ts +1 -0
  26. package/dist/client/decorators/nui.js +9 -0
  27. package/dist/client/decorators/onNet.d.ts +1 -0
  28. package/dist/client/decorators/onNet.js +9 -0
  29. package/dist/client/decorators/resourceLifecycle.d.ts +11 -0
  30. package/dist/client/decorators/resourceLifecycle.js +24 -0
  31. package/dist/client/decorators/tick.d.ts +1 -0
  32. package/dist/client/decorators/tick.js +9 -0
  33. package/dist/client/index.d.ts +7 -0
  34. package/dist/client/index.js +23 -0
  35. package/dist/client/interfaces/appearance.interface.d.ts +19 -0
  36. package/dist/client/interfaces/appearance.interface.js +2 -0
  37. package/dist/client/player/player.d.ts +262 -0
  38. package/dist/client/player/player.js +480 -0
  39. package/dist/client/player/player.loader.d.ts +1 -0
  40. package/dist/client/player/player.loader.js +22 -0
  41. package/dist/client/services/appearance.service.d.ts +6 -0
  42. package/dist/client/services/appearance.service.js +89 -0
  43. package/dist/client/services/blip.service.d.ts +112 -0
  44. package/dist/client/services/blip.service.js +215 -0
  45. package/dist/client/services/index.d.ts +9 -0
  46. package/dist/client/services/index.js +25 -0
  47. package/dist/client/services/marker.service.d.ts +94 -0
  48. package/dist/client/services/marker.service.js +153 -0
  49. package/dist/client/services/notification.service.d.ts +76 -0
  50. package/dist/client/services/notification.service.js +111 -0
  51. package/dist/client/services/ped.service.d.ts +182 -0
  52. package/dist/client/services/ped.service.js +302 -0
  53. package/dist/client/services/progress.service.d.ts +82 -0
  54. package/dist/client/services/progress.service.js +210 -0
  55. package/dist/client/services/spawn.service.d.ts +73 -0
  56. package/dist/client/services/spawn.service.js +261 -0
  57. package/dist/client/services/streaming.service.d.ts +165 -0
  58. package/dist/client/services/streaming.service.js +341 -0
  59. package/dist/client/services/textui.service.d.ts +82 -0
  60. package/dist/client/services/textui.service.js +156 -0
  61. package/dist/client/services/vehicle.service.d.ts +168 -0
  62. package/dist/client/services/vehicle.service.js +296 -0
  63. package/dist/client/system/metadata-client.keys.d.ts +13 -0
  64. package/dist/client/system/metadata-client.keys.js +16 -0
  65. package/dist/client/system/processors/export.processor.d.ts +7 -0
  66. package/dist/client/system/processors/export.processor.js +39 -0
  67. package/dist/client/system/processors/gameEvent.processor.d.ts +10 -0
  68. package/dist/client/system/processors/gameEvent.processor.js +58 -0
  69. package/dist/client/system/processors/interval.processor.d.ts +7 -0
  70. package/dist/client/system/processors/interval.processor.js +43 -0
  71. package/dist/client/system/processors/key.processor.d.ts +8 -0
  72. package/dist/client/system/processors/key.processor.js +27 -0
  73. package/dist/client/system/processors/localEvent.processor.d.ts +7 -0
  74. package/dist/client/system/processors/localEvent.processor.js +38 -0
  75. package/dist/client/system/processors/netEvent.processor.d.ts +7 -0
  76. package/dist/client/system/processors/netEvent.processor.js +38 -0
  77. package/dist/client/system/processors/nui.processor.d.ts +7 -0
  78. package/dist/client/system/processors/nui.processor.js +40 -0
  79. package/dist/client/system/processors/resourceLifecycle.processor.d.ts +9 -0
  80. package/dist/client/system/processors/resourceLifecycle.processor.js +69 -0
  81. package/dist/client/system/processors/tick.processor.d.ts +5 -0
  82. package/dist/client/system/processors/tick.processor.js +37 -0
  83. package/dist/client/system/processors.register.d.ts +1 -0
  84. package/dist/client/system/processors.register.js +27 -0
  85. package/dist/client/types/game-events.d.ts +126 -0
  86. package/dist/client/types/game-events.js +83 -0
  87. package/dist/client/types/index.d.ts +1 -0
  88. package/dist/client/types/index.js +17 -0
  89. package/dist/client/ui-bridge.d.ts +116 -0
  90. package/dist/client/ui-bridge.js +201 -0
  91. package/dist/index.d.ts +5 -0
  92. package/dist/index.js +41 -0
  93. package/dist/server/bootstrap.d.ts +16 -0
  94. package/dist/server/bootstrap.js +57 -0
  95. package/dist/server/bus/core-event-bus.d.ts +6 -0
  96. package/dist/server/bus/core-event-bus.js +31 -0
  97. package/dist/server/configs/api.config.d.ts +71 -0
  98. package/dist/server/configs/api.config.js +81 -0
  99. package/dist/server/configs/config.base.d.ts +63 -0
  100. package/dist/server/configs/config.base.js +64 -0
  101. package/dist/server/configs/index.d.ts +2 -0
  102. package/dist/server/configs/index.js +18 -0
  103. package/dist/server/container.d.ts +2 -0
  104. package/dist/server/container.js +6 -0
  105. package/dist/server/controllers/chat.controller.d.ts +10 -0
  106. package/dist/server/controllers/chat.controller.js +50 -0
  107. package/dist/server/controllers/command.controller.d.ts +7 -0
  108. package/dist/server/controllers/command.controller.js +47 -0
  109. package/dist/server/controllers/session.controller.d.ts +9 -0
  110. package/dist/server/controllers/session.controller.js +70 -0
  111. package/dist/server/core.d.ts +1 -0
  112. package/dist/server/core.js +7 -0
  113. package/dist/server/database/adapters/oxmysql.adapter.d.ts +89 -0
  114. package/dist/server/database/adapters/oxmysql.adapter.js +149 -0
  115. package/dist/server/database/database.contract.d.ts +128 -0
  116. package/dist/server/database/database.contract.js +29 -0
  117. package/dist/server/database/database.service.d.ts +216 -0
  118. package/dist/server/database/database.service.js +301 -0
  119. package/dist/server/database/index.d.ts +53 -0
  120. package/dist/server/database/index.js +70 -0
  121. package/dist/server/database/types.d.ts +67 -0
  122. package/dist/server/database/types.js +7 -0
  123. package/dist/server/database.d.ts +7 -0
  124. package/dist/server/database.js +23 -0
  125. package/dist/server/decorators/bind.d.ts +2 -0
  126. package/dist/server/decorators/bind.js +15 -0
  127. package/dist/server/decorators/command.d.ts +49 -0
  128. package/dist/server/decorators/command.js +23 -0
  129. package/dist/server/decorators/controller.d.ts +25 -0
  130. package/dist/server/decorators/controller.js +36 -0
  131. package/dist/server/decorators/export.d.ts +39 -0
  132. package/dist/server/decorators/export.js +47 -0
  133. package/dist/server/decorators/guard.d.ts +56 -0
  134. package/dist/server/decorators/guard.js +82 -0
  135. package/dist/server/decorators/index.d.ts +10 -0
  136. package/dist/server/decorators/index.js +29 -0
  137. package/dist/server/decorators/onFiveMEvent.d.ts +6 -0
  138. package/dist/server/decorators/onFiveMEvent.js +14 -0
  139. package/dist/server/decorators/onFrameworkEvent.d.ts +22 -0
  140. package/dist/server/decorators/onFrameworkEvent.js +29 -0
  141. package/dist/server/decorators/onNet.d.ts +58 -0
  142. package/dist/server/decorators/onNet.js +57 -0
  143. package/dist/server/decorators/onTick.d.ts +32 -0
  144. package/dist/server/decorators/onTick.js +40 -0
  145. package/dist/server/decorators/public.d.ts +27 -0
  146. package/dist/server/decorators/public.js +36 -0
  147. package/dist/server/decorators/requiresState.d.ts +56 -0
  148. package/dist/server/decorators/requiresState.js +63 -0
  149. package/dist/server/decorators/throttle.d.ts +48 -0
  150. package/dist/server/decorators/throttle.js +63 -0
  151. package/dist/server/decorators/utils.d.ts +57 -0
  152. package/dist/server/decorators/utils.js +63 -0
  153. package/dist/server/entities/index.d.ts +1 -0
  154. package/dist/server/entities/index.js +17 -0
  155. package/dist/server/entities/player.d.ts +157 -0
  156. package/dist/server/entities/player.js +217 -0
  157. package/dist/server/error-handler.d.ts +2 -0
  158. package/dist/server/error-handler.js +43 -0
  159. package/dist/server/helpers/resolve-method.d.ts +5 -0
  160. package/dist/server/helpers/resolve-method.js +18 -0
  161. package/dist/server/index.d.ts +10 -0
  162. package/dist/server/index.js +31 -0
  163. package/dist/server/loaders/exports.loader.d.ts +0 -0
  164. package/dist/server/loaders/exports.loader.js +23 -0
  165. package/dist/server/loaders/playerSession.loader.d.ts +1 -0
  166. package/dist/server/loaders/playerSession.loader.js +51 -0
  167. package/dist/server/services/access-control.service.d.ts +56 -0
  168. package/dist/server/services/access-control.service.js +99 -0
  169. package/dist/server/services/chat.service.d.ts +7 -0
  170. package/dist/server/services/chat.service.js +31 -0
  171. package/dist/server/services/command.service.d.ts +15 -0
  172. package/dist/server/services/command.service.js +77 -0
  173. package/dist/server/services/config.service.d.ts +75 -0
  174. package/dist/server/services/config.service.js +116 -0
  175. package/dist/server/services/default/default-security.handler.d.ts +6 -0
  176. package/dist/server/services/default/default-security.handler.js +26 -0
  177. package/dist/server/services/http/http.service.d.ts +50 -0
  178. package/dist/server/services/http/http.service.js +126 -0
  179. package/dist/server/services/index.d.ts +10 -0
  180. package/dist/server/services/index.js +26 -0
  181. package/dist/server/services/parallel/index.d.ts +49 -0
  182. package/dist/server/services/parallel/index.js +67 -0
  183. package/dist/server/services/parallel/parallel-compute.service.d.ts +132 -0
  184. package/dist/server/services/parallel/parallel-compute.service.js +449 -0
  185. package/dist/server/services/parallel/types.d.ts +188 -0
  186. package/dist/server/services/parallel/types.js +7 -0
  187. package/dist/server/services/parallel/worker-pool.d.ts +83 -0
  188. package/dist/server/services/parallel/worker-pool.js +350 -0
  189. package/dist/server/services/parallel/worker.d.ts +19 -0
  190. package/dist/server/services/parallel/worker.js +49 -0
  191. package/dist/server/services/persistence.service.d.ts +59 -0
  192. package/dist/server/services/persistence.service.js +166 -0
  193. package/dist/server/services/player.service.d.ts +96 -0
  194. package/dist/server/services/player.service.js +132 -0
  195. package/dist/server/services/rate-limiter.service.d.ts +5 -0
  196. package/dist/server/services/rate-limiter.service.js +39 -0
  197. package/dist/server/services/registers.d.ts +1 -0
  198. package/dist/server/services/registers.js +18 -0
  199. package/dist/server/setup.d.ts +9 -0
  200. package/dist/server/setup.js +28 -0
  201. package/dist/server/system/metadata-server.keys.d.ts +10 -0
  202. package/dist/server/system/metadata-server.keys.js +13 -0
  203. package/dist/server/system/processors/command.processor.d.ts +9 -0
  204. package/dist/server/system/processors/command.processor.js +30 -0
  205. package/dist/server/system/processors/coreEvent.processor.d.ts +7 -0
  206. package/dist/server/system/processors/coreEvent.processor.js +41 -0
  207. package/dist/server/system/processors/export.processor.d.ts +7 -0
  208. package/dist/server/system/processors/export.processor.js +30 -0
  209. package/dist/server/system/processors/fivemEvent.processor.d.ts +7 -0
  210. package/dist/server/system/processors/fivemEvent.processor.js +40 -0
  211. package/dist/server/system/processors/netEvent.processor.d.ts +11 -0
  212. package/dist/server/system/processors/netEvent.processor.js +103 -0
  213. package/dist/server/system/processors/tick.processor.d.ts +5 -0
  214. package/dist/server/system/processors/tick.processor.js +36 -0
  215. package/dist/server/system/processors.register.d.ts +1 -0
  216. package/dist/server/system/processors.register.js +23 -0
  217. package/dist/server/system/schema-generator.d.ts +2 -0
  218. package/dist/server/system/schema-generator.js +34 -0
  219. package/dist/server/templates/admin/admin.controller-template.d.ts +12 -0
  220. package/dist/server/templates/admin/admin.controller-template.js +2 -0
  221. package/dist/server/templates/auth/auth-provider.contract.d.ts +58 -0
  222. package/dist/server/templates/auth/auth-provider.contract.js +23 -0
  223. package/dist/server/templates/index.d.ts +8 -0
  224. package/dist/server/templates/index.js +21 -0
  225. package/dist/server/templates/persistence/index.d.ts +30 -0
  226. package/dist/server/templates/persistence/index.js +34 -0
  227. package/dist/server/templates/persistence/player-persistence.contract.d.ts +86 -0
  228. package/dist/server/templates/persistence/player-persistence.contract.js +52 -0
  229. package/dist/server/templates/repository/index.d.ts +57 -0
  230. package/dist/server/templates/repository/index.js +61 -0
  231. package/dist/server/templates/repository/repository.contract.d.ts +224 -0
  232. package/dist/server/templates/repository/repository.contract.js +342 -0
  233. package/dist/server/templates/repository/repository.types.d.ts +51 -0
  234. package/dist/server/templates/repository/repository.types.js +7 -0
  235. package/dist/server/templates/security/permission.types.d.ts +32 -0
  236. package/dist/server/templates/security/permission.types.js +2 -0
  237. package/dist/server/templates/security/principal-provider.contract.d.ts +43 -0
  238. package/dist/server/templates/security/principal-provider.contract.js +19 -0
  239. package/dist/server/templates/security/security-handler.contract.d.ts +5 -0
  240. package/dist/server/templates/security/security-handler.contract.js +6 -0
  241. package/dist/server/types/core-events.d.ts +22 -0
  242. package/dist/server/types/core-events.js +2 -0
  243. package/dist/server/types/security.types.d.ts +7 -0
  244. package/dist/server/types/security.types.js +2 -0
  245. package/dist/shared/index.d.ts +1 -0
  246. package/dist/shared/index.js +17 -0
  247. package/dist/shared/logger/core-logger.d.ts +35 -0
  248. package/dist/shared/logger/core-logger.js +52 -0
  249. package/dist/shared/logger/index.d.ts +11 -0
  250. package/dist/shared/logger/index.js +26 -0
  251. package/dist/shared/logger/logger.config.d.ts +47 -0
  252. package/dist/shared/logger/logger.config.js +33 -0
  253. package/dist/shared/logger/logger.service.d.ts +161 -0
  254. package/dist/shared/logger/logger.service.js +279 -0
  255. package/dist/shared/logger/logger.types.d.ts +85 -0
  256. package/dist/shared/logger/logger.types.js +74 -0
  257. package/dist/shared/logger/transports/buffered.transport.d.ts +88 -0
  258. package/dist/shared/logger/transports/buffered.transport.js +174 -0
  259. package/dist/shared/logger/transports/console.transport.d.ts +37 -0
  260. package/dist/shared/logger/transports/console.transport.js +134 -0
  261. package/dist/shared/logger/transports/index.d.ts +3 -0
  262. package/dist/shared/logger/transports/index.js +19 -0
  263. package/dist/shared/logger/transports/transport.interface.d.ts +40 -0
  264. package/dist/shared/logger/transports/transport.interface.js +2 -0
  265. package/dist/system/class-constructor.d.ts +1 -0
  266. package/dist/system/class-constructor.js +2 -0
  267. package/dist/system/decorator-processor.d.ts +4 -0
  268. package/dist/system/decorator-processor.js +2 -0
  269. package/dist/system/metadata.scanner.d.ts +7 -0
  270. package/dist/system/metadata.scanner.js +45 -0
  271. package/dist/utils/errors.d.ts +14 -0
  272. package/dist/utils/errors.js +25 -0
  273. package/dist/utils/index.d.ts +4 -0
  274. package/dist/utils/index.js +20 -0
  275. package/dist/utils/result.d.ts +12 -0
  276. package/dist/utils/result.js +10 -0
  277. package/dist/utils/rgb.d.ts +5 -0
  278. package/dist/utils/rgb.js +2 -0
  279. package/dist/utils/vector3.d.ts +13 -0
  280. package/dist/utils/vector3.js +27 -0
  281. package/package.json +98 -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;