Skip to content

Commit

Permalink
feat: keep metadata in state only
Browse files Browse the repository at this point in the history
  • Loading branch information
PatrykLucka committed Jan 17, 2025
1 parent 407f96d commit b9ca305
Showing 1 changed file with 20 additions and 19 deletions.
39 changes: 20 additions & 19 deletions packages/keyring-controller/src/KeyringController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,6 @@ export enum SignTypedDataVersion {
export type SerializedKeyring = {
type: string;
data: Json;
metadata: KeyringMetadata;
};

/**
Expand Down Expand Up @@ -611,8 +610,6 @@ export class KeyringController extends BaseController<

#keyrings: EthKeyring<Json>[];

#keyringsMetadata: KeyringMetadata[];

#unsupportedKeyrings: SerializedKeyring[];

#password?: string;
Expand Down Expand Up @@ -649,7 +646,7 @@ export class KeyringController extends BaseController<
vault: { persist: true, anonymous: false },
isUnlocked: { persist: false, anonymous: true },
keyrings: { persist: false, anonymous: false },
keyringsMetadata: { persist: false, anonymous: false },
keyringsMetadata: { persist: true, anonymous: false },
encryptionKey: { persist: false, anonymous: false },
encryptionSalt: { persist: false, anonymous: false },
},
Expand All @@ -666,7 +663,6 @@ export class KeyringController extends BaseController<

this.#encryptor = encryptor;
this.#keyrings = [];
this.#keyringsMetadata = [];
this.#unsupportedKeyrings = [];

// This option allows the controller to cache an exported key
Expand Down Expand Up @@ -1822,7 +1818,7 @@ export class KeyringController extends BaseController<
* @returns The keyring.
*/
#getKeyringById(keyringId: string): EthKeyring<Json> {
const index = this.#keyringsMetadata.findIndex(
const index = this.state.keyringsMetadata.findIndex(
(metadata) => metadata.id === keyringId,
);
return this.#keyrings[index] as EthKeyring<Json>;
Expand Down Expand Up @@ -2003,12 +1999,11 @@ export class KeyringController extends BaseController<
): Promise<SerializedKeyring[]> {
const serializedKeyrings = await Promise.all(
this.#keyrings.map(async (keyring, index) => {
const [type, data, metadata] = await Promise.all([
const [type, data] = await Promise.all([
keyring.type,
keyring.serialize(),
this.#keyringsMetadata[index],
]);
return { type, data, metadata };
return { type, data };
}),
);

Expand All @@ -2032,6 +2027,13 @@ export class KeyringController extends BaseController<
for (const serializedKeyring of serializedKeyrings) {
await this.#restoreKeyring(serializedKeyring);
}

if (this.state.keyringsMetadata.length > this.#keyrings.length) {
this.update((state) => {
// remove metadata from the end of the array to have the same length as the keyrings array
state.keyringsMetadata = state.keyringsMetadata.slice(0, -1 * (state.keyringsMetadata.length - this.#keyrings.length));
})
}
}

/**
Expand Down Expand Up @@ -2110,11 +2112,9 @@ export class KeyringController extends BaseController<

await this.#restoreSerializedKeyrings(vault);
const updatedKeyrings = await this.#getUpdatedKeyrings();
const updatedKeyringsMetadata = this.#keyringsMetadata;

this.update((state) => {
state.keyrings = updatedKeyrings;
state.keyringsMetadata = updatedKeyringsMetadata;
if (updatedState.encryptionKey || updatedState.encryptionSalt) {
state.encryptionKey = updatedState.encryptionKey;
state.encryptionSalt = updatedState.encryptionSalt;
Expand Down Expand Up @@ -2195,15 +2195,16 @@ export class KeyringController extends BaseController<
}

const updatedKeyrings = await this.#getUpdatedKeyrings();
const updatedKeyringsMetadata = this.#keyringsMetadata;
this.update((state) => {
state.vault = updatedState.vault;
state.keyrings = updatedKeyrings;
state.keyringsMetadata = updatedKeyringsMetadata;
if (updatedState.encryptionKey) {
state.encryptionKey = updatedState.encryptionKey;
state.encryptionSalt = JSON.parse(updatedState.vault as string).salt;
}
if (updatedKeyrings.length < state.keyringsMetadata.length) {
state.keyringsMetadata = state.keyringsMetadata.slice(0, -1 * (state.keyringsMetadata.length - updatedKeyrings.length));
}
});

return true;
Expand Down Expand Up @@ -2315,10 +2316,11 @@ export class KeyringController extends BaseController<
}

this.#keyrings.push(keyring);
if (metadata && this.#keyringsMetadata.length < this.#keyrings.length) {
this.#keyringsMetadata = [...this.#keyringsMetadata, metadata];
if (metadata && this.state.keyringsMetadata.length < this.#keyrings.length) {
this.update((state) => {
state.keyringsMetadata = [...state.keyringsMetadata, metadata];
});
}

return keyring;
}

Expand Down Expand Up @@ -2347,8 +2349,8 @@ export class KeyringController extends BaseController<
this.#assertControllerMutexIsLocked();

try {
const { type, data, metadata } = serialized;
return await this.#newKeyring(type, data, metadata);
const { type, data } = serialized;
return await this.#newKeyring(type, data);
} catch (_) {
this.#unsupportedKeyrings.push(serialized);
return undefined;
Expand Down Expand Up @@ -2389,7 +2391,6 @@ export class KeyringController extends BaseController<
validKeyrings.push(keyring);
} else {
await this.#destroyKeyring(keyring);
this.#keyringsMetadata = this.#keyringsMetadata.filter((_, i) => i !== index);
}
}),
);
Expand Down

0 comments on commit b9ca305

Please sign in to comment.