@fluidframework/telemetry-utils 1.2.7 → 2.0.0-dev.1.3.0.96595

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.
Files changed (70) hide show
  1. package/.mocharc.js +12 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +2 -7
  4. package/dist/config.js.map +1 -1
  5. package/dist/errorLogging.d.ts +10 -1
  6. package/dist/errorLogging.d.ts.map +1 -1
  7. package/dist/errorLogging.js +75 -31
  8. package/dist/errorLogging.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/logger.d.ts +1 -6
  14. package/dist/logger.d.ts.map +1 -1
  15. package/dist/logger.js +4 -8
  16. package/dist/logger.js.map +1 -1
  17. package/dist/mockLogger.d.ts +2 -0
  18. package/dist/mockLogger.d.ts.map +1 -1
  19. package/dist/mockLogger.js +12 -0
  20. package/dist/mockLogger.js.map +1 -1
  21. package/dist/packageVersion.d.ts +1 -1
  22. package/dist/packageVersion.d.ts.map +1 -1
  23. package/dist/packageVersion.js +1 -1
  24. package/dist/packageVersion.js.map +1 -1
  25. package/dist/sampledTelemetryHelper.d.ts +53 -0
  26. package/dist/sampledTelemetryHelper.d.ts.map +1 -0
  27. package/dist/sampledTelemetryHelper.js +92 -0
  28. package/dist/sampledTelemetryHelper.js.map +1 -0
  29. package/dist/thresholdCounter.d.ts +1 -1
  30. package/dist/thresholdCounter.js +1 -1
  31. package/dist/thresholdCounter.js.map +1 -1
  32. package/lib/config.d.ts.map +1 -1
  33. package/lib/config.js +2 -7
  34. package/lib/config.js.map +1 -1
  35. package/lib/errorLogging.d.ts +10 -1
  36. package/lib/errorLogging.d.ts.map +1 -1
  37. package/lib/errorLogging.js +74 -30
  38. package/lib/errorLogging.js.map +1 -1
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.d.ts.map +1 -1
  41. package/lib/index.js +1 -0
  42. package/lib/index.js.map +1 -1
  43. package/lib/logger.d.ts +1 -6
  44. package/lib/logger.d.ts.map +1 -1
  45. package/lib/logger.js +4 -8
  46. package/lib/logger.js.map +1 -1
  47. package/lib/mockLogger.d.ts +2 -0
  48. package/lib/mockLogger.d.ts.map +1 -1
  49. package/lib/mockLogger.js +12 -0
  50. package/lib/mockLogger.js.map +1 -1
  51. package/lib/packageVersion.d.ts +1 -1
  52. package/lib/packageVersion.d.ts.map +1 -1
  53. package/lib/packageVersion.js +1 -1
  54. package/lib/packageVersion.js.map +1 -1
  55. package/lib/sampledTelemetryHelper.d.ts +53 -0
  56. package/lib/sampledTelemetryHelper.d.ts.map +1 -0
  57. package/lib/sampledTelemetryHelper.js +88 -0
  58. package/lib/sampledTelemetryHelper.js.map +1 -0
  59. package/lib/thresholdCounter.d.ts +1 -1
  60. package/lib/thresholdCounter.js +1 -1
  61. package/lib/thresholdCounter.js.map +1 -1
  62. package/package.json +21 -10
  63. package/src/config.ts +2 -4
  64. package/src/errorLogging.ts +77 -30
  65. package/src/index.ts +1 -0
  66. package/src/logger.ts +4 -8
  67. package/src/mockLogger.ts +13 -0
  68. package/src/packageVersion.ts +1 -1
  69. package/src/sampledTelemetryHelper.ts +142 -0
  70. package/src/thresholdCounter.ts +1 -1
package/.mocharc.js ADDED
@@ -0,0 +1,12 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const getFluidTestMochaConfig = require('@fluidframework/mocha-test-setup/mocharc-common');
9
+
10
+ const packageDir = __dirname;
11
+ const config = getFluidTestMochaConfig(packageDir);
12
+ module.exports = config;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,oBAAY,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;CAC3C;AAED;;GAEG;AACF,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IACzD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACnD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACrD;AACF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,2BAC4C,CAAC;AAMtF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,YACrB,OAAO,GAAG,SAAS,KAAG,mBAYnC,CAAC;AA4FF;;GAEG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyC;IACrE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsC;gBAGvE,GAAI,oBAAoB,EAAE,CAAC,mBAAmB,GAAG,SAAS,CAAC,EAAE;IAoBjE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAG7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG3C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS;IAGpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAGlD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIvC,OAAO,CAAC,aAAa;CAcxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAC9B,CAAC,SAAS,oBAAoB,GAAG,gBAAgB;IAEjD,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC;CACb;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACvF,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAG3C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACvF,MAAM,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAKnC;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACpF,MAAM,EAAE,CAAC,EAAE,GAAI,OAAO,EAAE,CAAC,mBAAmB,GAAG,SAAS,CAAC,EAAE,wBAgB9D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAEpD,oBAAY,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;CAC3C;AAED;;GAEG;AACF,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IACzD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACnD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACrD;AACF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,2BAC4C,CAAC;AAMtF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,YACrB,OAAO,GAAG,SAAS,KAAG,mBAYnC,CAAC;AA0FF;;GAEG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyC;IACrE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsC;gBAGvE,GAAI,oBAAoB,EAAE,CAAC,mBAAmB,GAAG,SAAS,CAAC,EAAE;IAoBjE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAG7C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG3C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAG3C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS;IAGpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAGlD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIvC,OAAO,CAAC,aAAa;CAcxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAC9B,CAAC,SAAS,oBAAoB,GAAG,gBAAgB;IAEjD,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC;CACb;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACvF,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAG3C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACvF,MAAM,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAKnC;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,oBAAoB,GAAG,gBAAgB,EACpF,MAAM,EAAE,CAAC,EAAE,GAAI,OAAO,EAAE,CAAC,mBAAmB,GAAG,SAAS,CAAC,EAAE,wBAgB9D"}
package/dist/config.js CHANGED
@@ -98,14 +98,9 @@ function stronglyTypedParse(input) {
98
98
  }
99
99
  return defaultReturn;
100
100
  }
101
- /** Referencing the `sessionStorage` variable can throw in some environments such as Node */
101
+ /** `sessionStorage` is undefined in some environments such as Node */
102
102
  const safeSessionStorage = () => {
103
- try {
104
- return sessionStorage !== null ? sessionStorage : undefined;
105
- }
106
- catch (_a) {
107
- return undefined;
108
- }
103
+ return globalThis.sessionStorage;
109
104
  };
