@metamask-previews/assets-controller 11.2.1-preview-6cd1bb2f5 → 11.3.0-preview-2296abeaf

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.
@@ -0,0 +1,115 @@
1
+ const DEFAULT_TAGS = {
2
+ controller: 'AssetsController',
3
+ };
4
+ /**
5
+ * Build request tags / startTime for MetaMask's Sentry adapter.
6
+ * Numeric `data` fields become tags (measurements); `duration_ms` backdates start.
7
+ *
8
+ * @param data - Span data attributes.
9
+ * @param tags - Caller tags.
10
+ * @param startTime - Optional explicit start override.
11
+ * @returns tags and optional startTime for the TraceRequest.
12
+ */
13
+ function buildTraceTiming(data, tags, startTime) {
14
+ const numericFromData = {};
15
+ for (const [key, value] of Object.entries(data)) {
16
+ if (typeof value === 'number') {
17
+ numericFromData[key] = value;
18
+ }
19
+ }
20
+ const requestTags = {
21
+ ...tags,
22
+ ...numericFromData,
23
+ };
24
+ if (startTime !== undefined) {
25
+ return { tags: requestTags, startTime };
26
+ }
27
+ const durationMs = typeof data.duration_ms === 'number' ? data.duration_ms : undefined;
28
+ if (durationMs === undefined) {
29
+ return { tags: requestTags };
30
+ }
31
+ return {
32
+ tags: requestTags,
33
+ startTime: performance.timeOrigin + performance.now() - durationMs,
34
+ };
35
+ }
36
+ /**
37
+ * Fire-and-forget Sentry span. Swallows errors so telemetry never breaks callers.
38
+ * Pass `parentContext` to nest as a subspan. Omit `trace` to skip emission.
39
+ *
40
+ * @param params - Span configuration.
41
+ * @param params.name - Trace / span name visible in Sentry.
42
+ * @param params.trace - Optional client trace callback; omit to no-op.
43
+ * @param params.data - Key-value pairs attached as span data.
44
+ * @param params.tags - Key-value pairs used for Sentry filtering.
45
+ * @param params.parentContext - Optional parent span context for nesting.
46
+ * @param params.startTime - Optional explicit start; else derived from `duration_ms`.
47
+ */
48
+ export function emitTrace({ name, trace, data, tags = DEFAULT_TAGS, parentContext, startTime: startTimeOverride, }) {
49
+ if (!trace) {
50
+ return;
51
+ }
52
+ const { tags: requestTags, startTime } = buildTraceTiming(data, tags, startTimeOverride);
53
+ trace({
54
+ name,
55
+ data,
56
+ tags: requestTags,
57
+ parentContext,
58
+ ...(startTime === undefined ? {} : { startTime }),
59
+ }, () => undefined)?.catch(() => {
60
+ // Telemetry failure must not break.
61
+ });
62
+ }
63
+ /**
64
+ * Run work inside a parent Sentry span and pass its context for nested
65
+ * {@link emitTrace} subspans.
66
+ *
67
+ * When `trace` is omitted, runs `fn(undefined)` with no span.
68
+ * Telemetry failures are swallowed; errors from `fn` still propagate.
69
+ *
70
+ * @param params - Parent span config and work callback.
71
+ * @param params.name - Parent span name.
72
+ * @param params.trace - Optional client trace callback; omit to skip wrapping.
73
+ * @param params.data - Key-value pairs attached as span data.
74
+ * @param params.fn - Work to run; receives the parent span context.
75
+ * @param params.tags - Key-value pairs used for Sentry filtering.
76
+ * @param params.startTime - Optional explicit start; else derived from `duration_ms`.
77
+ * @returns The result of `fn`.
78
+ */
79
+ export async function withTrace({ name, trace, data, fn, tags = DEFAULT_TAGS, startTime: startTimeOverride, }) {
80
+ if (!trace) {
81
+ return fn(undefined);
82
+ }
83
+ const { tags: requestTags, startTime } = buildTraceTiming(data, tags, startTimeOverride);
84
+ let workResult;
85
+ try {
86
+ await trace({
87
+ name,
88
+ data,
89
+ tags: requestTags,
90
+ ...(startTime === undefined ? {} : { startTime }),
91
+ }, async (parentContext) => {
92
+ try {
93
+ const value = await fn(parentContext);
94
+ workResult = { ok: true, value };
95
+ return value;
96
+ }
97
+ catch (error) {
98
+ workResult = { ok: false, error };
99
+ throw error;
100
+ }
101
+ });
102
+ }
103
+ catch {
104
+ // Telemetry failure must not break — unless the work itself failed.
105
+ }
106
+ if (workResult === undefined) {
107
+ // `trace` failed before invoking `fn` (or never called it).
108
+ return fn(undefined);
109
+ }
110
+ if (workResult.ok) {
111
+ return workResult.value;
112
+ }
113
+ throw workResult.error;
114
+ }
115
+ //# sourceMappingURL=trace.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.mjs","sourceRoot":"","sources":["../../src/utils/trace.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TraceCallback, TraceContext } from '@metamask/controller-utils';\n\nconst DEFAULT_TAGS: Record<string, number | string | boolean> = {\n controller: 'AssetsController',\n};\n\nexport type TraceSpanData = Record<string, number | string | boolean>;\n\nexport type EmitTraceParams = {\n name: string;\n /** When omitted / undefined, this is a no-op (bake call-site gating here). */\n trace?: TraceCallback;\n data: TraceSpanData;\n tags?: TraceSpanData;\n parentContext?: TraceContext;\n /** Override span start; otherwise derived from `data.duration_ms` when present. */\n startTime?: number;\n};\n\nexport type WithTraceParams<Result> = {\n name: string;\n /** When omitted / undefined, `fn` runs with no parent context. */\n trace?: TraceCallback;\n data: TraceSpanData;\n fn: (parentContext?: TraceContext) => Promise<Result>;\n tags?: TraceSpanData;\n startTime?: number;\n};\n\n/**\n * Build request tags / startTime for MetaMask's Sentry adapter.\n * Numeric `data` fields become tags (measurements); `duration_ms` backdates start.\n *\n * @param data - Span data attributes.\n * @param tags - Caller tags.\n * @param startTime - Optional explicit start override.\n * @returns tags and optional startTime for the TraceRequest.\n */\nfunction buildTraceTiming(\n data: TraceSpanData,\n tags: TraceSpanData,\n startTime?: number,\n): { tags: TraceSpanData; startTime?: number } {\n const numericFromData: Record<string, number> = {};\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'number') {\n numericFromData[key] = value;\n }\n }\n const requestTags = {\n ...tags,\n ...numericFromData,\n };\n\n if (startTime !== undefined) {\n return { tags: requestTags, startTime };\n }\n\n const durationMs =\n typeof data.duration_ms === 'number' ? data.duration_ms : undefined;\n if (durationMs === undefined) {\n return { tags: requestTags };\n }\n\n return {\n tags: requestTags,\n startTime: performance.timeOrigin + performance.now() - durationMs,\n };\n}\n\n/**\n * Fire-and-forget Sentry span. Swallows errors so telemetry never breaks callers.\n * Pass `parentContext` to nest as a subspan. Omit `trace` to skip emission.\n *\n * @param params - Span configuration.\n * @param params.name - Trace / span name visible in Sentry.\n * @param params.trace - Optional client trace callback; omit to no-op.\n * @param params.data - Key-value pairs attached as span data.\n * @param params.tags - Key-value pairs used for Sentry filtering.\n * @param params.parentContext - Optional parent span context for nesting.\n * @param params.startTime - Optional explicit start; else derived from `duration_ms`.\n */\nexport function emitTrace({\n name,\n trace,\n data,\n tags = DEFAULT_TAGS,\n parentContext,\n startTime: startTimeOverride,\n}: EmitTraceParams): void {\n if (!trace) {\n return;\n }\n\n const { tags: requestTags, startTime } = buildTraceTiming(\n data,\n tags,\n startTimeOverride,\n );\n\n trace(\n {\n name,\n data,\n tags: requestTags,\n parentContext,\n ...(startTime === undefined ? {} : { startTime }),\n },\n () => undefined,\n )?.catch(() => {\n // Telemetry failure must not break.\n });\n}\n\n/**\n * Run work inside a parent Sentry span and pass its context for nested\n * {@link emitTrace} subspans.\n *\n * When `trace` is omitted, runs `fn(undefined)` with no span.\n * Telemetry failures are swallowed; errors from `fn` still propagate.\n *\n * @param params - Parent span config and work callback.\n * @param params.name - Parent span name.\n * @param params.trace - Optional client trace callback; omit to skip wrapping.\n * @param params.data - Key-value pairs attached as span data.\n * @param params.fn - Work to run; receives the parent span context.\n * @param params.tags - Key-value pairs used for Sentry filtering.\n * @param params.startTime - Optional explicit start; else derived from `duration_ms`.\n * @returns The result of `fn`.\n */\nexport async function withTrace<Result>({\n name,\n trace,\n data,\n fn,\n tags = DEFAULT_TAGS,\n startTime: startTimeOverride,\n}: WithTraceParams<Result>): Promise<Result> {\n if (!trace) {\n return fn(undefined);\n }\n\n const { tags: requestTags, startTime } = buildTraceTiming(\n data,\n tags,\n startTimeOverride,\n );\n\n let workResult:\n | { ok: true; value: Result }\n | { ok: false; error: unknown }\n | undefined;\n\n try {\n await trace(\n {\n name,\n data,\n tags: requestTags,\n ...(startTime === undefined ? {} : { startTime }),\n },\n async (parentContext) => {\n try {\n const value = await fn(parentContext);\n workResult = { ok: true, value };\n return value;\n } catch (error) {\n workResult = { ok: false, error };\n throw error;\n }\n },\n );\n } catch {\n // Telemetry failure must not break — unless the work itself failed.\n }\n\n if (workResult === undefined) {\n // `trace` failed before invoking `fn` (or never called it).\n return fn(undefined);\n }\n if (workResult.ok) {\n return workResult.value;\n }\n throw workResult.error;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/assets-controller",
3
- "version": "11.2.1-preview-6cd1bb2f5",
3
+ "version": "11.3.0-preview-2296abeaf",
4
4
  "description": "Tracks assets balances/prices and handles token detection across all digital assets",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -60,15 +60,15 @@
