@equinor/fusion-framework 9.0.6 → 9.1.0-next.1

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/README.md CHANGED
@@ -82,6 +82,30 @@ configurator.addConfig({ module: myCustomModule, configure: (b) => { /* … */ }
82
82
  const fusion = await init(configurator);
83
83
  ```
84
84
 
85
+ ### Diagnose HTTP transport failures
86
+
87
+ `FrameworkConfigurator` instruments the framework's HTTP clients with
88
+ `createHttpTelemetry` from `@equinor/fusion-framework-module-telemetry/integrations`.
89
+ Each actual fetch attempt produces one `fusion.http.request.duration` metric with a
90
+ `success`, `failure` (rejected fetch or non-2xx response) or `cancelled` (aborted signal)
91
+ outcome, and a failed attempt adds one sanitized `fusion.http.request.failure`. URLs,
92
+ headers, bodies, tokens and original errors are never recorded.
93
+
94
+ The middleware is appended after every configuration callback, so retry middleware you
95
+ register wraps it and every retry is its own attempt. Timing ends when `fetch` resolves,
96
+ not when a streamed body finishes. Token acquisition is reported separately by the auth
97
+ module, and service discovery by its own records. Telemetry is connected after
98
+ initialization, so requests made while modules initialize are not recorded. Exporter
99
+ requests marked with `markTelemetryExportRequest` are excluded, and a client configured
100
+ with its own `middlewareHandler` is not instrumented. No exporter is created.
101
+
102
+ ```ts
103
+ // Opt out of framework HTTP diagnostics; other operational telemetry is unchanged.
104
+ const configurator = new FrameworkConfigurator({ httpTelemetry: false });
105
+ ```
106
+
107
+ App modules configure their own HTTP module, which this setting does not instrument.
108
+
85
109
  ## Built-in modules
86
110
 
87
111
  The framework ships with the following modules enabled by default:
@@ -1,11 +1,12 @@
1
- import { ModulesConfigurator } from '@equinor/fusion-framework-module';
1
+ import { ModulesConfigurator, } from '@equinor/fusion-framework-module';
2
2
  import event from '@equinor/fusion-framework-module-event';
3
3
  import http, { configureHttpClient, configureHttp, } from '@equinor/fusion-framework-module-http';
4
4
  import auth from '@equinor/fusion-framework-module-msal';
5
5
  import context from '@equinor/fusion-framework-module-context';
6
6
  import disco from '@equinor/fusion-framework-module-service-discovery';
7
7
  import services from '@equinor/fusion-framework-module-services';
8
- import telemetry, { enableTelemetry } from '@equinor/fusion-framework-module-telemetry';
8
+ import telemetry, { enableTelemetry, StartupCapture, TelemetryConfigurator, } from '@equinor/fusion-framework-module-telemetry';
9
+ import { connectHttpTelemetry } from './connect-http-telemetry.js';
9
10
  import { version } from './version.js';
10
11
  /**
11
12
  * Configurator that registers and wires the core Fusion Framework modules.
@@ -52,6 +53,7 @@ export class FrameworkConfigurator extends ModulesConfigurator {
52
53
  * Initializes the framework with core modules (event, auth, http, service discovery,
53
54
  * services, context, and telemetry) and sets up default telemetry that includes
54
55
  * framework version metadata and 'framework' scope for all telemetry events.
56
+ * @param options - Optional host setup; see {@link FrameworkConfiguratorOptions}.
55
57
  *
56
58
  * @example
57
59
  * ```typescript
@@ -59,22 +61,50 @@ export class FrameworkConfigurator extends ModulesConfigurator {
59
61
  * // Now ready to configure additional modules
60
62
  * ```
61
63
  */
62
- constructor() {
64
+ constructor(options) {
63
65
  super([event, auth, http, disco, services, context, telemetry]);
64
- // default configuration
65
- enableTelemetry(this, {
66
- configure: (builder) => {
67
- builder.setMetadata({
68
- fusion: {
69
- type: 'framework-telemetry',
70
- framework: {
71
- version,
72
- },
73
- },
74
- });
75
- builder.setDefaultScope(['framework']);
66
+ const source = { source: 'framework', hostId: crypto.randomUUID() };
67
+ // Capture startup before any configuration code runs; the framework is the root host.
68
+ const capture = new StartupCapture(this, { source });
69
+ const builder = (options?.telemetry ?? new TelemetryConfigurator())
70
+ .setSource(source)
71
+ .setMetadata({
72
+ fusion: {
73
+ type: 'framework-telemetry',
74
+ framework: {
75
+ version,
76
+ },
76
77
  },
78
+ })
79
+ .setDefaultScope(['framework'])
80
+ .attachLifecycleItems(capture.items);
81
+ this.addConfig({
82
+ module: telemetry,
83
+ configurator: builder,
77
84
  });
85
+ // Explicit opt-out only; HTTP telemetry never creates an exporter by itself.
86
+ if (options?.httpTelemetry !== false) {
87
+ this.#httpTelemetry = connectHttpTelemetry(this);
88
+ }
89
+ }
90
+ /** Framework HTTP telemetry, installed once every configuration callback has settled. */
91
+ #httpTelemetry;
92
+ /**
93
+ * Configures modules, then installs HTTP telemetry as the innermost middleware.
94
+ *
95
+ * Post-configure callbacks run concurrently, so installing after the whole configure phase
96
+ * is the only point where every application middleware, including retry middleware added
97
+ * from asynchronous callbacks, is already registered.
98
+ *
99
+ * @param ref - Optional reference forwarded to module configuration.
100
+ * @returns The final module configuration map.
101
+ * @template T - Additional modules included in the configuration type.
102
+ * @template R - Reference type forwarded to module configuration.
103
+ */
104
+ async _configure(ref) {
105
+ const config = await super._configure(ref);
106
+ this.#httpTelemetry?.install(config);
107
+ return config;
78
108
  }
79
109
  /**
80
110
  * Configures the global HTTP module settings such as base URLs, default headers,
@@ -1 +1 @@
1
- {"version":3,"file":"FrameworkConfigurator.js","sourceRoot":"","sources":["../../src/FrameworkConfigurator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvF,OAAO,KAAK,MAAM,wCAAwC,CAAC;AAE3D,OAAO,IAAI,EAAE,EACX,mBAAmB,EACnB,aAAa,GAEd,MAAM,uCAAuC,CAAC;AAG/C,OAAO,IAA2B,MAAM,uCAAuC,CAAC;AAEhF,OAAO,OAAO,MAAM,0CAA0C,CAAC;AAE/D,OAAO,KAAK,MAAM,oDAAoD,CAAC;AACvE,OAAO,QAAQ,MAAM,2CAA2C,CAAC;AACjE,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAIxF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,qBAIX,SAAQ,mBAAkD;IAC1D;;;OAGG;IACH,MAAM,CAAU,SAAS,GAAW,uBAAuB,CAAC;IAE5D;;;;;;;;;;;;OAYG;IACH;QACE,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAEhE,wBAAwB;QACxB,eAAe,CAAC,IAAI,EAAE;YACpB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,OAAO,CAAC,WAAW,CAAC;oBAClB,MAAM,EAAE;wBACN,IAAI,EAAE,qBAAqB;wBAC3B,SAAS,EAAE;4BACT,OAAO;yBACR;qBACF;iBACF,CAAC,CAAC;gBACH,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACzC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACI,aAAa,CAAC,GAAG,IAAsC;QAC5D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACI,mBAAmB,CAAC,GAAG,IAA4C;QACxE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACI,aAAa,CAAC,YAA6C,EAAE,YAAY,GAAG,IAAI;QACrF,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,iFAAiF;gBACjF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;gBACD,sDAAsD;gBACtD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;oBACvC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBACD,+DAA+D;gBAC/D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,yBAAyB,CAAC,IAAmD;QAClF,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACI,kBAAkB,CAAC,EAAyC;QACjE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"FrameworkConfigurator.js","sourceRoot":"","sources":["../../src/FrameworkConfigurator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { markTelemetryExportRequest, telemetryExportRequest, } from '@equinor/fusion-framework-module';
3
+ import { enableTelemetry } from '@equinor/fusion-framework-module-telemetry';
4
+ import { mockFramework } from '../mock/mock-framework.js';
5
+ const sentinel = 'privacy-sentinel-3f9c';
6
+ /** Retries once on 503, standing in for application retry middleware. */
7
+ const retry = async (uri, init, next) => {
8
+ const response = await next(uri, init);
9
+ return response.status === 503 ? next(uri, init) : response;
10
+ };
11
+ /**
12
+ * Starts a framework whose test adapter collects every exported operational HTTP record.
13
+ * @param register - Where the application registers its retry middleware.
14
+ */
15
+ const setup = async (register = 'configure') => {
16
+ const items = [];
17
+ const fusion = await mockFramework((config) => {
18
+ enableTelemetry(config, {
19
+ configure: (builder) => {
20
+ builder.setAdapter('test', {
21
+ initialize: vi.fn(),
22
+ processItem: (item) => {
23
+ items.push(item);
24
+ },
25
+ });
26
+ },
27
+ });
28
+ config.configureHttpClient('remote', { baseUri: `https://${sentinel}.example.com` });
29
+ config.configureHttpClient('secured', {
30
+ baseUri: `https://${sentinel}.example.com`,
31
+ defaultScopes: ['api://telemetry/.default'],
32
+ });
33
+ // Application retry middleware wraps the instrumentation wherever it is registered.
34
+ if (register === 'configure') {
35
+ config.http.addMiddleware(retry);
36
+ }
37
+ else {
38
+ config.onConfigured(async (configs) => {
39
+ // Settling later than the framework's own callbacks must not change the order.
40
+ await new Promise((resolve) => setTimeout(resolve, 0));
41
+ configs.http.addMiddleware(retry);
42
+ });
43
+ }
44
+ });
45
+ return {
46
+ fusion,
47
+ http: () => items.filter((item) => item.name.startsWith('fusion.http.request.')),
48
+ };
49
+ };
50
+ describe('framework HTTP telemetry', () => {
51
+ afterEach(() => {
52
+ vi.unstubAllGlobals();
53
+ });
54
+ it('records each retried transport attempt once, with one sanitized failure', async () => {
55
+ const fetch = vi
56
+ .fn()
57
+ .mockResolvedValueOnce(new Response(sentinel, { status: 503 }))
58
+ .mockResolvedValueOnce(new Response(JSON.stringify({ sentinel }), { status: 200 }));
59
+ vi.stubGlobal('fetch', fetch);
60
+ const { fusion, http } = await setup();
61
+ const client = fusion.modules.http.createClient('remote');
62
+ const response = await client.fetch(`/items?token=${sentinel}`, {
63
+ method: 'POST',
64
+ headers: { authorization: `Bearer ${sentinel}` },
65
+ body: sentinel,
66
+ });
67
+ // The business response is returned unchanged after the retry.
68
+ expect(response.status).toBe(200);
69
+ expect(await response.json()).toEqual({ sentinel });
70
+ expect(fetch).toHaveBeenCalledTimes(2);
71
+ await vi.waitFor(() => expect(http()).toHaveLength(3));
72
+ const durations = http().filter((item) => item.name === 'fusion.http.request.duration');
73
+ expect(durations.map((item) => item.diagnostic?.outcome)).toEqual(['failure', 'success']);
74
+ expect(http().filter((item) => item.name === 'fusion.http.request.failure')).toHaveLength(1);
75
+ expect(durations[0].diagnostic).toMatchObject({ source: 'framework', module: 'http' });
76
+ expect(JSON.stringify(http())).not.toContain(sentinel);
77
+ await fusion.modules.dispose();
78
+ });
79
+ it('keeps telemetry innermost when retry middleware is added by a later async callback', async () => {
80
+ const fetch = vi
81
+ .fn()
82
+ .mockResolvedValueOnce(new Response(null, { status: 503 }))
83
+ .mockResolvedValueOnce(new Response(null, { status: 200 }));
84
+ vi.stubGlobal('fetch', fetch);
85
+ const { fusion, http } = await setup('async-on-configured');
86
+ await fusion.modules.http.createClient('remote').fetch('/items');
87
+ expect(fetch).toHaveBeenCalledTimes(2);
88
+ await vi.waitFor(() => expect(http()
89
+ .filter((item) => item.name === 'fusion.http.request.duration')
90
+ .map((item) => item.diagnostic?.outcome)).toEqual(['failure', 'success']));
91
+ await fusion.modules.dispose();
92
+ });
93
+ it('classifies an aborted request as cancelled and rethrows the original error', async () => {
94
+ const abort = new DOMException('aborted', 'AbortError');
95
+ vi.stubGlobal('fetch', vi.fn().mockRejectedValue(abort));
96
+ const { fusion, http } = await setup();
97
+ const controller = new AbortController();
98
+ controller.abort();
99
+ await expect(fusion.modules.http.createClient('remote').fetch('/items', { signal: controller.signal })).rejects.toBe(abort);
100
+ await vi.waitFor(() => expect(http()).toHaveLength(1));
101
+ expect(http()[0]).toMatchObject({
102
+ name: 'fusion.http.request.duration',
103
+ diagnostic: { outcome: 'cancelled' },
104
+ });
105
+ await fusion.modules.dispose();
106
+ });
107
+ it('excludes exporter-owned requests and stops recording after disposal', async () => {
108
+ const fetch = vi.fn(async () => new Response('ok'));
109
+ vi.stubGlobal('fetch', fetch);
110
+ const { fusion, http } = await setup();
111
+ const client = fusion.modules.http.createClient('remote');
112
+ await client.fetch('/v1/logs', markTelemetryExportRequest({ method: 'POST' }));
113
+ expect(fetch).toHaveBeenCalledTimes(1);
114
+ expect(http()).toHaveLength(0);
115
+ await fusion.modules.dispose();
116
+ await client.fetch('/after-dispose');
117
+ expect(fetch).toHaveBeenCalledTimes(2);
118
+ expect(http()).toHaveLength(0);
119
+ });
120
+ it('forwards the export marker to token acquisition for authenticated exports only', async () => {
121
+ vi.stubGlobal('fetch', vi.fn(async () => new Response('ok')));
122
+ const { fusion } = await setup();
123
+ const acquire = vi.spyOn(fusion.modules.auth, 'acquireAccessToken');
124
+ const client = fusion.modules.http.createClient('secured');
125
+ await client.fetch('/v1/logs', markTelemetryExportRequest({ method: 'POST' }));
126
+ await client.fetch('/items');
127
+ expect(acquire).toHaveBeenCalledTimes(2);
128
+ const [exported, application] = acquire.mock.calls.map(([options]) => options);
129
+ // Only the exporter's token request is owned by telemetry delivery.
130
+ expect(telemetryExportRequest in exported).toBe(true);
131
+ expect(telemetryExportRequest in application).toBe(false);
132
+ expect(exported).toMatchObject({ request: { scopes: ['api://telemetry/.default'] } });
133
+ await fusion.modules.dispose();
134
+ });
135
+ });
136
+ //# sourceMappingURL=http-telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-telemetry.test.js","sourceRoot":"","sources":["../../../src/__tests__/http-telemetry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { enableTelemetry } from '@equinor/fusion-framework-module-telemetry';
3
+ import { mockFramework } from '../mock/mock-framework.js';
4
+ describe('framework host telemetry', () => {
5
+ it('captures one host origin and terminal initialization/disposal without implicit exporters', async () => {
6
+ const processItem = vi.fn();
7
+ const fusion = await mockFramework((config) => {
8
+ enableTelemetry(config, {
9
+ configure: (builder) => {
10
+ builder.setAdapter('test', { initialize: vi.fn(), processItem });
11
+ },
12
+ });
13
+ });
14
+ const initialized = processItem.mock.calls.filter(([item]) => item.name === 'fusion.host.initialize.duration');
15
+ expect(initialized).toHaveLength(1);
16
+ expect(initialized[0][0].diagnostic).toMatchObject({
17
+ source: 'framework',
18
+ hostId: expect.any(String),
19
+ });
20
+ await fusion.modules.dispose();
21
+ const disposed = processItem.mock.calls.filter(([item]) => item.name === 'fusion.host.dispose.duration');
22
+ expect(disposed).toHaveLength(1);
23
+ expect(disposed[0][0].diagnostic.hostId).toBe(initialized[0][0].diagnostic.hostId);
24
+ });
25
+ });
26
+ //# sourceMappingURL=telemetry-host.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-host.test.js","sourceRoot":"","sources":["../../../src/__tests__/telemetry-host.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5C,eAAe,CAAC,MAAM,EAAE;gBACtB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;oBACrB,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBACnE,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAC/C,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iCAAiC,CAC5D,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC;YACjD,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAC5C,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,8BAA8B,CACzD,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { createHttpTelemetry } from '@equinor/fusion-framework-module-telemetry/integrations';
2
+ /**
3
+ * Instruments every HTTP client the host's HTTP module builds with transport-attempt telemetry.
4
+ *
5
+ * The owning host calls {@link HostHttpTelemetry.install} after its configure phase has
6
+ * settled, making this the innermost configurator-level middleware: retry or caching
7
+ * middleware registered by applications, including from asynchronous post-configure
8
+ * callbacks, wraps it, and each actual fetch attempt produces one
9
+ * `fusion.http.request.duration` record. Clients configured with their own
10
+ * `middlewareHandler` replace the configurator middleware and are not instrumented.
11
+ *
12
+ * Telemetry is resolved after initialization through a plugin, so HTTP never waits for
13
+ * telemetry and requests issued while modules initialize are not recorded. The plugin
14
+ * teardown detaches instrumentation before modules dispose, without aborting requests.
15
+ *
16
+ * @param configurator - Host configurator owning the HTTP and telemetry modules.
17
+ * @returns The installer the host calls once configuration has settled.
18
+ * @template TModules - Modules registered on the host configurator.
19
+ * @template TRef - Reference type forwarded to module initialization.
20
+ */
21
+ export function connectHttpTelemetry(configurator) {
22
+ let telemetry;
23
+ const diagnostics = createHttpTelemetry(() => telemetry);
24
+ configurator.registerPlugin(({ modules }) => {
25
+ telemetry = modules.telemetry;
26
+ return () => {
27
+ diagnostics.dispose();
28
+ telemetry = undefined;
29
+ };
30
+ });
31
+ return {
32
+ install: (config) => {
33
+ const http = config.http;
34
+ // A host without an HTTP module has no transport to observe.
35
+ http?.addMiddleware(diagnostics.middleware);
36
+ },
37
+ };
38
+ }
39
+ export default connectHttpTelemetry;
40
+ //# sourceMappingURL=connect-http-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-http-telemetry.js","sourceRoot":"","sources":["../../src/connect-http-telemetry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yDAAyD,CAAC;AAa9F;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAiD;IAEjD,IAAI,SAAyC,CAAC;IAC9C,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzD,YAAY,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,SAAS,GAAI,OAA8C,CAAC,SAAS,CAAC;QACtE,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,SAAS,GAAG,SAAS,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;YAClB,MAAM,IAAI,GAAI,MAA6C,CAAC,IAAI,CAAC;YACjE,6DAA6D;YAC7D,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,OAAO,EACL,qBAAqB;AACrB;;GAEG;AACH,qBAAqB,IAAI,kBAAkB,GAC5C,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,OAAO,EACL,qBAAqB;AACrB;;GAEG;AACH,qBAAqB,IAAI,kBAAkB,GAC5C,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
@@ -3,7 +3,7 @@ import { module as httpModule, } from '@equinor/fusion-framework-module-http';
3
3
  import { msalMockModule, } from '@equinor/fusion-framework-module-msal/mock';
