@machinemetrics/mm-erp-sdk 0.1.9-beta.1 → 0.1.9-beta.2
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/README.md +5 -0
- package/dist/{config-CvA-mFWF.js → config-Bax6Ofp5.js} +2 -2
- package/dist/{config-CvA-mFWF.js.map → config-Bax6Ofp5.js.map} +1 -1
- package/dist/{connector-factory-BPm2GVVF.js → connector-factory-BaMIlES8.js} +2 -2
- package/dist/{connector-factory-BPm2GVVF.js.map → connector-factory-BaMIlES8.js.map} +1 -1
- package/dist/{hashed-cache-manager-B15NN8hK.js → hashed-cache-manager-C1u9jQgY.js} +4 -4
- package/dist/{hashed-cache-manager-B15NN8hK.js.map → hashed-cache-manager-C1u9jQgY.js.map} +1 -1
- package/dist/{index-D8qO1NyK.js → index-BkVlW0ZW.js} +2 -2
- package/dist/{index-D8qO1NyK.js.map → index-BkVlW0ZW.js.map} +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/{logger-BWw0_z9q.js → logger-DW5fyhVS.js} +114 -78
- package/dist/logger-DW5fyhVS.js.map +1 -0
- package/dist/mm-erp-sdk.js +7 -716
- package/dist/mm-erp-sdk.js.map +1 -1
- package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +4 -4
- package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.js +12 -5
- package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +3 -3
- package/dist/services/data-sync-service/jobs/run-migrations.js +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.js +4 -7
- package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
- package/dist/services/mm-api-service/index.d.ts +0 -7
- package/dist/services/mm-api-service/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/mm-api-service.d.ts +0 -6
- package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
- package/dist/services/reporting-service/logger.d.ts.map +1 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +2 -5
- package/src/index.ts +0 -3
- package/src/services/data-sync-service/data-sync-service.ts +0 -10
- package/src/services/data-sync-service/jobs/from-erp.ts +7 -2
- package/src/services/data-sync-service/jobs/to-erp.ts +1 -5
- package/src/services/mm-api-service/index.ts +0 -8
- package/src/services/mm-api-service/mm-api-service.ts +2 -19
- package/src/services/reporting-service/logger.ts +111 -81
- package/src/utils/index.ts +0 -6
- package/dist/logger-BWw0_z9q.js.map +0 -1
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +0 -30
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +0 -1
- package/dist/services/mm-api-service/company-info.d.ts +0 -13
- package/dist/services/mm-api-service/company-info.d.ts.map +0 -1
- package/dist/services/nats-service/nats-service.d.ts +0 -114
- package/dist/services/nats-service/nats-service.d.ts.map +0 -1
- package/dist/services/nats-service/test-nats-subscriber.d.ts +0 -6
- package/dist/services/nats-service/test-nats-subscriber.d.ts.map +0 -1
- package/dist/utils/error-formatter.d.ts +0 -19
- package/dist/utils/error-formatter.d.ts.map +0 -1
- package/src/services/data-sync-service/nats-labor-ticket-listener.ts +0 -341
- package/src/services/mm-api-service/company-info.ts +0 -87
- package/src/services/nats-service/nats-service.ts +0 -351
- package/src/services/nats-service/test-nats-subscriber.ts +0 -96
- package/src/utils/error-formatter.ts +0 -205
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-sync-service.d.ts","sourceRoot":"","sources":["../../../src/services/data-sync-service/data-sync-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-sync-service.d.ts","sourceRoot":"","sources":["../../../src/services/data-sync-service/data-sync-service.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,GAAU,eAAe,MAAM,kBAuG7D,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../../../config-
|
|
2
|
-
import { H as HashedCacheManager } from "../../../hashed-cache-manager-
|
|
3
|
-
import { S as SQLiteCoordinator } from "../../../index-
|
|
4
|
-
import { l as logger } from "../../../logger-
|
|
1
|
+
import "../../../config-Bax6Ofp5.js";
|
|
2
|
+
import { H as HashedCacheManager } from "../../../hashed-cache-manager-C1u9jQgY.js";
|
|
3
|
+
import { S as SQLiteCoordinator } from "../../../index-BkVlW0ZW.js";
|
|
4
|
+
import { l as logger } from "../../../logger-DW5fyhVS.js";
|
|
5
5
|
logger.level = process.env.LOG_LEVEL || "info";
|
|
6
6
|
const main = async () => {
|
|
7
7
|
const cacheManager = new HashedCacheManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-erp.d.ts","sourceRoot":"","sources":["../../../../src/services/data-sync-service/jobs/from-erp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AASvB,QAAA,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"from-erp.d.ts","sourceRoot":"","sources":["../../../../src/services/data-sync-service/jobs/from-erp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AASvB,QAAA,MAAM,IAAI,qBAkCT,CAAC;AAoBF,eAAe,IAAI,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import "../../../config-
|
|
2
|
-
import { l as logger } from "../../../logger-
|
|
3
|
-
import { S as SQLiteCoordinator } from "../../../index-
|
|
4
|
-
import { c as createConnectorFromPath } from "../../../connector-factory-
|
|
1
|
+
import "../../../config-Bax6Ofp5.js";
|
|
2
|
+
import { l as logger } from "../../../logger-DW5fyhVS.js";
|
|
3
|
+
import { S as SQLiteCoordinator } from "../../../index-BkVlW0ZW.js";
|
|
4
|
+
import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
|
|
5
5
|
logger.level = process.env.LOG_LEVEL || "info";
|
|
6
6
|
const main = async () => {
|
|
7
7
|
try {
|
|
@@ -18,8 +18,15 @@ const main = async () => {
|
|
|
18
18
|
await connector.syncFromERPCompleted();
|
|
19
19
|
logger.info("==========Completed from-erp job cycle==========");
|
|
20
20
|
} catch (error) {
|
|
21
|
+
const errorDetails = {
|
|
22
|
+
message: error instanceof Error ? error.message : String(error),
|
|
23
|
+
stack: error instanceof Error ? error.stack : void 0,
|
|
24
|
+
name: error instanceof Error ? error.name : void 0,
|
|
25
|
+
...error && typeof error === "object" ? error : {}
|
|
26
|
+
// Include all enumerable properties if it's an object
|
|
27
|
+
};
|
|
21
28
|
logger.error('Worker for job "from-erp" had an error', {
|
|
22
|
-
error
|
|
29
|
+
error: errorDetails
|
|
23
30
|
});
|
|
24
31
|
throw error;
|
|
25
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-erp.js","sources":["../../../../src/services/data-sync-service/jobs/from-erp.ts"],"sourcesContent":["import \"dotenv/config\";\n\nimport logger from \"../../../services/reporting-service/logger\";\nimport { SQLiteCoordinator } from \"../../sqlite-service\";\nimport { createConnectorFromPath } from \"../../../utils/connector-factory\";\n\n// Configure the logger with the correct log level\nlogger.level = process.env.LOG_LEVEL || \"info\";\n\nconst main = async () => {\n try {\n logger.info('Worker for job \"from-erp\" online');\n logger.info(\"==========Starting from-erp job cycle==========\");\n\n // Get the connector path from the environment variable\n const connectorPath = process.env.CONNECTOR_PATH;\n \n if (!connectorPath) {\n throw new Error(\"Connector path not provided in environment variables\");\n }\n\n // Create a new connector instance for this job\n const connector = await createConnectorFromPath(connectorPath);\n\n await SQLiteCoordinator.executeWithLock(\"from-erp\", async () => {\n await connector.syncFromERP();\n });\n\n await connector.syncFromERPCompleted();\n logger.info(\"==========Completed from-erp job cycle==========\");\n } catch (error) {\n
|
|
1
|
+
{"version":3,"file":"from-erp.js","sources":["../../../../src/services/data-sync-service/jobs/from-erp.ts"],"sourcesContent":["import \"dotenv/config\";\n\nimport logger from \"../../../services/reporting-service/logger\";\nimport { SQLiteCoordinator } from \"../../sqlite-service\";\nimport { createConnectorFromPath } from \"../../../utils/connector-factory\";\n\n// Configure the logger with the correct log level\nlogger.level = process.env.LOG_LEVEL || \"info\";\n\nconst main = async () => {\n try {\n logger.info('Worker for job \"from-erp\" online');\n logger.info(\"==========Starting from-erp job cycle==========\");\n\n // Get the connector path from the environment variable\n const connectorPath = process.env.CONNECTOR_PATH;\n \n if (!connectorPath) {\n throw new Error(\"Connector path not provided in environment variables\");\n }\n\n // Create a new connector instance for this job\n const connector = await createConnectorFromPath(connectorPath);\n\n await SQLiteCoordinator.executeWithLock(\"from-erp\", async () => {\n await connector.syncFromERP();\n });\n\n await connector.syncFromERPCompleted();\n logger.info(\"==========Completed from-erp job cycle==========\");\n } catch (error) {\n const errorDetails = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined,\n ...(error && typeof error === \"object\" ? error : {}), // Include all enumerable properties if it's an object\n };\n logger.error('Worker for job \"from-erp\" had an error', {\n error: errorDetails,\n });\n\n throw error; // Rethrow so Bree can handle it properly\n }\n};\n\n// Cross-platform module detection fix for Bree compatibility\n// Windows: process.argv[1] uses backslashes, import.meta.url uses forward slashes\n// Linux/Mac: both use forward slashes, so this normalization is safe\nconst normalizedArgv1 = process.argv[1].replace(/\\\\/g, '/');\nconst fileUrl = normalizedArgv1.startsWith('/') ? \n `file://${normalizedArgv1}` : // Unix: file:// + /path = file:///path\n `file:///${normalizedArgv1}`; // Windows: file:/// + C:/path = file:///C:/path\nconst isMainModule = import.meta.url === fileUrl;\n\nif (isMainModule) {\n // This is called when Bree runs this file as a worker\n try {\n await main();\n } catch {\n process.exitCode = 1; // prefer exitCode so stdout/stderr can flush\n }\n}\n\nexport default main;"],"names":[],"mappings":";;;;AAOA,OAAO,QAAQ,QAAQ,IAAI,aAAa;AAExC,MAAM,OAAO,YAAY;AACvB,MAAI;AACF,WAAO,KAAK,kCAAkC;AAC9C,WAAO,KAAK,iDAAiD;AAG7D,UAAM,gBAAgB,QAAQ,IAAI;AAElC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAGA,UAAM,YAAY,MAAM,wBAAwB,aAAa;AAE7D,UAAM,kBAAkB,gBAAgB,YAAY,YAAY;AAC9D,YAAM,UAAU,YAAA;AAAA,IAClB,CAAC;AAED,UAAM,UAAU,qBAAA;AAChB,WAAO,KAAK,kDAAkD;AAAA,EAChE,SAAS,OAAO;AACd,UAAM,eAAe;AAAA,MACnB,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,MAC9C,MAAM,iBAAiB,QAAQ,MAAM,OAAO;AAAA,MAC5C,GAAI,SAAS,OAAO,UAAU,WAAW,QAAQ,CAAA;AAAA;AAAA,IAAC;AAEpD,WAAO,MAAM,0CAA0C;AAAA,MACrD,OAAO;AAAA,IAAA,CACR;AAED,UAAM;AAAA,EACR;AACF;AAKA,MAAM,kBAAkB,QAAQ,KAAK,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC1D,MAAM,UAAU,gBAAgB,WAAW,GAAG,IAC5C,UAAU,eAAe;AAAA;AAAA,EACzB,WAAW,eAAe;AAAA;AAC5B,MAAM,eAAe,YAAY,QAAQ;AAEzC,IAAI,cAAc;AAEhB,MAAI;AACF,UAAM,KAAA;AAAA,EACR,QAAQ;AACN,YAAQ,WAAW;AAAA,EACrB;AACF;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import "../../../config-
|
|
2
|
-
import { l as logger } from "../../../logger-
|
|
3
|
-
import { c as createConnectorFromPath } from "../../../connector-factory-
|
|
1
|
+
import "../../../config-Bax6Ofp5.js";
|
|
2
|
+
import { l as logger } from "../../../logger-DW5fyhVS.js";
|
|
3
|
+
import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
|
|
4
4
|
logger.level = process.env.LOG_LEVEL || "info";
|
|
5
5
|
const main = async () => {
|
|
6
6
|
try {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import knex from "knex";
|
|
2
|
-
import { l as logger } from "../../../logger-
|
|
2
|
+
import { l as logger } from "../../../logger-DW5fyhVS.js";
|
|
3
3
|
import { c as config } from "../../../knexfile-Bng2Ru9c.js";
|
|
4
4
|
logger.level = process.env.LOG_LEVEL || "info";
|
|
5
5
|
const db = knex(config.local);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-erp.d.ts","sourceRoot":"","sources":["../../../../src/services/data-sync-service/jobs/to-erp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"to-erp.d.ts","sourceRoot":"","sources":["../../../../src/services/data-sync-service/jobs/to-erp.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAQvB,QAAA,MAAM,IAAI,qBAoCT,CAAC;AAoBF,eAAe,IAAI,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import "../../../config-
|
|
2
|
-
import { l as logger } from "../../../logger-
|
|
3
|
-
import {
|
|
4
|
-
import { c as createConnectorFromPath } from "../../../connector-factory-BPm2GVVF.js";
|
|
1
|
+
import "../../../config-Bax6Ofp5.js";
|
|
2
|
+
import { l as logger } from "../../../logger-DW5fyhVS.js";
|
|
3
|
+
import { c as createConnectorFromPath } from "../../../connector-factory-BaMIlES8.js";
|
|
5
4
|
logger.level = process.env.LOG_LEVEL || "info";
|
|
6
5
|
const main = async () => {
|
|
7
6
|
try {
|
|
@@ -12,9 +11,7 @@ const main = async () => {
|
|
|
12
11
|
throw new Error("Connector path not provided in environment variables");
|
|
13
12
|
}
|
|
14
13
|
const connector = await createConnectorFromPath(connectorPath);
|
|
15
|
-
await
|
|
16
|
-
await connector.syncToERP();
|
|
17
|
-
});
|
|
14
|
+
await connector.syncToERP();
|
|
18
15
|
await connector.syncToERPCompleted();
|
|
19
16
|
logger.info("==========Completed to-erp job cycle==========");
|
|
20
17
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-erp.js","sources":["../../../../src/services/data-sync-service/jobs/to-erp.ts"],"sourcesContent":["import \"dotenv/config\";\n\nimport logger from \"../../reporting-service/logger\";\nimport {
|
|
1
|
+
{"version":3,"file":"to-erp.js","sources":["../../../../src/services/data-sync-service/jobs/to-erp.ts"],"sourcesContent":["import \"dotenv/config\";\n\nimport logger from \"../../reporting-service/logger\";\nimport { createConnectorFromPath } from \"../../../utils/connector-factory\";\n\n// Configure the logger with the correct log level\nlogger.level = process.env.LOG_LEVEL || \"info\";\n\nconst main = async () => {\n try {\n logger.info('Worker for job \"to-erp\" online');\n logger.info(\"==========Starting to-erp job cycle==========\");\n\n // Get the connector path from the environment variable\n const connectorPath = process.env.CONNECTOR_PATH;\n\n if (!connectorPath) {\n throw new Error(\"Connector path not provided in environment variables\");\n }\n\n // Create a new connector instance for this job\n const connector = await createConnectorFromPath(connectorPath);\n\n await connector.syncToERP();\n await connector.syncToERPCompleted();\n\n logger.info(\"==========Completed to-erp job cycle==========\");\n } catch (error) {\n const errorDetails = {\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined,\n ...(error && typeof error === \"object\" ? error : {}), // Include all enumerable properties if it's an object\n };\n logger.error('Worker for job \"to-erp\" had an error', {\n error: errorDetails,\n connectorPath: process.env.CONNECTOR_PATH,\n });\n\n // Also log to console for immediate visibility\n console.error(\"to-erp job error:\", error);\n\n throw error; // Rethrow so Bree can handle it properly\n }\n};\n\n// Cross-platform module detection fix for Bree compatibility\n// Windows: process.argv[1] uses backslashes, import.meta.url uses forward slashes\n// Linux/Mac: both use forward slashes, so this normalization is safe\nconst normalizedArgv1 = process.argv[1].replace(/\\\\/g, '/');\nconst fileUrl = normalizedArgv1.startsWith('/') ? \n `file://${normalizedArgv1}` : // Unix: file:// + /path = file:///path\n `file:///${normalizedArgv1}`; // Windows: file:/// + C:/path = file:///C:/path\nconst isMainModule = import.meta.url === fileUrl;\n\nif (isMainModule) {\n // This is called when Bree runs this file as a worker\n try {\n await main();\n } catch {\n process.exitCode = 1; // prefer exitCode so stdout/stderr can flush\n }\n}\n\nexport default main;\n"],"names":[],"mappings":";;;AAMA,OAAO,QAAQ,QAAQ,IAAI,aAAa;AAExC,MAAM,OAAO,YAAY;AACvB,MAAI;AACF,WAAO,KAAK,gCAAgC;AAC5C,WAAO,KAAK,+CAA+C;AAG3D,UAAM,gBAAgB,QAAQ,IAAI;AAElC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAGA,UAAM,YAAY,MAAM,wBAAwB,aAAa;AAE7D,UAAM,UAAU,UAAA;AAChB,UAAM,UAAU,mBAAA;AAEhB,WAAO,KAAK,gDAAgD;AAAA,EAC9D,SAAS,OAAO;AACd,UAAM,eAAe;AAAA,MACnB,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAAA,MAC9C,MAAM,iBAAiB,QAAQ,MAAM,OAAO;AAAA,MAC5C,GAAI,SAAS,OAAO,UAAU,WAAW,QAAQ,CAAA;AAAA;AAAA,IAAC;AAEpD,WAAO,MAAM,wCAAwC;AAAA,MACnD,OAAO;AAAA,MACP,eAAe,QAAQ,IAAI;AAAA,IAAA,CAC5B;AAGD,YAAQ,MAAM,qBAAqB,KAAK;AAExC,UAAM;AAAA,EACR;AACF;AAKA,MAAM,kBAAkB,QAAQ,KAAK,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC1D,MAAM,UAAU,gBAAgB,WAAW,GAAG,IAC5C,UAAU,eAAe;AAAA;AAAA,EACzB,WAAW,eAAe;AAAA;AAC5B,MAAM,eAAe,YAAY,QAAQ;AAEzC,IAAI,cAAc;AAEhB,MAAI;AACF,UAAM,KAAA;AAAA,EACR,QAAQ;AACN,YAAQ,WAAW;AAAA,EACrB;AACF;"}
|
|
@@ -3,8 +3,6 @@ import type { MMReceiveLaborTicketReason, MMReceiveLaborTicketWorkOrderOperation
|
|
|
3
3
|
import { MMSendPerson, MMSendResource, MMSendPart, MMSendPartOperation, MMSendWorkOrder, MMSendWorkOrderOperation, MMSendReason, MMSendLaborTicket, MMSendWorkOrderBatch } from "./types/send-types";
|
|
4
4
|
import type { IToRESTApiObject } from "./types/send-types";
|
|
5
5
|
import type { MMApiBaseResponse, MM200NonLaborTicketResponse, MM200LaborTicketResponse, MM207NonLaborTicketResponse, MM207LaborTicketResponse, MM500NonLaborTicketException, MM500LaborTicketException, MMGraphQLResourceResponse, MMMachineGroupsResponse } from "./types/mm-response-interfaces";
|
|
6
|
-
import { getCompanyInfo } from "./company-info";
|
|
7
|
-
import type { CompanyInfo } from "./company-info";
|
|
8
6
|
/**
|
|
9
7
|
* A class to manage interactions with the MM API
|
|
10
8
|
*/
|
|
@@ -31,9 +29,4 @@ export { MMSendPerson, MMSendResource, MMSendPart, MMSendPartOperation, MMSendWo
|
|
|
31
29
|
* Batch interfaces for sending multiple related entities
|
|
32
30
|
*/
|
|
33
31
|
export type { MMSendWorkOrderBatch };
|
|
34
|
-
/**
|
|
35
|
-
* Company information utilities
|
|
36
|
-
*/
|
|
37
|
-
export { getCompanyInfo };
|
|
38
|
-
export type { CompanyInfo };
|
|
39
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mm-api-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAEV,0BAA0B,EAC1B,sCAAsC,EACvC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mm-api-service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAEV,0BAA0B,EAC1B,sCAAsC,EACvC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAExC;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB;;;GAGG;AACH,YAAY,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EACV,0BAA0B,EAC1B,sCAAsC,GACvC,CAAC;AAEF;;GAEG;AACH,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;GAEG;AACH,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,GAClB,CAAC;AAEF;;GAEG;AACH,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -160,12 +160,6 @@ export declare class MMApiClient {
|
|
|
160
160
|
* @returns Promise with an array of labor ticket updates
|
|
161
161
|
*/
|
|
162
162
|
fetchLaborTicketUpdates(query: Record<string, string>): Promise<MMReceiveLaborTicket[]>;
|
|
163
|
-
/**
|
|
164
|
-
* Fetch a single labor ticket by reference from the MM API
|
|
165
|
-
* @param laborTicketRef The labor ticket reference to fetch
|
|
166
|
-
* @returns Promise with the labor ticket data
|
|
167
|
-
*/
|
|
168
|
-
fetchLaborTicketByRef(laborTicketRef: string): Promise<MMReceiveLaborTicket>;
|
|
169
163
|
/**
|
|
170
164
|
* Fetch a checkpoint for a specific system, table, and checkpoint type
|
|
171
165
|
* @param checkpoint The checkpoint to fetch
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mm-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/mm-api-service/mm-api-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,UAAU,EAIX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAYxC;;;GAGG;AACH,qBAAa,WAAW;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,UAAU,CAAC;IAEhB,OAAO,CAAC,QAAQ,CAA0B;IAE1C,YAAY;;;;;;;;;;;;;MAaV;;YAeY,oBAAoB;
|
|
1
|
+
{"version":3,"file":"mm-api-service.d.ts","sourceRoot":"","sources":["../../../src/services/mm-api-service/mm-api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/services/reporting-service/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/services/reporting-service/logger.ts"],"names":[],"mappings":"AAuGA,QAAA,MAAM,MAAM,0BAIV,CAAC;AAuGH,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,SA8BhE,CAAC;AAKF,eAAe,MAAM,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -46,11 +46,6 @@ export type { HTTPClient, HTTPRequestConfig, HTTPResponse } from "./http-client"
|
|
|
46
46
|
*/
|
|
47
47
|
export * from "./mm-labor-ticket-helpers";
|
|
48
48
|
export { getErrorType } from './error-utils';
|
|
49
|
-
/**
|
|
50
|
-
* Error formatting utilities
|
|
51
|
-
*/
|
|
52
|
-
export { formatError, formatErrorForLogging } from './error-formatter';
|
|
53
|
-
export type { FormattedError } from './error-formatter';
|
|
54
49
|
/**
|
|
55
50
|
* MM Connector Logger utilities
|
|
56
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAC5D,cAAc,cAAc,CAAC;AAE7B;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,YAAY,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAEpF;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAE7C;;GAEG;AACH,cAAc,oDAAoD,CAAC;AACnE,cAAc,oDAAoD,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjF;;GAEG;AACH,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAC5D,cAAc,cAAc,CAAC;AAE7B;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAC5F,YAAY,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAEpF;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAE7C;;GAEG;AACH,cAAc,oDAAoD,CAAC;AACnE,cAAc,oDAAoD,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjF;;GAEG;AACH,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACzH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;GAEG;AACH,cAAc,2BAA2B,CAAC;AAE1C;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAExE;;GAEG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@machinemetrics/mm-erp-sdk",
|
|
3
3
|
"description": "A library for syncing data between MachineMetrics and ERP systems",
|
|
4
|
-
"version": "0.1.9-beta.
|
|
4
|
+
"version": "0.1.9-beta.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "machinemetrics",
|
|
7
7
|
"main": "dist/mm-erp-sdk.js",
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
"scripts": {
|
|
15
15
|
"build": "vite build && tsc --project tsconfig.declarations.json",
|
|
16
16
|
"start": "vite build --watch",
|
|
17
|
-
"type-check": "tsc --noEmit"
|
|
18
|
-
"test:nats": "tsx src/services/nats-service/test-nats-subscriber.ts"
|
|
17
|
+
"type-check": "tsc --noEmit"
|
|
19
18
|
},
|
|
20
19
|
"dependencies": {
|
|
21
20
|
"@azure/msal-node": "^2.12.0",
|
|
@@ -29,7 +28,6 @@
|
|
|
29
28
|
"knex": "^3.1.0",
|
|
30
29
|
"lodash": "^4.17.21",
|
|
31
30
|
"mssql": "^11.0.1",
|
|
32
|
-
"nats": "^2.29.3",
|
|
33
31
|
"winston": "^3.14.0",
|
|
34
32
|
"winston-daily-rotate-file": "^5.0.0",
|
|
35
33
|
"xxhashjs": "^0.2.2",
|
|
@@ -45,7 +43,6 @@
|
|
|
45
43
|
"@types/node": "^20.0.0",
|
|
46
44
|
"@types/xxhashjs": "^0.2.4",
|
|
47
45
|
"prettier": "^3.6.2",
|
|
48
|
-
"tsx": "^4.20.6",
|
|
49
46
|
"typescript": "^5.8.3",
|
|
50
47
|
"vite": "^5.3.4"
|
|
51
48
|
},
|
package/src/index.ts
CHANGED
|
@@ -49,10 +49,7 @@ export {
|
|
|
49
49
|
applyTimezoneOffsetsToFields,
|
|
50
50
|
convertToLocalTime,
|
|
51
51
|
getErrorType,
|
|
52
|
-
formatError,
|
|
53
|
-
formatErrorForLogging,
|
|
54
52
|
} from "./utils";
|
|
55
|
-
export type { FormattedError } from "./utils";
|
|
56
53
|
|
|
57
54
|
// Local data store
|
|
58
55
|
export { getInitialLoadComplete, setInitialLoadComplete } from "./utils";
|
|
@@ -4,21 +4,11 @@ import path from "path";
|
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
import { CoreConfiguration } from "./configuration-manager";
|
|
6
6
|
import logger from "../reporting-service/logger";
|
|
7
|
-
import { createConnectorFromPath } from "../../utils/connector-factory";
|
|
8
|
-
import { NatsLaborTicketListener } from "./nats-labor-ticket-listener";
|
|
9
7
|
|
|
10
8
|
export const runDataSyncService = async (connectorPath: string) => {
|
|
11
9
|
const config = CoreConfiguration.inst();
|
|
12
10
|
|
|
13
11
|
try {
|
|
14
|
-
// Create connector instance
|
|
15
|
-
const connector = await createConnectorFromPath(connectorPath);
|
|
16
|
-
|
|
17
|
-
// Start NATS listener if enabled
|
|
18
|
-
if (process.env.NATS_ENABLED === "true") {
|
|
19
|
-
const natsListener = new NatsLaborTicketListener(connector);
|
|
20
|
-
await natsListener.start();
|
|
21
|
-
}
|
|
22
12
|
// Find the SDK's node_modules directory and jobs path using ES module import
|
|
23
13
|
const currentFileUrl = import.meta.url;
|
|
24
14
|
const currentFilePath = fileURLToPath(currentFileUrl);
|
|
@@ -29,9 +29,14 @@ const main = async () => {
|
|
|
29
29
|
await connector.syncFromERPCompleted();
|
|
30
30
|
logger.info("==========Completed from-erp job cycle==========");
|
|
31
31
|
} catch (error) {
|
|
32
|
-
|
|
32
|
+
const errorDetails = {
|
|
33
|
+
message: error instanceof Error ? error.message : String(error),
|
|
34
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
35
|
+
name: error instanceof Error ? error.name : undefined,
|
|
36
|
+
...(error && typeof error === "object" ? error : {}), // Include all enumerable properties if it's an object
|
|
37
|
+
};
|
|
33
38
|
logger.error('Worker for job "from-erp" had an error', {
|
|
34
|
-
error,
|
|
39
|
+
error: errorDetails,
|
|
35
40
|
});
|
|
36
41
|
|
|
37
42
|
throw error; // Rethrow so Bree can handle it properly
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import "dotenv/config";
|
|
2
2
|
|
|
3
3
|
import logger from "../../reporting-service/logger";
|
|
4
|
-
import { SQLiteCoordinator } from "../../sqlite-service";
|
|
5
4
|
import { createConnectorFromPath } from "../../../utils/connector-factory";
|
|
6
5
|
|
|
7
6
|
// Configure the logger with the correct log level
|
|
@@ -22,10 +21,7 @@ const main = async () => {
|
|
|
22
21
|
// Create a new connector instance for this job
|
|
23
22
|
const connector = await createConnectorFromPath(connectorPath);
|
|
24
23
|
|
|
25
|
-
await
|
|
26
|
-
await connector.syncToERP();
|
|
27
|
-
});
|
|
28
|
-
|
|
24
|
+
await connector.syncToERP();
|
|
29
25
|
await connector.syncToERPCompleted();
|
|
30
26
|
|
|
31
27
|
logger.info("==========Completed to-erp job cycle==========");
|
|
@@ -27,8 +27,6 @@ import type {
|
|
|
27
27
|
MMGraphQLResourceResponse,
|
|
28
28
|
MMMachineGroupsResponse,
|
|
29
29
|
} from "./types/mm-response-interfaces";
|
|
30
|
-
import { getCompanyInfo } from "./company-info";
|
|
31
|
-
import type { CompanyInfo } from "./company-info";
|
|
32
30
|
|
|
33
31
|
/**
|
|
34
32
|
* A class to manage interactions with the MM API
|
|
@@ -83,9 +81,3 @@ export {
|
|
|
83
81
|
* Batch interfaces for sending multiple related entities
|
|
84
82
|
*/
|
|
85
83
|
export type { MMSendWorkOrderBatch };
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Company information utilities
|
|
89
|
-
*/
|
|
90
|
-
export { getCompanyInfo };
|
|
91
|
-
export type { CompanyInfo };
|
|
@@ -80,12 +80,9 @@ export class MMApiClient {
|
|
|
80
80
|
return typeof err === "object" && err !== null && "status" in err;
|
|
81
81
|
};
|
|
82
82
|
|
|
83
|
-
// Check if this looks like an auth error - retry on auth status codes
|
|
83
|
+
// Check if this looks like an auth error - only retry on explicit auth status codes
|
|
84
84
|
const isAuthError =
|
|
85
|
-
hasStatus(error) && (error.status === 401 || error.status === 403)
|
|
86
|
-
(hasStatus(error) && error.status === 500 &&
|
|
87
|
-
typeof (error as any).data?.error === 'string' &&
|
|
88
|
-
(error as any).data.error.includes('JWT'));
|
|
85
|
+
hasStatus(error) && (error.status === 401 || error.status === 403);
|
|
89
86
|
|
|
90
87
|
if (isAuthError && !options.token) {
|
|
91
88
|
// Only retry if we used cached token
|
|
@@ -509,20 +506,6 @@ export class MMApiClient {
|
|
|
509
506
|
return updates.data.map((ticket) => new MMReceiveLaborTicket(ticket));
|
|
510
507
|
}
|
|
511
508
|
|
|
512
|
-
/**
|
|
513
|
-
* Fetch a single labor ticket by reference from the MM API
|
|
514
|
-
* @param laborTicketRef The labor ticket reference to fetch
|
|
515
|
-
* @returns Promise with the labor ticket data
|
|
516
|
-
*/
|
|
517
|
-
async fetchLaborTicketByRef(
|
|
518
|
-
laborTicketRef: string
|
|
519
|
-
): Promise<MMReceiveLaborTicket> {
|
|
520
|
-
const response = (await this.getData(
|
|
521
|
-
`${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/${laborTicketRef}`
|
|
522
|
-
)) as { data: MMReceiveLaborTicket };
|
|
523
|
-
return new MMReceiveLaborTicket(response.data);
|
|
524
|
-
}
|
|
525
|
-
|
|
526
509
|
/**
|
|
527
510
|
* Fetch a checkpoint for a specific system, table, and checkpoint type
|
|
528
511
|
* @param checkpoint The checkpoint to fetch
|
|
@@ -3,6 +3,33 @@ import DailyRotateFile from "winston-daily-rotate-file";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
|
|
5
5
|
const logDirectory = "logs";
|
|
6
|
+
const initialLogLevel = process.env.LOG_LEVEL || "info";
|
|
7
|
+
|
|
8
|
+
const LOGGER_ERROR_PREFIX = "[mm-erp-sdk logger]";
|
|
9
|
+
|
|
10
|
+
const serializeLoggerError = (error: unknown): string => {
|
|
11
|
+
if (error instanceof Error) {
|
|
12
|
+
return error.stack ?? error.message;
|
|
13
|
+
}
|
|
14
|
+
if (typeof error === "string") {
|
|
15
|
+
return error;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return JSON.stringify(error);
|
|
19
|
+
} catch {
|
|
20
|
+
return String(error);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const handleLoggerError = (error: unknown) => {
|
|
25
|
+
const serialized = serializeLoggerError(error);
|
|
26
|
+
try {
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.error(`${LOGGER_ERROR_PREFIX} transport error: ${serialized}`);
|
|
29
|
+
} catch {
|
|
30
|
+
/* ignore failures when reporting logger errors */
|
|
31
|
+
}
|
|
32
|
+
};
|
|
6
33
|
|
|
7
34
|
const MSG_MAX_LEN = 60;
|
|
8
35
|
const MSG_MAX_CHARS = 2048;
|
|
@@ -23,45 +50,8 @@ const truncateString = (str: string): string => {
|
|
|
23
50
|
return result;
|
|
24
51
|
};
|
|
25
52
|
|
|
26
|
-
/**
|
|
27
|
-
* Safe JSON serializer that handles circular references and extracts meaningful error data
|
|
28
|
-
*/
|
|
29
|
-
const safeStringify = (obj: any, indent: number = 2): string => {
|
|
30
|
-
const seen = new WeakSet();
|
|
31
|
-
|
|
32
|
-
return JSON.stringify(
|
|
33
|
-
obj,
|
|
34
|
-
(key, value) => {
|
|
35
|
-
// Handle Error objects specially
|
|
36
|
-
if (value instanceof Error) {
|
|
37
|
-
return {
|
|
38
|
-
message: value.message,
|
|
39
|
-
name: value.name,
|
|
40
|
-
stack: value.stack,
|
|
41
|
-
...(value.constructor.name === 'HTTPError' || value.constructor.name === 'AxiosError' ? {
|
|
42
|
-
status: (value as any).status,
|
|
43
|
-
code: (value as any).code,
|
|
44
|
-
data: (value as any).data,
|
|
45
|
-
} : {}),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Handle circular references
|
|
50
|
-
if (typeof value === "object" && value !== null) {
|
|
51
|
-
if (seen.has(value)) {
|
|
52
|
-
return "[Circular]";
|
|
53
|
-
}
|
|
54
|
-
seen.add(value);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return value;
|
|
58
|
-
},
|
|
59
|
-
indent
|
|
60
|
-
);
|
|
61
|
-
};
|
|
62
|
-
|
|
63
53
|
const baseFormat = format.printf(({ timestamp, level, message, ...rest }) => {
|
|
64
|
-
let restString =
|
|
54
|
+
let restString = JSON.stringify(rest, undefined, 2);
|
|
65
55
|
restString = restString === "{}" ? "" : restString;
|
|
66
56
|
|
|
67
57
|
let formattedMessage: string;
|
|
@@ -97,25 +87,31 @@ const logFormat = format.combine(
|
|
|
97
87
|
baseFormat
|
|
98
88
|
);
|
|
99
89
|
|
|
90
|
+
const createConsoleTransport = () => {
|
|
91
|
+
const consoleTransport = new transports.Console({
|
|
92
|
+
format: format.combine(
|
|
93
|
+
format.timestamp(),
|
|
94
|
+
format.splat(),
|
|
95
|
+
baseFormat,
|
|
96
|
+
format.colorize({ all: true })
|
|
97
|
+
),
|
|
98
|
+
});
|
|
99
|
+
consoleTransport.on("error", handleLoggerError);
|
|
100
|
+
return consoleTransport;
|
|
101
|
+
};
|
|
102
|
+
|
|
100
103
|
// Create a basic logger with default configuration
|
|
101
104
|
const logger = createLogger({
|
|
102
|
-
level:
|
|
105
|
+
level: initialLogLevel,
|
|
103
106
|
format: logFormat,
|
|
104
|
-
transports: [
|
|
105
|
-
new transports.Console({
|
|
106
|
-
format: format.combine(
|
|
107
|
-
format.timestamp(),
|
|
108
|
-
format.splat(),
|
|
109
|
-
baseFormat,
|
|
110
|
-
format.colorize({ all: true })
|
|
111
|
-
),
|
|
112
|
-
}),
|
|
113
|
-
],
|
|
107
|
+
transports: [createConsoleTransport()],
|
|
114
108
|
});
|
|
115
109
|
|
|
110
|
+
logger.on("error", handleLoggerError);
|
|
111
|
+
|
|
116
112
|
// Helper function to create a file transport with shared configuration
|
|
117
113
|
const createFileTransport = (): DailyRotateFile => {
|
|
118
|
-
|
|
114
|
+
const transport = new DailyRotateFile({
|
|
119
115
|
filename: path.join(logDirectory, "%DATE%.log"),
|
|
120
116
|
datePattern: "YYYY-MM-DD",
|
|
121
117
|
zippedArchive: true,
|
|
@@ -123,6 +119,8 @@ const createFileTransport = (): DailyRotateFile => {
|
|
|
123
119
|
maxFiles: "14d",
|
|
124
120
|
format: logFormat,
|
|
125
121
|
});
|
|
122
|
+
transport.on("error", handleLoggerError);
|
|
123
|
+
return transport;
|
|
126
124
|
};
|
|
127
125
|
|
|
128
126
|
// Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
|
|
@@ -136,35 +134,76 @@ function attachRotateMitigation(
|
|
|
136
134
|
if (isRefreshing) return;
|
|
137
135
|
isRefreshing = true;
|
|
138
136
|
let removalTimer: NodeJS.Timeout | null = null;
|
|
137
|
+
let next: DailyRotateFile | null = null;
|
|
139
138
|
|
|
140
|
-
|
|
141
|
-
const next = createFileTransport();
|
|
142
|
-
// When the new file is created, remove the old transport
|
|
143
|
-
next.on("new", () => {
|
|
139
|
+
const cleanupRefresh = () => {
|
|
144
140
|
if (removalTimer) {
|
|
145
141
|
clearTimeout(removalTimer);
|
|
146
142
|
removalTimer = null;
|
|
147
143
|
}
|
|
148
|
-
try {
|
|
149
|
-
logger.remove(transport);
|
|
150
|
-
} catch {}
|
|
151
144
|
isRefreshing = false;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
// Create replacement first to avoid any logging gap
|
|
149
|
+
next = createFileTransport();
|
|
150
|
+
// When the new file is created, remove the old transport
|
|
151
|
+
next.on("new", () => {
|
|
152
|
+
if (removalTimer) {
|
|
153
|
+
clearTimeout(removalTimer);
|
|
154
|
+
removalTimer = null;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
logger.remove(transport);
|
|
158
|
+
} catch (error) {
|
|
159
|
+
handleLoggerError(error);
|
|
160
|
+
}
|
|
161
|
+
cleanupRefresh();
|
|
162
|
+
});
|
|
163
|
+
attachRotateMitigation(next, opts);
|
|
159
164
|
try {
|
|
160
|
-
logger.
|
|
161
|
-
} catch {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
+
logger.add(next);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
handleLoggerError(error);
|
|
168
|
+
cleanupRefresh();
|
|
169
|
+
try {
|
|
170
|
+
logger.remove(next);
|
|
171
|
+
} catch {}
|
|
172
|
+
try {
|
|
173
|
+
if (typeof next.close === "function") {
|
|
174
|
+
next.close();
|
|
175
|
+
}
|
|
176
|
+
} catch {}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
165
179
|
|
|
166
|
-
|
|
167
|
-
|
|
180
|
+
// Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
|
|
181
|
+
const REMOVAL_GRACE_MS = 30000;
|
|
182
|
+
removalTimer = setTimeout(() => {
|
|
183
|
+
try {
|
|
184
|
+
logger.remove(transport);
|
|
185
|
+
} catch (error) {
|
|
186
|
+
handleLoggerError(error);
|
|
187
|
+
}
|
|
188
|
+
cleanupRefresh();
|
|
189
|
+
}, REMOVAL_GRACE_MS);
|
|
190
|
+
|
|
191
|
+
// Keep console and other transports intact; do not silence or clear
|
|
192
|
+
logger.level = logLevel;
|
|
193
|
+
} catch (error) {
|
|
194
|
+
cleanupRefresh();
|
|
195
|
+
handleLoggerError(error);
|
|
196
|
+
if (next) {
|
|
197
|
+
try {
|
|
198
|
+
logger.remove(next);
|
|
199
|
+
} catch {}
|
|
200
|
+
try {
|
|
201
|
+
if (typeof next.close === "function") {
|
|
202
|
+
next.close();
|
|
203
|
+
}
|
|
204
|
+
} catch {}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
168
207
|
});
|
|
169
208
|
}
|
|
170
209
|
|
|
@@ -194,16 +233,7 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
|
|
|
194
233
|
|
|
195
234
|
// Add console transport in non-production environments
|
|
196
235
|
if (nodeEnv !== "production") {
|
|
197
|
-
logger.add(
|
|
198
|
-
new transports.Console({
|
|
199
|
-
format: format.combine(
|
|
200
|
-
format.timestamp(),
|
|
201
|
-
format.splat(),
|
|
202
|
-
baseFormat,
|
|
203
|
-
format.colorize({ all: true })
|
|
204
|
-
),
|
|
205
|
-
})
|
|
206
|
-
);
|
|
236
|
+
logger.add(createConsoleTransport());
|
|
207
237
|
}
|
|
208
238
|
|
|
209
239
|
// Set the log level
|