110
105
  /**
111
106
  * Implementation of {@link IConfigProvider} which contains nested {@link IConfigProviderBase} instances
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.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 */\nimport { ITelemetryBaseLogger, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { Lazy } from \"@fluidframework/common-utils\";\n\nexport type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;\n\n/**\n * Base interface for providing configurations to enable/disable/control features\n */\nexport interface IConfigProviderBase {\n getRawConfig(name: string): ConfigTypes;\n}\n\n/**\n * Explicitly typed interface for reading configurations\n */\n export interface IConfigProvider extends IConfigProviderBase {\n getBoolean(name: string): boolean | undefined;\n getNumber(name: string): number | undefined;\n getString(name: string): string | undefined;\n getBooleanArray(name: string): boolean[] | undefined;\n getNumberArray(name: string): number[] | undefined;\n getStringArray(name: string): string[] | undefined;\n }\n/**\n * Creates a base configuration provider based on `sessionStorage`\n *\n * @returns A lazy initialized base configuration provider with `sessionStorage` as the underlying config store\n */\nexport const sessionStorageConfigProvider =\n new Lazy<IConfigProviderBase>(() => inMemoryConfigProvider(safeSessionStorage()));\n\nconst NullConfigProvider: IConfigProviderBase = {\n getRawConfig: () => undefined,\n};\n\n/**\n * Creates a base configuration provider based on the supplied `Storage` instance\n *\n * @param storage - instance of `Storage` to be used as storage media for the config\n * @returns A base configuration provider with\n * the supplied `Storage` instance as the underlying config store\n */\nexport const inMemoryConfigProvider =\n (storage: Storage | undefined): IConfigProviderBase => {\n if (storage !== undefined && storage !== null) {\n return new CachedConfigProvider({\n getRawConfig: (name: string) => {\n try {\n return stronglyTypedParse(storage.getItem(name) ?? undefined)?.raw;\n } catch { }\n return undefined;\n },\n });\n }\n return NullConfigProvider;\n};\n\ninterface ConfigTypeStringToType {\n number: number;\n string: string;\n boolean: boolean;\n [\"number[]\"]: number[];\n [\"string[]\"]: string[];\n [\"boolean[]\"]: boolean[];\n}\n\ntype PrimitiveTypeStrings = \"number\" | \"string\" | \"boolean\";\n\nfunction isPrimitiveType(type: string): type is PrimitiveTypeStrings {\n switch (type) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return true;\n default:\n return false;\n }\n}\n\ninterface StronglyTypedValue extends Partial<ConfigTypeStringToType> {\n raw: ConfigTypes;\n}\n/**\n * Takes any supported config type, and returns the value with a strong type. If the type of\n * the config is not a supported type undefined will be returned.\n * The user of this function should cache the result to avoid duplicated work.\n *\n * Strings will be attempted to be parsed and coerced into a strong config type.\n * if it is not possible to parsed and coerce a string to a strong config type the original string\n * will be return with a string type for the consumer to handle further if necessary.\n */\nfunction stronglyTypedParse(input: ConfigTypes): StronglyTypedValue | undefined {\n let output: ConfigTypes = input;\n let defaultReturn: Pick<StronglyTypedValue, \"raw\" | \"string\"> | undefined;\n // we do special handling for strings to try and coerce\n // them into a config type if we can. This makes it easy\n // for config sources like sessionStorage which only\n // holds strings\n if (typeof input === \"string\") {\n try {\n output = JSON.parse(input);\n // we succeeded in parsing, but we don't support parsing\n // for any object as we can't do it type safely\n // so in this case, the default return will be string\n // rather than undefined, and the consumer\n // can parse, as we don't want to provide\n // a false sense of security by just\n // casting.\n defaultReturn = { raw: input, string: input };\n } catch { }\n }\n\n if (output === undefined) {\n return defaultReturn;\n }\n\n const outputType = typeof output;\n if (isPrimitiveType(outputType)) {\n return { ...defaultReturn, raw: input, [outputType]: output };\n }\n\n if (Array.isArray(output)) {\n const firstType = typeof output[0];\n // ensure the first elements is a primitive type\n if (!isPrimitiveType(firstType)) {\n return defaultReturn;\n }\n // ensue all the elements types are homogeneous\n // aka they all have the same type as the first\n for (const v of output) {\n if (typeof v !== firstType) {\n return defaultReturn;\n }\n }\n return { ...defaultReturn, raw: input, [`${firstType}[]`]: output };\n }\n\n return defaultReturn;\n}\n\n/** Referencing the `sessionStorage` variable can throw in some environments such as Node */\nconst safeSessionStorage = (): Storage | undefined => {\n try {\n return sessionStorage !== null ? sessionStorage : undefined;\n } catch { return undefined; }\n};\n\n/**\n * Implementation of {@link IConfigProvider} which contains nested {@link IConfigProviderBase} instances\n */\nexport class CachedConfigProvider implements IConfigProvider {\n private readonly configCache = new Map<string, StronglyTypedValue>();\n private readonly orderedBaseProviders: (IConfigProviderBase | undefined)[];\n\n constructor(\n ... orderedBaseProviders: (IConfigProviderBase | undefined)[]\n ) {\n this.orderedBaseProviders = [];\n const knownProviders = new Set<IConfigProviderBase>();\n const candidateProviders = [...orderedBaseProviders];\n while (candidateProviders.length > 0) {\n const baseProvider = candidateProviders.shift()!;\n if (baseProvider !== undefined\n && isConfigProviderBase(baseProvider)\n && !knownProviders.has(baseProvider)\n ) {\n knownProviders.add(baseProvider);\n if (baseProvider instanceof CachedConfigProvider) {\n candidateProviders.push(...baseProvider.orderedBaseProviders);\n } else {\n this.orderedBaseProviders.push(baseProvider);\n }\n }\n }\n }\n getBoolean(name: string): boolean | undefined {\n return this.getCacheEntry(name)?.boolean;\n }\n getNumber(name: string): number | undefined {\n return this.getCacheEntry(name)?.number;\n }\n getString(name: string): string | undefined {\n return this.getCacheEntry(name)?.string;\n }\n getBooleanArray(name: string): boolean[] | undefined {\n return this.getCacheEntry(name)?.[\"boolean[]\"];\n }\n getNumberArray(name: string): number[] | undefined {\n return this.getCacheEntry(name)?.[\"number[]\"];\n }\n getStringArray(name: string): string[] | undefined {\n return this.getCacheEntry(name)?.[\"string[]\"];\n }\n\n getRawConfig(name: string): ConfigTypes {\n return this.getCacheEntry(name)?.raw;\n }\n\n private getCacheEntry(name: string): StronglyTypedValue | undefined {\n if (!this.configCache.has(name)) {\n for (const provider of this.orderedBaseProviders) {\n const parsed = stronglyTypedParse(provider?.getRawConfig(name));\n if (parsed !== undefined) {\n this.configCache.set(name, parsed);\n return parsed;\n }\n }\n // configs are immutable, if the first lookup returned no results, all lookups should\n this.configCache.set(name, { raw: undefined });\n }\n return this.configCache.get(name);\n }\n}\n\n/**\n * A type containing both a telemetry logger and a configuration provider\n */\nexport interface MonitoringContext<\n L extends ITelemetryBaseLogger = ITelemetryLogger,\n> {\n config: IConfigProvider;\n logger: L;\n}\n\nexport function loggerIsMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n obj: L): obj is L & MonitoringContext<L> {\n const maybeConfig = obj as Partial<MonitoringContext<L>> | undefined;\n return isConfigProviderBase(maybeConfig?.config) && maybeConfig?.logger !== undefined;\n}\n\nexport function loggerToMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n logger: L): MonitoringContext<L> {\n if (loggerIsMonitoringContext<L>(logger)) {\n return logger;\n }\n return mixinMonitoringContext<L>(logger, sessionStorageConfigProvider.value);\n}\n\nexport function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n logger: L, ... configs: (IConfigProviderBase | undefined)[]) {\n if (loggerIsMonitoringContext<L>(logger)) {\n throw new Error(\"Logger is already a monitoring context\");\n }\n /**\n * this is the tricky bit we use for now to smuggle monitoring context around.\n * To the logger we mixin both config and itself, so mc.logger === logger as it is self-referential.\n * We then expose it as a Monitoring context, so via types we hide the outer logger methods.\n * To layers that expect just a logger we can pass mc.logger, but this is still a MonitoringContext\n * so if a deeper layer then converts that logger to a monitoring context it can find the smuggled properties\n * of the MonitoringContext and get the config provider.\n */\n const mc: L & Partial<MonitoringContext<L>> = logger;\n mc.config = new CachedConfigProvider(...configs);\n mc.logger = logger;\n return mc as MonitoringContext<L>;\n}\n\nfunction isConfigProviderBase(obj: unknown): obj is IConfigProviderBase {\n const maybeConfig = obj as Partial<IConfigProviderBase> | undefined;\n return typeof (maybeConfig?.getRawConfig) === \"function\";\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.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 */\nimport { ITelemetryBaseLogger, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { Lazy } from \"@fluidframework/common-utils\";\n\nexport type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;\n\n/**\n * Base interface for providing configurations to enable/disable/control features\n */\nexport interface IConfigProviderBase {\n getRawConfig(name: string): ConfigTypes;\n}\n\n/**\n * Explicitly typed interface for reading configurations\n */\n export interface IConfigProvider extends IConfigProviderBase {\n getBoolean(name: string): boolean | undefined;\n getNumber(name: string): number | undefined;\n getString(name: string): string | undefined;\n getBooleanArray(name: string): boolean[] | undefined;\n getNumberArray(name: string): number[] | undefined;\n getStringArray(name: string): string[] | undefined;\n }\n/**\n * Creates a base configuration provider based on `sessionStorage`\n *\n * @returns A lazy initialized base configuration provider with `sessionStorage` as the underlying config store\n */\nexport const sessionStorageConfigProvider =\n new Lazy<IConfigProviderBase>(() => inMemoryConfigProvider(safeSessionStorage()));\n\nconst NullConfigProvider: IConfigProviderBase = {\n getRawConfig: () => undefined,\n};\n\n/**\n * Creates a base configuration provider based on the supplied `Storage` instance\n *\n * @param storage - instance of `Storage` to be used as storage media for the config\n * @returns A base configuration provider with\n * the supplied `Storage` instance as the underlying config store\n */\nexport const inMemoryConfigProvider =\n (storage: Storage | undefined): IConfigProviderBase => {\n if (storage !== undefined && storage !== null) {\n return new CachedConfigProvider({\n getRawConfig: (name: string) => {\n try {\n return stronglyTypedParse(storage.getItem(name) ?? undefined)?.raw;\n } catch { }\n return undefined;\n },\n });\n }\n return NullConfigProvider;\n};\n\ninterface ConfigTypeStringToType {\n number: number;\n string: string;\n boolean: boolean;\n [\"number[]\"]: number[];\n [\"string[]\"]: string[];\n [\"boolean[]\"]: boolean[];\n}\n\ntype PrimitiveTypeStrings = \"number\" | \"string\" | \"boolean\";\n\nfunction isPrimitiveType(type: string): type is PrimitiveTypeStrings {\n switch (type) {\n case \"boolean\":\n case \"number\":\n case \"string\":\n return true;\n default:\n return false;\n }\n}\n\ninterface StronglyTypedValue extends Partial<ConfigTypeStringToType> {\n raw: ConfigTypes;\n}\n/**\n * Takes any supported config type, and returns the value with a strong type. If the type of\n * the config is not a supported type undefined will be returned.\n * The user of this function should cache the result to avoid duplicated work.\n *\n * Strings will be attempted to be parsed and coerced into a strong config type.\n * if it is not possible to parsed and coerce a string to a strong config type the original string\n * will be return with a string type for the consumer to handle further if necessary.\n */\nfunction stronglyTypedParse(input: ConfigTypes): StronglyTypedValue | undefined {\n let output: ConfigTypes = input;\n let defaultReturn: Pick<StronglyTypedValue, \"raw\" | \"string\"> | undefined;\n // we do special handling for strings to try and coerce\n // them into a config type if we can. This makes it easy\n // for config sources like sessionStorage which only\n // holds strings\n if (typeof input === \"string\") {\n try {\n output = JSON.parse(input);\n // we succeeded in parsing, but we don't support parsing\n // for any object as we can't do it type safely\n // so in this case, the default return will be string\n // rather than undefined, and the consumer\n // can parse, as we don't want to provide\n // a false sense of security by just\n // casting.\n defaultReturn = { raw: input, string: input };\n } catch { }\n }\n\n if (output === undefined) {\n return defaultReturn;\n }\n\n const outputType = typeof output;\n if (isPrimitiveType(outputType)) {\n return { ...defaultReturn, raw: input, [outputType]: output };\n }\n\n if (Array.isArray(output)) {\n const firstType = typeof output[0];\n // ensure the first elements is a primitive type\n if (!isPrimitiveType(firstType)) {\n return defaultReturn;\n }\n // ensue all the elements types are homogeneous\n // aka they all have the same type as the first\n for (const v of output) {\n if (typeof v !== firstType) {\n return defaultReturn;\n }\n }\n return { ...defaultReturn, raw: input, [`${firstType}[]`]: output };\n }\n\n return defaultReturn;\n}\n\n/** `sessionStorage` is undefined in some environments such as Node */\nconst safeSessionStorage = (): Storage | undefined => {\n return globalThis.sessionStorage;\n};\n\n/**\n * Implementation of {@link IConfigProvider} which contains nested {@link IConfigProviderBase} instances\n */\nexport class CachedConfigProvider implements IConfigProvider {\n private readonly configCache = new Map<string, StronglyTypedValue>();\n private readonly orderedBaseProviders: (IConfigProviderBase | undefined)[];\n\n constructor(\n ... orderedBaseProviders: (IConfigProviderBase | undefined)[]\n ) {\n this.orderedBaseProviders = [];\n const knownProviders = new Set<IConfigProviderBase>();\n const candidateProviders = [...orderedBaseProviders];\n while (candidateProviders.length > 0) {\n const baseProvider = candidateProviders.shift()!;\n if (baseProvider !== undefined\n && isConfigProviderBase(baseProvider)\n && !knownProviders.has(baseProvider)\n ) {\n knownProviders.add(baseProvider);\n if (baseProvider instanceof CachedConfigProvider) {\n candidateProviders.push(...baseProvider.orderedBaseProviders);\n } else {\n this.orderedBaseProviders.push(baseProvider);\n }\n }\n }\n }\n getBoolean(name: string): boolean | undefined {\n return this.getCacheEntry(name)?.boolean;\n }\n getNumber(name: string): number | undefined {\n return this.getCacheEntry(name)?.number;\n }\n getString(name: string): string | undefined {\n return this.getCacheEntry(name)?.string;\n }\n getBooleanArray(name: string): boolean[] | undefined {\n return this.getCacheEntry(name)?.[\"boolean[]\"];\n }\n getNumberArray(name: string): number[] | undefined {\n return this.getCacheEntry(name)?.[\"number[]\"];\n }\n getStringArray(name: string): string[] | undefined {\n return this.getCacheEntry(name)?.[\"string[]\"];\n }\n\n getRawConfig(name: string): ConfigTypes {\n return this.getCacheEntry(name)?.raw;\n }\n\n private getCacheEntry(name: string): StronglyTypedValue | undefined {\n if (!this.configCache.has(name)) {\n for (const provider of this.orderedBaseProviders) {\n const parsed = stronglyTypedParse(provider?.getRawConfig(name));\n if (parsed !== undefined) {\n this.configCache.set(name, parsed);\n return parsed;\n }\n }\n // configs are immutable, if the first lookup returned no results, all lookups should\n this.configCache.set(name, { raw: undefined });\n }\n return this.configCache.get(name);\n }\n}\n\n/**\n * A type containing both a telemetry logger and a configuration provider\n */\nexport interface MonitoringContext<\n L extends ITelemetryBaseLogger = ITelemetryLogger,\n> {\n config: IConfigProvider;\n logger: L;\n}\n\nexport function loggerIsMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n obj: L): obj is L & MonitoringContext<L> {\n const maybeConfig = obj as Partial<MonitoringContext<L>> | undefined;\n return isConfigProviderBase(maybeConfig?.config) && maybeConfig?.logger !== undefined;\n}\n\nexport function loggerToMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n logger: L): MonitoringContext<L> {\n if (loggerIsMonitoringContext<L>(logger)) {\n return logger;\n }\n return mixinMonitoringContext<L>(logger, sessionStorageConfigProvider.value);\n}\n\nexport function mixinMonitoringContext<L extends ITelemetryBaseLogger = ITelemetryLogger>(\n logger: L, ... configs: (IConfigProviderBase | undefined)[]) {\n if (loggerIsMonitoringContext<L>(logger)) {\n throw new Error(\"Logger is already a monitoring context\");\n }\n /**\n * this is the tricky bit we use for now to smuggle monitoring context around.\n * To the logger we mixin both config and itself, so mc.logger === logger as it is self-referential.\n * We then expose it as a Monitoring context, so via types we hide the outer logger methods.\n * To layers that expect just a logger we can pass mc.logger, but this is still a MonitoringContext\n * so if a deeper layer then converts that logger to a monitoring context it can find the smuggled properties\n * of the MonitoringContext and get the config provider.\n */\n const mc: L & Partial<MonitoringContext<L>> = logger;\n mc.config = new CachedConfigProvider(...configs);\n mc.logger = logger;\n return mc as MonitoringContext<L>;\n}\n\nfunction isConfigProviderBase(obj: unknown): obj is IConfigProviderBase {\n const maybeConfig = obj as Partial<IConfigProviderBase> | undefined;\n return typeof (maybeConfig?.getRawConfig) === \"function\";\n}\n"]}
@@ -47,7 +47,8 @@ export declare function wrapError<T extends LoggingError>(innerError: unknown, n
47
47
  export declare function wrapErrorAndLog<T extends LoggingError>(innerError: unknown, newErrorFn: (message: string) => T, logger: ITelemetryLogger): T;
48
48
  /**
49
49
  * True for any error object that is an (optionally normalized) external error
50
- * False for any error we created and raised within the FF codebase, or wrapped in a well-known error type
50
+ * False for any error we created and raised within the FF codebase via LoggingError base class,
51
+ * or wrapped in a well-known error type
51
52
  */
52
53
  export declare function isExternalError(e: any): boolean;
53
54
  /**
@@ -83,6 +84,12 @@ export declare class LoggingError extends Error implements ILoggingError, Omit<I
83
84
  * @param omitPropsFromLogging - properties by name to omit from telemetry props
84
85
  */
85
86
  constructor(message: string, props?: ITelemetryProperties, omitPropsFromLogging?: Set<string>);
87
+ /**
88
+ * Determines if a given object is an instance of a LoggingError
89
+ * @param object - any object
90
+ * @returns - true if the object is an instance of a LoggingError, false if not.
91
+ */
92
+ static typeCheck(object: unknown): object is LoggingError;
86
93
  /**
87
94
  * Add additional properties to be logged
88
95
  */
@@ -92,4 +99,6 @@ export declare class LoggingError extends Error implements ILoggingError, Omit<I
92
99
  */
93
100
  getTelemetryProperties(): ITelemetryProperties;
94
101
  }