60
60
  "@ethersproject/providers": "^5.7.0",
61
61
  "@metamask/account-tree-controller": "^7.5.5",
62
62
  "@metamask/accounts-controller": "^39.0.5",
63
- "@metamask/assets-controllers": "^110.0.0",
63
+ "@metamask/assets-controllers": "^110.0.1",
64
64
  "@metamask/base-controller": "^9.1.0",
65
65
  "@metamask/client-controller": "^1.0.1",
66
66
  "@metamask/controller-utils": "^12.3.0",
67
- "@metamask/core-backend": "^7.0.0",
68
- "@metamask/keyring-api": "^23.5.0",
67
+ "@metamask/core-backend": "^8.0.0",
68
+ "@metamask/keyring-api": "^23.7.0",
69
69
  "@metamask/keyring-controller": "^27.1.0",
70
- "@metamask/keyring-internal-api": "^11.0.1",
71
- "@metamask/keyring-snap-client": "^9.2.0",
70
+ "@metamask/keyring-internal-api": "^11.0.2",
71
+ "@metamask/keyring-snap-client": "^9.2.1",
72
72
  "@metamask/messenger": "^2.0.0",
73
73
  "@metamask/network-controller": "^34.0.0",
74
74
  "@metamask/network-enablement-controller": "^5.6.0",
@@ -79,7 +79,7 @@
79
79
  "@metamask/remote-feature-flag-controller": "^4.2.2",
80
80
  "@metamask/snaps-controllers": "^19.0.0",
81
81
  "@metamask/snaps-utils": "^12.1.2",
82
- "@metamask/transaction-controller": "^69.2.1",
82
+ "@metamask/transaction-controller": "^69.3.0",
83
83
  "@metamask/utils": "^11.11.0",
84
84
  "async-mutex": "^0.5.0",
85
85
  "bignumber.js": "^9.1.2",