@machinemetrics/mm-erp-sdk 0.1.9-beta.0 → 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-C2Dse2g2.js → config-Bax6Ofp5.js} +2 -2
- package/dist/{config-C2Dse2g2.js.map → config-Bax6Ofp5.js.map} +1 -1
- package/dist/{connector-factory-BGykiICT.js → connector-factory-BaMIlES8.js} +2 -2
- package/dist/{connector-factory-BGykiICT.js.map → connector-factory-BaMIlES8.js.map} +1 -1
- package/dist/{hashed-cache-manager-DbG72eRm.js → hashed-cache-manager-C1u9jQgY.js} +4 -4
- package/dist/{hashed-cache-manager-DbG72eRm.js.map → hashed-cache-manager-C1u9jQgY.js.map} +1 -1
- package/dist/{index-Cq9tNcJT.js → index-BkVlW0ZW.js} +2 -2
- package/dist/{index-Cq9tNcJT.js.map → index-BkVlW0ZW.js.map} +1 -1
- package/dist/{logger-DeKxCUPp.js → logger-DW5fyhVS.js} +101 -40
- package/dist/{logger-DeKxCUPp.js.map → logger-DW5fyhVS.js.map} +1 -1
- package/dist/mm-erp-sdk.js +8 -12
- package/dist/mm-erp-sdk.js.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.js +4 -4
- 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.js +3 -3
- package/dist/services/reporting-service/logger.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/services/mm-api-service/mm-api-service.ts +1 -1
- package/src/services/reporting-service/logger.ts +110 -43
- package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +1 -5
|
@@ -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,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 {
|
|
@@ -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,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 +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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"labor-ticket-erp-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOnE;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;WACU,SAAS,CACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"labor-ticket-erp-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAOnE;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;WACU,SAAS,CACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IA4GhB;;OAEG;WACU,WAAW,CACtB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;mBA+DK,sBAAsB;mBAetB,kBAAkB;CAkDxC"}
|
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",
|
|
@@ -551,7 +551,7 @@ export class MMApiClient {
|
|
|
551
551
|
logger.info("saveCheckpoint:", { saveCheckpoint });
|
|
552
552
|
} else {
|
|
553
553
|
logger.info("Existing checkpoint found:", {
|
|
554
|
-
|
|
554
|
+
timestamp: checkpointResponse.timestamp,
|
|
555
555
|
});
|
|
556
556
|
}
|
|
557
557
|
}
|
|
@@ -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;
|
|
@@ -60,25 +87,31 @@ const logFormat = format.combine(
|
|
|
60
87
|
baseFormat
|
|
61
88
|
);
|
|
62
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
|
+
|
|
63
103
|
// Create a basic logger with default configuration
|
|
64
104
|
const logger = createLogger({
|
|
65
|
-
level:
|
|
105
|
+
level: initialLogLevel,
|
|
66
106
|
format: logFormat,
|
|
67
|
-
transports: [
|
|
68
|
-
new transports.Console({
|
|
69
|
-
format: format.combine(
|
|
70
|
-
format.timestamp(),
|
|
71
|
-
format.splat(),
|
|
72
|
-
baseFormat,
|
|
73
|
-
format.colorize({ all: true })
|
|
74
|
-
),
|
|
75
|
-
}),
|
|
76
|
-
],
|
|
107
|
+
transports: [createConsoleTransport()],
|
|
77
108
|
});
|
|
78
109
|
|
|
110
|
+
logger.on("error", handleLoggerError);
|
|
111
|
+
|
|
79
112
|
// Helper function to create a file transport with shared configuration
|
|
80
113
|
const createFileTransport = (): DailyRotateFile => {
|
|
81
|
-
|
|
114
|
+
const transport = new DailyRotateFile({
|
|
82
115
|
filename: path.join(logDirectory, "%DATE%.log"),
|
|
83
116
|
datePattern: "YYYY-MM-DD",
|
|
84
117
|
zippedArchive: true,
|
|
@@ -86,6 +119,8 @@ const createFileTransport = (): DailyRotateFile => {
|
|
|
86
119
|
maxFiles: "14d",
|
|
87
120
|
format: logFormat,
|
|
88
121
|
});
|
|
122
|
+
transport.on("error", handleLoggerError);
|
|
123
|
+
return transport;
|
|
89
124
|
};
|
|
90
125
|
|
|
91
126
|
// Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
|
|
@@ -99,35 +134,76 @@ function attachRotateMitigation(
|
|
|
99
134
|
if (isRefreshing) return;
|
|
100
135
|
isRefreshing = true;
|
|
101
136
|
let removalTimer: NodeJS.Timeout | null = null;
|
|
137
|
+
let next: DailyRotateFile | null = null;
|
|
102
138
|
|
|
103
|
-
|
|
104
|
-
const next = createFileTransport();
|
|
105
|
-
// When the new file is created, remove the old transport
|
|
106
|
-
next.on("new", () => {
|
|
139
|
+
const cleanupRefresh = () => {
|
|
107
140
|
if (removalTimer) {
|
|
108
141
|
clearTimeout(removalTimer);
|
|
109
142
|
removalTimer = null;
|
|
110
143
|
}
|
|
111
|
-
try {
|
|
112
|
-
logger.remove(transport);
|
|
113
|
-
} catch {}
|
|
114
144
|
isRefreshing = false;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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);
|
|
122
164
|
try {
|
|
123
|
-
logger.
|
|
124
|
-
} catch {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
+
}
|
|
128
179
|
|
|
129
|
-
|
|
130
|
-
|
|
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
|
+
}
|
|
131
207
|
});
|
|
132
208
|
}
|
|
133
209
|
|
|
@@ -157,16 +233,7 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
|
|
|
157
233
|
|
|
158
234
|
// Add console transport in non-production environments
|
|
159
235
|
if (nodeEnv !== "production") {
|
|
160
|
-
logger.add(
|
|
161
|
-
new transports.Console({
|
|
162
|
-
format: format.combine(
|
|
163
|
-
format.timestamp(),
|
|
164
|
-
format.splat(),
|
|
165
|
-
baseFormat,
|
|
166
|
-
format.colorize({ all: true })
|
|
167
|
-
),
|
|
168
|
-
})
|
|
169
|
-
);
|
|
236
|
+
logger.add(createConsoleTransport());
|
|
170
237
|
}
|
|
171
238
|
|
|
172
239
|
// Set the log level
|
|
@@ -56,8 +56,7 @@ export class LaborTicketERPSynchronizer {
|
|
|
56
56
|
// the checkpoint to ensure there is no gap of time for the next sync.
|
|
57
57
|
const mostRecentUpdate = laborTicketsUpdates.reduce(
|
|
58
58
|
(latest: string | null, ticket: MMReceiveLaborTicket) => {
|
|
59
|
-
if (!ticket.updatedAt) return latest;
|
|
60
|
-
if (!latest) return ticket.updatedAt; // Initialize on first valid value
|
|
59
|
+
if (!latest || !ticket.updatedAt) return latest;
|
|
61
60
|
return new Date(ticket.updatedAt) > new Date(latest)
|
|
62
61
|
? ticket.updatedAt
|
|
63
62
|
: latest;
|
|
@@ -119,9 +118,6 @@ export class LaborTicketERPSynchronizer {
|
|
|
119
118
|
timestamp: mostRecentUpdate || fallbackTimestamp,
|
|
120
119
|
},
|
|
121
120
|
});
|
|
122
|
-
logger.info("syncLaborTicketsToERP: Checkpoint saved:", {
|
|
123
|
-
checkpointTimestamp: (mostRecentUpdate || fallbackTimestamp)
|
|
124
|
-
});
|
|
125
121
|
} catch (error) {
|
|
126
122
|
logger.error("syncLaborTicketsToERP: Error:", error);
|
|
127
123
|
}
|