Skip to content

Commit 96acf2a

Browse files
committed
feat: updated all handlers for Vaults and VaultsSecrets with ctx
1 parent 6f131d4 commit 96acf2a

File tree

8 files changed

+122
-93
lines changed

8 files changed

+122
-93
lines changed

src/client/handlers/VaultsSecretsCat.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
12
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
24
import type {
35
ClientRPCRequestParams,
46
ClientRPCResponseResult,
@@ -26,16 +28,20 @@ class VaultsSecretsCat extends DuplexHandler<
2628
input: AsyncIterableIterator<
2729
ClientRPCRequestParams<SecretIdentifierMessage>
2830
>,
31+
_cancel: (reason?: any) => void,
32+
_meta: Record<string, JSONValue>,
33+
ctx: ContextTimed,
2934
): AsyncGenerator<ClientRPCResponseResult<ContentOrErrorMessage>> {
3035
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
3136
this.container;
3237
yield* db.withTransactionG(async function* (tran): AsyncGenerator<
3338
ClientRPCResponseResult<ContentOrErrorMessage>
3439
> {
3540
// As we need to preserve the order of parameters, we need to loop over
36-
// them individually, as grouping them would make them go out of order.
37-
for await (const secretIdentiferMessage of input) {
38-
const { nameOrId, secretName } = secretIdentiferMessage;
41+
// them individually. Grouping them would make them go out of order.
42+
for await (const secretIdentifierMessage of input) {
43+
ctx.signal.throwIfAborted();
44+
const { nameOrId, secretName } = secretIdentifierMessage;
3945
const vaultIdFromName = await vaultManager.getVaultId(nameOrId, tran);
4046
const vaultId = vaultIdFromName ?? vaultsUtils.decodeVaultId(nameOrId);
4147
if (vaultId == null) throw new vaultsErrors.ErrorVaultsVaultUndefined();

src/client/handlers/VaultsSecretsEnv.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
12
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
24
import type {
35
ClientRPCRequestParams,
46
ClientRPCResponseResult,
@@ -22,19 +24,18 @@ class VaultsSecretsEnv extends DuplexHandler<
2224
input: AsyncIterableIterator<
2325
ClientRPCRequestParams<SecretIdentifierMessage>
2426
>,
25-
_cancel,
26-
_meta,
27-
ctx,
27+
_cancel: (reason?: any) => void,
28+
_meta: Record<string, JSONValue>,
29+
ctx: ContextTimed,
2830
): AsyncGenerator<ClientRPCResponseResult<SecretContentMessage>> {
29-
if (ctx.signal.aborted) throw ctx.signal.reason;
3031
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
3132
this.container;
3233

3334
return yield* db.withTransactionG(async function* (tran): AsyncGenerator<
3435
ClientRPCResponseResult<SecretContentMessage>
3536
> {
36-
if (ctx.signal.aborted) throw ctx.signal.reason;
3737
for await (const secretIdentifierMessage of input) {
38+
ctx.signal.throwIfAborted();
3839
const { nameOrId, secretName } = secretIdentifierMessage;
3940
const vaultIdFromName = await vaultManager.getVaultId(nameOrId, tran);
4041
const vaultId = vaultIdFromName ?? vaultsUtils.decodeVaultId(nameOrId);
@@ -75,6 +76,7 @@ class VaultsSecretsEnv extends DuplexHandler<
7576
tran,
7677
);
7778
for (const { filePath, value } of secrets) {
79+
ctx.signal.throwIfAborted();
7880
yield {
7981
nameOrId: nameOrId,
8082
secretName: filePath,

src/client/handlers/VaultsSecretsList.ts

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
12
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
24
import type {
35
ClientRPCRequestParams,
46
ClientRPCResponseResult,
@@ -21,7 +23,10 @@ class VaultsSecretsList extends ServerHandler<
2123
> {
2224
public handle = async function* (
2325
input: ClientRPCRequestParams<SecretIdentifierMessage>,
24-
): AsyncGenerator<ClientRPCResponseResult<SecretFilesMessage>, void, void> {
26+
_cancel: (reason?: any) => void,
27+
_meta: Record<string, JSONValue>,
28+
ctx: ContextTimed,
29+
): AsyncGenerator<ClientRPCResponseResult<SecretFilesMessage>> {
2530
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
2631
this.container;
2732
const vaultId = await db.withTransactionF(async (tran) => {
@@ -36,34 +41,33 @@ class VaultsSecretsList extends ServerHandler<
3641
});
3742

3843
yield* vaultManager.withVaultsG([vaultId], (vault) => {
39-
return vault.readG(async function* (fs): AsyncGenerator<
40-
SecretFilesMessage,
41-
void,
42-
void
43-
> {
44-
let files: Array<string | Buffer>;
45-
try {
46-
files = await fs.promises.readdir(input.secretName);
47-
} catch (e) {
48-
if (e.code === 'ENOENT') {
49-
throw new vaultsErrors.ErrorSecretsDirectoryUndefined(e.message, {
50-
cause: e,
51-
});
44+
return vault.readG(
45+
async function* (fs): AsyncGenerator<SecretFilesMessage> {
46+
let files: Array<string | Buffer>;
47+
try {
48+
files = await fs.promises.readdir(input.secretName);
49+
} catch (e) {
50+
if (e.code === 'ENOENT') {
51+
throw new vaultsErrors.ErrorSecretsDirectoryUndefined(e.message, {
52+
cause: e,
53+
});
54+
}
55+
if (e.code === 'ENOTDIR') {
56+
throw new vaultsErrors.ErrorSecretsIsSecret(e.message, {
57+
cause: e,
58+
});
59+
}
60+
throw e;
5261
}
53-
if (e.code === 'ENOTDIR') {
54-
throw new vaultsErrors.ErrorSecretsIsSecret(e.message, {
55-
cause: e,
56-
});
62+
for await (const file of files) {
63+
ctx.signal.throwIfAborted();
64+
const filePath = path.join(input.secretName, file.toString());
65+
const stat = await fs.promises.stat(filePath);
66+
const type = stat.isFile() ? 'FILE' : 'DIRECTORY';
67+
yield { path: filePath, type: type };
5768
}
58-
throw e;
59-
}
60-
for await (const file of files) {
61-
const filePath = path.join(input.secretName, file.toString());
62-
const stat = await fs.promises.stat(filePath);
63-
const type = stat.isFile() ? 'FILE' : 'DIRECTORY';
64-
yield { path: filePath, type: type };
65-
}
66-
});
69+
},
70+
);
6771
});
6872
};
6973
}

src/client/handlers/VaultsSecretsMkdir.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
12
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
24
import type {
35
ClientRPCRequestParams,
46
ClientRPCResponseResult,
@@ -22,13 +24,17 @@ class VaultsSecretsMkdir extends DuplexHandler<
2224
> {
2325
public handle = async function* (
2426
input: AsyncIterableIterator<ClientRPCRequestParams<SecretDirMessage>>,
27+
_cancel: (reason?: any) => void,
28+
_meta: Record<string, JSONValue>,
29+
ctx: ContextTimed,
2530
): AsyncGenerator<ClientRPCResponseResult<SuccessOrErrorMessage>> {
2631
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
2732
this.container;
2833
let metadata: POJO;
2934
yield* db.withTransactionG(
3035
async function* (tran): AsyncGenerator<SuccessOrErrorMessage> {
3136
for await (const secretDirMessage of input) {
37+
ctx.signal.throwIfAborted();
3238
// Unpack input
3339
if (metadata == null) metadata = secretDirMessage.metadata ?? {};
3440
const nameOrId = secretDirMessage.nameOrId;
@@ -41,10 +47,7 @@ class VaultsSecretsMkdir extends DuplexHandler<
4147
throw new vaultsErrors.ErrorVaultsVaultUndefined();
4248
}
4349
// Write directories. This doesn't need to be grouped by vault names,
44-
// as no commit is created for empty directories anyways. The
45-
// vaultOps.mkdir() method also returns an object of type
46-
// SuccessOrErrorMessage. As such, we can return the result without
47-
// doing any type conversion or extra processing.
50+
// as no commit is created for empty directories anyway.
4851
yield await vaultManager.withVaults(
4952
[vaultId],
5053
async (vault) => {

src/client/handlers/VaultsSecretsRemove.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
12
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
24
import type { ResourceAcquire } from '@matrixai/resources';
35
import type {
46
ClientRPCRequestParams,
@@ -31,6 +33,9 @@ class VaultsSecretsRemove extends DuplexHandler<
3133
SecretsRemoveHeaderMessage | SecretIdentifierMessageTagged
3234
>
3335
>,
36+
_cancel: (reason?: any) => void,
37+
_meta: Record<string, JSONValue>,
38+
ctx: ContextTimed,
3439
): AsyncGenerator<ClientRPCResponseResult<SuccessOrErrorMessage>> {
3540
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
3641
this.container;
@@ -50,6 +55,7 @@ class VaultsSecretsRemove extends DuplexHandler<
5055
const vaultAcquires = await db.withTransactionF(async (tran) => {
5156
const vaultAcquires: Array<ResourceAcquire<FileSystemWritable>> = [];
5257
for (const vaultName of headerMessage.vaultNames) {
58+
ctx.signal.throwIfAborted();
5359
const vaultIdFromName = await vaultManager.getVaultId(vaultName, tran);
5460
const vaultId = vaultIdFromName ?? vaultsUtils.decodeVaultId(vaultName);
5561
if (vaultId == null) {
@@ -76,6 +82,7 @@ class VaultsSecretsRemove extends DuplexHandler<
7682
}
7783
let loopRan = false;
7884
for await (const message of input) {
85+
ctx.signal.throwIfAborted();
7986
loopRan = true;
8087
// Header messages should not be seen anymore
8188
if (message.type === 'VaultNamesHeaderMessage') {
@@ -108,8 +115,8 @@ class VaultsSecretsRemove extends DuplexHandler<
108115
e.code === 'ENOTEMPTY' ||
109116
e.code === 'EINVAL'
110117
) {
111-
// EINVAL can be triggered if removing the root of the
112-
// vault is attempted.
118+
// EINVAL can be triggered if removing the root of the vault is
119+
// attempted.
113120
yield {
114121
type: 'error',
115122
code: e.code,

src/client/handlers/VaultsVersion.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ class VaultsVersion extends UnaryHandler<
4444
},
4545
tran,
4646
);
47-
// Checking if latest version ID
48-
const latestVersion = latestOid === currentVersionId;
4947
return {
50-
latestVersion,
48+
latestVersion: latestOid === currentVersionId,
5149
};
5250
});
5351
};

src/vaults/VaultInternal.ts

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type RemoteInfo = {
4343
};
4444

4545
interface VaultInternal extends CreateDestroyStartStop {}
46+
4647
@CreateDestroyStartStop(
4748
new vaultsErrors.ErrorVaultRunning(),
4849
new vaultsErrors.ErrorVaultDestroyed(),
@@ -61,40 +62,43 @@ class VaultInternal {
6162
* If no state already exists then state for the vault is initialized.
6263
* If state already exists then this just creates the `VaultInternal` instance for managing that state.
6364
*/
64-
public static async createVaultInternal({
65-
vaultId,
66-
vaultName,
67-
db,
68-
vaultsDbPath,
69-
keyRing,
70-
efs,
71-
logger = new Logger(this.name),
72-
fresh = false,
73-
tran,
74-
}: {
75-
vaultId: VaultId;
76-
vaultName?: VaultName;
77-
db: DB;
78-
vaultsDbPath: LevelPath;
79-
keyRing: KeyRing;
80-
efs: EncryptedFS;
81-
logger?: Logger;
82-
fresh?: boolean;
83-
tran?: DBTransaction;
84-
}): Promise<VaultInternal> {
65+
public static async createVaultInternal(
66+
{
67+
vaultId,
68+
vaultName,
69+
db,
70+
vaultsDbPath,
71+
keyRing,
72+
efs,
73+
logger = new Logger(this.name),
74+
fresh = false,
75+
}: {
76+
vaultId: VaultId;
77+
vaultName?: VaultName;
78+
db: DB;
79+
vaultsDbPath: LevelPath;
80+
keyRing: KeyRing;
81+
efs: EncryptedFS;
82+
logger?: Logger;
83+
fresh?: boolean;
84+
},
85+
tran?: DBTransaction,
86+
): Promise<VaultInternal> {
8587
if (tran == null) {
8688
return await db.withTransactionF((tran) =>
87-
this.createVaultInternal({
88-
vaultId,
89-
vaultName,
90-
db,
91-
vaultsDbPath,
92-
keyRing,
93-
efs,
94-
logger,
95-
fresh,
89+
this.createVaultInternal(
90+
{
91+
vaultId,
92+
vaultName,
93+
db,
94+
vaultsDbPath,
95+
keyRing,
96+
efs,
97+
logger,
98+
fresh,
99+
},
96100
tran,
97-
}),
101+
),
98102
);
99103
}
100104

src/vaults/VaultManager.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ type VaultMetadata = {
5454
};
5555

5656
interface VaultManager extends CreateDestroyStartStop {}
57+
5758
@CreateDestroyStartStop(
5859
new vaultsErrors.ErrorVaultManagerRunning(),
5960
new vaultsErrors.ErrorVaultManagerDestroyed(),
@@ -343,17 +344,19 @@ class VaultManager {
343344
[vaultId.toString(), RWLockWriter, 'write'],
344345
async () => {
345346
// Creating vault
346-
const vault = await VaultInternal.createVaultInternal({
347-
vaultId,
348-
vaultName,
349-
keyRing: this.keyRing,
350-
efs: this.efs,
351-
logger: this.logger.getChild(VaultInternal.name),
352-
db: this.db,
353-
vaultsDbPath: this.vaultsDbPath,
354-
fresh: true,
347+
const vault = await VaultInternal.createVaultInternal(
348+
{
349+
vaultId: vaultId,
350+
vaultName: vaultName,
351+
keyRing: this.keyRing,
352+
efs: this.efs,
353+
logger: this.logger.getChild(VaultInternal.name),
354+
db: this.db,
355+
vaultsDbPath: this.vaultsDbPath,
356+
fresh: true,
357+
},
355358
tran,
356-
});
359+
);
357360
// Adding vault to object map
358361
this.vaultMap.set(vaultIdString, vault);
359362
return vault.vaultId;
@@ -984,15 +987,17 @@ class VaultManager {
984987
);
985988
}
986989
// 2. if the state exists then create, add to map and return that
987-
const newVault = await VaultInternal.createVaultInternal({
988-
vaultId,
989-
keyRing: this.keyRing,
990-
efs: this.efs,
991-
logger: this.logger.getChild(VaultInternal.name),
992-
db: this.db,
993-
vaultsDbPath: this.vaultsDbPath,
990+
const newVault = await VaultInternal.createVaultInternal(
991+
{
992+
vaultId: vaultId,
993+
keyRing: this.keyRing,
994+
efs: this.efs,
995+
logger: this.logger.getChild(VaultInternal.name),
996+
db: this.db,
997+
vaultsDbPath: this.vaultsDbPath,
998+
},
994999
tran,
995-
});
1000+
);
9961001
this.vaultMap.set(vaultIdString, newVault);
9971002
return newVault;
9981003
}

0 commit comments

Comments
 (0)