@zincapp/zn-vault-agent 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +701 -0
  2. package/deploy/logrotate.d/zn-vault-agent +14 -0
  3. package/deploy/systemd/zn-vault-agent.service +75 -0
  4. package/dist/commands/certs.d.ts +3 -0
  5. package/dist/commands/certs.d.ts.map +1 -0
  6. package/dist/commands/certs.js +369 -0
  7. package/dist/commands/certs.js.map +1 -0
  8. package/dist/commands/exec.d.ts +3 -0
  9. package/dist/commands/exec.d.ts.map +1 -0
  10. package/dist/commands/exec.js +193 -0
  11. package/dist/commands/exec.js.map +1 -0
  12. package/dist/commands/login.d.ts +3 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +234 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/secrets.d.ts +3 -0
  17. package/dist/commands/secrets.d.ts.map +1 -0
  18. package/dist/commands/secrets.js +445 -0
  19. package/dist/commands/secrets.js.map +1 -0
  20. package/dist/commands/setup.d.ts +9 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +346 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/start.d.ts +3 -0
  25. package/dist/commands/start.d.ts.map +1 -0
  26. package/dist/commands/start.js +113 -0
  27. package/dist/commands/start.js.map +1 -0
  28. package/dist/commands/status.d.ts +3 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +85 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/sync.d.ts +3 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +126 -0
  35. package/dist/commands/sync.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +28 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/api.d.ts +104 -0
  41. package/dist/lib/api.d.ts.map +1 -0
  42. package/dist/lib/api.js +338 -0
  43. package/dist/lib/api.js.map +1 -0
  44. package/dist/lib/config.d.ts +164 -0
  45. package/dist/lib/config.d.ts.map +1 -0
  46. package/dist/lib/config.js +299 -0
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/deployer.d.ts +22 -0
  49. package/dist/lib/deployer.d.ts.map +1 -0
  50. package/dist/lib/deployer.js +407 -0
  51. package/dist/lib/deployer.js.map +1 -0
  52. package/dist/lib/health.d.ts +68 -0
  53. package/dist/lib/health.d.ts.map +1 -0
  54. package/dist/lib/health.js +216 -0
  55. package/dist/lib/health.js.map +1 -0
  56. package/dist/lib/logger.d.ts +38 -0
  57. package/dist/lib/logger.d.ts.map +1 -0
  58. package/dist/lib/logger.js +161 -0
  59. package/dist/lib/logger.js.map +1 -0
  60. package/dist/lib/metrics.d.ts +50 -0
  61. package/dist/lib/metrics.d.ts.map +1 -0
  62. package/dist/lib/metrics.js +273 -0
  63. package/dist/lib/metrics.js.map +1 -0
  64. package/dist/lib/secret-deployer.d.ts +22 -0
  65. package/dist/lib/secret-deployer.d.ts.map +1 -0
  66. package/dist/lib/secret-deployer.js +201 -0
  67. package/dist/lib/secret-deployer.js.map +1 -0
  68. package/dist/lib/validation.d.ts +25 -0
  69. package/dist/lib/validation.d.ts.map +1 -0
  70. package/dist/lib/validation.js +257 -0
  71. package/dist/lib/validation.js.map +1 -0
  72. package/dist/lib/websocket.d.ts +74 -0
  73. package/dist/lib/websocket.d.ts.map +1 -0
  74. package/dist/lib/websocket.js +441 -0
  75. package/dist/lib/websocket.js.map +1 -0
  76. package/dist/services/api-key-renewal.d.ts +13 -0
  77. package/dist/services/api-key-renewal.d.ts.map +1 -0
  78. package/dist/services/api-key-renewal.js +204 -0
  79. package/dist/services/api-key-renewal.js.map +1 -0
  80. package/dist/services/npm-auto-update.d.ts +60 -0
  81. package/dist/services/npm-auto-update.d.ts.map +1 -0
  82. package/dist/services/npm-auto-update.js +245 -0
  83. package/dist/services/npm-auto-update.js.map +1 -0
  84. package/dist/types/update.d.ts +19 -0
  85. package/dist/types/update.d.ts.map +1 -0
  86. package/dist/types/update.js +7 -0
  87. package/dist/types/update.js.map +1 -0
  88. package/package.json +74 -0
