@fluidframework/telemetry-utils 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917

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/src/config.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { ITelemetryBaseLogger, ITelemetryLogger } from "@fluidframework/common-definitions";
6
6
  import { Lazy } from "@fluidframework/common-utils";
7
+ import { TelemetryDataTag } from "./logger";
7
8
 
8
9
  export type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;
9
10
 
@@ -47,7 +48,7 @@ const NullConfigProvider: IConfigProviderBase = {
47
48
  */
48
49
  export const inMemoryConfigProvider = (storage: Storage | undefined): IConfigProviderBase => {
49
50
  if (storage !== undefined && storage !== null) {
50
- return new CachedConfigProvider({
51
+ return new CachedConfigProvider(undefined, {
51
52
  getRawConfig: (name: string) => {
52
53
  try {
53
54
  return stronglyTypedParse(storage.getItem(name) ?? undefined)?.raw;
@@ -142,9 +143,20 @@ function stronglyTypedParse(input: ConfigTypes): StronglyTypedValue | undefined
142
143
  return defaultReturn;
143
144
  }
144
145
 
145
- /** `sessionStorage` is undefined in some environments such as Node */
146
+ /** `sessionStorage` is undefined in some environments such as Node and web pages with session storage disabled */
146
147
  const safeSessionStorage = (): Storage | undefined => {
147
- return globalThis.sessionStorage;
148
+ // For some configurations accessing "globalThis.sessionStorage" throws
149
+ // "'sessionStorage' property from 'Window': Access is denied for this document" rather than returning undefined.
150
+ // Therefor check for it before accessing.
151
+ try {
152
+ // Using globalThis and checking for undefined is preferred over just accessing global sessionStorage
153
+ // since it avoids an exception when running in node.
154
+ // In some cases this has returned null when disabled in the browser, so ensure its undefined in that case:
155
+ return globalThis.sessionStorage ?? undefined;
156
+ } catch {
157
+ // For browsers which error on the above when session storage is disabled:
158
+ return undefined;
159
+ }
148
160
  };
149
161
 
150
162
  /**
@@ -154,7 +166,10 @@ export class CachedConfigProvider implements IConfigProvider {
154
166
  private readonly configCache = new Map<string, StronglyTypedValue>();
155
167
  private readonly orderedBaseProviders: (IConfigProviderBase | undefined)[];
156
168
 
157
- constructor(...orderedBaseProviders: (IConfigProviderBase | undefined)[]) {
169
+ constructor(
170
+ private readonly logger?: ITelemetryBaseLogger,
171
+ ...orderedBaseProviders: (IConfigProviderBase | undefined)[]
172
+ ) {
158
173
  this.orderedBaseProviders = [];
159
174
  const knownProviders = new Set<IConfigProviderBase>();
160
175
  const candidateProviders = [...orderedBaseProviders];
@@ -203,6 +218,15 @@ export class CachedConfigProvider implements IConfigProvider {
203
218
  const parsed = stronglyTypedParse(provider?.getRawConfig(name));
204
219
  if (parsed !== undefined) {
205
220
  this.configCache.set(name, parsed);
221
+ this.logger?.send({
222
+ category: "generic",
223
+ eventName: "ConfigRead",
224
+ configName: { tag: TelemetryDataTag.CodeArtifact, value: name },
225
+ configValue: {
226
+ tag: TelemetryDataTag.CodeArtifact,
227
+ value: JSON.stringify(parsed),
228
+ },
229
+ });
206
230
  return parsed;
207
231
  }
208
232
  }
@@ -253,7 +277,7 @@ export function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemet
253
277
  * of the MonitoringContext and get the config provider.
254
278
  */
255
279
  const mc: L & Partial<MonitoringContext<L>> = logger;
256
- mc.config = new CachedConfigProvider(...configs);
280
+ mc.config = new CachedConfigProvider(logger, ...configs);
257
281
  mc.logger = logger;
258
282
  return mc as MonitoringContext<L>;
259
283
  }
@@ -34,8 +34,18 @@ export class DebugLogger extends TelemetryLogger {
34
34
  // Setup base logger upfront, such that host can disable it (if needed)
35
35
  const debug = registerDebug(namespace);
36
36
 
37
+ // Create one for errors that is always enabled
38
+ // It can be silenced by replacing console.error if the debug namespace is not enabled.
37
39
  const debugErr = registerDebug(namespace);
38
- debugErr.log = console.error.bind(console);
40
+ debugErr.log = function () {
41
+ if (debug.enabled) {
42
+ // if the namespace is enabled, just use the default logger
43
+ registerDebug.log(...arguments);
44
+ } else {
45
+ // other wise, use the console logger (which could be replaced and silenced)
46
+ console.error(...arguments);
47
+ }
48
+ };
39
49
  debugErr.enabled = true;
40
50
 
41
51
  return new DebugLogger(debug, debugErr, properties);
package/src/logger.ts CHANGED
@@ -344,7 +344,7 @@ export class ChildLogger extends TelemetryLogger {
344
344
 
345
345
  // propagate the monitoring context
346
346
  if (loggerIsMonitoringContext(baseLogger)) {
347
- mixinMonitoringContext(this, new CachedConfigProvider(baseLogger.config));
347
+ mixinMonitoringContext(this, new CachedConfigProvider(this, baseLogger.config));
348
348
  }
349
349
  }
350
350
 
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/telemetry-utils";
9
- export const pkgVersion = "2.0.0-dev.3.1.0.125672";
9
+ export const pkgVersion = "2.0.0-dev.4.2.0.153917";