@fluidframework/telemetry-utils 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.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.
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +23 -0
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -2
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/telemetry-utils.api.md +10 -33
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/error.d.ts +2 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +9 -9
- package/dist/error.js.map +1 -1
- package/dist/errorLogging.d.ts +4 -4
- package/dist/errorLogging.d.ts.map +1 -1
- package/dist/errorLogging.js +19 -60
- package/dist/errorLogging.js.map +1 -1
- package/dist/eventEmitterWithErrorHandling.d.ts +1 -1
- package/dist/eventEmitterWithErrorHandling.js +1 -1
- package/dist/eventEmitterWithErrorHandling.js.map +1 -1
- package/dist/events.d.ts +2 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/fluidErrorBase.d.ts +4 -3
- package/dist/fluidErrorBase.d.ts.map +1 -1
- package/dist/fluidErrorBase.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -60
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +7 -23
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +12 -29
- package/dist/logger.js.map +1 -1
- package/dist/mockLogger.d.ts +1 -1
- package/dist/mockLogger.d.ts.map +1 -1
- package/dist/mockLogger.js +2 -2
- package/dist/mockLogger.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/sampledTelemetryHelper.d.ts +4 -4
- package/dist/sampledTelemetryHelper.d.ts.map +1 -1
- package/dist/sampledTelemetryHelper.js +1 -1
- package/dist/sampledTelemetryHelper.js.map +1 -1
- package/dist/telemetry-utils-alpha.d.ts +4 -15
- package/dist/telemetry-utils-beta.d.ts +4 -32
- package/dist/telemetry-utils-public.d.ts +4 -32
- package/dist/telemetry-utils-untrimmed.d.ts +11 -50
- package/dist/thresholdCounter.d.ts +1 -1
- package/dist/thresholdCounter.d.ts.map +1 -1
- package/dist/thresholdCounter.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/utils.d.ts +1 -20
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -27
- package/dist/utils.js.map +1 -1
- package/lib/config.d.ts +2 -2
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +1 -1
- package/lib/config.js.map +1 -1
- package/lib/error.d.ts +2 -2
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +1 -1
- package/lib/error.js.map +1 -1
- package/lib/errorLogging.d.ts +4 -4
- package/lib/errorLogging.d.ts.map +1 -1
- package/lib/errorLogging.js +15 -56
- package/lib/errorLogging.js.map +1 -1
- package/lib/eventEmitterWithErrorHandling.d.ts +1 -1
- package/lib/eventEmitterWithErrorHandling.js +1 -1
- package/lib/eventEmitterWithErrorHandling.js.map +1 -1
- package/lib/events.d.ts +2 -3
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/fluidErrorBase.d.ts +4 -3
- package/lib/fluidErrorBase.d.ts.map +1 -1
- package/lib/fluidErrorBase.js.map +1 -1
- package/lib/index.d.ts +12 -12
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +11 -11
- package/lib/index.js.map +1 -1
- package/lib/logger.d.ts +7 -23
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +3 -19
- package/lib/logger.js.map +1 -1
- package/lib/mockLogger.d.ts +1 -1
- package/lib/mockLogger.d.ts.map +1 -1
- package/lib/mockLogger.js +1 -1
- package/lib/mockLogger.js.map +1 -1
- package/lib/sampledTelemetryHelper.d.ts +4 -4
- package/lib/sampledTelemetryHelper.d.ts.map +1 -1
- package/lib/sampledTelemetryHelper.js +1 -1
- package/lib/sampledTelemetryHelper.js.map +1 -1
- package/lib/{telemetry-utils-alpha.d.mts → telemetry-utils-alpha.d.ts} +4 -15
- package/lib/{telemetry-utils-beta.d.mts → telemetry-utils-beta.d.ts} +4 -32
- package/lib/{telemetry-utils-public.d.mts → telemetry-utils-public.d.ts} +4 -32
- package/lib/{telemetry-utils-untrimmed.d.mts → telemetry-utils-untrimmed.d.ts} +11 -50
- package/lib/test/EventEmitterWithErrorHandling.spec.js +86 -0
- package/lib/test/EventEmitterWithErrorHandling.spec.js.map +1 -0
- package/lib/test/childLogger.spec.js +233 -0
- package/lib/test/childLogger.spec.js.map +1 -0
- package/lib/test/config.spec.js +229 -0
- package/lib/test/config.spec.js.map +1 -0
- package/lib/test/error.spec.js +161 -0
- package/lib/test/error.spec.js.map +1 -0
- package/lib/test/errorLogging.spec.js +801 -0
- package/lib/test/errorLogging.spec.js.map +1 -0
- package/lib/test/errorTypeLoggingTest.spec.js +107 -0
- package/lib/test/errorTypeLoggingTest.spec.js.map +1 -0
- package/lib/test/mockLogger.spec.js +164 -0
- package/lib/test/mockLogger.spec.js.map +1 -0
- package/lib/test/multiSinkLogger.spec.js +84 -0
- package/lib/test/multiSinkLogger.spec.js.map +1 -0
- package/lib/test/performanceEvent.spec.js +86 -0
- package/lib/test/performanceEvent.spec.js.map +1 -0
- package/lib/test/sampledTelemetryHelper.spec.js +169 -0
- package/lib/test/sampledTelemetryHelper.spec.js.map +1 -0
- package/lib/test/telemetryLogger.spec.js +357 -0
- package/lib/test/telemetryLogger.spec.js.map +1 -0
- package/lib/test/thresholdCounter.spec.js +51 -0
- package/lib/test/thresholdCounter.spec.js.map +1 -0
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js +132 -0
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js.map +1 -0
- package/lib/test/utils.spec.js +284 -0
- package/lib/test/utils.spec.js.map +1 -0
- package/lib/thresholdCounter.d.ts +1 -1
- package/lib/thresholdCounter.d.ts.map +1 -1
- package/lib/thresholdCounter.js.map +1 -1
- package/lib/utils.d.ts +1 -20
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +1 -24
- package/lib/utils.js.map +1 -1
- package/package.json +75 -26
- package/src/config.ts +2 -2
- package/src/error.ts +2 -2
- package/src/errorLogging.ts +27 -68
- package/src/eventEmitterWithErrorHandling.ts +1 -1
- package/src/events.ts +2 -4
- package/src/fluidErrorBase.ts +4 -3
- package/src/index.ts +12 -13
- package/src/logger.ts +12 -28
- package/src/mockLogger.ts +2 -2
- package/src/sampledTelemetryHelper.ts +10 -11
- package/src/thresholdCounter.ts +1 -1
- package/src/utils.ts +3 -36
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -3
- package/tsconfig.esnext.json +0 -7
- /package/{.eslintrc.js → .eslintrc.cjs} +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "node:assert";
|
|
6
|
+
import { FluidErrorTypes } from "@fluidframework/core-interfaces";
|
|
7
|
+
import { DataCorruptionError, DataProcessingError } from "../error.js";
|
|
8
|
+
import { LoggingError, isILoggingError, normalizeError } from "../errorLogging.js";
|
|
9
|
+
describe("Errors", () => {
|
|
10
|
+
describe("DataProcessingError.create", () => {
|
|
11
|
+
it("Should yield a DataProcessingError", () => {
|
|
12
|
+
const dpe = DataProcessingError.create("Some message", "someCodepath", undefined, {
|
|
13
|
+
someProp: 1234,
|
|
14
|
+
});
|
|
15
|
+
assert(dpe instanceof DataProcessingError);
|
|
16
|
+
assert(dpe.errorType === FluidErrorTypes.dataProcessingError);
|
|
17
|
+
assert(dpe.message === "Some message");
|
|
18
|
+
assert(dpe.getTelemetryProperties().someProp === 1234);
|
|
19
|
+
assert(dpe.getTelemetryProperties().dataProcessingError === 1);
|
|
20
|
+
assert(dpe.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
21
|
+
assert(dpe.getTelemetryProperties().untrustedOrigin === 1);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("DataProcessingError coercion via DataProcessingError.wrapIfUnrecognized", () => {
|
|
25
|
+
it("Should preserve the stack", () => {
|
|
26
|
+
const originalError = new Error("Test error");
|
|
27
|
+
const testError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
28
|
+
assert(testError.stack === originalError.stack);
|
|
29
|
+
});
|
|
30
|
+
it("Should skip coercion for valid Fluid Error", () => {
|
|
31
|
+
const originalError = new DataCorruptionError("some message", {});
|
|
32
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
33
|
+
assert(coercedError === originalError);
|
|
34
|
+
assert(coercedError.errorType === FluidErrorTypes.dataCorruptionError);
|
|
35
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
36
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
37
|
+
});
|
|
38
|
+
it("Should skip coercion for LoggingError with errorType", () => {
|
|
39
|
+
const originalError = new LoggingError("Inherited error message", {
|
|
40
|
+
errorType: "Some error type",
|
|
41
|
+
otherProperty: "some safe-to-log property",
|
|
42
|
+
});
|
|
43
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
44
|
+
assert(coercedError === originalError);
|
|
45
|
+
assert(coercedError.errorType === "Some error type");
|
|
46
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
47
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
48
|
+
});
|
|
49
|
+
it("Should coerce normalized external error", () => {
|
|
50
|
+
const originalError = normalizeError("boo");
|
|
51
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
52
|
+
assert(coercedError !== originalError);
|
|
53
|
+
assert(coercedError instanceof DataProcessingError);
|
|
54
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
55
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
56
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
57
|
+
assert(coercedError.getTelemetryProperties().untrustedOrigin === 1);
|
|
58
|
+
});
|
|
59
|
+
it("Should coerce external error object even with errorType", () => {
|
|
60
|
+
const originalError = {
|
|
61
|
+
errorType: "Some error type",
|
|
62
|
+
};
|
|
63
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
64
|
+
assert(coercedError !== originalError);
|
|
65
|
+
assert(coercedError instanceof DataProcessingError);
|
|
66
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
67
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
68
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
69
|
+
assert(coercedError.getTelemetryProperties().untrustedOrigin === 1);
|
|
70
|
+
assert(coercedError.message === "[object Object]");
|
|
71
|
+
});
|
|
72
|
+
it("Should coerce LoggingError missing errorType", () => {
|
|
73
|
+
const originalError = new LoggingError("Inherited error message", {
|
|
74
|
+
otherProperty: "some safe-to-log property",
|
|
75
|
+
});
|
|
76
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
77
|
+
assert(coercedError !== originalError);
|
|
78
|
+
assert(coercedError instanceof DataProcessingError);
|
|
79
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
80
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
81
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
82
|
+
assert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);
|
|
83
|
+
assert(coercedError.message === "Inherited error message");
|
|
84
|
+
assert(coercedError.getTelemetryProperties().otherProperty === "some safe-to-log property", "telemetryProps should be copied when wrapping");
|
|
85
|
+
});
|
|
86
|
+
it("Should coerce Normalized LoggingError with errorType", () => {
|
|
87
|
+
const originalError = new LoggingError("Inherited error message", {
|
|
88
|
+
otherProperty: "some safe-to-log property",
|
|
89
|
+
});
|
|
90
|
+
const normalizedLoggingError = normalizeError(originalError);
|
|
91
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(normalizedLoggingError, "someCodepath", undefined);
|
|
92
|
+
assert(coercedError !== originalError);
|
|
93
|
+
assert(coercedError instanceof DataProcessingError);
|
|
94
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
95
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
96
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
97
|
+
assert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);
|
|
98
|
+
assert(coercedError.message === "Inherited error message");
|
|
99
|
+
assert(coercedError.getTelemetryProperties().otherProperty === "some safe-to-log property", "telemetryProps should be copied when wrapping");
|
|
100
|
+
});
|
|
101
|
+
it("Should not fail coercing malformed inputs", () => {
|
|
102
|
+
const originalMalformations = [
|
|
103
|
+
// eslint-disable-next-line unicorn/no-null
|
|
104
|
+
null,
|
|
105
|
+
undefined,
|
|
106
|
+
false,
|
|
107
|
+
true,
|
|
108
|
+
3.14,
|
|
109
|
+
Symbol("Unique"),
|
|
110
|
+
() => { },
|
|
111
|
+
[],
|
|
112
|
+
[1, 2, 3],
|
|
113
|
+
];
|
|
114
|
+
const coercedErrors = originalMalformations.map((value) => DataProcessingError.wrapIfUnrecognized(value, "someCodepath", undefined));
|
|
115
|
+
assert(coercedErrors.every((error) => typeof error.message === "string" &&
|
|
116
|
+
error.errorType === FluidErrorTypes.dataProcessingError &&
|
|
117
|
+
error.getTelemetryProperties().dataProcessingError === 1 &&
|
|
118
|
+
error.getTelemetryProperties().dataProcessingCodepath === "someCodepath" &&
|
|
119
|
+
error.getTelemetryProperties().untrustedOrigin === 1));
|
|
120
|
+
assert(!originalMalformations.some((value) => typeof value === "string" ||
|
|
121
|
+
(typeof value === "object" && !Array.isArray(value) && value !== null)), "Neither strings nor objects are considered malformed");
|
|
122
|
+
});
|
|
123
|
+
it("Should be coercible from a string message", () => {
|
|
124
|
+
const originalMessage = "Example of some thrown string";
|
|
125
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalMessage, "someCodepath", undefined);
|
|
126
|
+
assert(coercedError.message === originalMessage);
|
|
127
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
128
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
129
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
130
|
+
});
|
|
131
|
+
it("Should be coercible from a property object (no errorType)", () => {
|
|
132
|
+
const originalError = {
|
|
133
|
+
message: "Inherited error message",
|
|
134
|
+
};
|
|
135
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", undefined);
|
|
136
|
+
assert(coercedError.message === originalError.message);
|
|
137
|
+
assert(coercedError.errorType === FluidErrorTypes.dataProcessingError);
|
|
138
|
+
assert(coercedError.getTelemetryProperties().dataProcessingError === 1);
|
|
139
|
+
assert(coercedError.getTelemetryProperties().dataProcessingCodepath === "someCodepath");
|
|
140
|
+
});
|
|
141
|
+
it("op props should be logged when coerced", () => {
|
|
142
|
+
const originalError = {
|
|
143
|
+
message: "Inherited error message",
|
|
144
|
+
};
|
|
145
|
+
const op = { sequenceNumber: 42 };
|
|
146
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", op);
|
|
147
|
+
assert(isILoggingError(coercedError));
|
|
148
|
+
assert(coercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber);
|
|
149
|
+
});
|
|
150
|
+
it("op props should be logged even when not coerced", () => {
|
|
151
|
+
const originalError = {
|
|
152
|
+
errorType: "hello",
|
|
153
|
+
};
|
|
154
|
+
const op = { sequenceNumber: 42 };
|
|
155
|
+
const coercedError = DataProcessingError.wrapIfUnrecognized(originalError, "someCodepath", op);
|
|
156
|
+
assert(isILoggingError(coercedError));
|
|
157
|
+
assert(coercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=error.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.spec.js","sourceRoot":"","sources":["../../src/test/error.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces\";\n\nimport { DataCorruptionError, DataProcessingError } from \"../error.js\";\nimport { LoggingError, isILoggingError, normalizeError } from \"../errorLogging.js\";\n\ndescribe(\"Errors\", () => {\n\tdescribe(\"DataProcessingError.create\", () => {\n\t\tit(\"Should yield a DataProcessingError\", () => {\n\t\t\tconst dpe = DataProcessingError.create(\"Some message\", \"someCodepath\", undefined, {\n\t\t\t\tsomeProp: 1234,\n\t\t\t});\n\t\t\tassert(dpe instanceof DataProcessingError);\n\t\t\tassert(dpe.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(dpe.message === \"Some message\");\n\t\t\tassert(dpe.getTelemetryProperties().someProp === 1234);\n\t\t\tassert(dpe.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(dpe.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(dpe.getTelemetryProperties().untrustedOrigin === 1);\n\t\t});\n\t});\n\tdescribe(\"DataProcessingError coercion via DataProcessingError.wrapIfUnrecognized\", () => {\n\t\tit(\"Should preserve the stack\", () => {\n\t\t\tconst originalError = new Error(\"Test error\");\n\t\t\tconst testError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(testError.stack === originalError.stack);\n\t\t});\n\t\tit(\"Should skip coercion for valid Fluid Error\", () => {\n\t\t\tconst originalError = new DataCorruptionError(\"some message\", {});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) === originalError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataCorruptionError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\t\tit(\"Should skip coercion for LoggingError with errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\terrorType: \"Some error type\",\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) === originalError);\n\t\t\tassert(coercedError.errorType === \"Some error type\");\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\t\tit(\"Should coerce normalized external error\", () => {\n\t\t\tconst originalError = normalizeError(\"boo\");\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === 1);\n\t\t});\n\t\tit(\"Should coerce external error object even with errorType\", () => {\n\t\t\tconst originalError = {\n\t\t\t\terrorType: \"Some error type\",\n\t\t\t};\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === 1);\n\t\t\tassert(coercedError.message === \"[object Object]\");\n\t\t});\n\t\tit(\"Should coerce LoggingError missing errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);\n\t\t\tassert(coercedError.message === \"Inherited error message\");\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().otherProperty === \"some safe-to-log property\",\n\t\t\t\t\"telemetryProps should be copied when wrapping\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should coerce Normalized LoggingError with errorType\", () => {\n\t\t\tconst originalError = new LoggingError(\"Inherited error message\", {\n\t\t\t\totherProperty: \"some safe-to-log property\",\n\t\t\t});\n\t\t\tconst normalizedLoggingError = normalizeError(originalError);\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\tnormalizedLoggingError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert((coercedError as unknown) !== originalError);\n\t\t\tassert(coercedError instanceof DataProcessingError);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t\tassert(coercedError.getTelemetryProperties().untrustedOrigin === undefined);\n\t\t\tassert(coercedError.message === \"Inherited error message\");\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().otherProperty === \"some safe-to-log property\",\n\t\t\t\t\"telemetryProps should be copied when wrapping\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should not fail coercing malformed inputs\", () => {\n\t\t\tconst originalMalformations = [\n\t\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\t\tnull,\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t\t3.14,\n\t\t\t\tSymbol(\"Unique\"),\n\t\t\t\t(): void => {},\n\t\t\t\t[],\n\t\t\t\t[1, 2, 3],\n\t\t\t];\n\t\t\tconst coercedErrors = originalMalformations.map((value) =>\n\t\t\t\tDataProcessingError.wrapIfUnrecognized(value, \"someCodepath\", undefined),\n\t\t\t);\n\n\t\t\tassert(\n\t\t\t\tcoercedErrors.every(\n\t\t\t\t\t(error) =>\n\t\t\t\t\t\ttypeof error.message === \"string\" &&\n\t\t\t\t\t\terror.errorType === FluidErrorTypes.dataProcessingError &&\n\t\t\t\t\t\terror.getTelemetryProperties().dataProcessingError === 1 &&\n\t\t\t\t\t\terror.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\" &&\n\t\t\t\t\t\terror.getTelemetryProperties().untrustedOrigin === 1,\n\t\t\t\t),\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!originalMalformations.some(\n\t\t\t\t\t(value) =>\n\t\t\t\t\t\ttypeof value === \"string\" ||\n\t\t\t\t\t\t(typeof value === \"object\" && !Array.isArray(value) && value !== null),\n\t\t\t\t),\n\t\t\t\t\"Neither strings nor objects are considered malformed\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should be coercible from a string message\", () => {\n\t\t\tconst originalMessage = \"Example of some thrown string\";\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalMessage,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(coercedError.message === originalMessage);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\n\t\tit(\"Should be coercible from a property object (no errorType)\", () => {\n\t\t\tconst originalError = {\n\t\t\t\tmessage: \"Inherited error message\",\n\t\t\t};\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tassert(coercedError.message === originalError.message);\n\t\t\tassert(coercedError.errorType === FluidErrorTypes.dataProcessingError);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingError === 1);\n\t\t\tassert(coercedError.getTelemetryProperties().dataProcessingCodepath === \"someCodepath\");\n\t\t});\n\n\t\tit(\"op props should be logged when coerced\", () => {\n\t\t\tconst originalError = {\n\t\t\t\tmessage: \"Inherited error message\",\n\t\t\t};\n\t\t\tconst op = { sequenceNumber: 42 };\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\top,\n\t\t\t);\n\n\t\t\tassert(isILoggingError(coercedError));\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber,\n\t\t\t);\n\t\t});\n\n\t\tit(\"op props should be logged even when not coerced\", () => {\n\t\t\tconst originalError = {\n\t\t\t\terrorType: \"hello\",\n\t\t\t};\n\t\t\tconst op = { sequenceNumber: 42 };\n\t\t\tconst coercedError = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\toriginalError,\n\t\t\t\t\"someCodepath\",\n\t\t\t\top,\n\t\t\t);\n\n\t\t\tassert(isILoggingError(coercedError));\n\t\t\tassert(\n\t\t\t\tcoercedError.getTelemetryProperties().messageSequenceNumber === op.sequenceNumber,\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|