102
+ /** The Error class used when normalizing an external error */
103
+ export declare const NORMALIZED_ERROR_TYPE = "genericError";
95
104
  //# sourceMappingURL=errorLogging.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errorLogging.d.ts","sourceRoot":"","sources":["../src/errorLogging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,aAAa,EACb,4BAA4B,EAC5B,gBAAgB,EAChB,oBAAoB,EACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAEH,eAAe,EAGlB,MAAM,kBAAkB,CAAC;AAO1B,sEAAsE;AACtE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO;aAiBhD,MAAM;;;EAkBrC;AAED,6CAA6C;AAC7C,eAAO,MAAM,eAAe,MAAO,GAAG,uBAAwE,CAAC;AAW/G,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,sBAA2B,GACzC,eAAe,CAwCjB;AAID;;;;;;;;GAQG;AACF,wBAAgB,sBAAsB,IAAI,KAAK,CAgB/C;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,YAAY,EAC5C,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,GACnC,CAAC,CAgCH;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAClD,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAClC,MAAM,EAAE,gBAAgB,KAiB3B;AAWD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAI/C;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,4BAA4B,CAExF;AAiCD;;;;;;EAME;AACF,eAAO,MAAM,mBAAmB,cAEf,MAAM,SAAS,GAAG,KAAG,GASrC,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,KAAM,YAAW,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC;IAkB5F,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAjBzC,OAAO,CAAC,gBAAgB,CAAU;IAClC,IAAI,eAAe,WAAoC;IACvD,wBAAwB,CAAC,EAAE,EAAE,MAAM;IAEnC,2FAA2F;IAE3F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;IAE3C;;;;;OAKG;gBAEC,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,oBAAoB,EACX,oBAAoB,GAAE,GAAG,CAAC,MAAM,CAAa;IAalE;;OAEG;IACI,sBAAsB,CAAC,KAAK,EAAE,oBAAoB;IAIzD;;OAEG;IACI,sBAAsB,IAAI,oBAAoB;CAUxD"}
