-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathVaultsSecretsMkdir.ts
More file actions
79 lines (77 loc) · 2.81 KB
/
VaultsSecretsMkdir.ts
File metadata and controls
79 lines (77 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import type { DB } from '@matrixai/db';
import type {
ClientRPCRequestParams,
ClientRPCResponseResult,
SecretDirMessage,
SuccessOrErrorMessage,
} from '../types';
import type VaultManager from '../../vaults/VaultManager';
import type { POJO } from '../../types';
import { DuplexHandler } from '@matrixai/rpc';
import * as vaultsUtils from '../../vaults/utils';
import * as vaultsErrors from '../../vaults/errors';
import * as vaultOps from '../../vaults/VaultOps';
class VaultsSecretsMkdir extends DuplexHandler<
{
db: DB;
vaultManager: VaultManager;
},
ClientRPCRequestParams<SecretDirMessage>,
ClientRPCResponseResult<SuccessOrErrorMessage>
> {
public handle = async function* (
input: AsyncIterable<ClientRPCRequestParams<SecretDirMessage>>,
): AsyncGenerator<ClientRPCResponseResult<SuccessOrErrorMessage>> {
const { db, vaultManager }: { db: DB; vaultManager: VaultManager } =
this.container;
let metadata: POJO;
yield* db.withTransactionG(
async function* (tran): AsyncGenerator<SuccessOrErrorMessage> {
for await (const secretDirMessage of input) {
// Unpack input
if (metadata == null) metadata = secretDirMessage.metadata ?? {};
const nameOrId = secretDirMessage.nameOrId;
const dirName = secretDirMessage.dirName;
// Get vaultId
const vaultIdFromName = await vaultManager.getVaultId(nameOrId, tran);
const vaultId =
vaultIdFromName ?? vaultsUtils.decodeVaultId(nameOrId);
if (vaultId == null) {
throw new vaultsErrors.ErrorVaultsVaultUndefined();
}
// Write directories. This doesn't need to be grouped by vault names,
// as no commit is created for empty directories anyways. The
// vaultOps.mkdir() method also returns an object of type
// SuccessOrErrorMessage. As such, we can return the result without
// doing any type conversion or extra processing.
yield await vaultManager.withVaults(
[vaultId],
async (vault) => {
try {
await vaultOps.mkdir(vault, dirName, {
recursive: metadata?.options?.recursive,
});
return { type: 'success', success: true };
} catch (e) {
if (
e instanceof vaultsErrors.ErrorVaultsRecursive ||
e instanceof vaultsErrors.ErrorSecretsSecretDefined
) {
return {
type: 'error',
code: e.cause.code,
reason: dirName,
};
} else {
throw e;
}
}
},
tran,
);
}
},
);
};
}
export default VaultsSecretsMkdir;