@fluidframework/telemetry-utils 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.253463
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/api-report/telemetry-utils.api.md +5 -5
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/error.d.ts +4 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +5 -5
- package/dist/error.js.map +1 -1
- package/dist/errorLogging.d.ts +3 -2
- package/dist/errorLogging.d.ts.map +1 -1
- package/dist/errorLogging.js.map +1 -1
- package/dist/eventEmitterWithErrorHandling.d.ts +1 -1
- package/dist/eventEmitterWithErrorHandling.d.ts.map +1 -1
- package/dist/eventEmitterWithErrorHandling.js.map +1 -1
- package/dist/events.d.ts +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/fluidErrorBase.d.ts.map +1 -1
- package/dist/fluidErrorBase.js.map +1 -1
- package/dist/logger.d.ts +2 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +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/sampledTelemetryHelper.d.ts +2 -2
- package/dist/sampledTelemetryHelper.d.ts.map +1 -1
- package/dist/sampledTelemetryHelper.js.map +1 -1
- package/dist/telemetry-utils-alpha.d.ts +4 -4
- package/dist/telemetry-utils-beta.d.ts +4 -4
- package/dist/telemetry-utils-public.d.ts +4 -4
- package/dist/telemetry-utils-untrimmed.d.ts +5 -5
- package/dist/utils.d.ts.map +1 -1
- 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 +4 -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 +3 -2
- package/lib/errorLogging.d.ts.map +1 -1
- package/lib/errorLogging.js.map +1 -1
- package/lib/eventEmitterWithErrorHandling.d.ts +1 -1
- package/lib/eventEmitterWithErrorHandling.d.ts.map +1 -1
- package/lib/eventEmitterWithErrorHandling.js.map +1 -1
- package/lib/events.d.ts +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/fluidErrorBase.d.ts.map +1 -1
- package/lib/fluidErrorBase.js.map +1 -1
- package/lib/logger.d.ts +2 -2
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +2 -2
- package/lib/logger.js.map +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 +2 -2
- package/lib/sampledTelemetryHelper.d.ts.map +1 -1
- package/lib/sampledTelemetryHelper.js.map +1 -1
- package/lib/telemetry-utils-alpha.d.ts +4 -4
- package/lib/telemetry-utils-beta.d.ts +4 -4
- package/lib/telemetry-utils-public.d.ts +4 -4
- package/lib/telemetry-utils-untrimmed.d.ts +5 -5
- package/lib/tsdoc-metadata.json +11 -0
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +12 -21
- package/src/config.ts +4 -3
- package/src/error.ts +4 -4
- package/src/errorLogging.ts +6 -8
- package/src/eventEmitterWithErrorHandling.ts +1 -1
- package/src/events.ts +2 -1
- package/src/fluidErrorBase.ts +1 -0
- package/src/logger.ts +7 -6
- package/src/mockLogger.ts +3 -2
- package/src/sampledTelemetryHelper.ts +3 -2
- package/src/utils.ts +1 -0
- package/lib/test/EventEmitterWithErrorHandling.spec.js +0 -86
- package/lib/test/EventEmitterWithErrorHandling.spec.js.map +0 -1
- package/lib/test/childLogger.spec.js +0 -233
- package/lib/test/childLogger.spec.js.map +0 -1
- package/lib/test/config.spec.js +0 -229
- package/lib/test/config.spec.js.map +0 -1
- package/lib/test/error.spec.js +0 -161
- package/lib/test/error.spec.js.map +0 -1
- package/lib/test/errorLogging.spec.js +0 -801
- package/lib/test/errorLogging.spec.js.map +0 -1
- package/lib/test/errorTypeLoggingTest.spec.js +0 -107
- package/lib/test/errorTypeLoggingTest.spec.js.map +0 -1
- package/lib/test/mockLogger.spec.js +0 -164
- package/lib/test/mockLogger.spec.js.map +0 -1
- package/lib/test/multiSinkLogger.spec.js +0 -84
- package/lib/test/multiSinkLogger.spec.js.map +0 -1
- package/lib/test/performanceEvent.spec.js +0 -86
- package/lib/test/performanceEvent.spec.js.map +0 -1
- package/lib/test/sampledTelemetryHelper.spec.js +0 -169
- package/lib/test/sampledTelemetryHelper.spec.js.map +0 -1
- package/lib/test/telemetryLogger.spec.js +0 -357
- package/lib/test/telemetryLogger.spec.js.map +0 -1
- package/lib/test/thresholdCounter.spec.js +0 -51
- package/lib/test/thresholdCounter.spec.js.map +0 -1
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js +0 -132
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js.map +0 -1
- package/lib/test/utils.spec.js +0 -284
- package/lib/test/utils.spec.js.map +0 -1
package/src/config.ts
CHANGED
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
ITelemetryBaseLogger,
|
|
8
|
-
IConfigProviderBase,
|
|
9
7
|
ConfigTypes,
|
|
8
|
+
IConfigProviderBase,
|
|
9
|
+
ITelemetryBaseLogger,
|
|
10
10
|
} from "@fluidframework/core-interfaces";
|
|
11
|
-
import { Lazy } from "@fluidframework/core-utils";
|
|
11
|
+
import { Lazy } from "@fluidframework/core-utils/internal";
|
|
12
|
+
|
|
12
13
|
import { createChildLogger, tagCodeArtifacts } from "./logger.js";
|
|
13
14
|
import { ITelemetryLoggerExt } from "./telemetryTypes.js";
|
|
14
15
|
|
package/src/error.ts
CHANGED
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { IErrorBase, ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
|
|
6
7
|
import {
|
|
7
8
|
FluidErrorTypes,
|
|
8
9
|
IGenericError,
|
|
9
|
-
IErrorBase,
|
|
10
|
-
ITelemetryBaseProperties,
|
|
11
10
|
IUsageError,
|
|
12
|
-
} from "@fluidframework/core-interfaces";
|
|
11
|
+
} from "@fluidframework/core-interfaces/internal";
|
|
13
12
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
14
13
|
|
|
15
14
|
import {
|
|
@@ -20,6 +19,7 @@ import {
|
|
|
20
19
|
wrapError,
|
|
21
20
|
} from "./errorLogging.js";
|
|
22
21
|
import { IFluidErrorBase } from "./fluidErrorBase.js";
|
|
22
|
+
import { ITelemetryPropertiesExt } from "./telemetryTypes.js";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Throws a UsageError with the given message if the condition is not met.
|
|
@@ -124,7 +124,7 @@ export class DataProcessingError extends LoggingError implements IErrorBase, IFl
|
|
|
124
124
|
errorMessage: string,
|
|
125
125
|
dataProcessingCodepath: string,
|
|
126
126
|
sequencedMessage?: ISequencedDocumentMessage,
|
|
127
|
-
props:
|
|
127
|
+
props: ITelemetryPropertiesExt = {},
|
|
128
128
|
): IFluidErrorBase {
|
|
129
129
|
const dataProcessingError = DataProcessingError.wrapIfUnrecognized(
|
|
130
130
|
errorMessage,
|
package/src/errorLogging.ts
CHANGED
|
@@ -3,24 +3,22 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type {
|
|
7
|
-
|
|
8
|
-
ITelemetryBaseProperties,
|
|
9
|
-
Tagged,
|
|
10
|
-
} from "@fluidframework/core-interfaces";
|
|
6
|
+
import type { ITelemetryBaseProperties, Tagged } from "@fluidframework/core-interfaces";
|
|
7
|
+
import type { ILoggingError } from "@fluidframework/core-interfaces/internal";
|
|
11
8
|
import { v4 as uuid } from "uuid";
|
|
9
|
+
|
|
12
10
|
import {
|
|
13
|
-
hasErrorInstanceId,
|
|
14
11
|
IFluidErrorBase,
|
|
12
|
+
hasErrorInstanceId,
|
|
15
13
|
isFluidError,
|
|
16
14
|
isValidLegacyError,
|
|
17
15
|
} from "./fluidErrorBase.js";
|
|
16
|
+
import { convertToBasePropertyType } from "./logger.js";
|
|
18
17
|
import type {
|
|
19
18
|
ITelemetryLoggerExt,
|
|
20
|
-
TelemetryEventPropertyTypeExt,
|
|
21
19
|
ITelemetryPropertiesExt,
|
|
20
|
+
TelemetryEventPropertyTypeExt,
|
|
22
21
|
} from "./telemetryTypes.js";
|
|
23
|
-
import { convertToBasePropertyType } from "./logger.js";
|
|
24
22
|
|
|
25
23
|
/**
|
|
26
24
|
* Determines if the provided value is an object but neither null nor an array.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { EventEmitterEventType, TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
7
|
import { IEvent } from "@fluidframework/core-interfaces";
|
|
8
8
|
|
|
9
9
|
/**
|
package/src/events.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { EventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import type { ITelemetryLoggerExt } from "./telemetryTypes.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Note: The contents of this file really don't belong in this package, as they are only intended for internal use.
|
package/src/fluidErrorBase.ts
CHANGED
package/src/logger.ts
CHANGED
|
@@ -3,35 +3,36 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { IsomorphicPerformance, performance } from "@fluid-internal/client-utils";
|
|
6
7
|
import {
|
|
7
8
|
ITelemetryBaseEvent,
|
|
8
9
|
ITelemetryBaseLogger,
|
|
10
|
+
ITelemetryBaseProperties,
|
|
9
11
|
LogLevel,
|
|
10
12
|
Tagged,
|
|
11
|
-
ITelemetryBaseProperties,
|
|
12
13
|
TelemetryBaseEventPropertyType,
|
|
13
14
|
} from "@fluidframework/core-interfaces";
|
|
14
|
-
|
|
15
|
+
|
|
15
16
|
import {
|
|
16
17
|
CachedConfigProvider,
|
|
17
18
|
loggerIsMonitoringContext,
|
|
18
19
|
mixinMonitoringContext,
|
|
19
20
|
} from "./config.js";
|
|
20
21
|
import {
|
|
21
|
-
isILoggingError,
|
|
22
22
|
extractLogSafeErrorProperties,
|
|
23
23
|
generateStack,
|
|
24
|
+
isILoggingError,
|
|
24
25
|
isTaggedTelemetryPropertyValue,
|
|
25
26
|
} from "./errorLogging.js";
|
|
26
27
|
import {
|
|
28
|
+
type ITelemetryErrorEventExt,
|
|
27
29
|
ITelemetryEventExt,
|
|
28
30
|
ITelemetryGenericEventExt,
|
|
29
31
|
ITelemetryLoggerExt,
|
|
30
32
|
ITelemetryPerformanceEventExt,
|
|
31
|
-
TelemetryEventPropertyTypeExt,
|
|
32
|
-
TelemetryEventCategory,
|
|
33
33
|
ITelemetryPropertiesExt,
|
|
34
|
-
|
|
34
|
+
TelemetryEventCategory,
|
|
35
|
+
TelemetryEventPropertyTypeExt,
|
|
35
36
|
} from "./telemetryTypes.js";
|
|
36
37
|
|
|
37
38
|
export interface Memory {
|
package/src/mockLogger.ts
CHANGED
|
@@ -8,9 +8,10 @@ import {
|
|
|
8
8
|
ITelemetryBaseLogger,
|
|
9
9
|
LogLevel,
|
|
10
10
|
} from "@fluidframework/core-interfaces";
|
|
11
|
-
import { assert } from "@fluidframework/core-utils";
|
|
12
|
-
|
|
11
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
12
|
+
|
|
13
13
|
import { createChildLogger } from "./logger.js";
|
|
14
|
+
import { ITelemetryLoggerExt, ITelemetryPropertiesExt } from "./telemetryTypes.js";
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* The MockLogger records events sent to it, and then can walk back over those events
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { ITelemetryBaseProperties, IDisposable } from "@fluidframework/core-interfaces";
|
|
7
6
|
import { performance } from "@fluid-internal/client-utils";
|
|
7
|
+
import type { IDisposable, ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
|
|
8
|
+
|
|
8
9
|
import {
|
|
9
|
-
ITelemetryLoggerExt,
|
|
10
10
|
type ITelemetryGenericEventExt,
|
|
11
|
+
ITelemetryLoggerExt,
|
|
11
12
|
type ITelemetryPerformanceEventExt,
|
|
12
13
|
} from "./telemetryTypes.js";
|
|
13
14
|
|
package/src/utils.ts
CHANGED
|
@@ -1,86 +0,0 @@
|
|
|
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 { EventEmitterWithErrorHandling } from "../eventEmitterWithErrorHandling.js";
|
|
7
|
-
describe("EventEmitterWithErrorHandling", () => {
|
|
8
|
-
let errorHandlerCalled = false;
|
|
9
|
-
function defaultErrorHandler(event, error) {
|
|
10
|
-
errorHandlerCalled = true;
|
|
11
|
-
throw error;
|
|
12
|
-
}
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
errorHandlerCalled = false;
|
|
15
|
-
});
|
|
16
|
-
it("forwards events", () => {
|
|
17
|
-
const emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);
|
|
18
|
-
let passedArg;
|
|
19
|
-
emitter.on("foo", (arg) => {
|
|
20
|
-
passedArg = arg;
|
|
21
|
-
});
|
|
22
|
-
emitter.emit("foo", 3);
|
|
23
|
-
assert.strictEqual(passedArg, 3);
|
|
24
|
-
assert.strictEqual(errorHandlerCalled, false);
|
|
25
|
-
});
|
|
26
|
-
it("forwards error event", () => {
|
|
27
|
-
const emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);
|
|
28
|
-
let passedArg;
|
|
29
|
-
emitter.on("error", (arg) => {
|
|
30
|
-
passedArg = arg;
|
|
31
|
-
});
|
|
32
|
-
emitter.emit("error", 3);
|
|
33
|
-
assert.strictEqual(passedArg, 3);
|
|
34
|
-
assert.strictEqual(errorHandlerCalled, false);
|
|
35
|
-
});
|
|
36
|
-
it("error thrown from listener is handled, some other listeners succeed", () => {
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
-
const emitter = new EventEmitterWithErrorHandling((event, error) => {
|
|
39
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
40
|
-
passedErrorMsg = error.message;
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
42
|
-
passedEventArg = error.eventArg;
|
|
43
|
-
});
|
|
44
|
-
let passedErrorMsg;
|
|
45
|
-
let passedEventArg;
|
|
46
|
-
let earlyListenerCallCount = 0;
|
|
47
|
-
let lateListenerCallCount = 0;
|
|
48
|
-
// Innocent bystander - early (registered before throwing one)
|
|
49
|
-
emitter.on("foo", (_arg) => {
|
|
50
|
-
++earlyListenerCallCount;
|
|
51
|
-
});
|
|
52
|
-
// The delinquent
|
|
53
|
-
emitter.on("foo", (arg) => {
|
|
54
|
-
const error = new Error("foo listener throws");
|
|
55
|
-
Object.assign(error, { eventArg: arg });
|
|
56
|
-
throw error;
|
|
57
|
-
});
|
|
58
|
-
// Innocent bystander - late (registered after throwing one)
|
|
59
|
-
emitter.on("foo", (_arg) => {
|
|
60
|
-
++lateListenerCallCount;
|
|
61
|
-
});
|
|
62
|
-
emitter.emit("foo", 3); // listener above will throw. Expect error listener to be invoked
|
|
63
|
-
assert.strictEqual(passedErrorMsg, "foo listener throws");
|
|
64
|
-
assert.strictEqual(passedEventArg, 3);
|
|
65
|
-
assert.strictEqual(earlyListenerCallCount, 1);
|
|
66
|
-
assert.strictEqual(lateListenerCallCount, 0);
|
|
67
|
-
});
|
|
68
|
-
it("emitting error event when unhandled will invoke handler", () => {
|
|
69
|
-
const emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);
|
|
70
|
-
try {
|
|
71
|
-
const error = new Error("No one is listening");
|
|
72
|
-
Object.assign(error, { prop: 4 });
|
|
73
|
-
emitter.emit("error", error, 3); // the extra args (e.g. 3 here) are dropped
|
|
74
|
-
assert.fail("previous line should throw");
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
79
|
-
assert.strictEqual(error.message, "No one is listening");
|
|
80
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
81
|
-
assert.strictEqual(error.prop, 4);
|
|
82
|
-
assert.strictEqual(errorHandlerCalled, true);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
//# sourceMappingURL=EventEmitterWithErrorHandling.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventEmitterWithErrorHandling.spec.js","sourceRoot":"","sources":["../../src/test/EventEmitterWithErrorHandling.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\";\nimport { EventEmitterWithErrorHandling } from \"../eventEmitterWithErrorHandling.js\";\n\ndescribe(\"EventEmitterWithErrorHandling\", () => {\n\tlet errorHandlerCalled = false;\n\tfunction defaultErrorHandler(event, error): void {\n\t\terrorHandlerCalled = true;\n\t\tthrow error;\n\t}\n\n\tbeforeEach(() => {\n\t\terrorHandlerCalled = false;\n\t});\n\n\tit(\"forwards events\", () => {\n\t\tconst emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);\n\t\tlet passedArg: number | undefined;\n\t\temitter.on(\"foo\", (arg: number) => {\n\t\t\tpassedArg = arg;\n\t\t});\n\n\t\temitter.emit(\"foo\", 3);\n\t\tassert.strictEqual(passedArg, 3);\n\t\tassert.strictEqual(errorHandlerCalled, false);\n\t});\n\tit(\"forwards error event\", () => {\n\t\tconst emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);\n\t\tlet passedArg: number | undefined;\n\t\temitter.on(\"error\", (arg: number) => {\n\t\t\tpassedArg = arg;\n\t\t});\n\n\t\temitter.emit(\"error\", 3);\n\t\tassert.strictEqual(passedArg, 3);\n\t\tassert.strictEqual(errorHandlerCalled, false);\n\t});\n\tit(\"error thrown from listener is handled, some other listeners succeed\", () => {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\tconst emitter = new EventEmitterWithErrorHandling((event, error: any) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tpassedErrorMsg = error.message;\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\t\tpassedEventArg = error.eventArg;\n\t\t});\n\t\tlet passedErrorMsg: string | undefined;\n\t\tlet passedEventArg: number | undefined;\n\t\tlet earlyListenerCallCount: number = 0;\n\t\tlet lateListenerCallCount: number = 0;\n\t\t// Innocent bystander - early (registered before throwing one)\n\t\temitter.on(\"foo\", (_arg: unknown) => {\n\t\t\t++earlyListenerCallCount;\n\t\t});\n\t\t// The delinquent\n\t\temitter.on(\"foo\", (arg: unknown) => {\n\t\t\tconst error = new Error(\"foo listener throws\");\n\t\t\tObject.assign(error, { eventArg: arg });\n\t\t\tthrow error;\n\t\t});\n\t\t// Innocent bystander - late (registered after throwing one)\n\t\temitter.on(\"foo\", (_arg) => {\n\t\t\t++lateListenerCallCount;\n\t\t});\n\n\t\temitter.emit(\"foo\", 3); // listener above will throw. Expect error listener to be invoked\n\t\tassert.strictEqual(passedErrorMsg, \"foo listener throws\");\n\t\tassert.strictEqual(passedEventArg, 3);\n\t\tassert.strictEqual(earlyListenerCallCount, 1);\n\t\tassert.strictEqual(lateListenerCallCount, 0);\n\t});\n\tit(\"emitting error event when unhandled will invoke handler\", () => {\n\t\tconst emitter = new EventEmitterWithErrorHandling(defaultErrorHandler);\n\t\ttry {\n\t\t\tconst error = new Error(\"No one is listening\");\n\t\t\tObject.assign(error, { prop: 4 });\n\t\t\temitter.emit(\"error\", error, 3); // the extra args (e.g. 3 here) are dropped\n\t\t\tassert.fail(\"previous line should throw\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t} catch (error: any) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert.strictEqual(error.message, \"No one is listening\");\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t\tassert.strictEqual(error.prop, 4);\n\t\t\tassert.strictEqual(errorHandlerCalled, true);\n\t\t}\n\t});\n});\n"]}
|
|
@@ -1,233 +0,0 @@
|
|
|
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 { LogLevel, } from "@fluidframework/core-interfaces";
|
|
7
|
-
import { ChildLogger, createChildLogger, createMultiSinkLogger } from "../logger.js";
|
|
8
|
-
import { MockLogger } from "../mockLogger.js";
|
|
9
|
-
describe("ChildLogger", () => {
|
|
10
|
-
it("Properties & Getters Propagate", () => {
|
|
11
|
-
let sent = false;
|
|
12
|
-
const logger = {
|
|
13
|
-
send(event) {
|
|
14
|
-
if (event.testProperty !== true || event.testGetter !== true) {
|
|
15
|
-
throw new Error("expected testProperty and testGetter on event");
|
|
16
|
-
}
|
|
17
|
-
sent = true;
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
const childLogger1 = ChildLogger.create(logger, "test1", {
|
|
21
|
-
all: {
|
|
22
|
-
testProperty: true,
|
|
23
|
-
testGetter: () => true,
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
childLogger1.send({ category: "generic", eventName: "test1" });
|
|
27
|
-
assert(sent, "event should be sent");
|
|
28
|
-
sent = false;
|
|
29
|
-
const childLogger2 = createChildLogger({ logger: childLogger1, namespace: "test2" });
|
|
30
|
-
childLogger2.send({ category: "generic", eventName: "test2" });
|
|
31
|
-
assert(sent, "event should be sent");
|
|
32
|
-
});
|
|
33
|
-
it("Undefined initial Properties and Getter", () => {
|
|
34
|
-
let sent = false;
|
|
35
|
-
const logger = {
|
|
36
|
-
send(event) {
|
|
37
|
-
if (event.testProperty !== true || event.testGetter !== true) {
|
|
38
|
-
throw new Error("expected testProperty and testGetter on event");
|
|
39
|
-
}
|
|
40
|
-
if (event.eventName !== "test1:test2:testEvent") {
|
|
41
|
-
throw new Error("expected combined namespace");
|
|
42
|
-
}
|
|
43
|
-
sent = true;
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
const childLogger1 = createChildLogger({ logger, namespace: "test1" });
|
|
47
|
-
sent = false;
|
|
48
|
-
const childLogger2 = ChildLogger.create(childLogger1, "test2", {
|
|
49
|
-
all: {
|
|
50
|
-
testProperty: true,
|
|
51
|
-
testGetter: () => true,
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
55
|
-
assert(sent, "event should be sent");
|
|
56
|
-
});
|
|
57
|
-
it("Properties Are Combined", () => {
|
|
58
|
-
let sent = false;
|
|
59
|
-
const logger = {
|
|
60
|
-
send(event) {
|
|
61
|
-
if (event.testProperty1 !== true || event.testProperty2 !== true) {
|
|
62
|
-
throw new Error("expected testProperty1 and testProperty2 on event");
|
|
63
|
-
}
|
|
64
|
-
if (event.eventName !== "test1:test2:testEvent") {
|
|
65
|
-
throw new Error("expected combined namespace");
|
|
66
|
-
}
|
|
67
|
-
sent = true;
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
const childLogger1 = ChildLogger.create(logger, "test1", {
|
|
71
|
-
all: {
|
|
72
|
-
testProperty1: true,
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
const childLogger2 = ChildLogger.create(childLogger1, "test2", {
|
|
76
|
-
all: {
|
|
77
|
-
testProperty2: true,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
81
|
-
assert(sent, "event should be sent");
|
|
82
|
-
});
|
|
83
|
-
it("Getters Are Combined", () => {
|
|
84
|
-
let sent = false;
|
|
85
|
-
const logger = {
|
|
86
|
-
send(event) {
|
|
87
|
-
if (event.testGetter1 !== true || event.testGetter2 !== true) {
|
|
88
|
-
throw new Error("expected testGetter1 and testGetter2 on event");
|
|
89
|
-
}
|
|
90
|
-
if (event.eventName !== "test1:test2:testEvent") {
|
|
91
|
-
throw new Error("expected combined namespace");
|
|
92
|
-
}
|
|
93
|
-
sent = true;
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
const childLogger1 = ChildLogger.create(logger, "test1", {
|
|
97
|
-
all: {
|
|
98
|
-
testGetter1: () => true,
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
const childLogger2 = ChildLogger.create(childLogger1, "test2", {
|
|
102
|
-
all: {
|
|
103
|
-
testGetter2: () => true,
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
107
|
-
assert(sent, "event should be sent");
|
|
108
|
-
});
|
|
109
|
-
it("Undefined initial namespace", () => {
|
|
110
|
-
let sent = false;
|
|
111
|
-
const logger = {
|
|
112
|
-
send(event) {
|
|
113
|
-
if (event.eventName !== "test2:testEvent") {
|
|
114
|
-
throw new Error("expected combined namespace");
|
|
115
|
-
}
|
|
116
|
-
sent = true;
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
const childLogger1 = createChildLogger({ logger });
|
|
120
|
-
sent = false;
|
|
121
|
-
const childLogger2 = createChildLogger({ logger: childLogger1, namespace: "test2" });
|
|
122
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
123
|
-
assert(sent, "event should be sent");
|
|
124
|
-
});
|
|
125
|
-
it("Undefined second child namespace", () => {
|
|
126
|
-
let sent = false;
|
|
127
|
-
const logger = {
|
|
128
|
-
send(event) {
|
|
129
|
-
if (event.eventName !== "test1:testEvent") {
|
|
130
|
-
throw new Error("expected combined namespace");
|
|
131
|
-
}
|
|
132
|
-
sent = true;
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
const childLogger1 = createChildLogger({ logger, namespace: "test1" });
|
|
136
|
-
sent = false;
|
|
137
|
-
const childLogger2 = createChildLogger({ logger: childLogger1 });
|
|
138
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
139
|
-
assert(sent, "event should be sent");
|
|
140
|
-
});
|
|
141
|
-
it("Undefined namespace", () => {
|
|
142
|
-
let sent = false;
|
|
143
|
-
const logger = {
|
|
144
|
-
send(event) {
|
|
145
|
-
if (event.eventName !== "testEvent") {
|
|
146
|
-
throw new Error("expected combined namespace");
|
|
147
|
-
}
|
|
148
|
-
sent = true;
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
const childLogger1 = createChildLogger({ logger });
|
|
152
|
-
sent = false;
|
|
153
|
-
const childLogger2 = createChildLogger({ logger: childLogger1 });
|
|
154
|
-
childLogger2.send({ category: "generic", eventName: "testEvent" });
|
|
155
|
-
assert(sent, "event should be sent");
|
|
156
|
-
});
|
|
157
|
-
it("should not send events with log level less than minloglevel", () => {
|
|
158
|
-
let sent = false;
|
|
159
|
-
const logger = {
|
|
160
|
-
send(event) {
|
|
161
|
-
if (event.eventName !== "testEvent") {
|
|
162
|
-
throw new Error("unexpected event");
|
|
163
|
-
}
|
|
164
|
-
sent = true;
|
|
165
|
-
},
|
|
166
|
-
minLogLevel: LogLevel.error,
|
|
167
|
-
};
|
|
168
|
-
const childLogger1 = createChildLogger({ logger });
|
|
169
|
-
childLogger1.send({ category: "error", eventName: "testEvent" }, LogLevel.error);
|
|
170
|
-
assert(sent, "event should be sent");
|
|
171
|
-
sent = false;
|
|
172
|
-
childLogger1.send({ category: "generic", eventName: "testEvent" }, LogLevel.default);
|
|
173
|
-
assert(!sent, "event should not be sent");
|
|
174
|
-
});
|
|
175
|
-
it("should receive verbose events with min loglevel set as verbose", () => {
|
|
176
|
-
let sent = false;
|
|
177
|
-
const logger = {
|
|
178
|
-
send(event) {
|
|
179
|
-
if (event.eventName !== "testEvent") {
|
|
180
|
-
throw new Error("unexpected event");
|
|
181
|
-
}
|
|
182
|
-
sent = true;
|
|
183
|
-
},
|
|
184
|
-
minLogLevel: LogLevel.verbose,
|
|
185
|
-
};
|
|
186
|
-
const childLogger1 = createChildLogger({ logger });
|
|
187
|
-
childLogger1.send({ category: "generic", eventName: "testEvent" }, LogLevel.verbose);
|
|
188
|
-
assert(sent, "event should be sent");
|
|
189
|
-
sent = false;
|
|
190
|
-
childLogger1.send({ category: "error", eventName: "testEvent" });
|
|
191
|
-
assert(sent, "default event should be sent");
|
|
192
|
-
});
|
|
193
|
-
it("should not receive verbose events with no min loglevel", () => {
|
|
194
|
-
let sent = false;
|
|
195
|
-
const logger = {
|
|
196
|
-
send(event) {
|
|
197
|
-
if (event.eventName !== "testEvent") {
|
|
198
|
-
throw new Error("unexpected event");
|
|
199
|
-
}
|
|
200
|
-
sent = true;
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
const childLogger1 = createChildLogger({ logger });
|
|
204
|
-
childLogger1.send({ category: "error", eventName: "testEvent" });
|
|
205
|
-
assert(sent, "default event should be sent");
|
|
206
|
-
sent = false;
|
|
207
|
-
childLogger1.send({ category: "generic", eventName: "testEvent" }, LogLevel.verbose);
|
|
208
|
-
assert(!sent, "event should not be sent");
|
|
209
|
-
});
|
|
210
|
-
it("should be able to send events correctly according to loglevel if multisink logger is used inside childlogger", () => {
|
|
211
|
-
let sent = false;
|
|
212
|
-
const logger1 = {
|
|
213
|
-
send(event) {
|
|
214
|
-
if (event.eventName !== "testEvent") {
|
|
215
|
-
throw new Error("unexpected event");
|
|
216
|
-
}
|
|
217
|
-
sent = true;
|
|
218
|
-
},
|
|
219
|
-
minLogLevel: LogLevel.default,
|
|
220
|
-
};
|
|
221
|
-
const multiSinkLogger = createMultiSinkLogger({
|
|
222
|
-
loggers: [logger1, new MockLogger(LogLevel.error)],
|
|
223
|
-
});
|
|
224
|
-
const childLogger1 = createChildLogger({
|
|
225
|
-
logger: multiSinkLogger,
|
|
226
|
-
});
|
|
227
|
-
childLogger1.send({ category: "generic", eventName: "testEvent" }, LogLevel.verbose);
|
|
228
|
-
assert(!sent, "verbose event should not be sent");
|
|
229
|
-
childLogger1.send({ category: "generic", eventName: "testEvent" }, LogLevel.default);
|
|
230
|
-
assert(sent, "verbose event should be sent");
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
//# sourceMappingURL=childLogger.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"childLogger.spec.js","sourceRoot":"","sources":["../../src/test/childLogger.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\";\nimport {\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tLogLevel,\n} from \"@fluidframework/core-interfaces\";\nimport { ChildLogger, createChildLogger, createMultiSinkLogger } from \"../logger.js\";\nimport { MockLogger } from \"../mockLogger.js\";\n\ndescribe(\"ChildLogger\", () => {\n\tit(\"Properties & Getters Propagate\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.testProperty !== true || event.testGetter !== true) {\n\t\t\t\t\tthrow new Error(\"expected testProperty and testGetter on event\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = ChildLogger.create(logger, \"test1\", {\n\t\t\tall: {\n\t\t\t\ttestProperty: true,\n\t\t\t\ttestGetter: () => true,\n\t\t\t},\n\t\t});\n\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"test1\" });\n\t\tassert(sent, \"event should be sent\");\n\n\t\tsent = false;\n\t\tconst childLogger2 = createChildLogger({ logger: childLogger1, namespace: \"test2\" });\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"test2\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Undefined initial Properties and Getter\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.testProperty !== true || event.testGetter !== true) {\n\t\t\t\t\tthrow new Error(\"expected testProperty and testGetter on event\");\n\t\t\t\t}\n\t\t\t\tif (event.eventName !== \"test1:test2:testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger, namespace: \"test1\" });\n\n\t\tsent = false;\n\t\tconst childLogger2 = ChildLogger.create(childLogger1, \"test2\", {\n\t\t\tall: {\n\t\t\t\ttestProperty: true,\n\t\t\t\ttestGetter: () => true,\n\t\t\t},\n\t\t});\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Properties Are Combined\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.testProperty1 !== true || event.testProperty2 !== true) {\n\t\t\t\t\tthrow new Error(\"expected testProperty1 and testProperty2 on event\");\n\t\t\t\t}\n\t\t\t\tif (event.eventName !== \"test1:test2:testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = ChildLogger.create(logger, \"test1\", {\n\t\t\tall: {\n\t\t\t\ttestProperty1: true,\n\t\t\t},\n\t\t});\n\n\t\tconst childLogger2 = ChildLogger.create(childLogger1, \"test2\", {\n\t\t\tall: {\n\t\t\t\ttestProperty2: true,\n\t\t\t},\n\t\t});\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Getters Are Combined\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.testGetter1 !== true || event.testGetter2 !== true) {\n\t\t\t\t\tthrow new Error(\"expected testGetter1 and testGetter2 on event\");\n\t\t\t\t}\n\t\t\t\tif (event.eventName !== \"test1:test2:testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = ChildLogger.create(logger, \"test1\", {\n\t\t\tall: {\n\t\t\t\ttestGetter1: () => true,\n\t\t\t},\n\t\t});\n\n\t\tconst childLogger2 = ChildLogger.create(childLogger1, \"test2\", {\n\t\t\tall: {\n\t\t\t\ttestGetter2: () => true,\n\t\t\t},\n\t\t});\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Undefined initial namespace\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"test2:testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger });\n\n\t\tsent = false;\n\t\tconst childLogger2 = createChildLogger({ logger: childLogger1, namespace: \"test2\" });\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Undefined second child namespace\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"test1:testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger, namespace: \"test1\" });\n\n\t\tsent = false;\n\t\tconst childLogger2 = createChildLogger({ logger: childLogger1 });\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"Undefined namespace\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"testEvent\") {\n\t\t\t\t\tthrow new Error(\"expected combined namespace\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger });\n\n\t\tsent = false;\n\t\tconst childLogger2 = createChildLogger({ logger: childLogger1 });\n\n\t\tchildLogger2.send({ category: \"generic\", eventName: \"testEvent\" });\n\t\tassert(sent, \"event should be sent\");\n\t});\n\n\tit(\"should not send events with log level less than minloglevel\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"testEvent\") {\n\t\t\t\t\tthrow new Error(\"unexpected event\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\n\t\t\tminLogLevel: LogLevel.error,\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger });\n\n\t\tchildLogger1.send({ category: \"error\", eventName: \"testEvent\" }, LogLevel.error);\n\t\tassert(sent, \"event should be sent\");\n\n\t\tsent = false;\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"testEvent\" }, LogLevel.default);\n\t\tassert(!sent, \"event should not be sent\");\n\t});\n\n\tit(\"should receive verbose events with min loglevel set as verbose\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"testEvent\") {\n\t\t\t\t\tthrow new Error(\"unexpected event\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\n\t\t\tminLogLevel: LogLevel.verbose,\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger });\n\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"testEvent\" }, LogLevel.verbose);\n\t\tassert(sent, \"event should be sent\");\n\n\t\tsent = false;\n\t\tchildLogger1.send({ category: \"error\", eventName: \"testEvent\" });\n\t\tassert(sent, \"default event should be sent\");\n\t});\n\n\tit(\"should not receive verbose events with no min loglevel\", () => {\n\t\tlet sent = false;\n\t\tconst logger: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"testEvent\") {\n\t\t\t\t\tthrow new Error(\"unexpected event\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t};\n\t\tconst childLogger1 = createChildLogger({ logger });\n\n\t\tchildLogger1.send({ category: \"error\", eventName: \"testEvent\" });\n\t\tassert(sent, \"default event should be sent\");\n\n\t\tsent = false;\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"testEvent\" }, LogLevel.verbose);\n\t\tassert(!sent, \"event should not be sent\");\n\t});\n\n\tit(\"should be able to send events correctly according to loglevel if multisink logger is used inside childlogger\", () => {\n\t\tlet sent = false;\n\t\tconst logger1: ITelemetryBaseLogger = {\n\t\t\tsend(event: ITelemetryBaseEvent): void {\n\t\t\t\tif (event.eventName !== \"testEvent\") {\n\t\t\t\t\tthrow new Error(\"unexpected event\");\n\t\t\t\t}\n\t\t\t\tsent = true;\n\t\t\t},\n\t\t\tminLogLevel: LogLevel.default,\n\t\t};\n\t\tconst multiSinkLogger = createMultiSinkLogger({\n\t\t\tloggers: [logger1, new MockLogger(LogLevel.error)],\n\t\t});\n\t\tconst childLogger1 = createChildLogger({\n\t\t\tlogger: multiSinkLogger,\n\t\t});\n\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"testEvent\" }, LogLevel.verbose);\n\t\tassert(!sent, \"verbose event should not be sent\");\n\n\t\tchildLogger1.send({ category: \"generic\", eventName: \"testEvent\" }, LogLevel.default);\n\t\tassert(sent, \"verbose event should be sent\");\n\t});\n});\n"]}
|