Skip to content

Commit 629eb4a

Browse files
committed
feat: vaultsSecretsEnv will continue on error
1 parent 12a5d67 commit 629eb4a

File tree

3 files changed

+127
-108
lines changed

3 files changed

+127
-108
lines changed

src/client/handlers/VaultsSecretsEnv.ts

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,19 @@ import type {
55
ClientRPCRequestParams,
66
ClientRPCResponseResult,
77
SecretIdentifierMessage,
8-
SecretContentMessage,
8+
SecretContentOrErrorMessage,
99
} from '../types.js';
1010
import type VaultManager from '../../vaults/VaultManager.js';
1111
import { DuplexHandler } from '@matrixai/rpc';
1212
import * as vaultsUtils from '../../vaults/utils.js';
13-
import * as vaultsErrors from '../../vaults/errors.js';
1413

1514
class VaultsSecretsEnv extends DuplexHandler<
1615
{
1716
db: DB;
1817
vaultManager: VaultManager;
1918
},
2019
ClientRPCRequestParams<SecretIdentifierMessage>,
21-
ClientRPCResponseResult<SecretContentMessage>
20+
ClientRPCResponseResult<SecretContentOrErrorMessage>
2221
> {
2322
public handle = async function* (
2423
input: AsyncIterableIterator<
@@ -27,64 +26,71 @@ class VaultsSecretsEnv extends DuplexHandler<
2726
_cancel: (reason?: any) => void,
2827
_meta: Record<string, JSONValue> | undefined,
2928
ctx: ContextTimed,
30-
): AsyncGenerator<ClientRPCResponseResult<SecretContentMessage>> {
29+
): AsyncGenerator<
30+
ClientRPCResponseResult<SecretContentOrErrorMessage>,
31+
void,
32+
void
33+
> {
3134
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
3235
this.container;
3336
return yield* db.withTransactionG(async function* (tran): AsyncGenerator<
34-
ClientRPCResponseResult<SecretContentMessage>
37+
ClientRPCResponseResult<SecretContentOrErrorMessage>,
38+
void,
39+
void
3540
> {
3641
for await (const secretIdentifierMessage of input) {
3742
const { nameOrId, secretName } = secretIdentifierMessage;
3843
const vaultIdFromName = await vaultManager.getVaultId(nameOrId, tran);
3944
const vaultId = vaultIdFromName ?? vaultsUtils.decodeVaultId(nameOrId);
4045
if (vaultId == null) {
41-
throw new vaultsErrors.ErrorVaultsVaultUndefined(
42-
`Vault "${nameOrId}" does not exist`,
43-
);
46+
yield {
47+
type: 'ErrorMessage',
48+
code: 'ENOENT',
49+
reason: `Vault "${nameOrId}" does not exist`,
50+
};
51+
continue;
4452
}
45-
const secrets = await vaultManager.withVaults(
53+
yield* vaultManager.withVaultsG(
4654
[vaultId],
47-
async (vault) => {
48-
const results: Array<{
49-
filePath: string;
50-
value: string;
51-
}> = [];
52-
return await vault.readF(async (fs) => {
55+
async function* (
56+
vault,
57+
): AsyncGenerator<SecretContentOrErrorMessage, void, void> {
58+
yield* vault.readG(async function* (efs): AsyncGenerator<
59+
SecretContentOrErrorMessage,
60+
void,
61+
void
62+
> {
5363
try {
5464
for await (const filePath of vaultsUtils.walkFs(
55-
fs,
65+
efs,
5666
secretName,
5767
)) {
5868
ctx.signal.throwIfAborted();
59-
const fileContents = await fs.readFile(filePath);
60-
results.push({
61-
filePath: filePath,
62-
value: fileContents.toString(),
63-
});
69+
const fileContents = await efs.readFile(filePath);
70+
yield {
71+
type: 'SuccessMessage',
72+
success: true,
73+
nameOrId: nameOrId,
74+
secretName: filePath,
75+
secretContent: fileContents.toString(),
76+
};
6477
}
6578
} catch (e) {
6679
if (e.code === 'ENOENT') {
67-
throw new vaultsErrors.ErrorSecretsSecretUndefined(
68-
`Secret with name: ${secretName} does not exist`,
69-
{ cause: e },
70-
);
80+
yield {
81+
type: 'ErrorMessage',
82+
code: e.code,
83+
reason: `Secret "${secretName}" does not exist`,
84+
};
85+
} else {
86+
throw e;
7187
}
72-
throw e;
7388
}
74-
return results;
7589
});
7690
},
7791
tran,
7892
ctx,
7993
);
80-
for (const { filePath, value } of secrets) {
81-
ctx.signal.throwIfAborted();
82-
yield {
83-
nameOrId: nameOrId,
84-
secretName: filePath,
85-
secretContent: value,
86-
};
87-
}
8894
}
8995
});
9096
};

src/client/types.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,13 @@ type ContentOrErrorMessage = ContentSuccessMessage | ErrorMessageTagged;
345345

346346
type SecretContentMessage = SecretIdentifierMessage & ContentMessage;
347347

348+
type SecretContentSuccessMessage = SecretIdentifierMessage &
349+
ContentSuccessMessage;
350+
351+
type SecretContentOrErrorMessage =
352+
| SecretContentSuccessMessage
353+
| ErrorMessageTagged;
354+
348355
type SecretDirMessage = VaultIdentifierMessage & {
349356
dirName: string;
350357
};
@@ -462,9 +469,11 @@ export type {
462469
SecretPathMessage,
463470
SecretIdentifierMessage,
464471
ContentMessage,
472+
SecretContentMessage,
465473
ContentSuccessMessage,
466474
ContentOrErrorMessage,
467-
SecretContentMessage,
475+
SecretContentSuccessMessage,
476+
SecretContentOrErrorMessage,
468477
SecretDirMessage,
469478
SecretRenameMessage,
470479
SecretFilesMessage,

0 commit comments

Comments
 (0)