Skip to content

Commit 259c830

Browse files
grypezclaude
andcommitted
feat(wallet)!: wire LoggingController into default initialization
Wire `LoggingController` into the default wallet initialization so that `LoggingController:getState`, `LoggingController:add`, and `LoggingController:clear` are exposed on the shared messenger bus. The controller's construction is identical across extension and mobile — it takes only `messenger` and `state` and delegates no external actions/events — so no injectable `instanceOptions` are required. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 2dd6aeb commit 259c830

11 files changed

Lines changed: 181 additions & 1 deletion

File tree

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
/packages/wallet/src/initialization/instances/approval-controller/ @MetaMask/confirmations
144144
/packages/wallet/src/initialization/instances/connectivity-controller/ @MetaMask/core-platform
145145
/packages/wallet/src/initialization/instances/keyring-controller/ @MetaMask/accounts-engineers @MetaMask/core-platform
146+
/packages/wallet/src/initialization/instances/logging-controller/ @MetaMask/confirmations
146147
/packages/wallet/src/initialization/instances/remote-feature-flag-controller/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform
147148
/packages/wallet/src/initialization/instances/storage-service/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform
148149

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ linkStyle default opacity:0.5
620620
wallet --> connectivity_controller;
621621
wallet --> controller_utils;
622622
wallet --> keyring_controller;
623+
wallet --> logging_controller;
623624
wallet --> messenger;
624625
wallet --> network_controller;
625626
wallet --> remote_feature_flag_controller;

packages/wallet/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- **BREAKING:** Wire `LoggingController` into the default wallet initialization ([#9357](https://github.com/MetaMask/core/pull/9357))
13+
1014
## [6.0.0]
1115

1216
### Added

packages/wallet/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"@metamask/connectivity-controller": "^0.2.0",
6262
"@metamask/controller-utils": "^12.3.0",
6363
"@metamask/keyring-controller": "^27.1.0",
64+
"@metamask/logging-controller": "^8.0.2",
6465
"@metamask/messenger": "^1.2.0",
6566
"@metamask/network-controller": "^34.0.0",
6667
"@metamask/remote-feature-flag-controller": "^4.2.2",

packages/wallet/src/Wallet.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getDefaultAddressBookControllerState } from '@metamask/address-book-controller';
22
import { CONNECTIVITY_STATUSES } from '@metamask/connectivity-controller';
3+
import { LogType } from '@metamask/logging-controller';
34
import { Messenger } from '@metamask/messenger';
45
import { InMemoryStorageAdapter } from '@metamask/storage-service';
56
import { Json } from '@metamask/utils';
@@ -319,6 +320,63 @@ describe('Wallet', () => {
319320
});
320321
});
321322