1
+ {"version":3,"file":"errorLogging.d.ts","sourceRoot":"","sources":["../src/errorLogging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,aAAa,EACb,4BAA4B,EAC5B,gBAAgB,EAChB,oBAAoB,EAEvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAEH,eAAe,EAGlB,MAAM,kBAAkB,CAAC;AAO1B,sEAAsE;AACtE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO;aAiBhD,MAAM;;;EAkBrC;AAED,6CAA6C;AAC7C,eAAO,MAAM,eAAe,MAAO,GAAG,uBAAwE,CAAC;AAW/G,6EAA6E;AAC7E,MAAM,WAAW,sBAAsB;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAYD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,OAAO,EACd,WAAW,GAAE,sBAA2B,GACzC,eAAe,CA0CjB;AAID;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,KAAK,CAgB9C;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,YAAY,EAC5C,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,GACnC,CAAC,CAgCH;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,EAClD,UAAU,EAAE,OAAO,EACnB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,EAClC,MAAM,EAAE,gBAAgB,KAiB3B;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAW/C;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,4BAA4B,CAExF;AAwDD;;;;;;EAME;AACF,eAAO,MAAM,mBAAmB,cAEf,MAAM,SAAS,GAAG,KAAG,GASrC,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,KAAM,YAAW,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC;IAkB5F,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAjBzC,OAAO,CAAC,gBAAgB,CAAU;IAClC,IAAI,eAAe,WAAoC;IACvD,wBAAwB,CAAC,EAAE,EAAE,MAAM;IAEnC,2FAA2F;IAE3F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;IAE3C;;;;;OAKG;gBAEC,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,oBAAoB,EACX,oBAAoB,GAAE,GAAG,CAAC,MAAM,CAAa;IAalE;;;;MAIE;WACY,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY;IAShE;;OAEG;IACI,sBAAsB,CAAC,KAAK,EAAE,oBAAoB;IAIzD;;OAEG;IACI,sBAAsB,IAAI,oBAAoB;CAUxD;AAED,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,iBAAiB,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.LoggingError = exports.getCircularReplacer = exports.isTaggedTelemetryPropertyValue = exports.isExternalError = exports.wrapErrorAndLog = exports.wrapError = exports.generateStack = exports.generateErrorWithStack = exports.normalizeError = exports.isILoggingError = exports.extractLogSafeErrorProperties = void 0;
7
+ exports.NORMALIZED_ERROR_TYPE = exports.LoggingError = exports.getCircularReplacer = exports.isTaggedTelemetryPropertyValue = exports.isExternalError = exports.wrapErrorAndLog = exports.wrapError = exports.generateStack = exports.generateErrorWithStack = exports.normalizeError = exports.isILoggingError = exports.extractLogSafeErrorProperties = void 0;
8
8
  const uuid_1 = require("uuid");
9
9
  const fluidErrorBase_1 = require("./fluidErrorBase");
10
10
  /** @returns true if value is an object but neither null nor an array */
@@ -80,7 +80,7 @@ function normalizeError(error, annotations = {}) {
80
80
  }
81
81
  // We have to construct a new Fluid Error, copying safe properties over
82
82
  const { message, stack } = extractLogSafeErrorProperties(error, false /* sanitizeStack */);
83
- const fluidError = new NormalizedExternalError({
83
+ const fluidError = new NormalizedLoggingError({
84
84
  message,
85
85
  stack,
86
86
  });
@@ -95,8 +95,10 @@ function normalizeError(error, annotations = {}) {
95
95
  // This is only interesting for non-objects
96
96
  fluidError.addTelemetryProperties({ typeofError: typeof (error) });
97
97
  }
98
- const originalErrorTelemetryProps = (0, exports.isILoggingError)(error) ? error.getTelemetryProperties() : {};
99
- fluidError.addTelemetryProperties(Object.assign(Object.assign(Object.assign({}, originalErrorTelemetryProps), annotations.props), { untrustedOrigin: 1 }));
98
+ const errorTelemetryProps = LoggingError.typeCheck(error)
99
+ ? error.getTelemetryProperties()
100
+ : { untrustedOrigin: 1 }; // This will let us filter errors that did not originate from our own codebase
101
+ fluidError.addTelemetryProperties(Object.assign(Object.assign({}, errorTelemetryProps), annotations.props));
100
102
  return fluidError;
101
103
  }
102
104
  exports.normalizeError = normalizeError;
@@ -187,21 +189,58 @@ function overwriteStack(error, stack) {
187
189
  }
188
190
  /**
189
191
  * True for any error object that is an (optionally normalized) external error
190
- * False for any error we created and raised within the FF codebase, or wrapped in a well-known error type
192
+ * False for any error we created and raised within the FF codebase via LoggingError base class,
193
+ * or wrapped in a well-known error type
191
194
  */
192
195
  function isExternalError(e) {
193
- return !(0, fluidErrorBase_1.isValidLegacyError)(e) ||
194
- (e.getTelemetryProperties().untrustedOrigin === 1 &&
195
- e.errorType === NormalizedExternalError.normalizedErrorType);
196
+ // LoggingErrors are an internal FF error type. However, an external error can be converted
197
+ // into a LoggingError if it is normalized. In this case we must use the untrustedOrigin flag to
198
+ // determine whether the original error was infact external.
199
+ if (LoggingError.typeCheck(e)) {
200
+ if (e.errorType === exports.NORMALIZED_ERROR_TYPE) {
201
+ return e.getTelemetryProperties().untrustedOrigin === 1;
202
+ }
203
+ return false;
204
+ }
205
+ return !(0, fluidErrorBase_1.isValidLegacyError)(e);
196
206
  }
197
207
  exports.isExternalError = isExternalError;
198
208
  /**
199
209
  * Type guard to identify if a particular value (loosely) appears to be a tagged telemetry property
200
210
  */
201
211
  function isTaggedTelemetryPropertyValue(x) {
202
- return (typeof (x === null || x === void 0 ? void 0 : x.value) !== "object" && typeof (x === null || x === void 0 ? void 0 : x.tag) === "string");
212
+ return typeof (x === null || x === void 0 ? void 0 : x.tag) === "string";
203
213
  }
204
214
  exports.isTaggedTelemetryPropertyValue = isTaggedTelemetryPropertyValue;
215
+ /**
216
+ * Filter serializable telemetry properties
217
+ * @param x - any telemetry prop
218
+ * @returns - as-is if x is primitive. returns stringified if x is an array of primitive.
219
+ * otherwise returns null since this is what we support at the moment.
220
+ */
221
+ function filterValidTelemetryProps(x, key) {
222
+ if (Array.isArray(x) && x.every((val) => isTelemetryEventPropertyValue(val))) {
223
+ return JSON.stringify(x);
224
+ }
225
+ if (isTelemetryEventPropertyValue(x)) {
226
+ return x;
227
+ }
228
+ // We don't support logging arbitrary objects
229
+ console.error(`UnSupported Format of Logging Error Property for key ${key}:`, x);
230
+ return "REDACTED (arbitrary object)";
231
+ }
232
+ // checking type of x, returns false if x is null
233
+ function isTelemetryEventPropertyValue(x) {
234
+ switch (typeof x) {
235
+ case "string":
236
+ case "number":
237
+ case "boolean":
238
+ case "undefined":
239
+ return true;
240
+ default:
241
+ return false;
242
+ }
243
+ }
205
244
  /**
206
245
  * Walk an object's enumerable properties to find those fit for telemetry.
207
246
  */
@@ -212,23 +251,15 @@ function getValidTelemetryProps(obj, keysToOmit) {
212
251
  continue;
213
252
  }
214
253
  const val = obj[key];
215
- switch (typeof val) {
216
- case "string":
217
- case "number":
218
- case "boolean":
219
- case "undefined":
220
- props[key] = val;
221
- break;
222
- default: {
223
- if (isTaggedTelemetryPropertyValue(val)) {
224
- props[key] = val;
225
- }
226
- else {
227
- // We don't support logging arbitrary objects
228
- props[key] = "REDACTED (arbitrary object)";
229
- }
230
- break;
231
- }
254
+ // ensure only valid props get logged, since props of logging error could be in any shape
255
+ if (isTaggedTelemetryPropertyValue(val)) {
256
+ props[key] = {
257
+ value: filterValidTelemetryProps(val.value, key),
258
+ tag: val.tag,
259
+ };
260
+ }
261
+ else {
262
+ props[key] = filterValidTelemetryProps(val, key);
232
263
  }
233
264
  }
234
265
  return props;
@@ -283,6 +314,19 @@ class LoggingError extends Error {
283
314
  }
284
315
  get errorInstanceId() { return this._errorInstanceId; }
285
316
  overwriteErrorInstanceId(id) { this._errorInstanceId = id; }
317
+ /**
318
+ * Determines if a given object is an instance of a LoggingError
319
+ * @param object - any object
320
+ * @returns - true if the object is an instance of a LoggingError, false if not.
321
+ */
322
+ static typeCheck(object) {
323
+ if (typeof object === "object" && object !== null) {
324
+ return typeof object.addTelemetryProperties === "function"
325
+ && typeof object.getTelemetryProperties === "function"
326
+ && typeof object.errorInstanceId === "string";
327
+ }
328
+ return false;
329
+ }
286
330
  /**
287
331
  * Add additional properties to be logged
288
332
  */
@@ -300,16 +344,16 @@ class LoggingError extends Error {
300
344
  }
301
345
  exports.LoggingError = LoggingError;
302
346
  /** The Error class used when normalizing an external error */
303
- class NormalizedExternalError extends LoggingError {
347
+ exports.NORMALIZED_ERROR_TYPE = "genericError";
348
+ class NormalizedLoggingError extends LoggingError {
304
349
  constructor(errorProps) {
305
350
  super(errorProps.message);
306
- this.errorType = NormalizedExternalError.normalizedErrorType;
351
+ // errorType "genericError" is used as a default value throughout the code.
352
+ // Note that this matches ContainerErrorType/DriverErrorType's genericError
353
+ this.errorType = exports.NORMALIZED_ERROR_TYPE;
307
354
  if (errorProps.stack !== undefined) {
308
355
  overwriteStack(this, errorProps.stack);
309
356
  }
310
357
  }
311
358
  }
312
- // errorType "genericError" is used as a default value throughout the code.
313
- // Note that this matches ContainerErrorType/DriverErrorType's genericError
314
- NormalizedExternalError.normalizedErrorType = "genericError";
315
359
  //# sourceMappingURL=errorLogging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errorLogging.js","sourceRoot":"","sources":["../src/errorLogging.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 {\n ILoggingError,\n ITaggedTelemetryPropertyType,\n ITelemetryLogger,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n hasErrorInstanceId,\n IFluidErrorBase,\n isFluidError,\n isValidLegacyError,\n} from \"./fluidErrorBase\";\n\n/** @returns true if value is an object but neither null nor an array */\nconst isRegularObject = (value: any): boolean => {\n return value !== null && !Array.isArray(value) && typeof value === \"object\";\n};\n\n/** Inspect the given error for common \"safe\" props and return them */\nexport function extractLogSafeErrorProperties(error: any, sanitizeStack: boolean) {\n const removeMessageFromStack = (stack: string, errorName?: string) => {\n if (!sanitizeStack) {\n return stack;\n }\n const stackFrames = stack.split(\"\\n\");\n stackFrames.shift(); // Remove \"[ErrorName]: [ErrorMessage]\"\n if (errorName !== undefined) {\n stackFrames.unshift(errorName); // Add \"[ErrorName]\"\n }\n return stackFrames.join(\"\\n\");\n };\n\n const message = (typeof error?.message === \"string\")\n ? error.message as string\n : String(error);\n\n const safeProps: { message: string; errorType?: string; stack?: string; } = {\n message,\n };\n\n if (isRegularObject(error)) {\n const { errorType, stack, name } = error;\n\n if (typeof errorType === \"string\") {\n safeProps.errorType = errorType;\n }\n\n if (typeof stack === \"string\") {\n const errorName = (typeof name === \"string\") ? name : undefined;\n safeProps.stack = removeMessageFromStack(stack, errorName);\n }\n }\n\n return safeProps;\n}\n\n/** type guard for ILoggingError interface */\nexport const isILoggingError = (x: any): x is ILoggingError => typeof x?.getTelemetryProperties === \"function\";\n\n/** Copy props from source onto target, but do not overwrite an existing prop that matches */\nfunction copyProps(target: ITelemetryProperties | LoggingError, source: ITelemetryProperties) {\n for (const key of Object.keys(source)) {\n if (target[key] === undefined) {\n target[key] = source[key];\n }\n }\n}\n\n/** Metadata to annotate an error object when annotating or normalizing it */\nexport interface IFluidErrorAnnotations {\n /** Telemetry props to log with the error */\n props?: ITelemetryProperties;\n}\n\n/** For backwards compatibility with pre-errorInstanceId valid errors */\nfunction patchLegacyError(\n legacyError: Omit<IFluidErrorBase, \"errorInstanceId\">,\n): asserts legacyError is IFluidErrorBase {\n const patchMe: { -readonly [P in \"errorInstanceId\"]?: IFluidErrorBase[P] } = legacyError as any;\n if (patchMe.errorInstanceId === undefined) {\n patchMe.errorInstanceId = uuid();\n }\n}\n\n/**\n * Normalize the given error yielding a valid Fluid Error\n * @returns A valid Fluid Error with any provided annotations applied\n * @param error - The error to normalize\n * @param annotations - Annotations to apply to the normalized error\n */\nexport function normalizeError(\n error: unknown,\n annotations: IFluidErrorAnnotations = {},\n): IFluidErrorBase {\n // Back-compat, while IFluidErrorBase is rolled out\n if (isValidLegacyError(error)) {\n patchLegacyError(error);\n }\n\n if (isFluidError(error)) {\n // We can simply add the telemetry props to the error and return it\n error.addTelemetryProperties(annotations.props ?? {});\n return error;\n }\n\n // We have to construct a new Fluid Error, copying safe properties over\n const { message, stack } = extractLogSafeErrorProperties(error, false /* sanitizeStack */);\n const fluidError: IFluidErrorBase = new NormalizedExternalError({\n message,\n stack,\n });\n\n // We need to preserve these properties which are used in a non-typesafe way throughout driver code (see #8743)\n // Anywhere they are set should be on a valid Fluid Error that would have been returned above,\n // but we can't prove it with the types, so adding this defensive measure.\n if (typeof error === \"object\" && error !== null) {\n const { canRetry, retryAfterSeconds } = error as any;\n Object.assign(normalizeError, { canRetry, retryAfterSeconds });\n }\n\n if (typeof (error) !== \"object\") {\n // This is only interesting for non-objects\n fluidError.addTelemetryProperties({ typeofError: typeof (error) });\n }\n\n const originalErrorTelemetryProps = isILoggingError(error) ? error.getTelemetryProperties() : {};\n fluidError.addTelemetryProperties({\n ...originalErrorTelemetryProps,\n ...annotations.props,\n untrustedOrigin: 1, // This will let us filter to errors not originated by our own code\n });\n\n return fluidError;\n}\n\nlet stackPopulatedOnCreation: boolean | undefined;\n\n/**\n * The purpose of this function is to provide ability to capture stack context quickly.\n * Accessing new Error().stack is slow, and the slowest part is accessing stack property itself.\n * There are scenarios where we generate error with stack, but error is handled in most cases and\n * stack property is not accessed.\n * For such cases it's better to not read stack property right away, but rather delay it until / if it's needed\n * Some browsers will populate stack right away, others require throwing Error, so we do auto-detection on the fly.\n * @returns Error object that has stack populated.\n */\n export function generateErrorWithStack(): Error {\n const err = new Error(\"<<generated stack>>\");\n\n if (stackPopulatedOnCreation === undefined) {\n stackPopulatedOnCreation = (err.stack !== undefined);\n }\n\n if (stackPopulatedOnCreation) {\n return err;\n }\n\n try {\n throw err;\n } catch (e) {\n return e as Error;\n }\n}\n\nexport function generateStack(): string | undefined {\n return generateErrorWithStack().stack;\n}\n\n/**\n * Create a new error using newErrorFn, wrapping and caused by the given unknown error.\n * Copies the inner error's stack, errorInstanceId and telemetry props over to the new error if present\n * @param innerError - An error from untrusted/unknown origins\n * @param newErrorFn - callback that will create a new error given the original error's message\n * @returns A new error object \"wrapping\" the given error\n */\nexport function wrapError<T extends LoggingError>(\n innerError: unknown,\n newErrorFn: (message: string) => T,\n): T {\n const {\n message,\n stack,\n } = extractLogSafeErrorProperties(innerError, false /* sanitizeStack */);\n\n const newError = newErrorFn(message);\n\n if (stack !== undefined) {\n overwriteStack(newError, stack);\n }\n\n // Mark external errors with untrustedOrigin flag\n if (isExternalError(innerError)) {\n newError.addTelemetryProperties({ untrustedOrigin: 1 });\n }\n\n // Reuse errorInstanceId\n if (hasErrorInstanceId(innerError)) {\n newError.overwriteErrorInstanceId(innerError.errorInstanceId);\n\n // For \"back-compat\" in the logs\n newError.addTelemetryProperties({ innerErrorInstanceId: innerError.errorInstanceId });\n }\n\n // Lastly, copy over all other telemetry properties. Note these will not overwrite existing properties\n // This will include the untrustedOrigin property if the inner error itself was created from an external error\n if (isILoggingError(innerError)) {\n newError.addTelemetryProperties(innerError.getTelemetryProperties());\n }\n\n return newError;\n}\n\n/** The same as wrapError, but also logs the innerError, including the wrapping error's instance id */\nexport function wrapErrorAndLog<T extends LoggingError>(\n innerError: unknown,\n newErrorFn: (message: string) => T,\n logger: ITelemetryLogger,\n) {\n const newError = wrapError(innerError, newErrorFn);\n\n // This will match innerError.errorInstanceId if present (see wrapError)\n const errorInstanceId = newError.errorInstanceId;\n\n // For \"back-compat\" in the logs\n const wrappedByErrorInstanceId = errorInstanceId;\n\n logger.sendTelemetryEvent({\n eventName: \"WrapError\",\n errorInstanceId,\n wrappedByErrorInstanceId,\n }, innerError);\n\n return newError;\n}\n\nfunction overwriteStack(error: IFluidErrorBase | LoggingError, stack: string) {\n // supposedly setting stack on an Error can throw.\n try {\n Object.assign(error, { stack });\n } catch (errorSettingStack) {\n error.addTelemetryProperties({ stack2: stack });\n }\n}\n\n/**\n * True for any error object that is an (optionally normalized) external error\n * False for any error we created and raised within the FF codebase, or wrapped in a well-known error type\n */\nexport function isExternalError(e: any): boolean {\n return !isValidLegacyError(e) ||\n (e.getTelemetryProperties().untrustedOrigin === 1 &&\n e.errorType === NormalizedExternalError.normalizedErrorType);\n}\n\n/**\n * Type guard to identify if a particular value (loosely) appears to be a tagged telemetry property\n */\nexport function isTaggedTelemetryPropertyValue(x: any): x is ITaggedTelemetryPropertyType {\n return (typeof (x?.value) !== \"object\" && typeof (x?.tag) === \"string\");\n}\n\n/**\n * Walk an object's enumerable properties to find those fit for telemetry.\n */\nfunction getValidTelemetryProps(obj: any, keysToOmit: Set<string>): ITelemetryProperties {\n const props: ITelemetryProperties = {};\n for (const key of Object.keys(obj)) {\n if (keysToOmit.has(key)) {\n continue;\n }\n const val = obj[key];\n switch (typeof val) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n props[key] = val;\n break;\n default: {\n if (isTaggedTelemetryPropertyValue(val)) {\n props[key] = val;\n } else {\n // We don't support logging arbitrary objects\n props[key] = \"REDACTED (arbitrary object)\";\n }\n break;\n }\n }\n }\n return props;\n}\n\n/**\n * Borrowed from\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#examples}\n * Avoids runtime errors with circular references.\n * Not ideal, as will cut values that are not necessarily circular references.\n * Could be improved by implementing Node's util.inspect() for browser (minus all the coloring code)\n*/\nexport const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (key: string, value: any): any => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) {\n return \"<removed/circular>\";\n }\n seen.add(value);\n }\n return value;\n };\n};\n\n/**\n * Base class for \"trusted\" errors we create, whose properties can generally be logged to telemetry safely.\n * All properties set on the object, or passed in (via the constructor or addTelemetryProperties),\n * will be logged in accordance with their tag, if present.\n *\n * PLEASE take care to avoid setting sensitive data on this object without proper tagging!\n */\nexport class LoggingError extends Error implements ILoggingError, Omit<IFluidErrorBase, \"errorType\"> {\n private _errorInstanceId = uuid();\n get errorInstanceId() { return this._errorInstanceId; }\n overwriteErrorInstanceId(id: string) { this._errorInstanceId = id; }\n\n /** Back-compat to appease isFluidError typeguard in old code that may handle this error */\n // @ts-expect-error - This field shouldn't be referenced in the current version, but needs to exist at runtime.\n private readonly fluidErrorCode: \"-\" = \"-\";\n\n /**\n * Create a new LoggingError\n * @param message - Error message to use for Error base class\n * @param props - telemetry props to include on the error for when it's logged\n * @param omitPropsFromLogging - properties by name to omit from telemetry props\n */\n constructor(\n message: string,\n props?: ITelemetryProperties,\n private readonly omitPropsFromLogging: Set<string> = new Set(),\n ) {\n super(message);\n\n // Don't log this list itself, or the private _errorInstanceId\n omitPropsFromLogging.add(\"omitPropsFromLogging\");\n omitPropsFromLogging.add(\"_errorInstanceId\");\n\n if (props) {\n this.addTelemetryProperties(props);\n }\n }\n\n /**\n * Add additional properties to be logged\n */\n public addTelemetryProperties(props: ITelemetryProperties) {\n copyProps(this, props);\n }\n\n /**\n * Get all properties fit to be logged to telemetry for this error\n */\n public getTelemetryProperties(): ITelemetryProperties {\n const taggableProps = getValidTelemetryProps(this, this.omitPropsFromLogging);\n // Include non-enumerable props that are not returned by getValidTelemetryProps\n return {\n ...taggableProps,\n stack: this.stack,\n message: this.message,\n errorInstanceId: this._errorInstanceId,\n };\n }\n}\n\n/** The Error class used when normalizing an external error */\nclass NormalizedExternalError extends LoggingError {\n // errorType \"genericError\" is used as a default value throughout the code.\n // Note that this matches ContainerErrorType/DriverErrorType's genericError\n static readonly normalizedErrorType = \"genericError\";\n\n errorType = NormalizedExternalError.normalizedErrorType;\n\n constructor(\n errorProps: Pick<IFluidErrorBase,\n | \"message\"\n | \"stack\"\n >,\n ) {\n super(errorProps.message);\n\n if (errorProps.stack !== undefined) {\n overwriteStack(this, errorProps.stack);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"errorLogging.js","sourceRoot":"","sources":["../src/errorLogging.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 {\n ILoggingError,\n ITaggedTelemetryPropertyType,\n ITelemetryLogger,\n ITelemetryProperties,\n TelemetryEventPropertyType,\n} from \"@fluidframework/common-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n hasErrorInstanceId,\n IFluidErrorBase,\n isFluidError,\n isValidLegacyError,\n} from \"./fluidErrorBase\";\n\n/** @returns true if value is an object but neither null nor an array */\nconst isRegularObject = (value: any): boolean => {\n return value !== null && !Array.isArray(value) && typeof value === \"object\";\n};\n\n/** Inspect the given error for common \"safe\" props and return them */\nexport function extractLogSafeErrorProperties(error: any, sanitizeStack: boolean) {\n const removeMessageFromStack = (stack: string, errorName?: string) => {\n if (!sanitizeStack) {\n return stack;\n }\n const stackFrames = stack.split(\"\\n\");\n stackFrames.shift(); // Remove \"[ErrorName]: [ErrorMessage]\"\n if (errorName !== undefined) {\n stackFrames.unshift(errorName); // Add \"[ErrorName]\"\n }\n return stackFrames.join(\"\\n\");\n };\n\n const message = (typeof error?.message === \"string\")\n ? error.message as string\n : String(error);\n\n const safeProps: { message: string; errorType?: string; stack?: string; } = {\n message,\n };\n\n if (isRegularObject(error)) {\n const { errorType, stack, name } = error;\n\n if (typeof errorType === \"string\") {\n safeProps.errorType = errorType;\n }\n\n if (typeof stack === \"string\") {\n const errorName = (typeof name === \"string\") ? name : undefined;\n safeProps.stack = removeMessageFromStack(stack, errorName);\n }\n }\n\n return safeProps;\n}\n\n/** type guard for ILoggingError interface */\nexport const isILoggingError = (x: any): x is ILoggingError => typeof x?.getTelemetryProperties === \"function\";\n\n/** Copy props from source onto target, but do not overwrite an existing prop that matches */\nfunction copyProps(target: ITelemetryProperties | LoggingError, source: ITelemetryProperties) {\n for (const key of Object.keys(source)) {\n if (target[key] === undefined) {\n target[key] = source[key];\n }\n }\n}\n\n/** Metadata to annotate an error object when annotating or normalizing it */\nexport interface IFluidErrorAnnotations {\n /** Telemetry props to log with the error */\n props?: ITelemetryProperties;\n}\n\n/** For backwards compatibility with pre-errorInstanceId valid errors */\nfunction patchLegacyError(\n legacyError: Omit<IFluidErrorBase, \"errorInstanceId\">,\n): asserts legacyError is IFluidErrorBase {\n const patchMe: { -readonly [P in \"errorInstanceId\"]?: IFluidErrorBase[P] } = legacyError as any;\n if (patchMe.errorInstanceId === undefined) {\n patchMe.errorInstanceId = uuid();\n }\n}\n\n/**\n * Normalize the given error yielding a valid Fluid Error\n * @returns A valid Fluid Error with any provided annotations applied\n * @param error - The error to normalize\n * @param annotations - Annotations to apply to the normalized error\n */\nexport function normalizeError(\n error: unknown,\n annotations: IFluidErrorAnnotations = {},\n): IFluidErrorBase {\n // Back-compat, while IFluidErrorBase is rolled out\n if (isValidLegacyError(error)) {\n patchLegacyError(error);\n }\n\n if (isFluidError(error)) {\n // We can simply add the telemetry props to the error and return it\n error.addTelemetryProperties(annotations.props ?? {});\n return error;\n }\n\n // We have to construct a new Fluid Error, copying safe properties over\n const { message, stack } = extractLogSafeErrorProperties(error, false /* sanitizeStack */);\n const fluidError: IFluidErrorBase = new NormalizedLoggingError({\n message,\n stack,\n });\n\n // We need to preserve these properties which are used in a non-typesafe way throughout driver code (see #8743)\n // Anywhere they are set should be on a valid Fluid Error that would have been returned above,\n // but we can't prove it with the types, so adding this defensive measure.\n if (typeof error === \"object\" && error !== null) {\n const { canRetry, retryAfterSeconds } = error as any;\n Object.assign(normalizeError, { canRetry, retryAfterSeconds });\n }\n\n if (typeof (error) !== \"object\") {\n // This is only interesting for non-objects\n fluidError.addTelemetryProperties({ typeofError: typeof (error) });\n }\n\n const errorTelemetryProps = LoggingError.typeCheck(error)\n ? error.getTelemetryProperties()\n : { untrustedOrigin: 1 }; // This will let us filter errors that did not originate from our own codebase\n\n fluidError.addTelemetryProperties({\n ...errorTelemetryProps,\n ...annotations.props,\n });\n\n return fluidError;\n}\n\nlet stackPopulatedOnCreation: boolean | undefined;\n\n/**\n * The purpose of this function is to provide ability to capture stack context quickly.\n * Accessing new Error().stack is slow, and the slowest part is accessing stack property itself.\n * There are scenarios where we generate error with stack, but error is handled in most cases and\n * stack property is not accessed.\n * For such cases it's better to not read stack property right away, but rather delay it until / if it's needed\n * Some browsers will populate stack right away, others require throwing Error, so we do auto-detection on the fly.\n * @returns Error object that has stack populated.\n */\nexport function generateErrorWithStack(): Error {\n const err = new Error(\"<<generated stack>>\");\n\n if (stackPopulatedOnCreation === undefined) {\n stackPopulatedOnCreation = (err.stack !== undefined);\n }\n\n if (stackPopulatedOnCreation) {\n return err;\n }\n\n try {\n throw err;\n } catch (e) {\n return e as Error;\n }\n}\n\nexport function generateStack(): string | undefined {\n return generateErrorWithStack().stack;\n}\n\n/**\n * Create a new error using newErrorFn, wrapping and caused by the given unknown error.\n * Copies the inner error's stack, errorInstanceId and telemetry props over to the new error if present\n * @param innerError - An error from untrusted/unknown origins\n * @param newErrorFn - callback that will create a new error given the original error's message\n * @returns A new error object \"wrapping\" the given error\n */\nexport function wrapError<T extends LoggingError>(\n innerError: unknown,\n newErrorFn: (message: string) => T,\n): T {\n const {\n message,\n stack,\n } = extractLogSafeErrorProperties(innerError, false /* sanitizeStack */);\n\n const newError = newErrorFn(message);\n\n if (stack !== undefined) {\n overwriteStack(newError, stack);\n }\n\n // Mark external errors with untrustedOrigin flag\n if (isExternalError(innerError)) {\n newError.addTelemetryProperties({ untrustedOrigin: 1 });\n }\n\n // Reuse errorInstanceId\n if (hasErrorInstanceId(innerError)) {\n newError.overwriteErrorInstanceId(innerError.errorInstanceId);\n\n // For \"back-compat\" in the logs\n newError.addTelemetryProperties({ innerErrorInstanceId: innerError.errorInstanceId });\n }\n\n // Lastly, copy over all other telemetry properties. Note these will not overwrite existing properties\n // This will include the untrustedOrigin property if the inner error itself was created from an external error\n if (isILoggingError(innerError)) {\n newError.addTelemetryProperties(innerError.getTelemetryProperties());\n }\n\n return newError;\n}\n\n/** The same as wrapError, but also logs the innerError, including the wrapping error's instance id */\nexport function wrapErrorAndLog<T extends LoggingError>(\n innerError: unknown,\n newErrorFn: (message: string) => T,\n logger: ITelemetryLogger,\n) {\n const newError = wrapError(innerError, newErrorFn);\n\n // This will match innerError.errorInstanceId if present (see wrapError)\n const errorInstanceId = newError.errorInstanceId;\n\n // For \"back-compat\" in the logs\n const wrappedByErrorInstanceId = errorInstanceId;\n\n logger.sendTelemetryEvent({\n eventName: \"WrapError\",\n errorInstanceId,\n wrappedByErrorInstanceId,\n }, innerError);\n\n return newError;\n}\n\nfunction overwriteStack(error: IFluidErrorBase | LoggingError, stack: string) {\n // supposedly setting stack on an Error can throw.\n try {\n Object.assign(error, { stack });\n } catch (errorSettingStack) {\n error.addTelemetryProperties({ stack2: stack });\n }\n}\n\n/**\n * True for any error object that is an (optionally normalized) external error\n * False for any error we created and raised within the FF codebase via LoggingError base class,\n * or wrapped in a well-known error type\n */\nexport function isExternalError(e: any): boolean {\n // LoggingErrors are an internal FF error type. However, an external error can be converted\n // into a LoggingError if it is normalized. In this case we must use the untrustedOrigin flag to\n // determine whether the original error was infact external.\n if (LoggingError.typeCheck(e)) {\n if ((e as NormalizedLoggingError).errorType === NORMALIZED_ERROR_TYPE) {\n return e.getTelemetryProperties().untrustedOrigin === 1;\n }\n return false;\n }\n return !isValidLegacyError(e);\n}\n\n/**\n * Type guard to identify if a particular value (loosely) appears to be a tagged telemetry property\n */\nexport function isTaggedTelemetryPropertyValue(x: any): x is ITaggedTelemetryPropertyType {\n return typeof (x?.tag) === \"string\";\n}\n\n/**\n * Filter serializable telemetry properties\n * @param x - any telemetry prop\n * @returns - as-is if x is primitive. returns stringified if x is an array of primitive.\n * otherwise returns null since this is what we support at the moment.\n */\nfunction filterValidTelemetryProps(x: any, key: string): TelemetryEventPropertyType {\n if (Array.isArray(x) && x.every((val) => isTelemetryEventPropertyValue(val))) {\n return JSON.stringify(x);\n }\n if (isTelemetryEventPropertyValue(x)) {\n return x;\n }\n // We don't support logging arbitrary objects\n console.error(`UnSupported Format of Logging Error Property for key ${key}:`, x);\n return \"REDACTED (arbitrary object)\";\n}\n\n// checking type of x, returns false if x is null\nfunction isTelemetryEventPropertyValue(x: any): x is TelemetryEventPropertyType {\n switch (typeof x) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return true;\n default:\n return false;\n }\n}\n/**\n * Walk an object's enumerable properties to find those fit for telemetry.\n */\nfunction getValidTelemetryProps(obj: any, keysToOmit: Set<string>): ITelemetryProperties {\n const props: ITelemetryProperties = {};\n for (const key of Object.keys(obj)) {\n if (keysToOmit.has(key)) {\n continue;\n }\n const val = obj[key];\n\n // ensure only valid props get logged, since props of logging error could be in any shape\n if (isTaggedTelemetryPropertyValue(val)) {\n props[key] = {\n value: filterValidTelemetryProps(val.value, key),\n tag: val.tag,\n };\n } else {\n props[key] = filterValidTelemetryProps(val, key);\n }\n }\n return props;\n}\n\n/**\n * Borrowed from\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value#examples}\n * Avoids runtime errors with circular references.\n * Not ideal, as will cut values that are not necessarily circular references.\n * Could be improved by implementing Node's util.inspect() for browser (minus all the coloring code)\n*/\nexport const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (key: string, value: any): any => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) {\n return \"<removed/circular>\";\n }\n seen.add(value);\n }\n return value;\n };\n};\n\n/**\n * Base class for \"trusted\" errors we create, whose properties can generally be logged to telemetry safely.\n * All properties set on the object, or passed in (via the constructor or addTelemetryProperties),\n * will be logged in accordance with their tag, if present.\n *\n * PLEASE take care to avoid setting sensitive data on this object without proper tagging!\n */\nexport class LoggingError extends Error implements ILoggingError, Omit<IFluidErrorBase, \"errorType\"> {\n private _errorInstanceId = uuid();\n get errorInstanceId() { return this._errorInstanceId; }\n overwriteErrorInstanceId(id: string) { this._errorInstanceId = id; }\n\n /** Back-compat to appease isFluidError typeguard in old code that may handle this error */\n // @ts-expect-error - This field shouldn't be referenced in the current version, but needs to exist at runtime.\n private readonly fluidErrorCode: \"-\" = \"-\";\n\n /**\n * Create a new LoggingError\n * @param message - Error message to use for Error base class\n * @param props - telemetry props to include on the error for when it's logged\n * @param omitPropsFromLogging - properties by name to omit from telemetry props\n */\n constructor(\n message: string,\n props?: ITelemetryProperties,\n private readonly omitPropsFromLogging: Set<string> = new Set(),\n ) {\n super(message);\n\n // Don't log this list itself, or the private _errorInstanceId\n omitPropsFromLogging.add(\"omitPropsFromLogging\");\n omitPropsFromLogging.add(\"_errorInstanceId\");\n\n if (props) {\n this.addTelemetryProperties(props);\n }\n }\n\n /**\n * Determines if a given object is an instance of a LoggingError\n * @param object - any object\n * @returns - true if the object is an instance of a LoggingError, false if not.\n */\n public static typeCheck(object: unknown): object is LoggingError {\n if (typeof object === \"object\" && object !== null) {\n return typeof (object as LoggingError).addTelemetryProperties === \"function\"\n && typeof (object as LoggingError).getTelemetryProperties === \"function\"\n && typeof (object as LoggingError).errorInstanceId === \"string\";\n }\n return false;\n }\n\n /**\n * Add additional properties to be logged\n */\n public addTelemetryProperties(props: ITelemetryProperties) {\n copyProps(this, props);\n }\n\n /**\n * Get all properties fit to be logged to telemetry for this error\n */\n public getTelemetryProperties(): ITelemetryProperties {\n const taggableProps = getValidTelemetryProps(this, this.omitPropsFromLogging);\n // Include non-enumerable props that are not returned by getValidTelemetryProps\n return {\n ...taggableProps,\n stack: this.stack,\n message: this.message,\n errorInstanceId: this._errorInstanceId,\n };\n }\n}\n\n/** The Error class used when normalizing an external error */\nexport const NORMALIZED_ERROR_TYPE = \"genericError\";\nclass NormalizedLoggingError extends LoggingError {\n // errorType \"genericError\" is used as a default value throughout the code.\n // Note that this matches ContainerErrorType/DriverErrorType's genericError\n errorType = NORMALIZED_ERROR_TYPE;\n\n constructor(\n errorProps: Pick<IFluidErrorBase,\n | \"message\"\n | \"stack\"\n >,\n ) {\n super(errorProps.message);\n\n if (errorProps.stack !== undefined) {\n overwriteStack(this, errorProps.stack);\n }\n }\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -11,5 +11,6 @@ export * from "./logger";
11
11
  export * from "./mockLogger";
12
12
  export * from "./thresholdCounter";
13
13
  export * from "./utils";
14
+ export * from "./sampledTelemetryHelper";
14
15
  export { MonitoringContext, IConfigProviderBase, sessionStorageConfigProvider, mixinMonitoringContext, IConfigProvider, ConfigTypes, loggerToMonitoringContext, } from "./config";
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,yBAAyB,GAC5B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iCAAiC,CAAC;AAChD,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,yBAAyB,GAC5B,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ __exportStar(require("./logger"), exports);
24
24
  __exportStar(require("./mockLogger"), exports);
25
25
  __exportStar(require("./thresholdCounter"), exports);
26
26
  __exportStar(require("./utils"), exports);
27
+ __exportStar(require("./sampledTelemetryHelper"), exports);
27
28
  var config_1 = require("./config");
28
29
  Object.defineProperty(exports, "sessionStorageConfigProvider", { enumerable: true, get: function () { return config_1.sessionStorageConfigProvider; } });
29
30
  Object.defineProperty(exports, "mixinMonitoringContext", { enumerable: true, get: function () { return config_1.mixinMonitoringContext; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;;GAGG;AACH,gDAA8B;AAC9B,iDAA+B;AAC/B,kEAAgD;AAChD,2CAAyB;AACzB,mDAAiC;AACjC,2CAAyB;AACzB,+CAA6B;AAC7B,qDAAmC;AACnC,0CAAwB;AACxB,mCAQkB;AALd,sHAAA,4BAA4B,OAAA;AAC5B,gHAAA,sBAAsB,OAAA;AAGtB,mHAAA,yBAAyB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nexport * from \"./debugLogger\";\nexport * from \"./errorLogging\";\nexport * from \"./eventEmitterWithErrorHandling\";\nexport * from \"./events\";\nexport * from \"./fluidErrorBase\";\nexport * from \"./logger\";\nexport * from \"./mockLogger\";\nexport * from \"./thresholdCounter\";\nexport * from \"./utils\";\nexport {\n MonitoringContext,\n IConfigProviderBase,\n sessionStorageConfigProvider,\n mixinMonitoringContext,\n IConfigProvider,\n ConfigTypes,\n loggerToMonitoringContext,\n} from \"./config\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;;GAGG;AACH,gDAA8B;AAC9B,iDAA+B;AAC/B,kEAAgD;AAChD,2CAAyB;AACzB,mDAAiC;AACjC,2CAAyB;AACzB,+CAA6B;AAC7B,qDAAmC;AACnC,0CAAwB;AACxB,2DAAyC;AACzC,mCAQkB;AALd,sHAAA,4BAA4B,OAAA;AAC5B,gHAAA,sBAAsB,OAAA;AAGtB,mHAAA,yBAAyB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nexport * from \"./debugLogger\";\nexport * from \"./errorLogging\";\nexport * from \"./eventEmitterWithErrorHandling\";\nexport * from \"./events\";\nexport * from \"./fluidErrorBase\";\nexport * from \"./logger\";\nexport * from \"./mockLogger\";\nexport * from \"./thresholdCounter\";\nexport * from \"./utils\";\nexport * from \"./sampledTelemetryHelper\";\nexport {\n MonitoringContext,\n IConfigProviderBase,\n sessionStorageConfigProvider,\n mixinMonitoringContext,\n IConfigProvider,\n ConfigTypes,\n loggerToMonitoringContext,\n} from \"./config\";\n"]}
package/dist/logger.d.ts CHANGED
@@ -8,11 +8,6 @@ import { ITelemetryBaseEvent, ITelemetryBaseLogger, ITelemetryErrorEvent, ITelem
8
8
  * Please do not modify existing entries for backwards compatibility.
9
9
  */
10
10
  export declare enum TelemetryDataTag {
11
- /**
12
- * Data containing terms from code packages that may have been dynamically loaded
13
- * @deprecated 1.0, will be removed in next release (see issue #6603). Use `TelemetryDataTag.CodeArtifact` instead.
14
- */
15
- PackageData = "PackageData",
16
11
  /** Data containing terms or IDs from code packages that may have been dynamically loaded */
17
12
  CodeArtifact = "CodeArtifact",
18
13
  /** Personal data of a variety of classifications that pertains to the user */
@@ -111,7 +106,7 @@ export declare class ChildLogger extends TelemetryLogger {
111
106
  /**
112
107
  * Create child logger
113
108
  * @param baseLogger - Base logger to use to output events. If undefined, proper child logger
114
- * is created, but it does not sends telemetry events anywhere.
109
+ * is created, but it does not send telemetry events anywhere.
115
110
  * @param namespace - Telemetry event name prefix to add to all events
116
111
  * @param properties - Base properties to add to all events
117
112
  * @param propertyGetters - Getters to add additional properties to all events
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/dist/logger.js CHANGED
@@ -14,11 +14,6 @@ const errorLogging_1 = require("./errorLogging");
14
14
  */
15
15
  var TelemetryDataTag;
16
16
  (function (TelemetryDataTag) {
17
- /**
18
- * Data containing terms from code packages that may have been dynamically loaded
19
- * @deprecated 1.0, will be removed in next release (see issue #6603). Use `TelemetryDataTag.CodeArtifact` instead.
20
- */
21
- TelemetryDataTag["PackageData"] = "PackageData";
22
17
  /** Data containing terms or IDs from code packages that may have been dynamically loaded */
23
18
  TelemetryDataTag["CodeArtifact"] = "CodeArtifact";
24
19
  /** Personal data of a variety of classifications that pertains to the user */
@@ -189,8 +184,9 @@ class TaggedLoggerAdapter {
189
184
  // No tag means we can log plainly
190
185
  newEvent[key] = value;
191
186
  break;
192
- case TelemetryDataTag.PackageData:
193
- // For Microsoft applications, PackageData is safe for now
187
+ case "PackageData": // For back-compat
188
+ case TelemetryDataTag.CodeArtifact:
189
+ // For Microsoft applications, CodeArtifact is safe for now
194
190
  // (we don't load 3P code in 1P apps)
195
191
  newEvent[key] = value;
196
192
  break;
@@ -227,7 +223,7 @@ class ChildLogger extends TelemetryLogger {
227
223
  /**
228
224
  * Create child logger
229
225
  * @param baseLogger - Base logger to use to output events. If undefined, proper child logger
230
- * is created, but it does not sends telemetry events anywhere.
226
+ * is created, but it does not send telemetry events anywhere.
231
227
  * @param namespace - Telemetry event name prefix to add to all events
232
228
  * @param properties - Base properties to add to all events
233
229
  * @param propertyGetters - Getters to add additional properties to all events