@robotical/webapp-types 3.19.2 → 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
+ }
@@ -2,6 +2,17 @@ import type { UserDeviceInfo } from "../../types/userDeviceInfo";
2
2
  export type FeedbackRating = 1 | 2 | 3 | 4 | 5;
3
3
  export type FeedbackSource = "emoji-modal" | "detailed-feedback" | "help-bug-report";
4
4
  export type FeedbackAppRuntime = "phone-app" | "web-app";
5
+ export type FeedbackScreenshot = {
6
+ id: string;
7
+ fileName: string;
8
+ mimeType: string;
9
+ sizeBytes: number;
10
+ width: number;
11
+ height: number;
12
+ };
13
+ export type FeedbackScreenshotUpload = FeedbackScreenshot & {
14
+ dataUrl: string;
15
+ };
5
16
  export type FeedbackEnvironment = {
6
17
  appRuntime: FeedbackAppRuntime;
7
18
  isPhoneApp: boolean;
@@ -21,6 +32,7 @@ export type SubmitFeedbackInput = {
21
32
  context?: Record<string, unknown> | null;
22
33
  source: FeedbackSource;
23
34
  environment?: FeedbackEnvironment;
35
+ screenshots?: FeedbackScreenshotUpload[];
24
36
  };
25
37
  export type FeedbackRecord = {
26
38
  rating: FeedbackRating | null;
@@ -29,6 +41,7 @@ export type FeedbackRecord = {
29
41
  source: FeedbackSource;
30
42
  context: Record<string, unknown> | null;
31
43
  environment: FeedbackEnvironment;
44
+ screenshots: FeedbackScreenshot[];
32
45
  timestamp: string;
33
46
  text: string;
34
47
  };
@@ -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";
@@ -202,6 +203,9 @@ export function buildFeedbackText(record) {
202
203
  if (record.rating) {
203
204
  lines.push("Rating: ".concat(record.rating, "/5"));
204
205
  }
206
+ if (record.screenshots.length > 0) {
207
+ lines.push("Screenshots: ".concat(record.screenshots.length, " (view in Marty Web App Insights)"));
208
+ }
205
209
  lines.push("Email: ".concat(record.email || "Anonymous"));
206
210
  if (record.message) {
207
211
  lines.push("Message: ".concat(record.message));
@@ -209,7 +213,7 @@ export function buildFeedbackText(record) {
209
213
  return lines.join("\n");
210
214
  }
211
215
  export function createFeedbackRecord(input) {
212
- var _a, _b;
216
+ var _a, _b, _c;
213
217
  var normalizedMessage = normalizeOptionalString(input.message);
214
218
  var normalizedEmail = normalizeOptionalString(input.email);
215
219
  var timestamp = new Date().toISOString();
@@ -221,6 +225,14 @@ export function createFeedbackRecord(input) {
221
225
  source: input.source,
222
226
  context: input.context || null,
223
227
  environment: environment,
228
+ screenshots: ((_c = input.screenshots) !== null && _c !== void 0 ? _c : []).map(function (screenshot) { return ({
229
+ id: screenshot.id,
230
+ fileName: screenshot.fileName,
231
+ mimeType: screenshot.mimeType,
232
+ sizeBytes: screenshot.sizeBytes,
233
+ width: screenshot.width,
234
+ height: screenshot.height,
235
+ }); }),
224
236
  timestamp: timestamp,
225
237
  text: "",
226
238
  };
@@ -228,11 +240,12 @@ export function createFeedbackRecord(input) {
228
240
  return record;
229
241
  }
230
242
  export function submitFeedback(input) {
231
- var _a;
243
+ var _a, _b;
232
244
  return __awaiter(this, void 0, void 0, function () {
233
- var requiresRobotConnection, robotConnection, record, firebaseResponse, errorText, slackDelivered, slackResponse, errorText, error_1;
234
- return __generator(this, function (_b) {
235
- switch (_b.label) {
245
+ var requiresRobotConnection, robotConnection, record, feedbackId, firebaseUpdates, _i, _c, screenshot, firebaseResponse, slackDelivered, slackResponse, error_1;
246
+ var _d;
247
+ return __generator(this, function (_e) {
248
+ switch (_e.label) {
236
249
  case 0:
237
250
  requiresRobotConnection = isRobotConnectionRequiredForFeedbackSource(input.source);
238
251
  robotConnection = requiresRobotConnection
@@ -243,27 +256,32 @@ export function submitFeedback(input) {
243
256
  }
244
257
  record = createFeedbackRecord(__assign(__assign({}, input), { context: robotConnection
245
258
  ? __assign(__assign({}, ((_a = input.context) !== null && _a !== void 0 ? _a : {})), robotConnection) : input.context }));
246
- return [4 /*yield*/, fetch("".concat(WEB_APP_FEEDBACK_DB_URL).concat(randomHashGenerator(), ".json"), {
259
+ feedbackId = randomHashGenerator();
260
+ firebaseUpdates = (_d = {},
261
+ _d[feedbackId] = record,
262
+ _d);
263
+ for (_i = 0, _c = (_b = input.screenshots) !== null && _b !== void 0 ? _b : []; _i < _c.length; _i++) {
264
+ screenshot = _c[_i];
265
+ firebaseUpdates["~screenshots/".concat(feedbackId, "/").concat(screenshot.id)] = screenshot.dataUrl;
266
+ }
267
+ return [4 /*yield*/, fetch("".concat(WEB_APP_FEEDBACK_DB_URL, ".json?print=silent"), {
247
268
  method: "PATCH",
248
269
  headers: {
249
270
  Application: "application/json",
250
271
  "Content-Type": "application/json",
251
272
  },
252
- body: JSON.stringify(record),
273
+ body: JSON.stringify(firebaseUpdates),
253
274
  })];
254
275
  case 1:
255
- firebaseResponse = _b.sent();
256
- if (!!firebaseResponse.ok) return [3 /*break*/, 3];
257
- return [4 /*yield*/, firebaseResponse.text()];
258
- case 2:
259
- errorText = _b.sent();
260
- Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Firebase: ".concat(firebaseResponse.status, " ").concat(errorText));
261
- throw new Error("Failed to submit feedback");
262
- case 3:
276
+ firebaseResponse = _e.sent();
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
+ }
263
281
  slackDelivered = true;
264
- _b.label = 4;
265
- case 4:
266
- _b.trys.push([4, 8, , 9]);
282
+ _e.label = 2;
283
+ case 2:
284
+ _e.trys.push([2, 4, , 5]);
267
285
  return [4 /*yield*/, fetch(WEB_APP_FEEDBACK_SLACK_WEBHOOK_URL, {
268
286
  method: "POST",
269
287
  headers: {
@@ -271,20 +289,18 @@ export function submitFeedback(input) {
271
289
  },
272
290
  body: JSON.stringify({ text: record.text }),
273
291
  })];
274
- case 5:
275
- slackResponse = _b.sent();
276
- if (!!slackResponse.ok) return [3 /*break*/, 7];
277
- return [4 /*yield*/, slackResponse.text()];
278
- case 6:
279
- errorText = _b.sent();
280
- throw new Error("Failed Slack response: ".concat(slackResponse.status, " ").concat(errorText));
281
- case 7: return [3 /*break*/, 9];
282
- case 8:
283
- error_1 = _b.sent();
292
+ case 3:
293
+ slackResponse = _e.sent();
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:
299
+ error_1 = _e.sent();
284
300
  slackDelivered = false;
285
- Logger.error(SHOW_LOGS, TAG, "Failed to submit feedback to Slack", error_1);
286
- return [3 /*break*/, 9];
287
- 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*/, {
288
304
  record: record,
289
305
  slackDelivered: slackDelivered,
290
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*/];