323+
describe('LoggingController', () => {
324+
it('is wired and exposes its state on the wallet messenger', async () => {
325+
const wallet = await setupWallet();
326+
const { messenger } = wallet;
327+
328+
expect(messenger.call('LoggingController:getState')).toStrictEqual({
329+
logs: {},
330+
});
331+
});
332+
333+
it('applies initial state passed through the Wallet constructor', () => {
334+
const entry = {
335+
id: 'test-id',
336+
timestamp: 0,
337+
log: { type: LogType.GenericLog, data: { message: 'hello' } },
338+
};
339+
340+
const wallet = new Wallet({
341+
state: {
342+
LoggingController: {
343+
logs: { 'test-id': entry },
344+
},
345+
},
346+
instanceOptions: {
347+
connectivityController: {
348+
connectivityAdapter: new AlwaysOnlineAdapter(),
349+
},
350+
networkController: {
351+
infuraProjectId: 'fake-infura-project-id',
352+
},
353+
storageService: {
354+
storage: new InMemoryStorageAdapter(),
355+
},
356+
remoteFeatureFlagController: REMOTE_FEATURE_FLAG_OPTIONS,
357+
},
358+
});
359+
360+
expect(wallet.state.LoggingController.logs['test-id']).toStrictEqual(
361+
entry,
362+
);
363+
});
364+
365+
it('routes its method actions through the wallet messenger', async () => {
366+
const wallet = await setupWallet();
367+
const { messenger } = wallet;
368+
369+
messenger.call('LoggingController:add', {
370+
type: LogType.GenericLog,
371+
data: { message: 'hello' },
372+
});
373+
374+
expect(Object.values(wallet.state.LoggingController.logs)).toHaveLength(
375+
1,
376+
);
377+
});
378+
});
379+
322380
describe('ConnectivityController', () => {
323381
it('reports online connectivity status', () => {
324382
const wallet = new Wallet({

packages/wallet/src/initialization/instances/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export { addressBookController } from './address-book-controller/address-book-co
33
export { approvalController } from './approval-controller/approval-controller';
44
export { connectivityController } from './connectivity-controller/connectivity-controller';
55
export { keyringController } from './keyring-controller/keyring-controller';
6+
export { loggingController } from './logging-controller/logging-controller';
67
export { networkController } from './network-controller/network-controller';
78
export { remoteFeatureFlagController } from './remote-feature-flag-controller/remote-feature-flag-controller';
89
export { storageService } from './storage-service/storage-service';
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { LoggingController, LogType } from '@metamask/logging-controller';
2+
import { Messenger } from '@metamask/messenger';
3+
4+
import { defaultConfigurations } from '../../defaults';
5+
import type {
6+
DefaultActions,
7+
DefaultEvents,
8+
RootMessenger,
9+
} from '../../defaults';
10+
import { loggingController } from './logging-controller';
11+
12+
const DEFAULT_STATE = { logs: {} };
13+
14+
/**
15+
* Creates a root messenger for use in tests.
16+
*
17+
* @returns A root messenger.
18+
*/
19+
function getRootMessenger(): RootMessenger<DefaultActions, DefaultEvents> {
20+
return new Messenger({ namespace: 'Root' });
21+
}
22+
23+
describe('loggingController', () => {
24+
it('is registered as a default initialization configuration', () => {
25+
expect(Object.values(defaultConfigurations)).toContain(loggingController);
26+
});
27+
28+
it('initializes a LoggingController with default state', () => {
29+
const messenger = loggingController.getMessenger(getRootMessenger());
30+
31+
const instance = loggingController.init({
32+
state: undefined,
33+
messenger,
34+
options: {},
35+
});
36+
37+
expect(instance).toBeInstanceOf(LoggingController);
38+
expect(instance.state).toStrictEqual(DEFAULT_STATE);
39+
});
40+
41+
it('merges provided state over the defaults', () => {
42+
const messenger = loggingController.getMessenger(getRootMessenger());
43+
44+
const entry = {
45+
id: 'test-id',
46+
timestamp: 0,
47+
log: { type: LogType.GenericLog, data: { message: 'hello' } },
48+
};
49+
50+
const instance = loggingController.init({
51+
state: { logs: { 'test-id': entry } },
52+
messenger,
53+
options: {},
54+
});
55+
56+
expect(instance.state.logs['test-id']).toStrictEqual(entry);
57+
});
58+
59+
it('exposes its state through the root messenger', () => {
60+
const rootMessenger = getRootMessenger();
61+
const messenger = loggingController.getMessenger(rootMessenger);
62+
63+
loggingController.init({ state: undefined, messenger, options: {} });
64+
65+
expect(rootMessenger.call('LoggingController:getState')).toStrictEqual(
66+
DEFAULT_STATE,
67+
);
68+
});
69+
70+
it('registers its method actions on the root messenger', () => {
71+
const rootMessenger = getRootMessenger();
72+
const messenger = loggingController.getMessenger(rootMessenger);
73+
74+
const instance = loggingController.init({
75+
state: undefined,
76+
messenger,
77+
options: {},
78+
});
79+
80+
rootMessenger.call('LoggingController:add', {
81+
type: LogType.GenericLog,
82+
data: { message: 'hello' },
83+
});
84+
85+
expect(Object.values(instance.state.logs)).toHaveLength(1);
86+
});
87+
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {
2+
LoggingController,
3+
LoggingControllerMessenger,
4+
} from '@metamask/logging-controller';
5+
import { Messenger } from '@metamask/messenger';
6+
7+
import type { InitializationConfiguration } from '../../types';
8+
9+
export const loggingController: InitializationConfiguration<
10+
LoggingController,
11+
LoggingControllerMessenger
12+
> = {
13+
name: 'LoggingController',
14+
init: ({ state, messenger }) =>
15+
new LoggingController({
16+
state,
17+
messenger,
18+
}),
19+
getMessenger: (parent) =>
20+
new Messenger({
21+
namespace: 'LoggingController',
22+
parent,
23+
}),
24+
};

packages/wallet/tsconfig.build.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
{ "path": "../connectivity-controller/tsconfig.build.json" },
1414
{ "path": "../controller-utils/tsconfig.build.json" },
1515
{ "path": "../keyring-controller/tsconfig.build.json" },
16+
{ "path": "../logging-controller/tsconfig.build.json" },
1617
{ "path": "../messenger/tsconfig.build.json" },
1718
{ "path": "../network-controller/tsconfig.build.json" },
1819
{ "path": "../remote-feature-flag-controller/tsconfig.build.json" },

packages/wallet/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
{ "path": "../connectivity-controller/tsconfig.json" },
1212
{ "path": "../controller-utils/tsconfig.json" },
1313
{ "path": "../keyring-controller/tsconfig.json" },
14+
{ "path": "../logging-controller/tsconfig.json" },
1415
{ "path": "../messenger/tsconfig.json" },
1516
{ "path": "../network-controller/tsconfig.json" },
1617
{ "path": "../remote-feature-flag-controller/tsconfig.json" },

0 commit comments

Comments
 (0)