4
4
  import { serviceDiscoveryMockModule, } from '@equinor/fusion-framework-module-service-discovery/mock';
5
5
  import servicesModule from '@equinor/fusion-framework-module-services';
6
- import { telemetryMockModule, } from '@equinor/fusion-framework-module-telemetry/mock';
6
+ import { telemetryMockModule, TelemetryMockConfigurator, } from '@equinor/fusion-framework-module-telemetry/mock';
7
7
  import { FrameworkConfigurator } from '../FrameworkConfigurator.js';
8
8
  /**
9
9
  * The real framework configurator, with every built-in module that reaches
@@ -63,7 +63,8 @@ export class FrameworkMockConfigurator extends FrameworkConfigurator {
63
63
  * Creates a framework configurator backed by the built-in mock modules.
64
64
  */
65
65
  constructor() {
66
- super();
66
+ const telemetry = new TelemetryMockConfigurator();
67
+ super({ telemetry });
67
68
  // Pinning up front — rather than waiting for an accessor to be read — is
68
69
  // what replaces the modules `FrameworkConfigurator`'s own constructor
69
70
  // already registered, whether or not a test ever touches the accessor.
@@ -72,7 +73,7 @@ export class FrameworkMockConfigurator extends FrameworkConfigurator {
72
73
  this._pin(httpModule);
73
74
  this._pin(servicesModule);
74
75
  this._pin(contextMockModule);
75
- this._pin(telemetryMockModule);
76
+ this.#configurators.set(telemetryMockModule.name, telemetry);
76
77
  }
77
78
  /**
78
79
  * Pins a module to a single configurator instance for the lifetime of this
@@ -81,9 +82,8 @@ export class FrameworkMockConfigurator extends FrameworkConfigurator {
81
82
  * @remarks
82
83
  * The module system otherwise builds a fresh configurator from its own
83
84
  * `configure` factory during the configure phase — too late for a test to
84
- * reach, and a new instance on every call besides. This replaces that
85
- * factory with one that always returns the same instance, and registers the
86
- * result under the module's own name.
85
+ * reach, and a new instance on every call besides. Prepared registration
86
+ * supplies that exact builder without replacing the module's factory.
87
87
  *
88
88
  * A subclass registering a module supplied through {@link TModules} uses
89
89
  * this the same way `.msal` and `.serviceDiscovery` do, to expose its own
@@ -120,7 +120,7 @@ export class FrameworkMockConfigurator extends FrameworkConfigurator {
120
120
  throw new Error(`Cannot pin "${module.name}": its configure factory returns a promise, so it cannot be resolved synchronously.`);
121
121
  }
122
122
  this.#configurators.set(module.name, instance);
123
- this.addConfig({ module: { ...module, configure: () => instance } });
123
+ this.addConfig({ module, configurator: instance });
124
124
  }
125
125
  /**
126
126
  * Returns the configurator pinned for a module by name.
@@ -1 +1 @@
1
- {"version":3,"file":"FrameworkMockConfigurator.js","sourceRoot":"","sources":["../../../src/mock/FrameworkMockConfigurator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FrameworkMockConfigurator.js","sourceRoot":"","sources":["../../../src/mock/FrameworkMockConfigurator.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '9.0.6';
2
+ export const version = '9.1.0-next.1';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAG,cAAc,CAAC"}