@@ -0,0 +1,126 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { isConfigured, getTargets } from '../lib/config.js';
4
+ import { deployCertificate } from '../lib/deployer.js';
5
+ export function registerSyncCommand(program) {
6
+ program
7
+ .command('sync')
8
+ .description('Sync certificates to configured targets')
9
+ .option('-f, --force', 'Force sync even if certificate unchanged')
10
+ .option('-t, --target <name>', 'Sync specific target only')
11
+ .option('--dry-run', 'Show what would be done without making changes')
12
+ .addHelpText('after', `
13
+ Examples:
14
+ # Sync all configured certificates
15
+ zn-vault-agent sync
16
+
17
+ # Force sync (even if unchanged)
18
+ zn-vault-agent sync --force
19
+
20
+ # Sync only a specific target
21
+ zn-vault-agent sync --target haproxy-frontend
22
+
23
+ # Preview what would be synced
24
+ zn-vault-agent sync --dry-run
25
+ `)
26
+ .action(async (options) => {
27
+ if (!isConfigured()) {
28
+ console.error(chalk.red('Not configured. Run: zn-vault-agent login'));
29
+ process.exit(1);
30
+ }
31
+ const targets = getTargets();
32
+ if (targets.length === 0) {
33
+ console.log('No certificate targets configured.');
34
+ console.log('Run ' + chalk.cyan('zn-vault-agent add') + ' to add one.');
35
+ return;
36
+ }
37
+ // Filter to specific target if requested
38
+ const targetsToSync = options.target
39
+ ? targets.filter(t => t.name === options.target || t.certId === options.target)
40
+ : targets;
41
+ if (options.target && targetsToSync.length === 0) {
42
+ console.error(chalk.red(`Target "${options.target}" not found`));
43
+ process.exit(1);
44
+ }
45
+ if (options.dryRun) {
46
+ console.log();
47
+ console.log(chalk.bold('Dry run - would sync:'));
48
+ console.log();
49
+ for (const target of targetsToSync) {
50
+ console.log(` ${chalk.cyan(target.name)}`);
51
+ console.log(` Certificate: ${target.certId.substring(0, 8)}...`);
52
+ console.log(` Outputs:`);
53
+ for (const [type, path] of Object.entries(target.outputs)) {
54
+ if (path)
55
+ console.log(` ${type}: ${path}`);
56
+ }
57
+ if (target.reloadCmd) {
58
+ console.log(` Reload: ${target.reloadCmd}`);
59
+ }
60
+ console.log();
61
+ }
62
+ return;
63
+ }
64
+ console.log();
65
+ console.log(chalk.bold('Syncing Certificates'));
66
+ console.log();
67
+ let successCount = 0;
68
+ let failCount = 0;
69
+ let unchangedCount = 0;
70
+ for (const target of targetsToSync) {
71
+ const spinner = ora(`Syncing ${target.name}...`).start();
72
+ try {
73
+ const result = await deployCertificate(target, options.force);
74
+ if (result.success) {
75
+ if (result.message === 'Certificate unchanged') {
76
+ spinner.info(`${target.name}: unchanged`);
77
+ unchangedCount++;
78
+ }
79
+ else {
80
+ spinner.succeed(`${target.name}: ${result.message}`);
81
+ successCount++;
82
+ // Show details
83
+ if (result.filesWritten && result.filesWritten.length > 0) {
84
+ for (const file of result.filesWritten) {
85
+ console.log(` ${chalk.gray('→')} ${file}`);
86
+ }
87
+ }
88
+ if (result.reloadOutput) {
89
+ console.log(` ${chalk.gray('reload:')} ${result.reloadOutput.trim()}`);
90
+ }
91
+ if (result.healthCheckPassed !== undefined) {
92
+ const status = result.healthCheckPassed
93
+ ? chalk.green('passed')
94
+ : chalk.red('failed');
95
+ console.log(` ${chalk.gray('health:')} ${status}`);
96
+ }
97
+ }
98
+ }
99
+ else {
100
+ spinner.fail(`${target.name}: ${result.message}`);
101
+ failCount++;
102
+ if (result.rolledBack) {
103
+ console.log(` ${chalk.yellow('→ Rolled back to previous certificate')}`);
104
+ }
105
+ }
106
+ }
107
+ catch (err) {
108
+ spinner.fail(`${target.name}: ${err instanceof Error ? err.message : String(err)}`);
109
+ failCount++;
110
+ }
111
+ }
112
+ console.log();
113
+ console.log(chalk.bold('Summary:'));
114
+ if (successCount > 0)
115
+ console.log(` ${chalk.green('✓')} ${successCount} updated`);
116
+ if (unchangedCount > 0)
117
+ console.log(` ${chalk.gray('○')} ${unchangedCount} unchanged`);
118
+ if (failCount > 0)
119
+ console.log(` ${chalk.red('✗')} ${failCount} failed`);
120
+ console.log();
121
+ if (failCount > 0) {
122
+ process.exit(1);
123
+ }
124
+ });
125
+ }
126
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerLoginCommand } from './commands/login.js';
4
+ import { registerCertsCommands } from './commands/certs.js';
5
+ import { registerSecretsCommands } from './commands/secrets.js';
6
+ import { registerSyncCommand } from './commands/sync.js';
7
+ import { registerStartCommand } from './commands/start.js';
8
+ import { registerStatusCommand } from './commands/status.js';
9
+ import { registerExecCommand } from './commands/exec.js';
10
+ import { registerSetupCommand } from './commands/setup.js';
11
+ const version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';
12
+ const program = new Command();
13
+ program
14
+ .name('zn-vault-agent')
15
+ .description('ZN-Vault Agent - Sync certificates and secrets from vault')
16
+ .version(version);
17
+ // Register commands
18
+ registerLoginCommand(program);
19
+ registerCertsCommands(program);
20
+ registerSecretsCommands(program);
21
+ registerSyncCommand(program);
22
+ registerStartCommand(program);
23
+ registerStatusCommand(program);
24
+ registerExecCommand(program);
25
+ registerSetupCommand(program);
26
+ // Parse arguments
27
+ program.parse();
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,MAAM,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AAE/E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB;AACpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,104 @@
1
+ interface LoginResponse {
2
+ accessToken: string;
3
+ refreshToken: string;
4
+ expiresIn: number;
5
+ user: {
6
+ id: string;
7
+ username: string;
8
+ role: string;
9
+ tenantId: string | null;
10
+ };
11
+ }
12
+ export interface CertificateMetadata {
13
+ id: string;
14
+ tenantId: string;
15
+ clientId: string;
16
+ kind: string;
17
+ alias: string;
18
+ certificateType: 'PEM' | 'P12' | 'DER';
19
+ fingerprintSha256: string;
20
+ subjectCn: string;
21
+ issuerCn: string;
22
+ notBefore: string;
23
+ notAfter: string;
24
+ status: string;
25
+ version: number;
26
+ daysUntilExpiry: number;
27
+ }
28
+ export interface DecryptedCertificate {
29
+ id: string;
30
+ certificateData: string;
31
+ certificateType: 'PEM' | 'P12' | 'DER';
32
+ fingerprintSha256: string;
33
+ }
34
+ export interface SecretMetadata {
35
+ id: string;
36
+ alias: string;
37
+ tenantId: string;
38
+ type: string;
39
+ version: number;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ expiresAt?: string;
43
+ tags?: string[];
44
+ }
45
+ export interface DecryptedSecret {
46
+ id: string;
47
+ alias: string;
48
+ type: string;
49
+ version: number;
50
+ data: Record<string, unknown>;
51
+ }
52
+ /**
53
+ * Login and get access token
54
+ */
55
+ export declare function login(username: string, password: string): Promise<LoginResponse>;
56
+ /**
57
+ * List certificates
58
+ */
59
+ export declare function listCertificates(): Promise<{
60
+ items: CertificateMetadata[];
61
+ total: number;
62
+ }>;
63
+ /**
64
+ * Get certificate metadata
65
+ */
66
+ export declare function getCertificate(certId: string): Promise<CertificateMetadata>;
67
+ /**
68
+ * Decrypt certificate (get actual cert data)
69
+ */
70
+ export declare function decryptCertificate(certId: string, purpose: string): Promise<DecryptedCertificate>;
71
+ /**
72
+ * Acknowledge certificate delivery (for tracking)
73
+ */
74
+ export declare function ackDelivery(certId: string, hostname: string, version: number): Promise<void>;
75
+ /**
76
+ * List secrets
77
+ */
78
+ export declare function listSecrets(): Promise<{
79
+ items: SecretMetadata[];
80
+ total: number;
81
+ }>;
82
+ /**
83
+ * Get secret by ID or alias
84
+ * @param secretId - UUID or alias (e.g., "alias:db/credentials")
85
+ */
86
+ export declare function getSecret(secretId: string): Promise<DecryptedSecret>;
87
+ /**
88
+ * Get secret metadata only (without decrypting)
89
+ */
90
+ export declare function getSecretMetadata(secretId: string): Promise<SecretMetadata>;
91
+ /**
92
+ * Check vault connectivity
93
+ */
94
+ export declare function checkHealth(): Promise<boolean>;
95
+ /**
96
+ * Clear cached token
97
+ */
98
+ export declare function clearToken(): void;
99
+ /**
100
+ * Check if we have a valid cached token
101
+ */
102
+ export declare function hasValidToken(): boolean;
103
+ export {};
104
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ // Path: src/lib/api.ts
2
+ // Vault API client with retry logic and observability
3
+ import https from 'node:https';
4
+ import http from 'node:http';
5
+ import { loadConfig } from './config.js';
6
+ import { apiLogger as log } from './logger.js';
7
+ import { metrics } from './metrics.js';
8
+ import { setVaultReachable } from './health.js';
9
+ // Token cache
10
+ let cachedToken = null;
11
+ let tokenExpiry = 0;
12
+ // Retry configuration
13
+ const MAX_RETRIES = 3;
14
+ const INITIAL_RETRY_DELAY = 1000; // 1 second
15
+ const MAX_RETRY_DELAY = 10000; // 10 seconds
16
+ /**
17
+ * Check if an error is retryable
18
+ */
19
+ function isRetryableError(statusCode, error) {
20
+ // Network errors are retryable
21
+ if (error.message.includes('ECONNREFUSED') ||
22
+ error.message.includes('ENOTFOUND') ||
23
+ error.message.includes('ETIMEDOUT') ||
24
+ error.message.includes('timeout') ||
25
+ error.message.includes('socket hang up')) {
26
+ return true;
27
+ }
28
+ // 5xx errors are retryable
29
+ if (statusCode && statusCode >= 500 && statusCode < 600) {
30
+ return true;
31
+ }
32
+ // 429 Too Many Requests is retryable
33
+ if (statusCode === 429) {
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ /**
39
+ * Calculate retry delay with exponential backoff and jitter
40
+ */
41
+ function getRetryDelay(attempt) {
42
+ const baseDelay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);
43
+ const jitter = Math.random() * 1000;
44
+ return Math.min(baseDelay + jitter, MAX_RETRY_DELAY);
45
+ }
46
+ /**
47
+ * Sleep for specified milliseconds
48
+ */
49
+ function sleep(ms) {
50
+ return new Promise((resolve) => setTimeout(resolve, ms));
51
+ }
52
+ /**
53
+ * Make HTTP request to vault API with retry logic
54
+ */
55
+ async function request(options) {
56
+ const config = loadConfig();
57
+ const startTime = Date.now();
58
+ if (!config.vaultUrl) {
59
+ throw new Error('Vault URL not configured. Run: zn-vault-agent login');
60
+ }
61
+ const url = new URL(config.vaultUrl);
62
+ url.pathname = options.path;
63
+ const headers = {
64
+ 'Content-Type': 'application/json',
65
+ 'Accept': 'application/json',
66
+ };
67
+ // Add authentication
68
+ if (options.token && options.token !== 'skip') {
69
+ headers['Authorization'] = `Bearer ${options.token}`;
70
+ }
71
+ else if (options.token !== 'skip') {
72
+ if (config.auth.apiKey) {
73
+ headers['X-API-Key'] = config.auth.apiKey;
74
+ }
75
+ else if (cachedToken && Date.now() < tokenExpiry) {
76
+ headers['Authorization'] = `Bearer ${cachedToken}`;
77
+ }
78
+ else if (config.auth.username && config.auth.password) {
79
+ // Need to login first
80
+ log.debug('Token expired or missing, logging in');
81
+ await login(config.auth.username, config.auth.password);
82
+ if (cachedToken) {
83
+ headers['Authorization'] = `Bearer ${cachedToken}`;
84
+ }
85
+ }
86
+ }
87
+ const requestOptions = {
88
+ hostname: url.hostname,
89
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
90
+ path: url.pathname + url.search,
91
+ method: options.method,
92
+ headers,
93
+ timeout: 30000,
94
+ rejectUnauthorized: !config.insecure,
95
+ };
96
+ let lastError = null;
97
+ let lastStatusCode;
98
+ const maxAttempts = options.noRetry ? 1 : MAX_RETRIES;
99
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
100
+ if (attempt > 0) {
101
+ const delay = getRetryDelay(attempt - 1);
102
+ log.debug({ attempt, delay, path: options.path }, 'Retrying request');
103
+ await sleep(delay);
104
+ }
105
+ try {
106
+ const result = await executeRequest(requestOptions, options.body, url.protocol === 'https:');
107
+ const duration = Date.now() - startTime;
108
+ // Record metrics
109
+ metrics.apiRequest(options.method, result.statusCode, duration);
110
+ setVaultReachable(true);
111
+ if (result.statusCode >= 400) {
112
+ const error = result.data;
113
+ const errorMessage = error?.message || `Request failed with status ${result.statusCode}`;
114
+ lastStatusCode = result.statusCode;
115
+ lastError = new Error(errorMessage);
116
+ // Don't retry auth errors
117
+ if (result.statusCode === 401 || result.statusCode === 403) {
118
+ log.warn({ path: options.path, status: result.statusCode }, 'Authentication failed');
119
+ throw lastError;
120
+ }
121
+ // Check if retryable
122
+ if (!isRetryableError(result.statusCode, lastError)) {
123
+ log.warn({ path: options.path, status: result.statusCode, error: errorMessage }, 'Request failed');
124
+ throw lastError;
125
+ }
126
+ log.debug({ attempt, status: result.statusCode }, 'Retryable error');
127
+ continue;
128
+ }
129
+ log.debug({ path: options.path, status: result.statusCode, duration }, 'Request completed');
130
+ return result.data;
131
+ }
132
+ catch (err) {
133
+ const error = err instanceof Error ? err : new Error(String(err));
134
+ lastError = error;
135
+ const duration = Date.now() - startTime;
136
+ metrics.apiRequest(options.method, 0, duration);
137
+ // Network error - vault may be unreachable
138
+ if (error.message.includes('ECONNREFUSED') || error.message.includes('ENOTFOUND')) {
139
+ setVaultReachable(false);
140
+ }
141
+ if (!isRetryableError(undefined, error)) {
142
+ log.error({ path: options.path, err: error }, 'Non-retryable error');
143
+ throw error;
144
+ }
145
+ log.debug({ attempt, err: error.message }, 'Retryable network error');
146
+ }
147
+ }
148
+ // All retries exhausted
149
+ log.error({ path: options.path, attempts: maxAttempts, lastStatus: lastStatusCode }, 'Request failed after retries');
150
+ throw lastError || new Error('Request failed after retries');
151
+ }
152
+ /**
153
+ * Execute a single HTTP request
154
+ */
155
+ function executeRequest(requestOptions, body, useHttps) {
156
+ return new Promise((resolve, reject) => {
157
+ const protocol = useHttps ? https : http;
158
+ const req = protocol.request(requestOptions, (res) => {
159
+ let data = '';
160
+ res.on('data', (chunk) => (data += chunk));
161
+ res.on('end', () => {
162
+ try {
163
+ const parsed = data ? JSON.parse(data) : {};
164
+ resolve({ statusCode: res.statusCode || 0, data: parsed });
165
+ }
166
+ catch {
167
+ resolve({ statusCode: res.statusCode || 0, data: data });
168
+ }
169
+ });
170
+ });
171
+ req.on('error', reject);
172
+ req.on('timeout', () => {
173
+ req.destroy();
174
+ reject(new Error('Request timeout'));
175
+ });
176
+ if (body) {
177
+ req.write(JSON.stringify(body));
178
+ }
179
+ req.end();
180
+ });
181
+ }
182
+ /**
183
+ * Login and get access token
184
+ */
185
+ export async function login(username, password) {
186
+ log.info({ username }, 'Logging in to vault');
187
+ const response = await request({
188
+ method: 'POST',
189
+ path: '/auth/login',
190
+ body: { username, password },
191
+ token: 'skip', // Don't try to auto-auth
192
+ noRetry: true, // Don't retry login (could lock account)
193
+ });
194
+ // Cache the token
195
+ cachedToken = response.accessToken;
196
+ tokenExpiry = Date.now() + (response.expiresIn * 1000) - 60000; // 1 min buffer
197
+ log.info({ username, expiresIn: response.expiresIn }, 'Login successful');
198
+ setVaultReachable(true);
199
+ return response;
200
+ }
201
+ /**
202
+ * List certificates
203
+ */
204
+ export async function listCertificates() {
205
+ log.debug('Listing certificates');
206
+ return request({
207
+ method: 'GET',
208
+ path: '/v1/certificates',
209
+ });
210
+ }
211
+ /**
212
+ * Get certificate metadata
213
+ */
214
+ export async function getCertificate(certId) {
215
+ log.debug({ certId }, 'Getting certificate metadata');
216
+ return request({
217
+ method: 'GET',
218
+ path: `/v1/certificates/${certId}`,
219
+ });
220
+ }
221
+ /**
222
+ * Decrypt certificate (get actual cert data)
223
+ */
224
+ export async function decryptCertificate(certId, purpose) {
225
+ log.debug({ certId, purpose }, 'Decrypting certificate');
226
+ return request({
227
+ method: 'POST',
228
+ path: `/v1/certificates/${certId}/decrypt`,
229
+ body: { purpose },
230
+ });
231
+ }
232
+ /**
233
+ * Acknowledge certificate delivery (for tracking)
234
+ */
235
+ export async function ackDelivery(certId, hostname, version) {
236
+ try {
237
+ await request({
238
+ method: 'POST',
239
+ path: `/v1/certificates/${certId}/ack`,
240
+ body: { hostname, version, timestamp: new Date().toISOString() },
241
+ noRetry: true, // ACK is best-effort
242
+ });
243
+ log.debug({ certId, hostname, version }, 'Delivery acknowledged');
244
+ }
245
+ catch (err) {
246
+ // ACK is best-effort, don't fail if endpoint doesn't exist yet
247
+ log.debug({ certId, err }, 'Failed to acknowledge delivery (best-effort)');
248
+ }
249
+ }
250
+ /**
251
+ * List secrets
252
+ */
253
+ export async function listSecrets() {
254
+ log.debug('Listing secrets');
255
+ const response = await request({
256
+ method: 'GET',
257
+ path: '/v1/secrets',
258
+ });
259
+ // API returns array directly, normalize to { items, total }
260
+ const items = Array.isArray(response) ? response : [];
261
+ return { items, total: items.length };
262
+ }
263
+ /**
264
+ * Get secret by ID or alias
265
+ * @param secretId - UUID or alias (e.g., "alias:db/credentials")
266
+ */
267
+ export async function getSecret(secretId) {
268
+ log.debug({ secretId }, 'Getting secret');
269
+ let id = secretId;
270
+ // Handle alias format - resolve to UUID first
271
+ if (secretId.startsWith('alias:')) {
272
+ const aliasPath = secretId.substring(6); // Remove "alias:" prefix
273
+ const metadata = await request({
274
+ method: 'GET',
275
+ path: `/v1/secrets/alias/${encodeURIComponent(aliasPath)}`,
276
+ });
277
+ id = metadata.id;
278
+ }
279
+ // Decrypt using UUID
280
+ return request({
281
+ method: 'POST',
282
+ path: `/v1/secrets/${id}/decrypt`,
283
+ body: {}, // Empty body required for POST
284
+ });
285
+ }
286
+ /**
287
+ * Get secret metadata only (without decrypting)
288
+ */
289
+ export async function getSecretMetadata(secretId) {
290
+ log.debug({ secretId }, 'Getting secret metadata');
291
+ // Handle alias format
292
+ if (secretId.startsWith('alias:')) {
293
+ const aliasPath = secretId.substring(6); // Remove "alias:" prefix
294
+ return request({
295
+ method: 'GET',
296
+ path: `/v1/secrets/alias/${encodeURIComponent(aliasPath)}`,
297
+ });
298
+ }
299
+ // Use UUID metadata endpoint
300
+ return request({
301
+ method: 'GET',
302
+ path: `/v1/secrets/${secretId}/meta`,
303
+ });
304
+ }
305
+ /**
306
+ * Check vault connectivity
307
+ */
308
+ export async function checkHealth() {
309
+ try {
310
+ await request({
311
+ method: 'GET',
312
+ path: '/v1/health',
313
+ token: 'skip',
314
+ noRetry: true,
315
+ });
316
+ setVaultReachable(true);
317
+ return true;
318
+ }
319
+ catch {
320
+ setVaultReachable(false);
321
+ return false;
322
+ }
323
+ }
324
+ /**
325
+ * Clear cached token
326
+ */
327
+ export function clearToken() {
328
+ cachedToken = null;
329
+ tokenExpiry = 0;
330
+ log.debug('Token cache cleared');
331
+ }
332
+ /**
333
+ * Check if we have a valid cached token
334
+ */
335
+ export function hasValidToken() {
336
+ return cachedToken !== null && Date.now() < tokenExpiry;
337
+ }
338
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}