@robotical/webapp-types 3.20.0 → 3.21.0

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.
@@ -8,6 +8,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
8
8
  return to.concat(ar || Array.prototype.slice.call(from));
9
9
  };
10
10
  import { AppSentMessage } from "../../types/communication-between-apps/wrapper-communication";
11
+ import { addLoggerWarningBreadcrumb, captureLoggerError, } from "../observability/Observability";
11
12
  var SHOW_LOGS_GLOBAL = true;
12
13
  var ONLY_SHOW_VIP_LOGS = false;
13
14
  var Logger = /** @class */ (function () {
@@ -25,6 +26,7 @@ var Logger = /** @class */ (function () {
25
26
  for (var _i = 2; _i < arguments.length; _i++) {
26
27
  messages[_i - 2] = arguments[_i];
27
28
  }
29
+ captureLoggerError(tag, messages);
28
30
  SHOW_LOGS_GLOBAL && !ONLY_SHOW_VIP_LOGS && SHOW_LOGS && console.error.apply(console, __spreadArray(['\x1b[31m%s\x1b[0m', "ERROR: ".concat(tag)], messages, false)); // Red color for error logs
29
31
  };
30
32
  Logger.debug = function (SHOW_LOGS, tag) {
@@ -39,6 +41,7 @@ var Logger = /** @class */ (function () {
39
41
  for (var _i = 2; _i < arguments.length; _i++) {
40
42
  messages[_i - 2] = arguments[_i];
41
43
  }
44
+ addLoggerWarningBreadcrumb(tag, messages);
42
45
  SHOW_LOGS_GLOBAL && !ONLY_SHOW_VIP_LOGS && SHOW_LOGS && console.warn.apply(console, __spreadArray(['\x1b[33m%s\x1b[0m', "WARN: ".concat(tag)], messages, false)); // Yellow color for warning logs
43
46
  };
44
47
  Logger.phoneAppLog = function (SHOW_LOGS, tag) {
@@ -0,0 +1,5 @@
1
+ export type AppRuntime = "web-app" | "phone-webview";
2
+ export declare function initializeObservability(): boolean;
3
+ export declare function isObservabilityTransportUrl(url: string): boolean;
4
+ export declare function captureLoggerError(tag: string, messages: unknown[]): void;
5
+ export declare function addLoggerWarningBreadcrumb(tag: string, messages: unknown[]): void;
@@ -0,0 +1,190 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import * as Sentry from "@sentry/react";
13
+ import packageInfo from "../../../package.json";
14
+ import isPhoneApp from "../../utils/phone-app-communication/is-phone-app";
15
+ import { getSafeErrorType, redactTelemetryText, sanitizeTelemetryValue, } from "./sanitizeTelemetry";
16
+ var appVersion = packageInfo.version;
17
+ var getRuntime = function () {
18
+ try {
19
+ return isPhoneApp() ? "phone-webview" : "web-app";
20
+ }
21
+ catch (_a) {
22
+ return "web-app";
23
+ }
24
+ };
25
+ var getSafeAppSnapshot = function () {
26
+ var applicationManager = window.applicationManager;
27
+ var connectedRafts = (applicationManager === null || applicationManager === void 0 ? void 0 : applicationManager.connectedRafts)
28
+ ? Object.values(applicationManager.connectedRafts)
29
+ : [];
30
+ var connectedRaftTypes = Array.from(new Set(connectedRafts
31
+ .map(function (raft) { return raft === null || raft === void 0 ? void 0 : raft.type; })
32
+ .filter(function (type) { return type !== undefined; })
33
+ .map(function (type) { return String(type); })));
34
+ var deviceInfo = applicationManager === null || applicationManager === void 0 ? void 0 : applicationManager.deviceInfo;
35
+ return sanitizeTelemetryValue({
36
+ appVersion: appVersion,
37
+ runtime: getRuntime(),
38
+ route: window.location.pathname,
39
+ online: navigator.onLine,
40
+ language: navigator.language,
41
+ viewport: {
42
+ width: window.innerWidth,
43
+ height: window.innerHeight,
44
+ devicePixelRatio: window.devicePixelRatio || 1,
45
+ },
46
+ connectedRaftCount: connectedRafts.length,
47
+ connectedRaftTypes: connectedRaftTypes,
48
+ wrapper: deviceInfo
49
+ ? {
50
+ appVersion: deviceInfo.appVersion,
51
+ buildNumber: deviceInfo.buildNumber,
52
+ systemName: deviceInfo.systemName,
53
+ systemVersion: deviceInfo.systemVersion,
54
+ }
55
+ : undefined,
56
+ });
57
+ };
58
+ var sanitizeEvent = function (event) {
59
+ var _a, _b;
60
+ var eventWithPrivateData = event;
61
+ delete eventWithPrivateData.user;
62
+ delete eventWithPrivateData.request;
63
+ (_b = (_a = eventWithPrivateData.exception) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.forEach(function (exception) {
64
+ if (exception.type) {
65
+ exception.type = getSafeErrorType(exception.type);
66
+ }
67
+ if (exception.value) {
68
+ exception.value = "[REDACTED]";
69
+ }
70
+ });
71
+ return sanitizeTelemetryValue(eventWithPrivateData);
72
+ };
73
+ export function initializeObservability() {
74
+ var _a;
75
+ var dsn = (_a = process.env.REACT_APP_SENTRY_DSN) === null || _a === void 0 ? void 0 : _a.trim();
76
+ if (!dsn || Sentry.isInitialized()) {
77
+ return Sentry.isInitialized();
78
+ }
79
+ Sentry.init({
80
+ dsn: dsn,
81
+ environment: process.env.REACT_APP_SENTRY_ENVIRONMENT || process.env.NODE_ENV,
82
+ release: process.env.REACT_APP_SENTRY_RELEASE || "marty-web-app@".concat(appVersion),
83
+ sendDefaultPii: false,
84
+ attachStacktrace: true,
85
+ maxBreadcrumbs: 75,
86
+ integrations: [
87
+ Sentry.breadcrumbsIntegration({
88
+ console: false,
89
+ dom: false,
90
+ fetch: false,
91
+ history: false,
92
+ sentry: false,
93
+ xhr: false,
94
+ }),
95
+ ],
96
+ beforeBreadcrumb: function (breadcrumb) {
97
+ return sanitizeTelemetryValue(breadcrumb);
98
+ },
99
+ beforeSend: function (event) {
100
+ event.tags = __assign(__assign({}, event.tags), { app_runtime: getRuntime(), app_version: appVersion });
101
+ event.contexts = __assign(__assign({}, event.contexts), { app_snapshot: getSafeAppSnapshot() });
102
+ return sanitizeEvent(event);
103
+ },
104
+ });
105
+ Sentry.setTags({
106
+ app_runtime: getRuntime(),
107
+ app_version: appVersion,
108
+ });
109
+ return true;
110
+ }
111
+ export function isObservabilityTransportUrl(url) {
112
+ var _a;
113
+ var dsn = (_a = process.env.REACT_APP_SENTRY_DSN) === null || _a === void 0 ? void 0 : _a.trim();
114
+ if (!dsn)
115
+ return false;
116
+ try {
117
+ return new URL(url, window.location.href).hostname === new URL(dsn).hostname;
118
+ }
119
+ catch (_b) {
120
+ return false;
121
+ }
122
+ }
123
+ var serializeLogArguments = function (messages) {
124
+ return messages.map(function (message) { return sanitizeTelemetryValue(message); });
125
+ };
126
+ var getLogMessage = function (messages) {
127
+ var message = messages
128
+ .map(function (item) {
129
+ if (item instanceof Error)
130
+ return getSafeErrorType(item);
131
+ if (typeof item === "string")
132
+ return item;
133
+ try {
134
+ return JSON.stringify(sanitizeTelemetryValue(item));
135
+ }
136
+ catch (_a) {
137
+ return String(item);
138
+ }
139
+ })
140
+ .join(" ")
141
+ .trim();
142
+ return redactTelemetryText(message || "Unknown error");
143
+ };
144
+ export function captureLoggerError(tag, messages) {
145
+ if (!Sentry.isInitialized())
146
+ return;
147
+ try {
148
+ var error_1 = messages.find(function (message) { return message instanceof Error; });
149
+ var safeTag_1 = redactTelemetryText(tag).slice(0, 100);
150
+ var safeMessage_1 = getLogMessage(messages);
151
+ Sentry.withScope(function (scope) {
152
+ scope.setLevel("error");
153
+ scope.setTag("logger_tag", safeTag_1);
154
+ scope.setContext("logger", {
155
+ message: safeMessage_1,
156
+ arguments: serializeLogArguments(messages),
157
+ });
158
+ scope.setContext("app_snapshot", getSafeAppSnapshot());
159
+ if (error_1) {
160
+ Sentry.captureException(error_1);
161
+ }
162
+ else {
163
+ Sentry.captureMessage("".concat(safeTag_1, ": ").concat(safeMessage_1), "error");
164
+ }
165
+ });
166
+ }
167
+ catch (_a) {
168
+ // Monitoring must never interrupt the application path it observes.
169
+ }
170
+ }
171
+ export function addLoggerWarningBreadcrumb(tag, messages) {
172
+ if (!Sentry.isInitialized())
173
+ return;
174
+ try {
175
+ var safeTag = redactTelemetryText(tag).slice(0, 100);
176
+ Sentry.addBreadcrumb({
177
+ category: "app.warning",
178
+ level: "warning",
179
+ message: "".concat(safeTag, ": ").concat(getLogMessage(messages)),
180
+ data: {
181
+ loggerTag: safeTag,
182
+ route: window.location.pathname,
183
+ runtime: getRuntime(),
184
+ },
185
+ });
186
+ }
187
+ catch (_a) {
188
+ // Monitoring must never interrupt the application path it observes.
189
+ }
190
+ }
@@ -0,0 +1,7 @@
1
+ export declare const isSensitiveTelemetryKey: (key: string) => boolean;
2
+ export declare const getSafeErrorType: (value: unknown) => string;
3
+ export declare const getSafeErrorMetadata: (error: unknown) => {
4
+ errorType: string;
5
+ };
6
+ export declare function redactTelemetryText(value: string): string;
7
+ export declare function sanitizeTelemetryValue(value: unknown, depth?: number, seen?: WeakSet<object>): unknown;
@@ -0,0 +1,136 @@
1
+ var REDACTED = "[REDACTED]";
2
+ var MAX_DEPTH = 12;
3
+ var MAX_ARRAY_ITEMS = 100;
4
+ var MAX_OBJECT_KEYS = 100;
5
+ var MAX_STRING_LENGTH = 4000;
6
+ var SAFE_ERROR_TYPES = new Set([
7
+ "AbortError",
8
+ "AggregateError",
9
+ "DOMException",
10
+ "Error",
11
+ "EvalError",
12
+ "NetworkError",
13
+ "NotAllowedError",
14
+ "RangeError",
15
+ "ReferenceError",
16
+ "SecurityError",
17
+ "SyntaxError",
18
+ "TimeoutError",
19
+ "TypeError",
20
+ "URIError",
21
+ ]);
22
+ var SENSITIVE_KEYS = new Set([
23
+ "authorization",
24
+ "authtoken",
25
+ "base64",
26
+ "bleaddress",
27
+ "bssid",
28
+ "cookie",
29
+ "cookies",
30
+ "credential",
31
+ "credentials",
32
+ "connectionlocator",
33
+ "dataurl",
34
+ "deviceid",
35
+ "devicename",
36
+ "email",
37
+ "filecontents",
38
+ "friendlyname",
39
+ "ipaddress",
40
+ "locator",
41
+ "macaddress",
42
+ "password",
43
+ "passphrase",
44
+ "raftid",
45
+ "robotid",
46
+ "secret",
47
+ "serial",
48
+ "serialno",
49
+ "serialnumber",
50
+ "ssid",
51
+ "streamcontents",
52
+ "token",
53
+ "username",
54
+ "wifipassword",
55
+ "wifimac",
56
+ "wifiusername",
57
+ ]);
58
+ var normalizeKey = function (key) {
59
+ return key.replace(/[^a-z0-9]/gi, "").toLowerCase();
60
+ };
61
+ export var isSensitiveTelemetryKey = function (key) {
62
+ return SENSITIVE_KEYS.has(normalizeKey(key));
63
+ };
64
+ export var getSafeErrorType = function (value) {
65
+ var errorType = value instanceof Error ? value.name : value;
66
+ return typeof errorType === "string" && SAFE_ERROR_TYPES.has(errorType)
67
+ ? errorType
68
+ : "Error";
69
+ };
70
+ export var getSafeErrorMetadata = function (error) { return ({
71
+ errorType: error instanceof Error ? getSafeErrorType(error) : typeof error,
72
+ }); };
73
+ export function redactTelemetryText(value) {
74
+ var redacted = value
75
+ .replace(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi, REDACTED)
76
+ .replace(/\b(password|passphrase|token|authorization|cookie|secret|ssid|serial(?:\s*(?:number|no))?|device\s*id|device\s*name|robot\s*id|robot\s*name|raft(?:\s+with)?\s*id|mac\s*address|ble\s*address)\s*(?::|=|\s)\s*[^\s,;]+/gi, function (_match, label) { return "".concat(label, ": ").concat(REDACTED); })
77
+ .replace(/\bWi-?Fi\s+network\s+[^\s,;]+/gi, "Wi-Fi network ".concat(REDACTED))
78
+ .replace(/https:\/\/hooks\.slack\.com\/services\/[^\s"']+/gi, REDACTED)
79
+ .replace(/([?&][^=&#\s]+)=([^&#\s]*)/g, "$1=".concat(REDACTED))
80
+ .replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi, REDACTED)
81
+ .replace(/\b(?:[0-9a-f]{2}:){5}[0-9a-f]{2}\b/gi, REDACTED);
82
+ return redacted.length > MAX_STRING_LENGTH
83
+ ? "".concat(redacted.slice(0, MAX_STRING_LENGTH), "\u2026")
84
+ : redacted;
85
+ }
86
+ export function sanitizeTelemetryValue(value, depth, seen) {
87
+ if (depth === void 0) { depth = 0; }
88
+ if (seen === void 0) { seen = new WeakSet(); }
89
+ if (typeof value === "string") {
90
+ return redactTelemetryText(value);
91
+ }
92
+ if (value === null ||
93
+ value === undefined ||
94
+ typeof value === "boolean" ||
95
+ typeof value === "number") {
96
+ return value;
97
+ }
98
+ if (typeof value === "bigint" || typeof value === "symbol") {
99
+ return String(value);
100
+ }
101
+ if (typeof value === "function") {
102
+ return "[Function]";
103
+ }
104
+ if (depth >= MAX_DEPTH) {
105
+ return "[Truncated]";
106
+ }
107
+ if (value instanceof Error) {
108
+ return {
109
+ name: getSafeErrorType(value),
110
+ message: REDACTED,
111
+ };
112
+ }
113
+ if (value instanceof Date) {
114
+ return value.toISOString();
115
+ }
116
+ if (typeof value !== "object") {
117
+ return redactTelemetryText(String(value));
118
+ }
119
+ if (seen.has(value)) {
120
+ return "[Circular]";
121
+ }
122
+ seen.add(value);
123
+ if (Array.isArray(value)) {
124
+ return value
125
+ .slice(0, MAX_ARRAY_ITEMS)
126
+ .map(function (item) { return sanitizeTelemetryValue(item, depth + 1, seen); });
127
+ }
128
+ var sanitized = {};
129
+ for (var _i = 0, _a = Object.entries(value).slice(0, MAX_OBJECT_KEYS); _i < _a.length; _i++) {
130
+ var _b = _a[_i], key = _b[0], item = _b[1];
131
+ sanitized[key] = isSensitiveTelemetryKey(key)
132
+ ? REDACTED
133
+ : sanitizeTelemetryValue(item, depth + 1, seen);
134
+ }
135
+ return sanitized;
136
+ }
@@ -46,6 +46,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
46
46
  }
47
47
  };
48
48
  import Logger from "../../services/logger/Logger";
49
+ import { getSafeErrorMetadata } from "../../services/observability/sanitizeTelemetry";
49
50
  import { FEEDBACK_REQUIRES_ROBOT_CONNECTION_MESSAGE, getActiveFeedbackRobotConnection, isRobotConnectionRequiredForFeedbackSource, } from "./feedbackConnectionEligibility";
50
51
  import randomHashGenerator from "../helpers/randomHashGenerator";
51
52
  import isPhoneApp from "../phone-app-communication/is-phone-app";
@@ -241,7 +242,7 @@ export function createFeedbackRecord(input) {
241
242
  export function submitFeedback(input) {
242
243
  var _a, _b;
243
244
  return __awaiter(this, void 0, void 0, function () {
244
- var requiresRobotConnection, robotConnection, record, feedbackId, firebaseUpdates, _i, _c, screenshot, firebaseResponse, errorText, slackDelivered, slackResponse, errorText, error_1;
245
+ var requiresRobotConnection, robotConnection, record, feedbackId, firebaseUpdates, _i, _c, screenshot, firebaseResponse, slackDelivered, slackResponse, error_1;
245
246
  var _d;
246
247
  return __generator(this, function (_e) {
247
248
  switch (_e.label) {
@@ -273,17 +274,14 @@ export function submitFeedback(input) {
273
274
  })];
274
275
  case 1:
275
276
  firebaseResponse = _e.sent();
276
- if (!!firebaseResponse.ok) return [3 /*break*/, 3];
277
- return [4 /*yield*/, firebaseResponse.text()];
278
- case 2:
279
- errorText = _e.sent();
280
- Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Firebase: ".concat(firebaseResponse.status, " ").concat(errorText));
281
- throw new Error("Failed to submit feedback");
282
- case 3:
277
+ if (!firebaseResponse.ok) {
278
+ Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Firebase", { status: firebaseResponse.status });
279
+ throw new Error("Failed to submit feedback");
280
+ }
283
281
  slackDelivered = true;
284
- _e.label = 4;
285
- case 4:
286
- _e.trys.push([4, 8, , 9]);
282
+ _e.label = 2;
283
+ case 2:
284
+ _e.trys.push([2, 4, , 5]);
287
285
  return [4 /*yield*/, fetch(WEB_APP_FEEDBACK_SLACK_WEBHOOK_URL, {
288
286
  method: "POST",
289
287
  headers: {
@@ -291,20 +289,18 @@ export function submitFeedback(input) {
291
289
  },
292
290
  body: JSON.stringify({ text: record.text }),
293
291
  })];
294
- case 5:
292
+ case 3:
295
293
  slackResponse = _e.sent();
296
- if (!!slackResponse.ok) return [3 /*break*/, 7];
297
- return [4 /*yield*/, slackResponse.text()];
298
- case 6:
299
- errorText = _e.sent();
300
- throw new Error("Failed Slack response: ".concat(slackResponse.status, " ").concat(errorText));
301
- case 7: return [3 /*break*/, 9];
302
- case 8:
294
+ if (!slackResponse.ok) {
295
+ throw new Error("Failed Slack response with status ".concat(slackResponse.status));
296
+ }
297
+ return [3 /*break*/, 5];
298
+ case 4:
303
299
  error_1 = _e.sent();
304
300
  slackDelivered = false;
305
- Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Slack", error_1);
306
- return [3 /*break*/, 9];
307
- case 9: return [2 /*return*/, {
301
+ Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Slack", getSafeErrorMetadata(error_1));
302
+ return [3 /*break*/, 5];
303
+ case 5: return [2 /*return*/, {
308
304
  record: record,
309
305
  slackDelivered: slackDelivered,
310
306
  }];
@@ -35,6 +35,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  }
36
36
  };
37
37
  import Logger from "../../services/logger/Logger";
38
+ import { getSafeErrorMetadata } from "../../services/observability/sanitizeTelemetry";
38
39
  import { getOnboardingCookie, isOnboardingCookieExpired } from "./cookies";
39
40
  import WarranyFacade from "@robotical/appv2-warranty-service-lib";
40
41
  var SHOW_LOGS = true;
@@ -62,7 +63,7 @@ export function shouldShowOnboardingModal(serialNo) {
62
63
  case 3: return [3 /*break*/, 5];
63
64
  case 4:
64
65
  error_1 = _a.sent();
65
- Logger.error(SHOW_LOGS, TAG, "Error checking if should show onboarding modal: " + error_1);
66
+ Logger.error(SHOW_LOGS, TAG, "Error checking if onboarding should be shown", getSafeErrorMetadata(error_1));
66
67
  // Don't show the modal if there was an error (probably no internet connection)
67
68
  return [2 /*return*/, false];
68
69
  case 5: return [2 /*return*/, shouldShowModal];
@@ -108,7 +109,7 @@ export function registerUser(email, establishment, serialNumbers) {
108
109
  return [2 /*return*/, WarranyFacade.registerUser(email, establishment, serialNumbers)];
109
110
  }
110
111
  catch (error) {
111
- Logger.error(SHOW_LOGS, TAG, "Error registering user: " + error);
112
+ Logger.error(SHOW_LOGS, TAG, "Error registering user", getSafeErrorMetadata(error));
112
113
  return [2 /*return*/, false];
113
114
  }
114
115
  return [2 /*return*/];
@@ -129,7 +130,7 @@ export function isUserRegistered(email) {
129
130
  case 2: return [2 /*return*/, !!(_a.sent())];
130
131
  case 3:
131
132
  error_2 = _a.sent();
132
- Logger.error(SHOW_LOGS, TAG, "Error checking if user is registered: " + error_2);
133
+ Logger.error(SHOW_LOGS, TAG, "Error checking if user is registered", getSafeErrorMetadata(error_2));
133
134
  return [2 /*return*/, false];
134
135
  case 4: return [2 /*return*/];
135
136
  }
@@ -152,7 +153,7 @@ export function getUserGivenEmail(email) {
152
153
  return [2 /*return*/, user];
153
154
  case 3:
154
155
  error_3 = _a.sent();
155
- Logger.error(SHOW_LOGS, TAG, "Error getting user given email: " + error_3);
156
+ Logger.error(SHOW_LOGS, TAG, "Error getting user", getSafeErrorMetadata(error_3));
156
157
  return [2 /*return*/, null];
157
158
  case 4: return [2 /*return*/];
158
159
  }
@@ -166,7 +167,7 @@ export var isSerialNumberRegistered = function (serialNo) { return __awaiter(voi
166
167
  return [2 /*return*/, WarranyFacade.isSerialNumberRegistered(serialNo)];
167
168
  }
168
169
  catch (error) {
169
- Logger.error(SHOW_LOGS, TAG, "Error checking if serial number is registered: " + error);
170
+ Logger.error(SHOW_LOGS, TAG, "Error checking if serial number is registered", getSafeErrorMetadata(error));
170
171
  return [2 /*return*/, false];
171
172
  }
172
173
  return [2 /*return*/];
@@ -190,7 +191,7 @@ export var createTicket = function (serialNo, title, description, robotName, rob
190
191
  case 4: return [2 /*return*/, false];
191
192
  case 5:
192
193
  error_4 = _a.sent();
193
- Logger.error(SHOW_LOGS, TAG, "Error creating ticket: " + error_4);
194
+ Logger.error(SHOW_LOGS, TAG, "Error creating ticket", getSafeErrorMetadata(error_4));
194
195
  return [2 /*return*/, false];
195
196
  case 6: return [2 /*return*/];
196
197
  }
@@ -211,7 +212,7 @@ export var getEmailGivenSerialNumber = function (serialNo) { return __awaiter(vo
211
212
  return [2 /*return*/, serialNumber === null || serialNumber === void 0 ? void 0 : serialNumber.email];
212
213
  case 3:
213
214
  error_5 = _a.sent();
214
- Logger.error(SHOW_LOGS, TAG, "Error getting email given serial number: " + error_5);
215
+ Logger.error(SHOW_LOGS, TAG, "Error getting email for serial number", getSafeErrorMetadata(error_5));
215
216
  return [2 /*return*/, undefined];
216
217
  case 4: return [2 /*return*/];
217
218
  }
@@ -224,7 +225,7 @@ export var addRobotNameToSerialNumber = function (serialNo, name) { return __awa
224
225
  return [2 /*return*/, WarranyFacade.addRobotNameToSerialNumber(serialNo, name)];
225
226
  }
226
227
  catch (error) {
227
- Logger.error(SHOW_LOGS, TAG, "Error adding robot name to serial number: " + error);
228
+ Logger.error(SHOW_LOGS, TAG, "Error adding robot name to serial number", getSafeErrorMetadata(error));
228
229
  return [2 /*return*/, false];
229
230
  }
230
231
  return [2 /*return*/];