@fdm-monster/server 1.9.0-rc1 → 1.9.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/.env.template +1 -1
- package/.yarn/install-state.gz +0 -0
- package/.yarn/releases/yarn-4.10.3.cjs +942 -0
- package/.yarnrc.yml +1 -1
- package/README.md +2 -2
- package/RELEASE_NOTES.MD +25 -0
- package/dist/consoles/utils/api-messages.js +5 -5
- package/dist/consoles/utils/api-messages.js.map +1 -1
- package/dist/constants/authorization.constants.js +9 -9
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/event.constants.js +8 -8
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +16 -15
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/constants/service.constants.js +4 -4
- package/dist/constants/service.constants.js.map +1 -1
- package/dist/container.js +3 -3
- package/dist/container.js.map +1 -1
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/camera-stream.controller.js.map +1 -1
- package/dist/controllers/custom-gcode.controller.js.map +1 -1
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-completion.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +3 -1
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-group.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +8 -4
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +4 -4
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +3 -3
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-controller.validation.js +6 -6
- package/dist/controllers/validation/printer-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +13 -4
- package/dist/controllers/validation/printer-files-controller.validation.js.map +1 -1
- package/dist/controllers/validation/setting.validation.js +4 -4
- package/dist/controllers/validation/setting.validation.js.map +1 -1
- package/dist/controllers/validation/user-controller.validation.js +8 -8
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/entities/index.js +12 -12
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/exceptions/failed-dependency.exception.js.map +1 -1
- package/dist/exceptions/job.exceptions.js.map +1 -1
- package/dist/exceptions/runtime.exceptions.js +10 -10
- package/dist/exceptions/runtime.exceptions.js.map +1 -1
- package/dist/handlers/logger-factory.js +2 -2
- package/dist/handlers/logger-factory.js.map +1 -1
- package/dist/handlers/logger.js +9 -151
- package/dist/handlers/logger.js.map +1 -1
- package/dist/handlers/logging/file-logging.transport.js +35 -0
- package/dist/handlers/logging/file-logging.transport.js.map +1 -0
- package/dist/handlers/logging/loki-logging.transport.js +55 -0
- package/dist/handlers/logging/loki-logging.transport.js.map +1 -0
- package/dist/handlers/logging/static.logger.js +134 -0
- package/dist/handlers/logging/static.logger.js.map +1 -0
- package/dist/handlers/validators.js +3 -3
- package/dist/handlers/validators.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +4 -4
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/global.middleware.js +3 -3
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +5 -5
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +4 -4
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer.js +6 -6
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/socketio.middleware.js +11 -3
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/models/Printer.js +3 -3
- package/dist/models/Printer.js.map +1 -1
- package/dist/models/Settings.js +6 -1
- package/dist/models/Settings.js.map +1 -1
- package/dist/models/index.js +11 -11
- package/dist/models/index.js.map +1 -1
- package/dist/server.constants.js +2 -1
- package/dist/server.constants.js.map +1 -1
- package/dist/server.env.js +18 -19
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js +1 -2
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/client-bundle.service.js +4 -8
- package/dist/services/core/client-bundle.service.js.map +1 -1
- package/dist/services/core/cradle.service.js.map +1 -1
- package/dist/services/core/github.service.js +1 -1
- package/dist/services/core/github.service.js.map +1 -1
- package/dist/services/core/http-client.factory.js.map +1 -1
- package/dist/services/core/logs-manager.service.js.map +1 -1
- package/dist/services/core/monsterpi.service.js.map +1 -1
- package/dist/services/core/multer.service.js +6 -7
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/server-release.service.js +6 -12
- package/dist/services/core/server-release.service.js.map +1 -1
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/interfaces/camera-stream.dto.js +4 -4
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/floor.dto.js +6 -6
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/print-completion.dto.js +3 -3
- package/dist/services/interfaces/print-completion.dto.js.map +1 -1
- package/dist/services/interfaces/printer-group.dto.js +3 -3
- package/dist/services/interfaces/printer-group.dto.js.map +1 -1
- package/dist/services/interfaces/printer.dto.js +3 -3
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/user.dto.js +3 -3
- package/dist/services/interfaces/user.dto.js.map +1 -1
- package/dist/services/mongoose/camera-stream.service.js +1 -2
- package/dist/services/mongoose/camera-stream.service.js.map +1 -1
- package/dist/services/mongoose/floor.service.js.map +1 -1
- package/dist/services/mongoose/permission.service.js.map +1 -1
- package/dist/services/mongoose/print-completion.service.js.map +1 -1
- package/dist/services/mongoose/printer.service.js.map +1 -1
- package/dist/services/mongoose/refresh-token.service.js.map +1 -1
- package/dist/services/mongoose/role.service.js +1 -2
- package/dist/services/mongoose/role.service.js.map +1 -1
- package/dist/services/mongoose/user.service.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker-event.dto.js +3 -3
- package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/idle-timeout.dto.js +3 -3
- package/dist/services/moonraker/dto/objects/idle-timeout.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/print-stats.dto.js +3 -3
- package/dist/services/moonraker/dto/objects/print-stats.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/printer-objects-list.dto.js +3 -3
- package/dist/services/moonraker/dto/objects/printer-objects-list.dto.js.map +1 -1
- package/dist/services/moonraker/dto/printer-info.dto.js +3 -3
- package/dist/services/moonraker/dto/printer-info.dto.js.map +1 -1
- package/dist/services/moonraker/dto/server-history/job.dto.js +3 -3
- package/dist/services/moonraker/dto/server-history/job.dto.js.map +1 -1
- package/dist/services/moonraker/dto/websocket/methods.js +3 -3
- package/dist/services/moonraker/dto/websocket/methods.js.map +1 -1
- package/dist/services/moonraker/dto/websocket/notify-update-response.params.js +3 -3
- package/dist/services/moonraker/dto/websocket/notify-update-response.params.js.map +1 -1
- package/dist/services/moonraker/moonraker-websocket.adapter.js +23 -18
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js +8 -4
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +2 -2
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-service.constants.js +7 -7
- package/dist/services/octoprint/constants/octoprint-service.constants.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js +3 -3
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js.map +1 -1
- package/dist/services/octoprint/dto/octoprint-event.dto.js +4 -4
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js +17 -17
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +9 -9
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint/utils/api.utils.js +3 -3
- package/dist/services/octoprint/utils/api.utils.js.map +1 -1
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
- package/dist/services/octoprint.api.js +2 -5
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-completion.service.js.map +1 -1
- package/dist/services/orm/printer-group.service.js.map +1 -1
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +2 -2
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js +6 -6
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +2 -4
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +7 -6
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/socket.factory.js.map +1 -1
- package/dist/services/task-manager.service.js +1 -2
- package/dist/services/task-manager.service.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +10 -10
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/printer-service.validation.js +14 -14
- package/dist/services/validators/printer-service.validation.js.map +1 -1
- package/dist/services/validators/settings-service.validation.js +15 -14
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +3 -3
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +6 -6
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/default-http-client.builder.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +7 -0
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js +1 -2
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/file.cache.js.map +1 -1
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-files.store.js.map +1 -1
- package/dist/state/printer-socket.store.js +1 -2
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +3 -3
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +1 -2
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +4 -4
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/client-bundle.task.js.map +1 -1
- package/dist/tasks/print-completion.socketio.task.js +1 -2
- package/dist/tasks/print-completion.socketio.task.js.map +1 -1
- package/dist/tasks/printer-file-clean.task.js.map +1 -1
- package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
- package/dist/tasks/printer-websocket.task.js.map +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks/software-update.task.js.map +1 -1
- package/dist/tasks.js +3 -3
- package/dist/tasks.js.map +1 -1
- package/dist/utils/array.util.js +3 -3
- package/dist/utils/array.util.js.map +1 -1
- package/dist/utils/crypto.utils.js +3 -3
- package/dist/utils/crypto.utils.js.map +1 -1
- package/dist/utils/env.utils.js +6 -6
- package/dist/utils/env.utils.js.map +1 -1
- package/dist/utils/fs.utils.js +4 -4
- package/dist/utils/fs.utils.js.map +1 -1
- package/dist/utils/gcode.utils.js +3 -3
- package/dist/utils/gcode.utils.js.map +1 -1
- package/dist/utils/pretty-print.utils.js +3 -3
- package/dist/utils/pretty-print.utils.js.map +1 -1
- package/dist/utils/printer-type.utils.js +4 -4
- package/dist/utils/printer-type.utils.js.map +1 -1
- package/dist/utils/semver.utils.js +3 -3
- package/dist/utils/semver.utils.js.map +1 -1
- package/dist/utils/url.utils.js +3 -3
- package/dist/utils/url.utils.js.map +1 -1
- package/package.json +34 -33
- package/.yarn/releases/yarn-4.9.1.cjs +0 -948
|
@@ -5,35 +5,35 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
function _export(target, all) {
|
|
6
6
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: all
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
AuthenticationError
|
|
12
|
+
get AuthenticationError () {
|
|
13
13
|
return AuthenticationError;
|
|
14
14
|
},
|
|
15
|
-
AuthorizationError
|
|
15
|
+
get AuthorizationError () {
|
|
16
16
|
return AuthorizationError;
|
|
17
17
|
},
|
|
18
|
-
BadRequestException
|
|
18
|
+
get BadRequestException () {
|
|
19
19
|
return BadRequestException;
|
|
20
20
|
},
|
|
21
|
-
ExternalServiceError
|
|
21
|
+
get ExternalServiceError () {
|
|
22
22
|
return ExternalServiceError;
|
|
23
23
|
},
|
|
24
|
-
ForbiddenError
|
|
24
|
+
get ForbiddenError () {
|
|
25
25
|
return ForbiddenError;
|
|
26
26
|
},
|
|
27
|
-
InternalServerException
|
|
27
|
+
get InternalServerException () {
|
|
28
28
|
return InternalServerException;
|
|
29
29
|
},
|
|
30
|
-
NotFoundException
|
|
30
|
+
get NotFoundException () {
|
|
31
31
|
return NotFoundException;
|
|
32
32
|
},
|
|
33
|
-
NotImplementedException
|
|
33
|
+
get NotImplementedException () {
|
|
34
34
|
return NotImplementedException;
|
|
35
35
|
},
|
|
36
|
-
ValidationException
|
|
36
|
+
get ValidationException () {
|
|
37
37
|
return ValidationException;
|
|
38
38
|
}
|
|
39
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exceptions/runtime.exceptions.ts"],"names":["AuthenticationError","AuthorizationError","BadRequestException","ExternalServiceError","ForbiddenError","InternalServerException","NotFoundException","NotImplementedException","ValidationException","Error","
|
|
1
|
+
{"version":3,"sources":["../../src/exceptions/runtime.exceptions.ts"],"names":["AuthenticationError","AuthorizationError","BadRequestException","ExternalServiceError","ForbiddenError","InternalServerException","NotFoundException","NotImplementedException","ValidationException","Error","message","name","reasonCode","error","permissions","roles","reason","path","errors","validationObject","JSON","stringify","serviceType","responseObject","stack"],"mappings":";;;;;;;;;;;QAOaA;eAAAA;;QAiBAC;eAAAA;;QAcAC;eAAAA;;QA2BAC;eAAAA;;QAhDAC;eAAAA;;QA4DAC;eAAAA;;QAhCAC;eAAAA;;QA7CAC;eAAAA;;QAuDAC;eAAAA;;;AAvDN,MAAMD,gCAAgCE;IAC3C,YAAYC,OAAgB,CAAE;QAC5B,KAAK,CAACA;QACN,IAAI,CAACC,IAAI,GAAGJ,wBAAwBI,IAAI;IAC1C;AACF;AAEO,MAAMX,4BAA4BS;IACvCG,WAAmB;IAEnB,YAAYC,KAAc,EAAED,aAAa,EAAE,CAAE;QAC3C,KAAK,CAACC;QACN,IAAI,CAACF,IAAI,GAAGX,oBAAoBW,IAAI;QACpC,IAAI,CAACC,UAAU,GAAGA;IACpB;AACF;AAEO,MAAMR,uBAAuBK;IAClC,YAAYI,KAAc,CAAE;QAC1B,KAAK,CAACA;QACN,IAAI,CAACF,IAAI,GAAGP,eAAeO,IAAI;IACjC;AACF;AAEO,MAAMV,2BAA2BQ;IACtCK,cAAyB,EAAE,CAAC;IAC5BC,QAAmB,EAAE,CAAC;IACtBC,OAAgB;IAEhB,YAAY,EAAEF,WAAW,EAAEC,KAAK,EAAEC,MAAM,EAAiE,CAAE;QACzG,KAAK,CAAC;QACN,IAAI,CAACL,IAAI,GAAGV,mBAAmBU,IAAI;QACnC,IAAI,CAACK,MAAM,GAAGA;QACd,IAAI,CAACF,WAAW,GAAGA;QACnB,IAAI,CAACC,KAAK,GAAGA;IACf;AACF;AAEO,MAAMb,4BAA4BO;IACvC,YAAYC,OAAe,CAAE;QAC3B,KAAK,CAACA;QACN,IAAI,CAACC,IAAI,GAAGT,oBAAoBS,IAAI;IACtC;AACF;AAEO,MAAML,0BAA0BG;IACrCQ,KAAc;IAEd,YAAYP,OAAe,EAAEO,IAAa,CAAE;QAC1C,KAAK,CAACP;QACN,IAAI,CAACC,IAAI,GAAGL,kBAAkBK,IAAI;QAClC,IAAI,CAACM,IAAI,GAAGA;IACd;AACF;AAEO,MAAMT,4BAAqCC;IAChDS,OAAU;IAEV,YAAYC,gBAAmB,CAAE;QAC/B,KAAK,CAACC,KAAKC,SAAS,CAACF;QACrB,IAAI,CAACR,IAAI,GAAGH,oBAAoBG,IAAI;QACpC,IAAI,CAACO,MAAM,GAAGC;IAChB;AACF;AAEO,MAAMhB,6BAA6BM;IACxCI,MAAW;IACXS,YAAqB;IAErB,YAAYC,cAAmB,EAAED,WAAoB,CAAE;QACrD,KAAK,CAACF,KAAKC,SAAS,CAACE;QACrB,IAAI,CAACZ,IAAI,GAAGR,qBAAqBQ,IAAI;QACrC,IAAI,CAACE,KAAK,GAAGU;QACb,IAAI,CAACD,WAAW,GAAGA;IACrB;AACF;AAEO,MAAMjB,gCAAgCI;IAC3C,YAAYC,OAAe,EAAEc,KAAW,CAAE;QACxC,KAAK,CAACd;QACN,IAAI,CAACC,IAAI,GAAGN,wBAAwBM,IAAI;QACxC,IAAI,CAACa,KAAK,GAAGA;IACf;AACF"}
|
|
@@ -10,8 +10,8 @@ Object.defineProperty(exports, "LoggerFactory", {
|
|
|
10
10
|
});
|
|
11
11
|
const _logger = require("./logger");
|
|
12
12
|
function LoggerFactory() {
|
|
13
|
-
return (name
|
|
14
|
-
return new _logger.LoggerService(name
|
|
13
|
+
return (name)=>{
|
|
14
|
+
return new _logger.LoggerService(name);
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/handlers/logger-factory.ts"],"names":["LoggerFactory","name","
|
|
1
|
+
{"version":3,"sources":["../../src/handlers/logger-factory.ts"],"names":["LoggerFactory","name","LoggerService"],"mappings":";;;;+BAIgBA;;;eAAAA;;;wBAJc;AAIvB,SAASA;IACd,OAAO,CAACC;QACN,OAAO,IAAIC,qBAAa,CAACD;IAC3B;AACF"}
|
package/dist/handlers/logger.js
CHANGED
|
@@ -8,172 +8,30 @@ Object.defineProperty(exports, "LoggerService", {
|
|
|
8
8
|
return LoggerService;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
const
|
|
12
|
-
const _path = require("path");
|
|
13
|
-
const _luxon = require("luxon");
|
|
14
|
-
const _serverconstants = require("../server.constants");
|
|
15
|
-
const _fsutils = require("../utils/fs.utils");
|
|
16
|
-
const _winstonloki = /*#__PURE__*/ _interop_require_default(require("winston-loki"));
|
|
17
|
-
const _zod = require("zod");
|
|
18
|
-
function _interop_require_default(obj) {
|
|
19
|
-
return obj && obj.__esModule ? obj : {
|
|
20
|
-
default: obj
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
const levelMap = {
|
|
24
|
-
error: "ERR",
|
|
25
|
-
warn: "WRN",
|
|
26
|
-
info: "INF",
|
|
27
|
-
debug: "DBG",
|
|
28
|
-
http: "HTT",
|
|
29
|
-
verbose: "VRB",
|
|
30
|
-
silly: "SLY"
|
|
31
|
-
};
|
|
32
|
-
const lokiLineClassProperty = "class";
|
|
33
|
-
const lokiValidationSchema = _zod.z.object({
|
|
34
|
-
lokiEnabled: _zod.z.boolean(),
|
|
35
|
-
lokiAddress: _zod.z.string().url(),
|
|
36
|
-
lokiTimeoutSeconds: _zod.z.coerce.number().positive().default(30),
|
|
37
|
-
lokiInterval: _zod.z.coerce.number().positive().default(15)
|
|
38
|
-
});
|
|
11
|
+
const _staticlogger = require("./logging/static.logger");
|
|
39
12
|
class LoggerService {
|
|
40
13
|
name;
|
|
41
14
|
logger;
|
|
42
|
-
constructor(name
|
|
43
|
-
const isProd = process.env[_serverconstants.AppConstants.NODE_ENV_KEY] === _serverconstants.AppConstants.defaultProductionEnv;
|
|
44
|
-
const isTest = process.env[_serverconstants.AppConstants.NODE_ENV_KEY] === _serverconstants.AppConstants.defaultTestEnv;
|
|
45
|
-
let effectiveLogLevel = logFilterLevel;
|
|
46
|
-
if (!effectiveLogLevel) {
|
|
47
|
-
effectiveLogLevel = isProd || isTest ? "warn" : "debug";
|
|
48
|
-
}
|
|
49
|
-
const isLokiEnabled = process.env[_serverconstants.AppConstants.ENABLE_LOKI_LOGGING] === "true";
|
|
50
|
-
const extraWinstonTransports = [];
|
|
51
|
-
if (isLokiEnabled) {
|
|
52
|
-
const lokiConfigValidationResult = lokiValidationSchema.safeParse({
|
|
53
|
-
lokiEnabled: isLokiEnabled,
|
|
54
|
-
lokiTimeoutSeconds: process.env[_serverconstants.AppConstants.LOKI_TIMEOUT_SECONDS],
|
|
55
|
-
lokiAddress: process.env[_serverconstants.AppConstants.LOKI_ADDRESS],
|
|
56
|
-
lokiInterval: process.env[_serverconstants.AppConstants.LOKI_INTERVAL]
|
|
57
|
-
});
|
|
58
|
-
if (lokiConfigValidationResult.success) {
|
|
59
|
-
extraWinstonTransports.push(new _winstonloki.default({
|
|
60
|
-
level: effectiveLogLevel,
|
|
61
|
-
host: lokiConfigValidationResult.data.lokiAddress,
|
|
62
|
-
interval: lokiConfigValidationResult.data.lokiInterval,
|
|
63
|
-
timeout: lokiConfigValidationResult.data.lokiTimeoutSeconds,
|
|
64
|
-
handleExceptions: true,
|
|
65
|
-
onConnectionError (error) {
|
|
66
|
-
console.debug(`Loki logger enabled, but connection failed. ${error}`);
|
|
67
|
-
},
|
|
68
|
-
labels: {
|
|
69
|
-
app: "fdm-monster-server"
|
|
70
|
-
},
|
|
71
|
-
json: false,
|
|
72
|
-
useWinstonMetaAsLabels: false,
|
|
73
|
-
format: _winston.default.format.json()
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
15
|
+
constructor(name){
|
|
77
16
|
this.name = name;
|
|
78
|
-
this.logger =
|
|
79
|
-
|
|
80
|
-
...extraWinstonTransports,
|
|
81
|
-
new _winston.default.transports.Console({
|
|
82
|
-
level: effectiveLogLevel,
|
|
83
|
-
format: _winston.default.format.combine(_winston.default.format((info)=>{
|
|
84
|
-
info.rawLevel = info.level;
|
|
85
|
-
return info;
|
|
86
|
-
})(), _winston.default.format.colorize({
|
|
87
|
-
colors: {
|
|
88
|
-
error: "red",
|
|
89
|
-
warn: "yellow",
|
|
90
|
-
info: "white",
|
|
91
|
-
debug: "gray",
|
|
92
|
-
http: "magenta",
|
|
93
|
-
verbose: "cyan",
|
|
94
|
-
silly: "gray"
|
|
95
|
-
},
|
|
96
|
-
level: true,
|
|
97
|
-
message: true,
|
|
98
|
-
all: false
|
|
99
|
-
}), _winston.default.format.printf((info)=>{
|
|
100
|
-
const now = new Date();
|
|
101
|
-
const timestamp = `${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`;
|
|
102
|
-
const levelAbbr = levelMap[info.rawLevel] || info.rawLevel.substring(0, 3).toUpperCase();
|
|
103
|
-
const gray = "\x1b[90m";
|
|
104
|
-
const reset = info.message.substring(0, 5) ?? "\x1b[0m";
|
|
105
|
-
const numberRegex = /\b\d+\b/g;
|
|
106
|
-
const coloredMessage = info.message.replace(numberRegex, (match)=>`\x1b[35m${match}${reset}`);
|
|
107
|
-
let logEntry = `${gray}[${timestamp} ${reset}${levelAbbr}${reset}${gray}]${reset} ${gray}[${reset}${name}${gray}]${reset} ${coloredMessage}`;
|
|
108
|
-
if (info.meta) {
|
|
109
|
-
const metaString = JSON.stringify(info.meta);
|
|
110
|
-
const coloredMeta = metaString.replace(numberRegex, (match)=>`\x1b[35m${match}${reset}`);
|
|
111
|
-
logEntry += ` ${coloredMeta}`;
|
|
112
|
-
}
|
|
113
|
-
return logEntry;
|
|
114
|
-
}))
|
|
115
|
-
})
|
|
116
|
-
],
|
|
117
|
-
format: _winston.default.format.printf((info)=>{
|
|
118
|
-
const now = new Date();
|
|
119
|
-
const timestamp = `${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`;
|
|
120
|
-
const levelAbbr = levelMap[info.level] || `[${info.level.substring(0, 3).toUpperCase()}]`;
|
|
121
|
-
let message = `[${timestamp} ${levelAbbr}] [${name}] ${info.message}`;
|
|
122
|
-
if (info.meta) {
|
|
123
|
-
const pascalCaseMeta = Object.entries(info.meta).reduce((acc, [key, value])=>{
|
|
124
|
-
const pascalKey = key.charAt(0).toUpperCase() + key.slice(1);
|
|
125
|
-
acc[pascalKey] = value;
|
|
126
|
-
return acc;
|
|
127
|
-
}, {});
|
|
128
|
-
message += ` ${JSON.stringify(pascalCaseMeta)}`;
|
|
129
|
-
}
|
|
130
|
-
return message;
|
|
131
|
-
})
|
|
17
|
+
this.logger = (0, _staticlogger.getStaticLogger)().child({
|
|
18
|
+
[_staticlogger.logContextClassProperty]: this.name
|
|
132
19
|
});
|
|
133
|
-
if (enableFileLogs) {
|
|
134
|
-
const date = _luxon.DateTime.now().toISODate();
|
|
135
|
-
const logFilePath = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultLogsFolder, `${_serverconstants.AppConstants.logAppName}-${date}.log`);
|
|
136
|
-
this.logger.add(new _winston.default.transports.File({
|
|
137
|
-
level: isTest ? "warn" : "info",
|
|
138
|
-
filename: logFilePath,
|
|
139
|
-
maxsize: 5000000,
|
|
140
|
-
maxFiles: 5
|
|
141
|
-
}));
|
|
142
|
-
}
|
|
143
20
|
}
|
|
144
21
|
newDebug(object) {
|
|
145
|
-
this.logger.debug(
|
|
146
|
-
...object,
|
|
147
|
-
[lokiLineClassProperty]: this.name
|
|
148
|
-
});
|
|
22
|
+
this.logger.debug(object);
|
|
149
23
|
}
|
|
150
24
|
log(message, meta) {
|
|
151
|
-
|
|
152
|
-
...meta,
|
|
153
|
-
[lokiLineClassProperty]: this.name
|
|
154
|
-
};
|
|
155
|
-
this.logger.log("info", message, enrichedMeta);
|
|
25
|
+
this.logger.log("info", message, meta);
|
|
156
26
|
}
|
|
157
27
|
warn(message, meta) {
|
|
158
|
-
|
|
159
|
-
...meta,
|
|
160
|
-
[lokiLineClassProperty]: this.name
|
|
161
|
-
};
|
|
162
|
-
this.logger.log("warn", message, enrichedMeta);
|
|
28
|
+
this.logger.log("warn", message, meta);
|
|
163
29
|
}
|
|
164
30
|
debug(message, meta) {
|
|
165
|
-
|
|
166
|
-
...meta,
|
|
167
|
-
[lokiLineClassProperty]: this.name
|
|
168
|
-
};
|
|
169
|
-
this.logger.log("debug", message, enrichedMeta);
|
|
31
|
+
this.logger.log("debug", message, meta);
|
|
170
32
|
}
|
|
171
33
|
error(message, meta) {
|
|
172
|
-
|
|
173
|
-
...meta,
|
|
174
|
-
[lokiLineClassProperty]: this.name
|
|
175
|
-
};
|
|
176
|
-
this.logger.log("error", message, enrichedMeta);
|
|
34
|
+
this.logger.log("error", message, meta);
|
|
177
35
|
}
|
|
178
36
|
}
|
|
179
37
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/handlers/logger.ts"],"names":["LoggerService","
|
|
1
|
+
{"version":3,"sources":["../../src/handlers/logger.ts"],"names":["LoggerService","logger","name","getStaticLogger","child","logContextClassProperty","newDebug","object","debug","log","message","meta","warn","error"],"mappings":";;;;+BAGaA;;;eAAAA;;;8BAF4C;AAElD,MAAMA;;IACXC,OAAuB;IAEvB,YAAY,AAAiBC,IAAY,CAAE;aAAdA,OAAAA;QAC3B,IAAI,CAACD,MAAM,GAAGE,IAAAA,6BAAe,IAAGC,KAAK,CAAC;YAAE,CAACC,qCAAuB,CAAC,EAAE,IAAI,CAACH,IAAI;QAAC;IAC/E;IAEAI,SAASC,MAAW,EAAE;QACpB,IAAI,CAACN,MAAM,CAACO,KAAK,CAACD;IACpB;IAEAE,IAAIC,OAAe,EAAEC,IAAU,EAAE;QAC/B,IAAI,CAACV,MAAM,CAACQ,GAAG,CAAC,QAAQC,SAASC;IACnC;IAEAC,KAAKF,OAAe,EAAEC,IAAU,EAAE;QAChC,IAAI,CAACV,MAAM,CAACQ,GAAG,CAAC,QAAQC,SAASC;IACnC;IAEAH,MAAME,OAAe,EAAEC,IAAU,EAAE;QACjC,IAAI,CAACV,MAAM,CAACQ,GAAG,CAAC,SAASC,SAASC;IACpC;IAEAE,MAAMH,OAAe,EAAEC,IAAU,EAAE;QACjC,IAAI,CAACV,MAAM,CAACQ,GAAG,CAAC,SAASC,SAASC;IACpC;AACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createFileLoggingTransport", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createFileLoggingTransport;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _luxon = require("luxon");
|
|
12
|
+
const _path = require("path");
|
|
13
|
+
const _fsutils = require("../../utils/fs.utils");
|
|
14
|
+
const _serverconstants = require("../../server.constants");
|
|
15
|
+
const _winston = /*#__PURE__*/ _interop_require_default(require("winston"));
|
|
16
|
+
function _interop_require_default(obj) {
|
|
17
|
+
return obj && obj.__esModule ? obj : {
|
|
18
|
+
default: obj
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function createFileLoggingTransport(options) {
|
|
22
|
+
if (!options.enabled) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const date = _luxon.DateTime.now().toISODate();
|
|
26
|
+
const logFilePath = (0, _path.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultLogsFolder, `${_serverconstants.AppConstants.logAppName}-${date}.log`);
|
|
27
|
+
return new _winston.default.transports.File({
|
|
28
|
+
level: options.isTest ? "warn" : "info",
|
|
29
|
+
filename: logFilePath,
|
|
30
|
+
maxsize: 5000000,
|
|
31
|
+
maxFiles: 5
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=file-logging.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/handlers/logging/file-logging.transport.ts"],"names":["createFileLoggingTransport","options","enabled","date","DateTime","now","toISODate","logFilePath","join","superRootPath","AppConstants","defaultLogsFolder","logAppName","winston","transports","File","level","isTest","filename","maxsize","maxFiles"],"mappings":";;;;+BAWgBA;;;eAAAA;;;uBAXS;sBACJ;yBACS;iCACD;gEACT;;;;;;AAOb,SAASA,2BAA2BC,OAA0B;IACnE,IAAI,CAACA,QAAQC,OAAO,EAAE;QACpB;IACF;IAEA,MAAMC,OAAOC,eAAQ,CAACC,GAAG,GAAGC,SAAS;IACrC,MAAMC,cAAcC,IAAAA,UAAI,EACtBC,IAAAA,sBAAa,KACbC,6BAAY,CAACC,iBAAiB,EAC9B,GAAGD,6BAAY,CAACE,UAAU,CAAC,CAAC,EAAET,KAAK,IAAI,CAAC;IAG1C,OAAO,IAAIU,gBAAO,CAACC,UAAU,CAACC,IAAI,CAAC;QACjCC,OAAOf,QAAQgB,MAAM,GAAG,SAAS;QACjCC,UAAUX;QACVY,SAAS;QACTC,UAAU;IACZ;AACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createLokiLoggingTransport", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createLokiLoggingTransport;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _winstonloki = /*#__PURE__*/ _interop_require_default(require("winston-loki"));
|
|
12
|
+
const _winston = /*#__PURE__*/ _interop_require_default(require("winston"));
|
|
13
|
+
const _nodeprocess = /*#__PURE__*/ _interop_require_default(require("node:process"));
|
|
14
|
+
const _serverconstants = require("../../server.constants");
|
|
15
|
+
const _zod = require("zod");
|
|
16
|
+
function _interop_require_default(obj) {
|
|
17
|
+
return obj && obj.__esModule ? obj : {
|
|
18
|
+
default: obj
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const lokiValidationSchema = _zod.z.object({
|
|
22
|
+
lokiEnabled: _zod.z.boolean(),
|
|
23
|
+
lokiAddress: _zod.z.string().url(),
|
|
24
|
+
lokiTimeoutSeconds: _zod.z.coerce.number().positive().default(30),
|
|
25
|
+
lokiInterval: _zod.z.coerce.number().positive().default(15)
|
|
26
|
+
});
|
|
27
|
+
function createLokiLoggingTransport(options) {
|
|
28
|
+
const lokiConfigValidationResult = lokiValidationSchema.safeParse({
|
|
29
|
+
lokiEnabled: _nodeprocess.default.env[_serverconstants.AppConstants.ENABLE_LOKI_LOGGING] === "true",
|
|
30
|
+
lokiTimeoutSeconds: _nodeprocess.default.env[_serverconstants.AppConstants.LOKI_TIMEOUT_SECONDS],
|
|
31
|
+
lokiAddress: _nodeprocess.default.env[_serverconstants.AppConstants.LOKI_ADDRESS],
|
|
32
|
+
lokiInterval: _nodeprocess.default.env[_serverconstants.AppConstants.LOKI_INTERVAL]
|
|
33
|
+
});
|
|
34
|
+
if (!lokiConfigValidationResult.success || !lokiConfigValidationResult.data.lokiEnabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
return new _winstonloki.default({
|
|
38
|
+
level: options.logLevel ?? "info",
|
|
39
|
+
host: lokiConfigValidationResult.data.lokiAddress,
|
|
40
|
+
interval: lokiConfigValidationResult.data.lokiInterval,
|
|
41
|
+
timeout: lokiConfigValidationResult.data.lokiTimeoutSeconds,
|
|
42
|
+
handleExceptions: true,
|
|
43
|
+
onConnectionError (error) {
|
|
44
|
+
console.debug(`Loki logger enabled, but connection failed. ${error}`);
|
|
45
|
+
},
|
|
46
|
+
labels: {
|
|
47
|
+
app: "fdm-monster-server"
|
|
48
|
+
},
|
|
49
|
+
json: false,
|
|
50
|
+
useWinstonMetaAsLabels: false,
|
|
51
|
+
format: _winston.default.format.json()
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=loki-logging.transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/handlers/logging/loki-logging.transport.ts"],"names":["createLokiLoggingTransport","lokiValidationSchema","z","object","lokiEnabled","boolean","lokiAddress","string","url","lokiTimeoutSeconds","coerce","number","positive","default","lokiInterval","options","lokiConfigValidationResult","safeParse","process","env","AppConstants","ENABLE_LOKI_LOGGING","LOKI_TIMEOUT_SECONDS","LOKI_ADDRESS","LOKI_INTERVAL","success","data","LokiTransport","level","logLevel","host","interval","timeout","handleExceptions","onConnectionError","error","console","debug","labels","app","json","useWinstonMetaAsLabels","format","winston"],"mappings":";;;;+BAiBgBA;;;eAAAA;;;oEAjBU;gEACN;oEACA;iCACS;qBACX;;;;;;AAMlB,MAAMC,uBAAuBC,MAAC,CAACC,MAAM,CAAC;IACpCC,aAAaF,MAAC,CAACG,OAAO;IACtBC,aAAaJ,MAAC,CAACK,MAAM,GAAGC,GAAG;IAC3BC,oBAAoBP,MAAC,CAACQ,MAAM,CAACC,MAAM,GAAGC,QAAQ,GAAGC,OAAO,CAAC;IACzDC,cAAcZ,MAAC,CAACQ,MAAM,CAACC,MAAM,GAAGC,QAAQ,GAAGC,OAAO,CAAC;AACrD;AAEO,SAASb,2BAA2Be,OAA0B;IACnE,MAAMC,6BAA6Bf,qBAAqBgB,SAAS,CAAC;QAChEb,aAAac,oBAAO,CAACC,GAAG,CAACC,6BAAY,CAACC,mBAAmB,CAAC,KAAK;QAC/DZ,oBAAoBS,oBAAO,CAACC,GAAG,CAACC,6BAAY,CAACE,oBAAoB,CAAC;QAClEhB,aAAaY,oBAAO,CAACC,GAAG,CAACC,6BAAY,CAACG,YAAY,CAAC;QACnDT,cAAcI,oBAAO,CAACC,GAAG,CAACC,6BAAY,CAACI,aAAa,CAAC;IACvD;IAEA,IAAI,CAACR,2BAA2BS,OAAO,IAAI,CAACT,2BAA2BU,IAAI,CAACtB,WAAW,EAAE;QACvF;IACF;IAEA,OAAO,IAAIuB,oBAAa,CAAC;QACvBC,OAAOb,QAAQc,QAAQ,IAAI;QAC3BC,MAAMd,2BAA2BU,IAAI,CAACpB,WAAW;QACjDyB,UAAUf,2BAA2BU,IAAI,CAACZ,YAAY;QACtDkB,SAAShB,2BAA2BU,IAAI,CAACjB,kBAAkB;QAC3DwB,kBAAkB;QAClBC,mBAAkBC,KAAc;YAC9BC,QAAQC,KAAK,CAAC,CAAC,4CAA4C,EAAEF,OAAO;QACtE;QAEAG,QAAQ;YACNC,KAAK;QACP;QAEAC,MAAM;QAENC,wBAAwB;QAExBC,QAAQC,gBAAO,CAACD,MAAM,CAACF,IAAI;IAC7B;AACF"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get createStaticLogger () {
|
|
13
|
+
return createStaticLogger;
|
|
14
|
+
},
|
|
15
|
+
get getStaticLogger () {
|
|
16
|
+
return getStaticLogger;
|
|
17
|
+
},
|
|
18
|
+
get logContextClassProperty () {
|
|
19
|
+
return logContextClassProperty;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _winston = /*#__PURE__*/ _interop_require_default(require("winston"));
|
|
23
|
+
const _nodeprocess = /*#__PURE__*/ _interop_require_default(require("node:process"));
|
|
24
|
+
const _serverconstants = require("../../server.constants");
|
|
25
|
+
const _lokiloggingtransport = require("./loki-logging.transport");
|
|
26
|
+
const _fileloggingtransport = require("./file-logging.transport");
|
|
27
|
+
const _envutils = require("../../utils/env.utils");
|
|
28
|
+
function _interop_require_default(obj) {
|
|
29
|
+
return obj && obj.__esModule ? obj : {
|
|
30
|
+
default: obj
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
let staticLogger = null;
|
|
34
|
+
const levelMap = {
|
|
35
|
+
error: "ERR",
|
|
36
|
+
warn: "WRN",
|
|
37
|
+
info: "INF",
|
|
38
|
+
debug: "DBG",
|
|
39
|
+
http: "HTT",
|
|
40
|
+
verbose: "VRB",
|
|
41
|
+
silly: "SLY"
|
|
42
|
+
};
|
|
43
|
+
const logContextClassProperty = "class";
|
|
44
|
+
function getStaticLogger() {
|
|
45
|
+
if (!staticLogger) {
|
|
46
|
+
throw new Error("Logger not yet initialized.");
|
|
47
|
+
}
|
|
48
|
+
return staticLogger;
|
|
49
|
+
}
|
|
50
|
+
function createStaticLogger(config) {
|
|
51
|
+
if (staticLogger) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const isProd = _nodeprocess.default.env[_serverconstants.AppConstants.NODE_ENV_KEY] === _serverconstants.AppConstants.defaultProductionEnv;
|
|
55
|
+
const isTest = _nodeprocess.default.env[_serverconstants.AppConstants.NODE_ENV_KEY] === _serverconstants.AppConstants.defaultTestEnv;
|
|
56
|
+
const effectiveLogLevel = isProd || isTest ? "warn" : "debug";
|
|
57
|
+
const lokiTransport = (0, _lokiloggingtransport.createLokiLoggingTransport)({
|
|
58
|
+
logLevel: effectiveLogLevel
|
|
59
|
+
});
|
|
60
|
+
const extraWinstonTransports = [];
|
|
61
|
+
if (lokiTransport) {
|
|
62
|
+
extraWinstonTransports.push(lokiTransport);
|
|
63
|
+
}
|
|
64
|
+
const fileLoggerTransport = (0, _fileloggingtransport.createFileLoggingTransport)({
|
|
65
|
+
enabled: config.enableFileLogs,
|
|
66
|
+
isTest
|
|
67
|
+
});
|
|
68
|
+
if (fileLoggerTransport) {
|
|
69
|
+
extraWinstonTransports.push(fileLoggerTransport);
|
|
70
|
+
}
|
|
71
|
+
staticLogger = _winston.default.createLogger({
|
|
72
|
+
transports: [
|
|
73
|
+
...extraWinstonTransports,
|
|
74
|
+
new _winston.default.transports.Console({
|
|
75
|
+
level: effectiveLogLevel,
|
|
76
|
+
format: _winston.default.format.combine(...(0, _envutils.isDevelopmentEnvironment)() && _nodeprocess.default.env[_serverconstants.AppConstants.ENABLE_COLORED_LOGS_KEY] == "true" ? [
|
|
77
|
+
_winston.default.format((info)=>{
|
|
78
|
+
info.rawLevel = info.level;
|
|
79
|
+
return info;
|
|
80
|
+
})(),
|
|
81
|
+
_winston.default.format.colorize({
|
|
82
|
+
colors: {
|
|
83
|
+
error: "red",
|
|
84
|
+
warn: "yellow",
|
|
85
|
+
info: "white",
|
|
86
|
+
debug: "gray",
|
|
87
|
+
http: "magenta",
|
|
88
|
+
verbose: "cyan",
|
|
89
|
+
silly: "gray"
|
|
90
|
+
},
|
|
91
|
+
level: true,
|
|
92
|
+
message: true,
|
|
93
|
+
all: false
|
|
94
|
+
}),
|
|
95
|
+
_winston.default.format.printf((info)=>{
|
|
96
|
+
const now = new Date();
|
|
97
|
+
const timestamp = `${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`;
|
|
98
|
+
const levelAbbr = levelMap[info.rawLevel] ?? info.rawLevel.substring(0, 3).toUpperCase();
|
|
99
|
+
const gray = "\x1b[90m";
|
|
100
|
+
const reset = info.message.substring(0, 5) ?? "\x1b[0m";
|
|
101
|
+
const numberRegex = /\b\d+\b/g;
|
|
102
|
+
const coloredMessage = info.message.replace(numberRegex, (match)=>`\x1b[35m${match}${reset}`);
|
|
103
|
+
const serviceName = info[logContextClassProperty] ?? "unknown";
|
|
104
|
+
let logEntry = `${gray}[${timestamp} ${reset}${levelAbbr}${reset}${gray}]${reset} ${gray}[${reset}${serviceName}${gray}]${reset} ${coloredMessage}`;
|
|
105
|
+
if (info.meta) {
|
|
106
|
+
const metaString = JSON.stringify(info.meta);
|
|
107
|
+
const coloredMeta = metaString.replace(numberRegex, (match)=>`\x1b[35m${match}${reset}`);
|
|
108
|
+
logEntry += ` ${coloredMeta}`;
|
|
109
|
+
}
|
|
110
|
+
return logEntry;
|
|
111
|
+
})
|
|
112
|
+
] : [])
|
|
113
|
+
})
|
|
114
|
+
],
|
|
115
|
+
format: _winston.default.format.printf((info)=>{
|
|
116
|
+
const now = new Date();
|
|
117
|
+
const timestamp = `${now.toISOString().split("T")[0]} ${now.toTimeString().split(" ")[0]}.${now.getMilliseconds().toString().padStart(3, "0")}`;
|
|
118
|
+
const levelAbbr = levelMap[info.level] || `[${info.level.substring(0, 3).toUpperCase()}]`;
|
|
119
|
+
const serviceName = info[logContextClassProperty] ?? "unknown";
|
|
120
|
+
let message = `[${timestamp} ${levelAbbr}] [${serviceName}] ${info.message}`;
|
|
121
|
+
if (info.meta) {
|
|
122
|
+
const pascalCaseMeta = Object.entries(info.meta).reduce((acc, [key, value])=>{
|
|
123
|
+
const pascalKey = key.charAt(0).toUpperCase() + key.slice(1);
|
|
124
|
+
acc[pascalKey] = value;
|
|
125
|
+
return acc;
|
|
126
|
+
}, {});
|
|
127
|
+
message += ` ${JSON.stringify(pascalCaseMeta)}`;
|
|
128
|
+
}
|
|
129
|
+
return message;
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=static.logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/handlers/logging/static.logger.ts"],"names":["createStaticLogger","getStaticLogger","logContextClassProperty","staticLogger","levelMap","error","warn","info","debug","http","verbose","silly","Error","config","isProd","process","env","AppConstants","NODE_ENV_KEY","defaultProductionEnv","isTest","defaultTestEnv","effectiveLogLevel","lokiTransport","createLokiLoggingTransport","logLevel","extraWinstonTransports","push","fileLoggerTransport","createFileLoggingTransport","enabled","enableFileLogs","winston","createLogger","transports","Console","level","format","combine","isDevelopmentEnvironment","ENABLE_COLORED_LOGS_KEY","rawLevel","colorize","colors","message","all","printf","now","Date","timestamp","toISOString","split","toTimeString","getMilliseconds","toString","padStart","levelAbbr","substring","toUpperCase","gray","reset","numberRegex","coloredMessage","replace","match","serviceName","logEntry","meta","metaString","JSON","stringify","coloredMeta","pascalCaseMeta","Object","entries","reduce","acc","key","value","pascalKey","charAt","slice"],"mappings":"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"}
|
|
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
function _export(target, all) {
|
|
6
6
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: all
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
validateInput
|
|
12
|
+
get validateInput () {
|
|
13
13
|
return validateInput;
|
|
14
14
|
},
|
|
15
|
-
validateMiddleware
|
|
15
|
+
get validateMiddleware () {
|
|
16
16
|
return validateMiddleware;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/handlers/validators.ts"],"names":["validateInput","validateMiddleware","data","zodSchema","result","safeParseAsync","success","ValidationException","error","req","body"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/handlers/validators.ts"],"names":["validateInput","validateMiddleware","data","zodSchema","result","safeParseAsync","success","ValidationException","error","req","body"],"mappings":";;;;;;;;;;;QAIsBA;eAAAA;;QASAC;eAAAA;;;mCAZc;AAG7B,eAAeD,cAAoBE,IAAO,EAAEC,SAAuB;IACxE,MAAMC,SAAS,MAAMD,UAAUE,cAAc,CAACH;IAE9C,IAAI,CAACE,OAAOE,OAAO,EAAE;QACnB,MAAM,IAAIC,sCAAmB,CAACH,OAAOI,KAAK;IAC5C;IACA,OAAOJ,OAAOF,IAAI;AACpB;AAEO,eAAeD,mBAAyBQ,GAAe,EAAEN,SAAuB;IACrF,OAAOH,cAAcS,IAAIC,IAAI,EAAEP;AACjC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,19 @@ const _node = require("@sentry/node");
|
|
|
6
6
|
const _serverenv = require("./server.env");
|
|
7
7
|
const _servercore = require("./server.core");
|
|
8
8
|
const _containertokens = require("./container.tokens");
|
|
9
|
+
const _dotenv = require("dotenv");
|
|
10
|
+
const _logger = require("./handlers/logger");
|
|
11
|
+
const _path = require("path");
|
|
12
|
+
const _fsutils = require("./utils/fs.utils");
|
|
13
|
+
const _staticlogger = require("./handlers/logging/static.logger");
|
|
14
|
+
(0, _dotenv.config)({
|
|
15
|
+
path: (0, _path.join)((0, _fsutils.superRootPath)(), "./.env")
|
|
16
|
+
});
|
|
17
|
+
(0, _staticlogger.createStaticLogger)({
|
|
18
|
+
enableFileLogs: true
|
|
19
|
+
});
|
|
20
|
+
const logger = new _logger.LoggerService("FDM-Environment");
|
|
21
|
+
logger.log("✓ Parsed environment with (optional) .env file, created static logger");
|
|
9
22
|
(0, _serverenv.setupEnvConfig)();
|
|
10
23
|
(0, _servercore.setupServer)().then(({ httpServer, container })=>{
|
|
11
24
|
container.resolve(_containertokens.DITokens.serverHost).boot(httpServer).catch(async (e)=>{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["setupEnvConfig","setupServer","then","httpServer","container","resolve","DITokens","serverHost","boot","catch","e","console","error","captureException","flush","process","exit"],"mappings":";;;;sBAAwC;2BACT;4BACH;iCACH;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["config","path","join","superRootPath","createStaticLogger","enableFileLogs","logger","Logger","log","setupEnvConfig","setupServer","then","httpServer","container","resolve","DITokens","serverHost","boot","catch","e","console","error","captureException","flush","process","exit"],"mappings":";;;;sBAAwC;2BACT;4BACH;iCACH;wBAEF;wBACiB;sBACnB;yBACS;8BACK;AAEnCA,IAAAA,cAAM,EAAC;IAAEC,MAAMC,IAAAA,UAAI,EAACC,IAAAA,sBAAa,KAAI;AAAU;AAC/CC,IAAAA,gCAAkB,EAAC;IAAEC,gBAAgB;AAAK;AAE1C,MAAMC,SAAS,IAAIC,qBAAM,CAAC;AAC1BD,OAAOE,GAAG,CAAC;AAEXC,IAAAA,yBAAc;AAEdC,IAAAA,uBAAW,IAAGC,IAAI,CAAC,CAAC,EAAEC,UAAU,EAAEC,SAAS,EAAE;IAC3CA,UACGC,OAAO,CAAaC,yBAAQ,CAACC,UAAU,EACvCC,IAAI,CAACL,YACLM,KAAK,CAAC,OAAOC;QACZC,QAAQC,KAAK,CAAC,2DAA2DF;QAEzEG,IAAAA,sBAAgB,EAACH;QACjB,MAAMI,IAAAA,WAAK,EAAC;QACZC,QAAQC,IAAI,CAAC;IACf;AACJ"}
|
|
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
function _export(target, all) {
|
|
6
6
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: all
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
authenticate
|
|
12
|
+
get authenticate () {
|
|
13
13
|
return authenticate;
|
|
14
14
|
},
|
|
15
|
-
authorizeRoles
|
|
15
|
+
get authorizeRoles () {
|
|
16
16
|
return authorizeRoles;
|
|
17
17
|
},
|
|
18
|
-
permission
|
|
18
|
+
get permission () {
|
|
19
19
|
return permission;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/authenticate.ts"],"names":["authenticate","authorizeRoles","permission","inject","authService","loggerFactory","settingsStore","req","res","next","logger","isLoginRequired","getLoginRequired","user","needsPasswordChange","AuthenticationError","AUTH_ERROR_REASON","PasswordChangeRequired","bearer","headers","authorization","replace","undefined","length","isJwtTokenBlacklisted","LoginRequired","isAuthenticated","log","originalUrl","InvalidOrExpiredAuthToken","requiredPermission","permissionService","roleService","userRoles","roles","AuthorizationError","permissions","assignedPermissions","getRolesPermissions","authorizePermission","subset"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/middleware/authenticate.ts"],"names":["authenticate","authorizeRoles","permission","inject","authService","loggerFactory","settingsStore","req","res","next","logger","isLoginRequired","getLoginRequired","user","needsPasswordChange","AuthenticationError","AUTH_ERROR_REASON","PasswordChangeRequired","bearer","headers","authorization","replace","undefined","length","isJwtTokenBlacklisted","LoginRequired","isAuthenticated","log","originalUrl","InvalidOrExpiredAuthToken","requiredPermission","permissionService","roleService","userRoles","roles","AuthorizationError","permissions","assignedPermissions","getRolesPermissions","authorizePermission","subset"],"mappings":";;;;;;;;;;;QAWaA;eAAAA;;QAkDAC;eAAAA;;QAnBGC;eAAAA;;;+BA1CO;mCACiC;wCAEtB;AAQ3B,MAAMF,eAAe,IAC1BG,IAAAA,qBAAM,EACJ,CAACC,aAA0BC,eAA+BC,gBACxD,OAAOC,KAAcC,KAAeC;YAClC,MAAMC,SAASL,cAAc;YAE7B,MAAMM,kBAAkB,MAAML,cAAcM,gBAAgB;YAC5D,IAAI,CAACD,iBAAiB;gBACpB,OAAOF;YACT;YAGA,IAAIF,IAAIM,IAAI,EAAEC,qBAAqB;gBACjC,MAAM,IAAIC,sCAAmB,CAAC,4BAA4BC,yCAAiB,CAACC,sBAAsB;YACpG;YAGA,MAAMC,SAASX,IAAIY,OAAO,CAACC,aAAa,EAAEC,QAAQ,WAAW,OAAOC;YACpE,IAAI,CAAC,CAACJ,QAAQK,UAAUnB,YAAYoB,qBAAqB,CAACN,SAAS;gBACjE,MAAM,IAAIH,sCAAmB,CAAC,qBAAqBC,yCAAiB,CAACS,aAAa;YACpF;YAEA,IAAIlB,IAAImB,eAAe,IAAI;gBACzB,OAAOjB;YACT;YAEAC,OAAOiB,GAAG,CAAC,CAAC,6BAA6B,EAAEpB,IAAIqB,WAAW,EAAE;YAC5D,MAAM,IAAIb,sCAAmB,CAAC,qBAAqBC,yCAAiB,CAACa,yBAAyB;QAChG;AAGC,SAAS3B,WAAW4B,kBAA0B;IACnD,OAAO3B,IAAAA,qBAAM,EACX,CAAC4B,mBAAuCC,cACtC,OAAOzB,KAAcC,KAAeC;YAClC,MAAMwB,YAAY1B,IAAI2B,KAAK;YAC3B,IAAI,CAACD,WAAWV,QAAQ;gBACtB,MAAM,IAAIY,qCAAkB,CAAC;oBAAEC,aAAa;wBAACN;qBAAmB;gBAAC;YACnE;YAEA,MAAMO,sBAAsBL,YAAYM,mBAAmB,CAACL;YAC5D,IAAI,CAACF,kBAAkBQ,mBAAmB,CAACT,oBAAoBO,sBAAsB;gBACnF,MAAM,IAAIF,qCAAkB,CAAC;oBAAEC,aAAa;wBAACN;qBAAmB;gBAAC;YACnE;YAEArB;QACF;AAEN;AAEO,MAAMR,iBAAiB,CAACiC,OAAiBM,SAAS,IAAI,GAC3DrC,IAAAA,qBAAM,EAAC,CAAC6B,cAA8B,OAAOzB,KAAcC,KAAeC;YACxE,IAAI,CAACF,IAAI2B,KAAK,EAAEX,UAAU,CAACS,YAAY/B,cAAc,CAACiC,OAAO3B,IAAI2B,KAAK,EAAEM,SAAS;gBAC/E,MAAM,IAAIL,qCAAkB,CAAC;oBAAED;gBAAM;YACvC;YAEAzB;QACF"}
|