@resolveio/server-lib 20.11.1 → 20.11.3
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/collections/error-auto-fix.collection.d.ts +3 -0
- package/collections/error-auto-fix.collection.js +266 -0
- package/collections/error-auto-fix.collection.js.map +1 -0
- package/models/error-auto-fix-log.model.d.ts +47 -0
- package/models/error-auto-fix-log.model.js +4 -0
- package/models/error-auto-fix-log.model.js.map +1 -0
- package/package.json +1 -1
- package/util/error-reporter.d.ts +33 -0
- package/util/error-reporter.js +249 -7
- package/util/error-reporter.js.map +1 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ErrorAutoFixLogs = void 0;
|
|
40
|
+
var mongo_manager_1 = require("../managers/mongo.manager");
|
|
41
|
+
var resolveio_server_app_1 = require("../resolveio-server-app");
|
|
42
|
+
var schema = {
|
|
43
|
+
_id: {
|
|
44
|
+
type: String,
|
|
45
|
+
optional: true
|
|
46
|
+
},
|
|
47
|
+
__v: {
|
|
48
|
+
type: Number,
|
|
49
|
+
optional: true
|
|
50
|
+
},
|
|
51
|
+
email_hash: {
|
|
52
|
+
type: String
|
|
53
|
+
},
|
|
54
|
+
issue_hash: {
|
|
55
|
+
type: String,
|
|
56
|
+
optional: true
|
|
57
|
+
},
|
|
58
|
+
subject: {
|
|
59
|
+
type: String
|
|
60
|
+
},
|
|
61
|
+
message_id: {
|
|
62
|
+
type: String,
|
|
63
|
+
optional: true
|
|
64
|
+
},
|
|
65
|
+
body: {
|
|
66
|
+
type: String
|
|
67
|
+
},
|
|
68
|
+
status: {
|
|
69
|
+
type: String,
|
|
70
|
+
allowedValues: ['pending', 'in_progress', 'success', 'failed', 'skipped']
|
|
71
|
+
},
|
|
72
|
+
ignored: {
|
|
73
|
+
type: Boolean
|
|
74
|
+
},
|
|
75
|
+
attempt_count: {
|
|
76
|
+
type: Number
|
|
77
|
+
},
|
|
78
|
+
duplicate_count: {
|
|
79
|
+
type: Number
|
|
80
|
+
},
|
|
81
|
+
first_seen_at: {
|
|
82
|
+
type: Date
|
|
83
|
+
},
|
|
84
|
+
last_attempt_at: {
|
|
85
|
+
type: Date,
|
|
86
|
+
optional: true
|
|
87
|
+
},
|
|
88
|
+
last_duplicate_at: {
|
|
89
|
+
type: Date,
|
|
90
|
+
optional: true
|
|
91
|
+
},
|
|
92
|
+
last_result_at: {
|
|
93
|
+
type: Date,
|
|
94
|
+
optional: true
|
|
95
|
+
},
|
|
96
|
+
branch_name: {
|
|
97
|
+
type: String,
|
|
98
|
+
optional: true
|
|
99
|
+
},
|
|
100
|
+
pr_url: {
|
|
101
|
+
type: String,
|
|
102
|
+
optional: true
|
|
103
|
+
},
|
|
104
|
+
plan_summary: {
|
|
105
|
+
type: String,
|
|
106
|
+
optional: true
|
|
107
|
+
},
|
|
108
|
+
plan_body: {
|
|
109
|
+
type: String,
|
|
110
|
+
optional: true
|
|
111
|
+
},
|
|
112
|
+
patches: {
|
|
113
|
+
type: Array,
|
|
114
|
+
optional: true
|
|
115
|
+
},
|
|
116
|
+
'patches.$': {
|
|
117
|
+
type: String
|
|
118
|
+
},
|
|
119
|
+
id_client: {
|
|
120
|
+
type: String,
|
|
121
|
+
optional: true
|
|
122
|
+
},
|
|
123
|
+
client_name: {
|
|
124
|
+
type: String,
|
|
125
|
+
optional: true
|
|
126
|
+
},
|
|
127
|
+
from_email: {
|
|
128
|
+
type: String,
|
|
129
|
+
optional: true
|
|
130
|
+
},
|
|
131
|
+
source_type: {
|
|
132
|
+
type: String,
|
|
133
|
+
optional: true
|
|
134
|
+
},
|
|
135
|
+
classification_reason: {
|
|
136
|
+
type: String,
|
|
137
|
+
optional: true
|
|
138
|
+
},
|
|
139
|
+
codex_task_id: {
|
|
140
|
+
type: String,
|
|
141
|
+
optional: true
|
|
142
|
+
},
|
|
143
|
+
codex_environment: {
|
|
144
|
+
type: String,
|
|
145
|
+
optional: true
|
|
146
|
+
},
|
|
147
|
+
last_error: {
|
|
148
|
+
type: String,
|
|
149
|
+
optional: true
|
|
150
|
+
},
|
|
151
|
+
source_app: {
|
|
152
|
+
type: String,
|
|
153
|
+
optional: true
|
|
154
|
+
},
|
|
155
|
+
source_environment: {
|
|
156
|
+
type: String,
|
|
157
|
+
optional: true
|
|
158
|
+
},
|
|
159
|
+
severity: {
|
|
160
|
+
type: String,
|
|
161
|
+
optional: true
|
|
162
|
+
},
|
|
163
|
+
reported_by: {
|
|
164
|
+
type: String,
|
|
165
|
+
optional: true
|
|
166
|
+
},
|
|
167
|
+
last_reported_at: {
|
|
168
|
+
type: Date,
|
|
169
|
+
optional: true
|
|
170
|
+
},
|
|
171
|
+
report_metadata: {
|
|
172
|
+
type: Object,
|
|
173
|
+
optional: true,
|
|
174
|
+
blackbox: true
|
|
175
|
+
},
|
|
176
|
+
report_context: {
|
|
177
|
+
type: Object,
|
|
178
|
+
optional: true,
|
|
179
|
+
blackbox: true
|
|
180
|
+
},
|
|
181
|
+
attachments: {
|
|
182
|
+
type: Array,
|
|
183
|
+
optional: true
|
|
184
|
+
},
|
|
185
|
+
'attachments.$': {
|
|
186
|
+
type: Object
|
|
187
|
+
},
|
|
188
|
+
'attachments.$.name': {
|
|
189
|
+
type: String,
|
|
190
|
+
optional: true
|
|
191
|
+
},
|
|
192
|
+
'attachments.$.url': {
|
|
193
|
+
type: String,
|
|
194
|
+
optional: true
|
|
195
|
+
},
|
|
196
|
+
'attachments.$.contentType': {
|
|
197
|
+
type: String,
|
|
198
|
+
optional: true
|
|
199
|
+
},
|
|
200
|
+
'attachments.$.size': {
|
|
201
|
+
type: Number,
|
|
202
|
+
optional: true
|
|
203
|
+
},
|
|
204
|
+
createdAt: {
|
|
205
|
+
type: Date,
|
|
206
|
+
optional: true
|
|
207
|
+
},
|
|
208
|
+
updatedAt: {
|
|
209
|
+
type: Date,
|
|
210
|
+
optional: true
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
exports.ErrorAutoFixLogs = null;
|
|
214
|
+
initializeCollection();
|
|
215
|
+
function initializeCollection() {
|
|
216
|
+
var _this = this;
|
|
217
|
+
if (resolveio_server_app_1.ResolveIOServer && resolveio_server_app_1.ResolveIOServer.getMainDB() && mongo_manager_1.MongoManagerModel) {
|
|
218
|
+
var model = mongo_manager_1.MongoManagerModel.create({
|
|
219
|
+
collectionName: 'error-autofix-logs',
|
|
220
|
+
schema: schema,
|
|
221
|
+
useVersionCollection: false,
|
|
222
|
+
useReportBuilder: false,
|
|
223
|
+
reportBuilderLookupTables: [],
|
|
224
|
+
timestamps: true,
|
|
225
|
+
createLogs: false,
|
|
226
|
+
checkSchema: true,
|
|
227
|
+
collectionOptions: null,
|
|
228
|
+
skipCache: true
|
|
229
|
+
});
|
|
230
|
+
exports.ErrorAutoFixLogs = model.collection_main;
|
|
231
|
+
setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
232
|
+
var err_1;
|
|
233
|
+
return __generator(this, function (_a) {
|
|
234
|
+
switch (_a.label) {
|
|
235
|
+
case 0:
|
|
236
|
+
_a.trys.push([0, 5, , 6]);
|
|
237
|
+
return [4 /*yield*/, exports.ErrorAutoFixLogs.createIndex({ email_hash: 1 })];
|
|
238
|
+
case 1:
|
|
239
|
+
_a.sent();
|
|
240
|
+
return [4 /*yield*/, exports.ErrorAutoFixLogs.createIndex({ issue_hash: 1 })];
|
|
241
|
+
case 2:
|
|
242
|
+
_a.sent();
|
|
243
|
+
return [4 /*yield*/, exports.ErrorAutoFixLogs.createIndex({ status: 1 })];
|
|
244
|
+
case 3:
|
|
245
|
+
_a.sent();
|
|
246
|
+
return [4 /*yield*/, exports.ErrorAutoFixLogs.createIndex({ ignored: 1 })];
|
|
247
|
+
case 4:
|
|
248
|
+
_a.sent();
|
|
249
|
+
return [3 /*break*/, 6];
|
|
250
|
+
case 5:
|
|
251
|
+
err_1 = _a.sent();
|
|
252
|
+
console.error('ErrorAutoFixLogs index creation failed', err_1);
|
|
253
|
+
return [3 /*break*/, 6];
|
|
254
|
+
case 6: return [2 /*return*/];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}); }, 5000);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
setImmediate(function () {
|
|
261
|
+
initializeCollection();
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
//# sourceMappingURL=error-auto-fix.collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collections/error-auto-fix.collection.ts"],"names":[],"mappings":"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","file":"error-auto-fix.collection.js","sourcesContent":["import { MongoManagerCollection, MongoManagerModel } from '../managers/mongo.manager';\nimport { ErrorAutoFixLogModel } from '../models/error-auto-fix-log.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nconst schema: any = {\n\t_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t__v: {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\temail_hash: {\n\t\ttype: String\n\t},\n\tissue_hash: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tsubject: {\n\t\ttype: String\n\t},\n\tmessage_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tbody: {\n\t\ttype: String\n\t},\n\tstatus: {\n\t\ttype: String,\n\t\tallowedValues: ['pending', 'in_progress', 'success', 'failed', 'skipped']\n\t},\n\tignored: {\n\t\ttype: Boolean\n\t},\n\tattempt_count: {\n\t\ttype: Number\n\t},\n\tduplicate_count: {\n\t\ttype: Number\n\t},\n\tfirst_seen_at: {\n\t\ttype: Date\n\t},\n\tlast_attempt_at: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tlast_duplicate_at: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tlast_result_at: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tbranch_name: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tpr_url: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tplan_summary: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tplan_body: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tpatches: {\n\t\ttype: Array,\n\t\toptional: true\n\t},\n\t'patches.$': {\n\t\ttype: String\n\t},\n\tid_client: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tclient_name: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tfrom_email: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tsource_type: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tclassification_reason: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tcodex_task_id: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tcodex_environment: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tlast_error: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tsource_app: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tsource_environment: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tseverity: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\treported_by: {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\tlast_reported_at: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\treport_metadata: {\n\t\ttype: Object,\n\t\toptional: true,\n\t\tblackbox: true\n\t},\n\treport_context: {\n\t\ttype: Object,\n\t\toptional: true,\n\t\tblackbox: true\n\t},\n\tattachments: {\n\t\ttype: Array,\n\t\toptional: true\n\t},\n\t'attachments.$': {\n\t\ttype: Object\n\t},\n\t'attachments.$.name': {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t'attachments.$.url': {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t'attachments.$.contentType': {\n\t\ttype: String,\n\t\toptional: true\n\t},\n\t'attachments.$.size': {\n\t\ttype: Number,\n\t\toptional: true\n\t},\n\tcreatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t},\n\tupdatedAt: {\n\t\ttype: Date,\n\t\toptional: true\n\t}\n};\n\nexport let ErrorAutoFixLogs: MongoManagerCollection<ErrorAutoFixLogModel> = null;\n\ninitializeCollection();\n\nfunction initializeCollection() {\n\tif (ResolveIOServer && ResolveIOServer.getMainDB() && MongoManagerModel) {\n\t\tconst model = MongoManagerModel.create<ErrorAutoFixLogModel>({\n\t\t\tcollectionName: 'error-autofix-logs',\n\t\t\tschema,\n\t\t\tuseVersionCollection: false,\n\t\t\tuseReportBuilder: false,\n\t\t\treportBuilderLookupTables: [],\n\t\t\ttimestamps: true,\n\t\t\tcreateLogs: false,\n\t\t\tcheckSchema: true,\n\t\t\tcollectionOptions: null,\n\t\t\tskipCache: true\n\t\t});\n\t\tErrorAutoFixLogs = model.collection_main;\n\t\tsetTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tawait ErrorAutoFixLogs.createIndex({email_hash: 1});\n\t\t\t\tawait ErrorAutoFixLogs.createIndex({issue_hash: 1});\n\t\t\t\tawait ErrorAutoFixLogs.createIndex({status: 1});\n\t\t\t\tawait ErrorAutoFixLogs.createIndex({ignored: 1});\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tconsole.error('ErrorAutoFixLogs index creation failed', err);\n\t\t\t}\n\t\t}, 5000);\n\t}\n\telse {\n\t\tsetImmediate(() => {\n\t\t\tinitializeCollection();\n\t\t});\n\t}\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type ErrorAutoFixLogStatus = 'pending' | 'in_progress' | 'success' | 'failed' | 'skipped';
|
|
2
|
+
export interface ErrorAutoFixAttachment {
|
|
3
|
+
name?: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
contentType?: string;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ErrorAutoFixLogModel {
|
|
9
|
+
_id?: string;
|
|
10
|
+
__v?: number;
|
|
11
|
+
email_hash: string;
|
|
12
|
+
issue_hash?: string;
|
|
13
|
+
subject: string;
|
|
14
|
+
message_id?: string;
|
|
15
|
+
body: string;
|
|
16
|
+
status: ErrorAutoFixLogStatus;
|
|
17
|
+
ignored: boolean;
|
|
18
|
+
attempt_count: number;
|
|
19
|
+
duplicate_count: number;
|
|
20
|
+
first_seen_at: Date;
|
|
21
|
+
last_attempt_at?: Date;
|
|
22
|
+
last_duplicate_at?: Date;
|
|
23
|
+
last_result_at?: Date;
|
|
24
|
+
branch_name?: string;
|
|
25
|
+
pr_url?: string;
|
|
26
|
+
plan_summary?: string;
|
|
27
|
+
plan_body?: string;
|
|
28
|
+
patches?: string[];
|
|
29
|
+
id_client?: string;
|
|
30
|
+
client_name?: string;
|
|
31
|
+
from_email?: string;
|
|
32
|
+
source_type?: 'app' | 'infrastructure' | 'noise';
|
|
33
|
+
classification_reason?: string;
|
|
34
|
+
codex_task_id?: string;
|
|
35
|
+
codex_environment?: string;
|
|
36
|
+
last_error?: string;
|
|
37
|
+
source_app?: string;
|
|
38
|
+
source_environment?: string;
|
|
39
|
+
severity?: string;
|
|
40
|
+
reported_by?: string;
|
|
41
|
+
last_reported_at?: Date;
|
|
42
|
+
report_metadata?: Record<string, any>;
|
|
43
|
+
report_context?: Record<string, any>;
|
|
44
|
+
attachments?: ErrorAutoFixAttachment[];
|
|
45
|
+
createdAt?: Date;
|
|
46
|
+
updatedAt?: Date;
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/models/error-auto-fix-log.model.ts"],"names":[],"mappings":"","file":"error-auto-fix-log.model.js","sourcesContent":["export type ErrorAutoFixLogStatus = 'pending' | 'in_progress' | 'success' | 'failed' | 'skipped';\n\nexport interface ErrorAutoFixAttachment {\n\tname?: string;\n\turl?: string;\n\tcontentType?: string;\n\tsize?: number;\n}\n\nexport interface ErrorAutoFixLogModel {\n\t_id?: string;\n\t__v?: number;\n\temail_hash: string;\n\tissue_hash?: string;\n\tsubject: string;\n\tmessage_id?: string;\n\tbody: string;\n\tstatus: ErrorAutoFixLogStatus;\n\tignored: boolean;\n\tattempt_count: number;\n\tduplicate_count: number;\n\tfirst_seen_at: Date;\n\tlast_attempt_at?: Date;\n\tlast_duplicate_at?: Date;\n\tlast_result_at?: Date;\n\tbranch_name?: string;\n\tpr_url?: string;\n\tplan_summary?: string;\n\tplan_body?: string;\n\tpatches?: string[];\n\tid_client?: string;\n\tclient_name?: string;\n\tfrom_email?: string;\n\tsource_type?: 'app' | 'infrastructure' | 'noise';\n\tclassification_reason?: string;\n\tcodex_task_id?: string;\n\tcodex_environment?: string;\n\tlast_error?: string;\n\tsource_app?: string;\n\tsource_environment?: string;\n\tseverity?: string;\n\treported_by?: string;\n\tlast_reported_at?: Date;\n\treport_metadata?: Record<string, any>;\n\treport_context?: Record<string, any>;\n\tattachments?: ErrorAutoFixAttachment[];\n\tcreatedAt?: Date;\n\tupdatedAt?: Date;\n}\n"]}
|
package/package.json
CHANGED
package/util/error-reporter.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
type LoggerLike = Pick<typeof console, 'error' | 'warn' | 'info' | 'log'>;
|
|
2
|
+
type ResolveIoInsertOverride = (payload: ErrorReportPayload, logger: LoggerLike) => Promise<ErrorReportResult>;
|
|
3
|
+
export declare function __setResolveIoInsertOverrideForTesting(fn: ResolveIoInsertOverride | null): void;
|
|
1
4
|
type FetchLike = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
2
5
|
export interface ErrorReportAttachment {
|
|
3
6
|
name: string;
|
|
@@ -46,6 +49,36 @@ export interface ErrorReportResult {
|
|
|
46
49
|
status?: number;
|
|
47
50
|
reason?: string;
|
|
48
51
|
}
|
|
52
|
+
interface ErrorReportPayload {
|
|
53
|
+
sourceApp: string;
|
|
54
|
+
message: string;
|
|
55
|
+
environment?: string;
|
|
56
|
+
clientId?: string;
|
|
57
|
+
clientSlug?: string;
|
|
58
|
+
clientName?: string;
|
|
59
|
+
clientRepo?: string;
|
|
60
|
+
clientEmail?: string;
|
|
61
|
+
severity: string;
|
|
62
|
+
stack?: string;
|
|
63
|
+
context?: Record<string, any> | string;
|
|
64
|
+
metadata?: Record<string, any> | string;
|
|
65
|
+
attachments?: ErrorReportAttachment[];
|
|
66
|
+
fingerprint?: string;
|
|
67
|
+
idempotencyKey?: string;
|
|
68
|
+
reportedBy?: string;
|
|
69
|
+
reportedAt?: string;
|
|
70
|
+
reportedFor?: string;
|
|
71
|
+
reportedCount?: number;
|
|
72
|
+
reportedSourceHost?: string;
|
|
73
|
+
reportedSourceIp?: string;
|
|
74
|
+
reportedSourceVersion?: string;
|
|
75
|
+
reportedSourcePid?: number;
|
|
76
|
+
reportedSourceInstance?: string;
|
|
77
|
+
reportedSourceRegion?: string;
|
|
78
|
+
reportedSourceCluster?: string;
|
|
79
|
+
reportedSourceProcess?: string;
|
|
80
|
+
reportedSourceEnv?: Record<string, any>;
|
|
81
|
+
}
|
|
49
82
|
export declare class ErrorReporter {
|
|
50
83
|
static report(options: ErrorReportOptions): Promise<ErrorReportResult>;
|
|
51
84
|
}
|
package/util/error-reporter.js
CHANGED
|
@@ -63,11 +63,18 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
63
63
|
return ar;
|
|
64
64
|
};
|
|
65
65
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
-
exports.ErrorReporter = void 0;
|
|
66
|
+
exports.ErrorReporter = exports.__setResolveIoInsertOverrideForTesting = void 0;
|
|
67
67
|
var crypto_1 = require("crypto");
|
|
68
|
+
var error_auto_fix_collection_1 = require("../collections/error-auto-fix.collection");
|
|
68
69
|
var resolveio_server_app_1 = require("../resolveio-server-app");
|
|
70
|
+
var common_1 = require("./common");
|
|
69
71
|
var DEFAULT_ERROR_API_URL = 'https://backend.resolveio.com/api/errors/report';
|
|
70
72
|
var LOCAL_HOSTNAMES = new Set(['localhost', '127.0.0.1', '0.0.0.0', '::1']);
|
|
73
|
+
var resolveIoInsertOverride = null;
|
|
74
|
+
function __setResolveIoInsertOverrideForTesting(fn) {
|
|
75
|
+
resolveIoInsertOverride = fn;
|
|
76
|
+
}
|
|
77
|
+
exports.__setResolveIoInsertOverrideForTesting = __setResolveIoInsertOverrideForTesting;
|
|
71
78
|
var ErrorReporter = /** @class */ (function () {
|
|
72
79
|
function ErrorReporter() {
|
|
73
80
|
}
|
|
@@ -129,15 +136,19 @@ var ErrorReporter = /** @class */ (function () {
|
|
|
129
136
|
logger.error('ErrorReporter payload (suppressed):', payload);
|
|
130
137
|
return [2 /*return*/, { delivered: false, reason: 'local-environment' }];
|
|
131
138
|
}
|
|
139
|
+
if (!isResolveIOSelfClient(clientName)) return [3 /*break*/, 2];
|
|
140
|
+
return [4 /*yield*/, handleResolveIoSelfReport(payload, logger)];
|
|
141
|
+
case 1: return [2 /*return*/, _b.sent()];
|
|
142
|
+
case 2:
|
|
132
143
|
transport = options.fetch || globalThis.fetch;
|
|
133
144
|
if (typeof transport !== 'function') {
|
|
134
145
|
logger.error('ErrorReporter failed: fetch is not available in this runtime');
|
|
135
146
|
logger.error('ErrorReporter payload (not sent):', payload);
|
|
136
147
|
return [2 /*return*/, { delivered: false, reason: 'missing-fetch' }];
|
|
137
148
|
}
|
|
138
|
-
_b.label =
|
|
139
|
-
case
|
|
140
|
-
_b.trys.push([
|
|
149
|
+
_b.label = 3;
|
|
150
|
+
case 3:
|
|
151
|
+
_b.trys.push([3, 5, , 6]);
|
|
141
152
|
return [4 /*yield*/, transport(normalizedApiUrl, {
|
|
142
153
|
method: 'POST',
|
|
143
154
|
headers: removeEmptyFields({
|
|
@@ -148,19 +159,19 @@ var ErrorReporter = /** @class */ (function () {
|
|
|
148
159
|
}),
|
|
149
160
|
body: JSON.stringify(payload)
|
|
150
161
|
})];
|
|
151
|
-
case
|
|
162
|
+
case 4:
|
|
152
163
|
response = _b.sent();
|
|
153
164
|
if (!response.ok) {
|
|
154
165
|
logger.error('ErrorReporter failed to deliver payload', { status: response.status, statusText: response.statusText });
|
|
155
166
|
return [2 /*return*/, { delivered: false, status: response.status, reason: 'http-error' }];
|
|
156
167
|
}
|
|
157
168
|
return [2 /*return*/, { delivered: true, status: response.status }];
|
|
158
|
-
case
|
|
169
|
+
case 5:
|
|
159
170
|
err_1 = _b.sent();
|
|
160
171
|
logger.error('ErrorReporter exception while delivering payload', err_1);
|
|
161
172
|
logger.error('ErrorReporter payload (not sent):', payload);
|
|
162
173
|
return [2 /*return*/, { delivered: false, reason: 'network-error' }];
|
|
163
|
-
case
|
|
174
|
+
case 6: return [2 /*return*/];
|
|
164
175
|
}
|
|
165
176
|
});
|
|
166
177
|
});
|
|
@@ -334,6 +345,228 @@ function mergeMetadata(metadata, correlationId) {
|
|
|
334
345
|
}
|
|
335
346
|
return metadataObj;
|
|
336
347
|
}
|
|
348
|
+
function handleResolveIoSelfReport(payload, logger) {
|
|
349
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
350
|
+
var doc, upsertResult, err_2;
|
|
351
|
+
return __generator(this, function (_a) {
|
|
352
|
+
switch (_a.label) {
|
|
353
|
+
case 0:
|
|
354
|
+
if (!resolveIoInsertOverride) return [3 /*break*/, 2];
|
|
355
|
+
return [4 /*yield*/, resolveIoInsertOverride(payload, logger)];
|
|
356
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
357
|
+
case 2:
|
|
358
|
+
if (!error_auto_fix_collection_1.ErrorAutoFixLogs) {
|
|
359
|
+
logger.warn('ErrorReporter ResolveIO insert skipped: error-autofix collection unavailable');
|
|
360
|
+
logger.error('ErrorReporter payload (not inserted):', payload);
|
|
361
|
+
return [2 /*return*/, { delivered: false, reason: 'resolveio-no-collection' }];
|
|
362
|
+
}
|
|
363
|
+
_a.label = 3;
|
|
364
|
+
case 3:
|
|
365
|
+
_a.trys.push([3, 5, , 6]);
|
|
366
|
+
doc = buildResolveIoAutoFixDoc(payload);
|
|
367
|
+
return [4 /*yield*/, upsertResolveIoAutoFixLog(error_auto_fix_collection_1.ErrorAutoFixLogs, doc)];
|
|
368
|
+
case 4:
|
|
369
|
+
upsertResult = _a.sent();
|
|
370
|
+
return [2 /*return*/, {
|
|
371
|
+
delivered: true,
|
|
372
|
+
reason: upsertResult.duplicate ? 'resolveio-duplicate' : 'resolveio-insert'
|
|
373
|
+
}];
|
|
374
|
+
case 5:
|
|
375
|
+
err_2 = _a.sent();
|
|
376
|
+
logger.error('ErrorReporter failed to insert resolveio auto-fix log', err_2);
|
|
377
|
+
logger.error('ErrorReporter payload (not inserted):', payload);
|
|
378
|
+
return [2 /*return*/, { delivered: false, reason: 'resolveio-insert-failed' }];
|
|
379
|
+
case 6: return [2 /*return*/];
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
function buildResolveIoAutoFixDoc(payload) {
|
|
385
|
+
var timestamp = coerceReportedDate(payload.reportedAt);
|
|
386
|
+
var safeMessage = (payload.message || '').toString().trim() || 'Unknown error';
|
|
387
|
+
var subjectBase = "[AppError] ".concat(payload.sourceApp || 'application').concat(payload.environment ? " (".concat(payload.environment, ")") : '');
|
|
388
|
+
var subject = "".concat(subjectBase, " - ").concat(safeMessage.slice(0, 120));
|
|
389
|
+
var bodyLines = [
|
|
390
|
+
"Source App:\t".concat(payload.sourceApp || 'n/a'),
|
|
391
|
+
"Environment:\t".concat(payload.environment || 'n/a'),
|
|
392
|
+
"Severity:\t".concat(payload.severity || 'error'),
|
|
393
|
+
"Client Hint:\t".concat(payload.clientName || payload.clientSlug || payload.clientRepo || payload.clientId || 'n/a'),
|
|
394
|
+
"Reported By:\t".concat(payload.reportedBy || payload.clientEmail || 'n/a'),
|
|
395
|
+
"Reported At:\t".concat(timestamp.toISOString()),
|
|
396
|
+
"Message:\t".concat(safeMessage)
|
|
397
|
+
];
|
|
398
|
+
if (payload.stack) {
|
|
399
|
+
bodyLines.push('', 'Stack Trace:', payload.stack.toString());
|
|
400
|
+
}
|
|
401
|
+
if (isPlainObject(payload.context) && Object.keys(payload.context).length) {
|
|
402
|
+
bodyLines.push('', 'Context JSON:', JSON.stringify(payload.context, null, 2));
|
|
403
|
+
}
|
|
404
|
+
if (isPlainObject(payload.metadata) && Object.keys(payload.metadata).length) {
|
|
405
|
+
bodyLines.push('', 'Metadata JSON:', JSON.stringify(payload.metadata, null, 2));
|
|
406
|
+
}
|
|
407
|
+
var normalizedAttachments = normalizeAttachments(payload.attachments);
|
|
408
|
+
if (Array.isArray(normalizedAttachments) && normalizedAttachments.length) {
|
|
409
|
+
bodyLines.push('', 'Attachments:');
|
|
410
|
+
normalizedAttachments.forEach(function (att) {
|
|
411
|
+
var segments = [];
|
|
412
|
+
if (att.name) {
|
|
413
|
+
segments.push(att.name);
|
|
414
|
+
}
|
|
415
|
+
if (att.contentType) {
|
|
416
|
+
segments.push(att.contentType);
|
|
417
|
+
}
|
|
418
|
+
if (typeof att.size === 'number') {
|
|
419
|
+
segments.push("".concat(att.size, "b"));
|
|
420
|
+
}
|
|
421
|
+
var summary = segments.length ? segments.join(' | ') : 'attachment';
|
|
422
|
+
bodyLines.push("- ".concat(summary).concat(att.url ? " -> ".concat(att.url) : ''));
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
if (payload.fingerprint) {
|
|
426
|
+
bodyLines.push('', "Fingerprint:\t".concat(payload.fingerprint));
|
|
427
|
+
}
|
|
428
|
+
if (payload.idempotencyKey) {
|
|
429
|
+
bodyLines.push("Idempotency Key:\t".concat(payload.idempotencyKey));
|
|
430
|
+
}
|
|
431
|
+
var body = bodyLines.join('\n');
|
|
432
|
+
var rawHash = (payload.idempotencyKey || '').toString().trim() || generateResolveIoRawHash(subject, body);
|
|
433
|
+
var issueHash = (payload.fingerprint || '').toString().trim() || generateResolveIoIssueHash(subject, body);
|
|
434
|
+
var fromEmail = payload.reportedBy || payload.clientEmail || '';
|
|
435
|
+
var reportMetadata = isPlainObject(payload.metadata) ? payload.metadata : undefined;
|
|
436
|
+
var reportContext = isPlainObject(payload.context) ? payload.context : undefined;
|
|
437
|
+
return cleanUndefined({
|
|
438
|
+
_id: (0, common_1.objectIdHexString)(),
|
|
439
|
+
email_hash: rawHash,
|
|
440
|
+
issue_hash: issueHash,
|
|
441
|
+
subject: subject,
|
|
442
|
+
message_id: payload.idempotencyKey ? payload.idempotencyKey.toString() : undefined,
|
|
443
|
+
body: body,
|
|
444
|
+
status: 'pending',
|
|
445
|
+
ignored: false,
|
|
446
|
+
attempt_count: 0,
|
|
447
|
+
duplicate_count: 0,
|
|
448
|
+
first_seen_at: timestamp,
|
|
449
|
+
from_email: fromEmail,
|
|
450
|
+
id_client: payload.clientId,
|
|
451
|
+
client_name: payload.clientName || payload.clientSlug || undefined,
|
|
452
|
+
codex_environment: payload.clientRepo || payload.clientSlug || undefined,
|
|
453
|
+
source_app: payload.sourceApp,
|
|
454
|
+
source_environment: payload.environment,
|
|
455
|
+
severity: payload.severity,
|
|
456
|
+
reported_by: fromEmail,
|
|
457
|
+
last_reported_at: timestamp,
|
|
458
|
+
report_metadata: reportMetadata,
|
|
459
|
+
report_context: reportContext,
|
|
460
|
+
attachments: normalizedAttachments,
|
|
461
|
+
createdAt: timestamp,
|
|
462
|
+
updatedAt: timestamp
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
function upsertResolveIoAutoFixLog(collection, doc) {
|
|
466
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
467
|
+
var timestamp, existing, updateSet;
|
|
468
|
+
return __generator(this, function (_a) {
|
|
469
|
+
switch (_a.label) {
|
|
470
|
+
case 0:
|
|
471
|
+
timestamp = doc.first_seen_at || new Date();
|
|
472
|
+
existing = null;
|
|
473
|
+
if (!doc.issue_hash) return [3 /*break*/, 2];
|
|
474
|
+
return [4 /*yield*/, collection.findOne({ issue_hash: doc.issue_hash })];
|
|
475
|
+
case 1:
|
|
476
|
+
existing = _a.sent();
|
|
477
|
+
_a.label = 2;
|
|
478
|
+
case 2:
|
|
479
|
+
if (!(!existing && doc.email_hash)) return [3 /*break*/, 4];
|
|
480
|
+
return [4 /*yield*/, collection.findOne({ email_hash: doc.email_hash })];
|
|
481
|
+
case 3:
|
|
482
|
+
existing = _a.sent();
|
|
483
|
+
_a.label = 4;
|
|
484
|
+
case 4:
|
|
485
|
+
if (!existing) return [3 /*break*/, 6];
|
|
486
|
+
updateSet = cleanUndefined({
|
|
487
|
+
last_duplicate_at: timestamp,
|
|
488
|
+
last_reported_at: timestamp,
|
|
489
|
+
report_metadata: doc.report_metadata,
|
|
490
|
+
report_context: doc.report_context,
|
|
491
|
+
attachments: doc.attachments,
|
|
492
|
+
severity: doc.severity,
|
|
493
|
+
source_app: doc.source_app,
|
|
494
|
+
source_environment: doc.source_environment,
|
|
495
|
+
reported_by: doc.reported_by,
|
|
496
|
+
updatedAt: new Date()
|
|
497
|
+
});
|
|
498
|
+
return [4 /*yield*/, collection.updateOne({ _id: existing._id }, {
|
|
499
|
+
$inc: { duplicate_count: 1 },
|
|
500
|
+
$set: updateSet
|
|
501
|
+
})];
|
|
502
|
+
case 5:
|
|
503
|
+
_a.sent();
|
|
504
|
+
return [2 /*return*/, { duplicate: true, doc: existing }];
|
|
505
|
+
case 6: return [4 /*yield*/, collection.insertOne(doc)];
|
|
506
|
+
case 7:
|
|
507
|
+
_a.sent();
|
|
508
|
+
return [2 /*return*/, { duplicate: false, doc: doc }];
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
function generateResolveIoRawHash(subject, body) {
|
|
514
|
+
return (0, crypto_1.createHash)('sha256').update("".concat(subject || '', "\n").concat(body || ''), 'utf8').digest('hex');
|
|
515
|
+
}
|
|
516
|
+
function generateResolveIoIssueHash(subject, body) {
|
|
517
|
+
var normalizedSubject = normalizeTextForAutoFixHash(subject);
|
|
518
|
+
var normalizedBody = normalizeBodyForAutoFixHash(body);
|
|
519
|
+
return (0, crypto_1.createHash)('sha256').update("".concat(normalizedSubject, "\n").concat(normalizedBody), 'utf8').digest('hex');
|
|
520
|
+
}
|
|
521
|
+
function normalizeTextForAutoFixHash(value) {
|
|
522
|
+
if (!value) {
|
|
523
|
+
return '';
|
|
524
|
+
}
|
|
525
|
+
var normalized = value
|
|
526
|
+
.replace(/\r/g, '\n')
|
|
527
|
+
.toLowerCase()
|
|
528
|
+
.replace(/0x[0-9a-f]+/gi, '0x#')
|
|
529
|
+
.replace(/\b[0-9a-f]{7,64}\b/gi, '#')
|
|
530
|
+
.replace(/\b[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}(?:[ t][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]{1,6})?)?\b/g, '#datetime#')
|
|
531
|
+
.replace(/\b[0-9]{2}:[0-9]{2}:[0-9]{2}\b/g, '#time#')
|
|
532
|
+
.replace(/[0-9]+/g, '#')
|
|
533
|
+
.replace(/[^\S\n]+/g, ' ')
|
|
534
|
+
.split('\n')
|
|
535
|
+
.map(function (line) { return line.trim(); })
|
|
536
|
+
.filter(Boolean)
|
|
537
|
+
.slice(0, 60)
|
|
538
|
+
.join('\n');
|
|
539
|
+
return normalized.length > 4000 ? normalized.slice(0, 4000) : normalized;
|
|
540
|
+
}
|
|
541
|
+
function normalizeBodyForAutoFixHash(body) {
|
|
542
|
+
if (!body) {
|
|
543
|
+
return '';
|
|
544
|
+
}
|
|
545
|
+
var withoutStackNoise = body
|
|
546
|
+
.replace(/=+\s*stack trace\s*=+/gi, 'stack trace')
|
|
547
|
+
.replace(/-{3,}/g, '-')
|
|
548
|
+
.replace(/\[[^\]]*request id[^\]]*\]/gi, '[request id]')
|
|
549
|
+
.replace(/guid:[^\s]+/gi, 'guid:#')
|
|
550
|
+
.replace(/request id:[^\s]+/gi, 'request id:#')
|
|
551
|
+
.replace(/correlation id:[^\s]+/gi, 'correlation id:#');
|
|
552
|
+
return normalizeTextForAutoFixHash(withoutStackNoise);
|
|
553
|
+
}
|
|
554
|
+
function cleanUndefined(obj) {
|
|
555
|
+
var cleaned = {};
|
|
556
|
+
Object.keys(obj || {}).forEach(function (key) {
|
|
557
|
+
if (typeof obj[key] !== 'undefined') {
|
|
558
|
+
cleaned[key] = obj[key];
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
return cleaned;
|
|
562
|
+
}
|
|
563
|
+
function coerceReportedDate(value) {
|
|
564
|
+
if (!value) {
|
|
565
|
+
return new Date();
|
|
566
|
+
}
|
|
567
|
+
var coerced = new Date(value);
|
|
568
|
+
return Number.isNaN(coerced.getTime()) ? new Date() : coerced;
|
|
569
|
+
}
|
|
337
570
|
function shouldSuppressForLocalEnvironment(config, apiUrl) {
|
|
338
571
|
if (isLocalUrl(config === null || config === void 0 ? void 0 : config.ROOT_URL) || isLocalUrl(config === null || config === void 0 ? void 0 : config.SERVER_URL) || process.env.NODE_ENV === 'development') {
|
|
339
572
|
return true;
|
|
@@ -352,5 +585,14 @@ function isLocalUrl(url) {
|
|
|
352
585
|
return /localhost|127\.0\.0\.1|0\.0\.0\.0|::1/.test(url);
|
|
353
586
|
}
|
|
354
587
|
}
|
|
588
|
+
function isResolveIOSelfClient(clientName) {
|
|
589
|
+
if (!clientName) {
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
return clientName.toLowerCase() === 'resolveio';
|
|
593
|
+
}
|
|
594
|
+
function isPlainObject(value) {
|
|
595
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
596
|
+
}
|
|
355
597
|
|
|
356
598
|
//# sourceMappingURL=error-reporter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/error-reporter.ts"],"names":[],"mappings":"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","file":"error-reporter.js","sourcesContent":["import { createHash } from 'crypto';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nconst DEFAULT_ERROR_API_URL = 'https://backend.resolveio.com/api/errors/report';\nconst LOCAL_HOSTNAMES = new Set(['localhost', '127.0.0.1', '0.0.0.0', '::1']);\n\n// eslint-disable-next-line no-unused-vars\ntype FetchLike = (input: RequestInfo, init?: RequestInit) => Promise<Response>;\n\nexport interface ErrorReportAttachment {\n\tname: string;\n\turl?: string;\n\tcontentType?: string;\n\tsize?: number;\n}\n\nexport interface ErrorReportOptions {\n\tsourceApp?: string;\n\tmessage?: string;\n\tsubject?: string;\n\tenvironment?: string;\n\tclientId?: string;\n\tclientSlug?: string;\n\tclientName?: string;\n\tclientRepo?: string;\n\tclientEmail?: string;\n\tseverity?: string;\n\tstack?: string | Error;\n\terror?: unknown;\n\tcontext?: Record<string, any> | string | null;\n\tmetadata?: Record<string, any> | string | null;\n\tattachments?: ErrorReportAttachment[];\n\tfingerprint?: string;\n\tidempotencyKey?: string;\n\treportedBy?: string;\n\treportedAt?: string | Date;\n\treportedFor?: string;\n\treportedCount?: number;\n\treportedSourceHost?: string;\n\treportedSourceIp?: string;\n\treportedSourceVersion?: string;\n\treportedSourcePid?: number;\n\treportedSourceInstance?: string;\n\treportedSourceRegion?: string;\n\treportedSourceCluster?: string;\n\treportedSourceProcess?: string;\n\treportedSourceEnv?: Record<string, any>;\n\tcorrelationId?: string;\n\tapiUrl?: string;\n\tfetch?: FetchLike;\n\tlogger?: Pick<typeof console, 'error' | 'warn' | 'info' | 'log'>;\n}\n\nexport interface ErrorReportResult {\n\tdelivered: boolean;\n\tstatus?: number;\n\treason?: string;\n}\n\ninterface ErrorReportPayload {\n\tsourceApp: string;\n\tmessage: string;\n\tenvironment?: string;\n\tclientId?: string;\n\tclientSlug?: string;\n\tclientName?: string;\n\tclientRepo?: string;\n\tclientEmail?: string;\n\tseverity: string;\n\tstack?: string;\n\tcontext?: Record<string, any> | string;\n\tmetadata?: Record<string, any> | string;\n\tattachments?: ErrorReportAttachment[];\n\tfingerprint?: string;\n\tidempotencyKey?: string;\n\treportedBy?: string;\n\treportedAt?: string;\n\treportedFor?: string;\n\treportedCount?: number;\n\treportedSourceHost?: string;\n\treportedSourceIp?: string;\n\treportedSourceVersion?: string;\n\treportedSourcePid?: number;\n\treportedSourceInstance?: string;\n\treportedSourceRegion?: string;\n\treportedSourceCluster?: string;\n\treportedSourceProcess?: string;\n\treportedSourceEnv?: Record<string, any>;\n}\n\nexport class ErrorReporter {\n\tpublic static async report(options: ErrorReportOptions): Promise<ErrorReportResult> {\n\t\tconst logger = options.logger || console;\n\t\tconst config = getServerConfig();\n\t\tconst normalizedApiUrl = options.apiUrl || DEFAULT_ERROR_API_URL;\n\t\tconst clientName = options.clientName || config?.CLIENT_NAME || ResolveIOServer.getClientName?.() || 'resolveio';\n\t\tconst sourceApp = options.sourceApp || clientName || 'resolveio-server-lib';\n\t\tconst environment = options.environment || process.env.RESOLVEIO_ENV || config?.RESOLVEIO_ENV || config?.ENVIRONMENT || config?.ROOT_URL || process.env.NODE_ENV || 'unknown';\n\t\tconst message = options.message || options.subject || 'ResolveIO Error Detected';\n\t\tconst severity = options.severity || 'error';\n\t\tconst stack = normalizeStack(options.stack || options.error);\n\t\tconst context = normalizeStructured(options.context, options.correlationId);\n\t\tconst metadata = normalizeStructured(mergeMetadata(options.metadata, options.correlationId));\n\t\tconst attachments = Array.isArray(options.attachments) ? normalizeAttachments(options.attachments) : undefined;\n\t\tconst fingerprint = options.fingerprint || computeFingerprint(sourceApp, environment, message, stack);\n\t\tconst idempotencyKey = options.idempotencyKey;\n\t\tconst reportedAt = normalizeReportedAt(options.reportedAt);\n\t\tconst normalizedReportedSourceEnv = normalizeStructured(options.reportedSourceEnv);\n\t\tconst payload: ErrorReportPayload = removeEmptyFields({\n\t\t\tsourceApp,\n\t\t\tmessage,\n\t\t\tenvironment,\n\t\t\tclientId: options.clientId,\n\t\t\tclientSlug: options.clientSlug,\n\t\t\tclientName,\n\t\t\tclientRepo: options.clientRepo,\n\t\t\tclientEmail: options.clientEmail,\n\t\t\tseverity,\n\t\t\tstack,\n\t\t\tcontext,\n\t\t\tmetadata,\n\t\t\tattachments,\n\t\t\tfingerprint,\n\t\t\tidempotencyKey,\n\t\t\treportedBy: options.reportedBy,\n\t\t\treportedAt,\n\t\t\treportedFor: options.reportedFor,\n\t\t\treportedCount: options.reportedCount,\n\t\t\treportedSourceHost: options.reportedSourceHost,\n\t\t\treportedSourceIp: options.reportedSourceIp,\n\t\t\treportedSourceVersion: options.reportedSourceVersion,\n\t\t\treportedSourcePid: options.reportedSourcePid,\n\t\t\treportedSourceInstance: options.reportedSourceInstance,\n\t\t\treportedSourceRegion: options.reportedSourceRegion,\n\t\t\treportedSourceCluster: options.reportedSourceCluster,\n\t\t\treportedSourceProcess: options.reportedSourceProcess,\n\t\t\treportedSourceEnv: typeof normalizedReportedSourceEnv === 'string' ? undefined : normalizedReportedSourceEnv as Record<string, any>\n\t\t});\n\n\t\tif (shouldSuppressForLocalEnvironment(config, normalizedApiUrl)) {\n\t\t\tlogger.info('ErrorReporter suppressed: local environment detected');\n\t\t\tlogger.error('ErrorReporter payload (suppressed):', payload);\n\t\t\treturn { delivered: false, reason: 'local-environment' };\n\t\t}\n\n\t\tconst transport = options.fetch || globalThis.fetch;\n\t\tif (typeof transport !== 'function') {\n\t\t\tlogger.error('ErrorReporter failed: fetch is not available in this runtime');\n\t\t\tlogger.error('ErrorReporter payload (not sent):', payload);\n\t\t\treturn { delivered: false, reason: 'missing-fetch' };\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await transport(normalizedApiUrl, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: removeEmptyFields({\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-ResolveIO-Error-Key': clientName,\n\t\t\t\t\t'X-ResolveIO-Error-Hash': fingerprint,\n\t\t\t\t\t'X-ResolveIO-Idempotency-Key': idempotencyKey\n\t\t\t\t}),\n\t\t\t\tbody: JSON.stringify(payload)\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlogger.error('ErrorReporter failed to deliver payload', { status: response.status, statusText: response.statusText });\n\t\t\t\treturn { delivered: false, status: response.status, reason: 'http-error' };\n\t\t\t}\n\n\t\t\treturn { delivered: true, status: response.status };\n\t\t}\n\t\tcatch (err) {\n\t\t\tlogger.error('ErrorReporter exception while delivering payload', err);\n\t\t\tlogger.error('ErrorReporter payload (not sent):', payload);\n\t\t\treturn { delivered: false, reason: 'network-error' };\n\t\t}\n\t}\n}\n\nfunction getServerConfig(): Record<string, any> | null {\n\ttry {\n\t\treturn ResolveIOServer.getServerConfig?.() || null;\n\t}\n\tcatch (err) {\n\t\tconsole.error('Failed to read ResolveIO server config', err);\n\t\treturn null;\n\t}\n}\n\nfunction normalizeStack(stack?: string | Error | unknown): string | undefined {\n\tif (!stack) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof stack === 'string') {\n\t\treturn stack;\n\t}\n\n\tif (stack instanceof Error) {\n\t\treturn stack.stack || stack.message;\n\t}\n\n\tif (typeof stack === 'object' && stack !== null && typeof (stack as Record<string, any>).stack === 'string') {\n\t\treturn (stack as Record<string, any>).stack;\n\t}\n\n\tif (typeof stack === 'object' && stack !== null && typeof (stack as Record<string, any>).message === 'string') {\n\t\treturn (stack as Record<string, any>).message;\n\t}\n\n\treturn JSON.stringify(stack);\n}\n\nfunction normalizeStructured(value: any, correlationId?: string): Record<string, any> | string | undefined {\n\tif (value === null || value === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof value === 'string') {\n\t\treturn value;\n\t}\n\n\tconst serialized = serializeValue(value);\n\tif (correlationId && typeof serialized === 'object' && serialized !== null && !serialized.correlationId) {\n\t\tserialized.correlationId = correlationId;\n\t}\n\treturn serialized;\n}\n\nfunction serializeValue(value: any, seen: WeakSet<object> = new WeakSet()): any {\n\tif (value === null || value === undefined) {\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'bigint') {\n\t\treturn value.toString();\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\n\tif (value instanceof Error) {\n\t\tconst base = {\n\t\t\tname: value.name,\n\t\t\tmessage: value.message,\n\t\t\tstack: value.stack\n\t\t};\n\t\treturn Object.assign({}, base, serializeValue(Object.assign({}, value), seen));\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tif (seen.has(value)) {\n\t\t\treturn '[Circular]';\n\t\t}\n\t\tseen.add(value);\n\t\tconst arr = value.map(item => serializeValue(item, seen));\n\t\tseen.delete(value);\n\t\treturn arr;\n\t}\n\n\tif (typeof value === 'object') {\n\t\tif (seen.has(value)) {\n\t\t\treturn '[Circular]';\n\t\t}\n\t\tseen.add(value);\n\t\tconst obj: Record<string, any> = {};\n\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\tobj[key] = serializeValue(val, seen);\n\t\t}\n\t\tseen.delete(value);\n\t\treturn obj;\n\t}\n\n\treturn String(value);\n}\n\nfunction normalizeAttachments(attachments: ErrorReportAttachment[]): ErrorReportAttachment[] {\n\treturn attachments\n\t\t.filter(att => !!att && typeof att === 'object')\n\t\t.map(att => removeEmptyFields({\n\t\t\tname: att.name,\n\t\t\turl: att.url,\n\t\t\tcontentType: att.contentType,\n\t\t\tsize: typeof att.size === 'number' ? att.size : undefined\n\t\t}))\n\t\t.filter(att => !!att.name);\n}\n\nfunction normalizeReportedAt(value?: string | Date): string | undefined {\n\tif (!value) {\n\t\treturn new Date().toISOString();\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\n\tconst date = new Date(value);\n\tif (!isNaN(date.getTime())) {\n\t\treturn date.toISOString();\n\t}\n\n\treturn new Date().toISOString();\n}\n\nfunction computeFingerprint(sourceApp: string, environment: string | undefined, message: string, stack?: string): string | undefined {\n\tconst signature = `${sourceApp || ''}:${environment || ''}:${message || ''}:${stack ? stack.split('\\n').slice(0, 5).join('|') : ''}`;\n\treturn createHash('sha256').update(signature).digest('hex');\n}\n\nfunction removeEmptyFields<T extends Record<string, any>>(obj: T): T {\n\tconst cleaned: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(obj || {})) {\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tcontinue;\n\t\t}\n\t\tcleaned[key] = value;\n\t}\n\treturn cleaned as T;\n}\n\nfunction mergeMetadata(metadata: Record<string, any> | string | null | undefined, correlationId?: string) {\n\tif (!metadata && !correlationId) {\n\t\treturn undefined;\n\t}\n\n\tconst base = metadata ? normalizeStructured(metadata) : undefined;\n\tif (!correlationId) {\n\t\treturn base;\n\t}\n\n\tif (typeof base === 'string') {\n\t\treturn {\n\t\t\tcorrelationId,\n\t\t\tmessage: base\n\t\t};\n\t}\n\n\tconst metadataObj = (base || {}) as Record<string, any>;\n\tif (!metadataObj.correlationId) {\n\t\tmetadataObj.correlationId = correlationId;\n\t}\n\treturn metadataObj;\n}\n\nfunction shouldSuppressForLocalEnvironment(config: Record<string, any> | null, apiUrl: string): boolean {\n\tif (isLocalUrl(config?.ROOT_URL) || isLocalUrl(config?.SERVER_URL) || process.env.NODE_ENV === 'development') {\n\t\treturn true;\n\t}\n\n\treturn isLocalUrl(apiUrl);\n}\n\nfunction isLocalUrl(url?: string): boolean {\n\tif (!url || typeof url !== 'string') {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\treturn LOCAL_HOSTNAMES.has(parsed.hostname.toLowerCase());\n\t}\n\tcatch {\n\t\treturn /localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|::1/.test(url);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/util/error-reporter.ts"],"names":[],"mappings":"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","file":"error-reporter.js","sourcesContent":["import { createHash } from 'crypto';\nimport { ErrorAutoFixLogs } from '../collections/error-auto-fix.collection';\nimport { MongoManagerCollection } from '../managers/mongo.manager';\nimport { ErrorAutoFixLogModel } from '../models/error-auto-fix-log.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { objectIdHexString } from './common';\n\nconst DEFAULT_ERROR_API_URL = 'https://backend.resolveio.com/api/errors/report';\nconst LOCAL_HOSTNAMES = new Set(['localhost', '127.0.0.1', '0.0.0.0', '::1']);\n\ntype LoggerLike = Pick<typeof console, 'error' | 'warn' | 'info' | 'log'>;\n// eslint-disable-next-line no-unused-vars\ntype ResolveIoInsertOverride = (payload: ErrorReportPayload, logger: LoggerLike) => Promise<ErrorReportResult>;\nlet resolveIoInsertOverride: ResolveIoInsertOverride | null = null;\n\nexport function __setResolveIoInsertOverrideForTesting(fn: ResolveIoInsertOverride | null) {\n\tresolveIoInsertOverride = fn;\n}\n\n// eslint-disable-next-line no-unused-vars\ntype FetchLike = (input: RequestInfo, init?: RequestInit) => Promise<Response>;\n\nexport interface ErrorReportAttachment {\n\tname: string;\n\turl?: string;\n\tcontentType?: string;\n\tsize?: number;\n}\n\nexport interface ErrorReportOptions {\n\tsourceApp?: string;\n\tmessage?: string;\n\tsubject?: string;\n\tenvironment?: string;\n\tclientId?: string;\n\tclientSlug?: string;\n\tclientName?: string;\n\tclientRepo?: string;\n\tclientEmail?: string;\n\tseverity?: string;\n\tstack?: string | Error;\n\terror?: unknown;\n\tcontext?: Record<string, any> | string | null;\n\tmetadata?: Record<string, any> | string | null;\n\tattachments?: ErrorReportAttachment[];\n\tfingerprint?: string;\n\tidempotencyKey?: string;\n\treportedBy?: string;\n\treportedAt?: string | Date;\n\treportedFor?: string;\n\treportedCount?: number;\n\treportedSourceHost?: string;\n\treportedSourceIp?: string;\n\treportedSourceVersion?: string;\n\treportedSourcePid?: number;\n\treportedSourceInstance?: string;\n\treportedSourceRegion?: string;\n\treportedSourceCluster?: string;\n\treportedSourceProcess?: string;\n\treportedSourceEnv?: Record<string, any>;\n\tcorrelationId?: string;\n\tapiUrl?: string;\n\tfetch?: FetchLike;\n\tlogger?: Pick<typeof console, 'error' | 'warn' | 'info' | 'log'>;\n}\n\nexport interface ErrorReportResult {\n\tdelivered: boolean;\n\tstatus?: number;\n\treason?: string;\n}\n\ninterface ErrorReportPayload {\n\tsourceApp: string;\n\tmessage: string;\n\tenvironment?: string;\n\tclientId?: string;\n\tclientSlug?: string;\n\tclientName?: string;\n\tclientRepo?: string;\n\tclientEmail?: string;\n\tseverity: string;\n\tstack?: string;\n\tcontext?: Record<string, any> | string;\n\tmetadata?: Record<string, any> | string;\n\tattachments?: ErrorReportAttachment[];\n\tfingerprint?: string;\n\tidempotencyKey?: string;\n\treportedBy?: string;\n\treportedAt?: string;\n\treportedFor?: string;\n\treportedCount?: number;\n\treportedSourceHost?: string;\n\treportedSourceIp?: string;\n\treportedSourceVersion?: string;\n\treportedSourcePid?: number;\n\treportedSourceInstance?: string;\n\treportedSourceRegion?: string;\n\treportedSourceCluster?: string;\n\treportedSourceProcess?: string;\n\treportedSourceEnv?: Record<string, any>;\n}\n\nexport class ErrorReporter {\n\tpublic static async report(options: ErrorReportOptions): Promise<ErrorReportResult> {\n\t\tconst logger = options.logger || console;\n\t\tconst config = getServerConfig();\n\t\tconst normalizedApiUrl = options.apiUrl || DEFAULT_ERROR_API_URL;\n\t\tconst clientName = options.clientName || config?.CLIENT_NAME || ResolveIOServer.getClientName?.() || 'resolveio';\n\t\tconst sourceApp = options.sourceApp || clientName || 'resolveio-server-lib';\n\t\tconst environment = options.environment || process.env.RESOLVEIO_ENV || config?.RESOLVEIO_ENV || config?.ENVIRONMENT || config?.ROOT_URL || process.env.NODE_ENV || 'unknown';\n\t\tconst message = options.message || options.subject || 'ResolveIO Error Detected';\n\t\tconst severity = options.severity || 'error';\n\t\tconst stack = normalizeStack(options.stack || options.error);\n\t\tconst context = normalizeStructured(options.context, options.correlationId);\n\t\tconst metadata = normalizeStructured(mergeMetadata(options.metadata, options.correlationId));\n\t\tconst attachments = Array.isArray(options.attachments) ? normalizeAttachments(options.attachments) : undefined;\n\t\tconst fingerprint = options.fingerprint || computeFingerprint(sourceApp, environment, message, stack);\n\t\tconst idempotencyKey = options.idempotencyKey;\n\t\tconst reportedAt = normalizeReportedAt(options.reportedAt);\n\t\tconst normalizedReportedSourceEnv = normalizeStructured(options.reportedSourceEnv);\n\t\tconst payload: ErrorReportPayload = removeEmptyFields({\n\t\t\tsourceApp,\n\t\t\tmessage,\n\t\t\tenvironment,\n\t\t\tclientId: options.clientId,\n\t\t\tclientSlug: options.clientSlug,\n\t\t\tclientName,\n\t\t\tclientRepo: options.clientRepo,\n\t\t\tclientEmail: options.clientEmail,\n\t\t\tseverity,\n\t\t\tstack,\n\t\t\tcontext,\n\t\t\tmetadata,\n\t\t\tattachments,\n\t\t\tfingerprint,\n\t\t\tidempotencyKey,\n\t\t\treportedBy: options.reportedBy,\n\t\t\treportedAt,\n\t\t\treportedFor: options.reportedFor,\n\t\t\treportedCount: options.reportedCount,\n\t\t\treportedSourceHost: options.reportedSourceHost,\n\t\t\treportedSourceIp: options.reportedSourceIp,\n\t\t\treportedSourceVersion: options.reportedSourceVersion,\n\t\t\treportedSourcePid: options.reportedSourcePid,\n\t\t\treportedSourceInstance: options.reportedSourceInstance,\n\t\t\treportedSourceRegion: options.reportedSourceRegion,\n\t\t\treportedSourceCluster: options.reportedSourceCluster,\n\t\t\treportedSourceProcess: options.reportedSourceProcess,\n\t\t\treportedSourceEnv: typeof normalizedReportedSourceEnv === 'string' ? undefined : normalizedReportedSourceEnv as Record<string, any>\n\t\t});\n\n\t\tif (shouldSuppressForLocalEnvironment(config, normalizedApiUrl)) {\n\t\t\tlogger.info('ErrorReporter suppressed: local environment detected');\n\t\t\tlogger.error('ErrorReporter payload (suppressed):', payload);\n\t\t\treturn { delivered: false, reason: 'local-environment' };\n\t\t}\n\n\t\tif (isResolveIOSelfClient(clientName)) {\n\t\t\treturn await handleResolveIoSelfReport(payload, logger);\n\t\t}\n\n\t\tconst transport = options.fetch || globalThis.fetch;\n\t\tif (typeof transport !== 'function') {\n\t\t\tlogger.error('ErrorReporter failed: fetch is not available in this runtime');\n\t\t\tlogger.error('ErrorReporter payload (not sent):', payload);\n\t\t\treturn { delivered: false, reason: 'missing-fetch' };\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await transport(normalizedApiUrl, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: removeEmptyFields({\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-ResolveIO-Error-Key': clientName,\n\t\t\t\t\t'X-ResolveIO-Error-Hash': fingerprint,\n\t\t\t\t\t'X-ResolveIO-Idempotency-Key': idempotencyKey\n\t\t\t\t}),\n\t\t\t\tbody: JSON.stringify(payload)\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlogger.error('ErrorReporter failed to deliver payload', { status: response.status, statusText: response.statusText });\n\t\t\t\treturn { delivered: false, status: response.status, reason: 'http-error' };\n\t\t\t}\n\n\t\t\treturn { delivered: true, status: response.status };\n\t\t}\n\t\tcatch (err) {\n\t\t\tlogger.error('ErrorReporter exception while delivering payload', err);\n\t\t\tlogger.error('ErrorReporter payload (not sent):', payload);\n\t\t\treturn { delivered: false, reason: 'network-error' };\n\t\t}\n\t}\n}\n\nfunction getServerConfig(): Record<string, any> | null {\n\ttry {\n\t\treturn ResolveIOServer.getServerConfig?.() || null;\n\t}\n\tcatch (err) {\n\t\tconsole.error('Failed to read ResolveIO server config', err);\n\t\treturn null;\n\t}\n}\n\nfunction normalizeStack(stack?: string | Error | unknown): string | undefined {\n\tif (!stack) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof stack === 'string') {\n\t\treturn stack;\n\t}\n\n\tif (stack instanceof Error) {\n\t\treturn stack.stack || stack.message;\n\t}\n\n\tif (typeof stack === 'object' && stack !== null && typeof (stack as Record<string, any>).stack === 'string') {\n\t\treturn (stack as Record<string, any>).stack;\n\t}\n\n\tif (typeof stack === 'object' && stack !== null && typeof (stack as Record<string, any>).message === 'string') {\n\t\treturn (stack as Record<string, any>).message;\n\t}\n\n\treturn JSON.stringify(stack);\n}\n\nfunction normalizeStructured(value: any, correlationId?: string): Record<string, any> | string | undefined {\n\tif (value === null || value === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof value === 'string') {\n\t\treturn value;\n\t}\n\n\tconst serialized = serializeValue(value);\n\tif (correlationId && typeof serialized === 'object' && serialized !== null && !serialized.correlationId) {\n\t\tserialized.correlationId = correlationId;\n\t}\n\treturn serialized;\n}\n\nfunction serializeValue(value: any, seen: WeakSet<object> = new WeakSet()): any {\n\tif (value === null || value === undefined) {\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n\t\treturn value;\n\t}\n\n\tif (typeof value === 'bigint') {\n\t\treturn value.toString();\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\n\tif (value instanceof Error) {\n\t\tconst base = {\n\t\t\tname: value.name,\n\t\t\tmessage: value.message,\n\t\t\tstack: value.stack\n\t\t};\n\t\treturn Object.assign({}, base, serializeValue(Object.assign({}, value), seen));\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tif (seen.has(value)) {\n\t\t\treturn '[Circular]';\n\t\t}\n\t\tseen.add(value);\n\t\tconst arr = value.map(item => serializeValue(item, seen));\n\t\tseen.delete(value);\n\t\treturn arr;\n\t}\n\n\tif (typeof value === 'object') {\n\t\tif (seen.has(value)) {\n\t\t\treturn '[Circular]';\n\t\t}\n\t\tseen.add(value);\n\t\tconst obj: Record<string, any> = {};\n\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\tobj[key] = serializeValue(val, seen);\n\t\t}\n\t\tseen.delete(value);\n\t\treturn obj;\n\t}\n\n\treturn String(value);\n}\n\nfunction normalizeAttachments(attachments: ErrorReportAttachment[]): ErrorReportAttachment[] {\n\treturn attachments\n\t\t.filter(att => !!att && typeof att === 'object')\n\t\t.map(att => removeEmptyFields({\n\t\t\tname: att.name,\n\t\t\turl: att.url,\n\t\t\tcontentType: att.contentType,\n\t\t\tsize: typeof att.size === 'number' ? att.size : undefined\n\t\t}))\n\t\t.filter(att => !!att.name);\n}\n\nfunction normalizeReportedAt(value?: string | Date): string | undefined {\n\tif (!value) {\n\t\treturn new Date().toISOString();\n\t}\n\n\tif (value instanceof Date) {\n\t\treturn value.toISOString();\n\t}\n\n\tconst date = new Date(value);\n\tif (!isNaN(date.getTime())) {\n\t\treturn date.toISOString();\n\t}\n\n\treturn new Date().toISOString();\n}\n\nfunction computeFingerprint(sourceApp: string, environment: string | undefined, message: string, stack?: string): string | undefined {\n\tconst signature = `${sourceApp || ''}:${environment || ''}:${message || ''}:${stack ? stack.split('\\n').slice(0, 5).join('|') : ''}`;\n\treturn createHash('sha256').update(signature).digest('hex');\n}\n\nfunction removeEmptyFields<T extends Record<string, any>>(obj: T): T {\n\tconst cleaned: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(obj || {})) {\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tcontinue;\n\t\t}\n\t\tcleaned[key] = value;\n\t}\n\treturn cleaned as T;\n}\n\nfunction mergeMetadata(metadata: Record<string, any> | string | null | undefined, correlationId?: string) {\n\tif (!metadata && !correlationId) {\n\t\treturn undefined;\n\t}\n\n\tconst base = metadata ? normalizeStructured(metadata) : undefined;\n\tif (!correlationId) {\n\t\treturn base;\n\t}\n\n\tif (typeof base === 'string') {\n\t\treturn {\n\t\t\tcorrelationId,\n\t\t\tmessage: base\n\t\t};\n\t}\n\n\tconst metadataObj = (base || {}) as Record<string, any>;\n\tif (!metadataObj.correlationId) {\n\t\tmetadataObj.correlationId = correlationId;\n\t}\n\treturn metadataObj;\n}\n\nasync function handleResolveIoSelfReport(payload: ErrorReportPayload, logger: LoggerLike): Promise<ErrorReportResult> {\n\tif (resolveIoInsertOverride) {\n\t\treturn await resolveIoInsertOverride(payload, logger);\n\t}\n\n\tif (!ErrorAutoFixLogs) {\n\t\tlogger.warn('ErrorReporter ResolveIO insert skipped: error-autofix collection unavailable');\n\t\tlogger.error('ErrorReporter payload (not inserted):', payload);\n\t\treturn { delivered: false, reason: 'resolveio-no-collection' };\n\t}\n\n\ttry {\n\t\tconst doc = buildResolveIoAutoFixDoc(payload);\n\t\tconst upsertResult = await upsertResolveIoAutoFixLog(ErrorAutoFixLogs, doc);\n\t\treturn {\n\t\t\tdelivered: true,\n\t\t\treason: upsertResult.duplicate ? 'resolveio-duplicate' : 'resolveio-insert'\n\t\t};\n\t}\n\tcatch (err) {\n\t\tlogger.error('ErrorReporter failed to insert resolveio auto-fix log', err);\n\t\tlogger.error('ErrorReporter payload (not inserted):', payload);\n\t\treturn { delivered: false, reason: 'resolveio-insert-failed' };\n\t}\n}\n\nfunction buildResolveIoAutoFixDoc(payload: ErrorReportPayload): ErrorAutoFixLogModel {\n\tconst timestamp = coerceReportedDate(payload.reportedAt);\n\tconst safeMessage = (payload.message || '').toString().trim() || 'Unknown error';\n\tconst subjectBase = `[AppError] ${payload.sourceApp || 'application'}${payload.environment ? ` (${payload.environment})` : ''}`;\n\tconst subject = `${subjectBase} - ${safeMessage.slice(0, 120)}`;\n\tconst bodyLines: string[] = [\n\t\t`Source App:\\t${payload.sourceApp || 'n/a'}`,\n\t\t`Environment:\\t${payload.environment || 'n/a'}`,\n\t\t`Severity:\\t${payload.severity || 'error'}`,\n\t\t`Client Hint:\\t${payload.clientName || payload.clientSlug || payload.clientRepo || payload.clientId || 'n/a'}`,\n\t\t`Reported By:\\t${payload.reportedBy || payload.clientEmail || 'n/a'}`,\n\t\t`Reported At:\\t${timestamp.toISOString()}`,\n\t\t`Message:\\t${safeMessage}`\n\t];\n\n\tif (payload.stack) {\n\t\tbodyLines.push('', 'Stack Trace:', payload.stack.toString());\n\t}\n\n\tif (isPlainObject(payload.context) && Object.keys(payload.context).length) {\n\t\tbodyLines.push('', 'Context JSON:', JSON.stringify(payload.context, null, 2));\n\t}\n\n\tif (isPlainObject(payload.metadata) && Object.keys(payload.metadata).length) {\n\t\tbodyLines.push('', 'Metadata JSON:', JSON.stringify(payload.metadata, null, 2));\n\t}\n\n\tconst normalizedAttachments = normalizeAttachments(payload.attachments);\n\tif (Array.isArray(normalizedAttachments) && normalizedAttachments.length) {\n\t\tbodyLines.push('', 'Attachments:');\n\t\tnormalizedAttachments.forEach(att => {\n\t\t\tconst segments: string[] = [];\n\t\t\tif (att.name) {\n\t\t\t\tsegments.push(att.name);\n\t\t\t}\n\t\t\tif (att.contentType) {\n\t\t\t\tsegments.push(att.contentType);\n\t\t\t}\n\t\t\tif (typeof att.size === 'number') {\n\t\t\t\tsegments.push(`${att.size}b`);\n\t\t\t}\n\t\t\tconst summary = segments.length ? segments.join(' | ') : 'attachment';\n\t\t\tbodyLines.push(`- ${summary}${att.url ? ` -> ${att.url}` : ''}`);\n\t\t});\n\t}\n\n\tif (payload.fingerprint) {\n\t\tbodyLines.push('', `Fingerprint:\\t${payload.fingerprint}`);\n\t}\n\n\tif (payload.idempotencyKey) {\n\t\tbodyLines.push(`Idempotency Key:\\t${payload.idempotencyKey}`);\n\t}\n\n\tconst body = bodyLines.join('\\n');\n\tconst rawHash = (payload.idempotencyKey || '').toString().trim() || generateResolveIoRawHash(subject, body);\n\tconst issueHash = (payload.fingerprint || '').toString().trim() || generateResolveIoIssueHash(subject, body);\n\tconst fromEmail = payload.reportedBy || payload.clientEmail || '';\n\tconst reportMetadata = isPlainObject(payload.metadata) ? payload.metadata : undefined;\n\tconst reportContext = isPlainObject(payload.context) ? payload.context : undefined;\n\n\treturn cleanUndefined<ErrorAutoFixLogModel>({\n\t\t_id: objectIdHexString(),\n\t\temail_hash: rawHash,\n\t\tissue_hash: issueHash,\n\t\tsubject,\n\t\tmessage_id: payload.idempotencyKey ? payload.idempotencyKey.toString() : undefined,\n\t\tbody,\n\t\tstatus: 'pending',\n\t\tignored: false,\n\t\tattempt_count: 0,\n\t\tduplicate_count: 0,\n\t\tfirst_seen_at: timestamp,\n\t\tfrom_email: fromEmail,\n\t\tid_client: payload.clientId,\n\t\tclient_name: payload.clientName || payload.clientSlug || undefined,\n\t\tcodex_environment: payload.clientRepo || payload.clientSlug || undefined,\n\t\tsource_app: payload.sourceApp,\n\t\tsource_environment: payload.environment,\n\t\tseverity: payload.severity,\n\t\treported_by: fromEmail,\n\t\tlast_reported_at: timestamp,\n\t\treport_metadata: reportMetadata,\n\t\treport_context: reportContext,\n\t\tattachments: normalizedAttachments,\n\t\tcreatedAt: timestamp,\n\t\tupdatedAt: timestamp\n\t});\n}\n\nasync function upsertResolveIoAutoFixLog(collection: MongoManagerCollection<ErrorAutoFixLogModel>, doc: ErrorAutoFixLogModel): Promise<{ duplicate: boolean, doc: ErrorAutoFixLogModel }> {\n\tconst timestamp = doc.first_seen_at || new Date();\n\tlet existing: ErrorAutoFixLogModel = null;\n\n\tif (doc.issue_hash) {\n\t\texisting = await collection.findOne({issue_hash: doc.issue_hash});\n\t}\n\n\tif (!existing && doc.email_hash) {\n\t\texisting = await collection.findOne({email_hash: doc.email_hash});\n\t}\n\n\tif (existing) {\n\t\tconst updateSet = cleanUndefined<Partial<ErrorAutoFixLogModel>>({\n\t\t\tlast_duplicate_at: timestamp,\n\t\t\tlast_reported_at: timestamp,\n\t\t\treport_metadata: doc.report_metadata,\n\t\t\treport_context: doc.report_context,\n\t\t\tattachments: doc.attachments,\n\t\t\tseverity: doc.severity,\n\t\t\tsource_app: doc.source_app,\n\t\t\tsource_environment: doc.source_environment,\n\t\t\treported_by: doc.reported_by,\n\t\t\tupdatedAt: new Date()\n\t\t});\n\n\t\tawait collection.updateOne({_id: existing._id}, {\n\t\t\t$inc: { duplicate_count: 1 },\n\t\t\t$set: updateSet\n\t\t});\n\n\t\treturn { duplicate: true, doc: existing };\n\t}\n\n\tawait collection.insertOne(doc as any);\n\treturn { duplicate: false, doc };\n}\n\nfunction generateResolveIoRawHash(subject: string, body: string): string {\n\treturn createHash('sha256').update(`${subject || ''}\\n${body || ''}`, 'utf8').digest('hex');\n}\n\nfunction generateResolveIoIssueHash(subject: string, body: string): string {\n\tconst normalizedSubject = normalizeTextForAutoFixHash(subject);\n\tconst normalizedBody = normalizeBodyForAutoFixHash(body);\n\treturn createHash('sha256').update(`${normalizedSubject}\\n${normalizedBody}`, 'utf8').digest('hex');\n}\n\nfunction normalizeTextForAutoFixHash(value: string): string {\n\tif (!value) {\n\t\treturn '';\n\t}\n\n\tconst normalized = value\n\t\t.replace(/\\r/g, '\\n')\n\t\t.toLowerCase()\n\t\t.replace(/0x[0-9a-f]+/gi, '0x#')\n\t\t.replace(/\\b[0-9a-f]{7,64}\\b/gi, '#')\n\t\t.replace(/\\b[0-9]{4}[-/][0-9]{2}[-/][0-9]{2}(?:[ t][0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{1,6})?)?\\b/g, '#datetime#')\n\t\t.replace(/\\b[0-9]{2}:[0-9]{2}:[0-9]{2}\\b/g, '#time#')\n\t\t.replace(/[0-9]+/g, '#')\n\t\t.replace(/[^\\S\\n]+/g, ' ')\n\t\t.split('\\n')\n\t\t.map(line => line.trim())\n\t\t.filter(Boolean)\n\t\t.slice(0, 60)\n\t\t.join('\\n');\n\n\treturn normalized.length > 4000 ? normalized.slice(0, 4000) : normalized;\n}\n\nfunction normalizeBodyForAutoFixHash(body: string): string {\n\tif (!body) {\n\t\treturn '';\n\t}\n\n\tconst withoutStackNoise = body\n\t\t.replace(/=+\\s*stack trace\\s*=+/gi, 'stack trace')\n\t\t.replace(/-{3,}/g, '-')\n\t\t.replace(/\\[[^\\]]*request id[^\\]]*\\]/gi, '[request id]')\n\t\t.replace(/guid:[^\\s]+/gi, 'guid:#')\n\t\t.replace(/request id:[^\\s]+/gi, 'request id:#')\n\t\t.replace(/correlation id:[^\\s]+/gi, 'correlation id:#');\n\n\treturn normalizeTextForAutoFixHash(withoutStackNoise);\n}\n\nfunction cleanUndefined<T extends Record<string, any>>(obj: T): T {\n\tconst cleaned: Record<string, any> = {};\n\tObject.keys(obj || {}).forEach(key => {\n\t\tif (typeof obj[key] !== 'undefined') {\n\t\t\tcleaned[key] = obj[key];\n\t\t}\n\t});\n\treturn cleaned as T;\n}\n\nfunction coerceReportedDate(value?: string): Date {\n\tif (!value) {\n\t\treturn new Date();\n\t}\n\n\tconst coerced = new Date(value);\n\treturn Number.isNaN(coerced.getTime()) ? new Date() : coerced;\n}\n\nfunction shouldSuppressForLocalEnvironment(config: Record<string, any> | null, apiUrl: string): boolean {\n\tif (isLocalUrl(config?.ROOT_URL) || isLocalUrl(config?.SERVER_URL) || process.env.NODE_ENV === 'development') {\n\t\treturn true;\n\t}\n\n\treturn isLocalUrl(apiUrl);\n}\n\nfunction isLocalUrl(url?: string): boolean {\n\tif (!url || typeof url !== 'string') {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\treturn LOCAL_HOSTNAMES.has(parsed.hostname.toLowerCase());\n\t}\n\tcatch {\n\t\treturn /localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|::1/.test(url);\n\t}\n}\n\nfunction isResolveIOSelfClient(clientName?: string): boolean {\n\tif (!clientName) {\n\t\treturn false;\n\t}\n\n\treturn clientName.toLowerCase() === 'resolveio';\n}\n\nfunction isPlainObject(value: any): value is Record<string, any> {\n\treturn !!value && typeof value === 'object' && !Array.isArray(value);\n}\n"]}
|