@fractary/faber 2.2.1 → 2.3.4
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.
- package/dist/__tests__/integration/init-workflow.test.js +2 -52
- package/dist/__tests__/integration/init-workflow.test.js.map +1 -1
- package/dist/auth/github-app.d.ts +155 -0
- package/dist/auth/github-app.d.ts.map +1 -0
- package/dist/auth/github-app.js +348 -0
- package/dist/auth/github-app.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/work/providers/github.d.ts.map +1 -1
- package/dist/work/providers/github.js +43 -7
- package/dist/work/providers/github.js.map +1 -1
- package/dist/workflow/faber.d.ts +8 -14
- package/dist/workflow/faber.d.ts.map +1 -1
- package/dist/workflow/faber.js +26 -161
- package/dist/workflow/faber.js.map +1 -1
- package/dist/workflow/index.d.ts +3 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +3 -1
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/resolver.d.ts +218 -0
- package/dist/workflow/resolver.d.ts.map +1 -0
- package/dist/workflow/resolver.js +351 -0
- package/dist/workflow/resolver.js.map +1 -0
- package/package.json +111 -106
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
import * as fs from 'fs';
|
|
7
7
|
import * as path from 'path';
|
|
8
8
|
import { ConfigInitializer } from '../../config/initializer.js';
|
|
9
|
-
import { loadFaberConfig, loadWorkConfig, loadRepoConfig,
|
|
10
|
-
import { SpecManager } from '../../spec/manager.js';
|
|
9
|
+
import { loadFaberConfig, loadWorkConfig, loadRepoConfig, } from '../../config.js';
|
|
11
10
|
describe('Init Workflow Integration', () => {
|
|
12
11
|
const testDir = path.join(__dirname, '__test-init-workflow__');
|
|
13
12
|
const configPath = path.join(testDir, '.fractary', 'plugins', 'faber', 'config.yaml');
|
|
@@ -82,40 +81,15 @@ describe('Init Workflow Integration', () => {
|
|
|
82
81
|
expect(config?.repo.platform).toBe('gitlab');
|
|
83
82
|
});
|
|
84
83
|
});
|
|
85
|
-
describe('SpecManager Integration After Init', () => {
|
|
86
|
-
it('should allow SpecManager creation before init', () => {
|
|
87
|
-
// Before init - should work with defaults
|
|
88
|
-
const managerBefore = new SpecManager();
|
|
89
|
-
expect(managerBefore).toBeDefined();
|
|
90
|
-
// After init - should use config
|
|
91
|
-
ConfigInitializer.initializeProject(testDir);
|
|
92
|
-
const managerAfter = new SpecManager();
|
|
93
|
-
expect(managerAfter).toBeDefined();
|
|
94
|
-
});
|
|
95
|
-
it('should use config path after init', () => {
|
|
96
|
-
// Create manager before config exists
|
|
97
|
-
const manager1 = new SpecManager();
|
|
98
|
-
expect(manager1).toBeDefined();
|
|
99
|
-
// Initialize with custom specs path
|
|
100
|
-
const config = ConfigInitializer.generateDefaultConfig();
|
|
101
|
-
config.artifacts.specs.local_path = '/custom/specs';
|
|
102
|
-
ConfigInitializer.writeConfig(config, configPath);
|
|
103
|
-
// New manager should use config path
|
|
104
|
-
const manager2 = new SpecManager();
|
|
105
|
-
expect(manager2).toBeDefined();
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
84
|
describe('Config Loading After Init', () => {
|
|
109
85
|
it('should load all config sections after init', () => {
|
|
110
86
|
ConfigInitializer.initializeProject(testDir);
|
|
111
87
|
const faberConfig = loadFaberConfig(testDir);
|
|
112
88
|
const workConfig = loadWorkConfig(testDir);
|
|
113
89
|
const repoConfig = loadRepoConfig(testDir);
|
|
114
|
-
const specConfig = loadSpecConfig(testDir);
|
|
115
90
|
expect(faberConfig).not.toBeNull();
|
|
116
91
|
expect(workConfig).not.toBeNull();
|
|
117
92
|
expect(repoConfig).not.toBeNull();
|
|
118
|
-
expect(specConfig).toBeDefined();
|
|
119
93
|
});
|
|
120
94
|
it('should not throw after successful init', () => {
|
|
121
95
|
ConfigInitializer.initializeProject(testDir);
|
|
@@ -123,7 +97,6 @@ describe('Init Workflow Integration', () => {
|
|
|
123
97
|
expect(() => loadFaberConfig(testDir)).not.toThrow();
|
|
124
98
|
expect(() => loadWorkConfig(testDir)).not.toThrow();
|
|
125
99
|
expect(() => loadRepoConfig(testDir)).not.toThrow();
|
|
126
|
-
expect(() => loadSpecConfig(testDir)).not.toThrow();
|
|
127
100
|
});
|
|
128
101
|
});
|
|
129
102
|
describe('Error Messages Without Init', () => {
|
|
@@ -152,13 +125,6 @@ describe('Init Workflow Integration', () => {
|
|
|
152
125
|
catch (error) {
|
|
153
126
|
expect(error.message).toContain('fractary init');
|
|
154
127
|
}
|
|
155
|
-
try {
|
|
156
|
-
loadSpecConfig(testDir);
|
|
157
|
-
fail('Should have thrown');
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
expect(error.message).toContain('fractary init');
|
|
161
|
-
}
|
|
162
128
|
});
|
|
163
129
|
});
|
|
164
130
|
describe('Backward Compatibility', () => {
|
|
@@ -174,9 +140,6 @@ describe('Init Workflow Integration', () => {
|
|
|
174
140
|
const config = loadFaberConfig(testDir);
|
|
175
141
|
expect(config).not.toBeNull();
|
|
176
142
|
expect(config?.repo.owner).toBe('legacy-owner');
|
|
177
|
-
// SpecManager should work
|
|
178
|
-
const manager = new SpecManager();
|
|
179
|
-
expect(manager).toBeDefined();
|
|
180
143
|
});
|
|
181
144
|
it('should migrate from JSON to YAML when re-initializing', () => {
|
|
182
145
|
// Create legacy JSON config
|
|
@@ -203,10 +166,7 @@ describe('Init Workflow Integration', () => {
|
|
|
203
166
|
repoName: 'my-app',
|
|
204
167
|
});
|
|
205
168
|
expect(fs.existsSync(createdPath)).toBe(true);
|
|
206
|
-
// 2.
|
|
207
|
-
const manager = new SpecManager();
|
|
208
|
-
expect(manager).toBeDefined();
|
|
209
|
-
// 3. Config should be loaded correctly
|
|
169
|
+
// 2. Config should be loaded correctly
|
|
210
170
|
const config = loadFaberConfig(testDir);
|
|
211
171
|
expect(config?.repo.owner).toBe('acme');
|
|
212
172
|
expect(config?.repo.repo).toBe('my-app');
|
|
@@ -243,9 +203,6 @@ describe('Init Workflow Integration', () => {
|
|
|
243
203
|
}
|
|
244
204
|
// Now config exists
|
|
245
205
|
expect(ConfigInitializer.configExists(configPath)).toBe(true);
|
|
246
|
-
// CLI can now run commands
|
|
247
|
-
const manager = new SpecManager();
|
|
248
|
-
expect(manager).toBeDefined();
|
|
249
206
|
});
|
|
250
207
|
});
|
|
251
208
|
describe('Performance Requirements', () => {
|
|
@@ -262,13 +219,6 @@ describe('Init Workflow Integration', () => {
|
|
|
262
219
|
const duration = Date.now() - start;
|
|
263
220
|
expect(duration).toBeLessThan(100);
|
|
264
221
|
});
|
|
265
|
-
it('should handle concurrent SpecManager creation', () => {
|
|
266
|
-
ConfigInitializer.initializeProject(testDir);
|
|
267
|
-
// Create multiple managers concurrently (simulates parallel operations)
|
|
268
|
-
const managers = Array(10).fill(null).map(() => new SpecManager());
|
|
269
|
-
expect(managers).toHaveLength(10);
|
|
270
|
-
managers.forEach(manager => expect(manager).toBeDefined());
|
|
271
|
-
});
|
|
272
222
|
});
|
|
273
223
|
});
|
|
274
224
|
//# sourceMappingURL=init-workflow.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-workflow.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/init-workflow.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init-workflow.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/init-workflow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/faber - GitHub App Authentication
|
|
3
|
+
*
|
|
4
|
+
* Provides JWT generation, installation token exchange, and token caching
|
|
5
|
+
* for GitHub App authentication.
|
|
6
|
+
*
|
|
7
|
+
* This module is used by both the SDK and CLI for GitHub App auth.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* GitHub App configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface GitHubAppConfig {
|
|
13
|
+
/** GitHub App ID */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Installation ID for the target org/repo */
|
|
16
|
+
installation_id: string;
|
|
17
|
+
/** Path to PEM file (optional if env var used) */
|
|
18
|
+
private_key_path?: string;
|
|
19
|
+
/** Env var name containing base64-encoded key */
|
|
20
|
+
private_key_env_var?: string;
|
|
21
|
+
/** How the app was created */
|
|
22
|
+
created_via?: 'manifest-flow' | 'manual';
|
|
23
|
+
/** ISO 8601 timestamp of creation */
|
|
24
|
+
created_at?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Private Key Loader
|
|
28
|
+
*
|
|
29
|
+
* Loads private keys from file path or environment variable
|
|
30
|
+
*/
|
|
31
|
+
export declare class PrivateKeyLoader {
|
|
32
|
+
/**
|
|
33
|
+
* Load private key from configured sources.
|
|
34
|
+
* Priority: env var > file path
|
|
35
|
+
*
|
|
36
|
+
* @param config - GitHub App configuration
|
|
37
|
+
* @returns The private key content
|
|
38
|
+
* @throws Error if private key cannot be loaded
|
|
39
|
+
*/
|
|
40
|
+
static load(config: GitHubAppConfig): Promise<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Validate private key format.
|
|
43
|
+
*
|
|
44
|
+
* @param key - The private key content
|
|
45
|
+
* @returns true if valid PEM format
|
|
46
|
+
*/
|
|
47
|
+
static validate(key: string): boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* GitHub App Authentication
|
|
51
|
+
*
|
|
52
|
+
* Handles JWT generation, installation token exchange, and caching
|
|
53
|
+
*/
|
|
54
|
+
export declare class GitHubAppAuth {
|
|
55
|
+
private cache;
|
|
56
|
+
private config;
|
|
57
|
+
private refreshPromise;
|
|
58
|
+
private static readonly REFRESH_THRESHOLD_MS;
|
|
59
|
+
private static readonly JWT_EXPIRY_SECONDS;
|
|
60
|
+
private static readonly GITHUB_API_URL;
|
|
61
|
+
constructor(config: GitHubAppConfig);
|
|
62
|
+
/**
|
|
63
|
+
* Get the configuration
|
|
64
|
+
*/
|
|
65
|
+
getConfig(): GitHubAppConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Get a valid installation token.
|
|
68
|
+
* Returns cached token if still valid, otherwise generates new one.
|
|
69
|
+
*
|
|
70
|
+
* @returns Installation access token
|
|
71
|
+
*/
|
|
72
|
+
getToken(): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Force refresh the token.
|
|
75
|
+
*
|
|
76
|
+
* @returns New installation access token
|
|
77
|
+
*/
|
|
78
|
+
refreshToken(): Promise<string>;
|
|
79
|
+
/**
|
|
80
|
+
* Check if token needs refresh (within 5 minutes of expiration).
|
|
81
|
+
*
|
|
82
|
+
* @returns true if token should be refreshed
|
|
83
|
+
*/
|
|
84
|
+
isTokenExpiringSoon(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Validate the configuration and private key.
|
|
87
|
+
*
|
|
88
|
+
* @throws Error if configuration is invalid
|
|
89
|
+
*/
|
|
90
|
+
validate(): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Perform the actual token refresh
|
|
93
|
+
*/
|
|
94
|
+
private doRefresh;
|
|
95
|
+
/**
|
|
96
|
+
* Generate a JWT for GitHub App authentication
|
|
97
|
+
*/
|
|
98
|
+
private generateJWT;
|
|
99
|
+
/**
|
|
100
|
+
* Exchange JWT for installation access token
|
|
101
|
+
*/
|
|
102
|
+
private exchangeForInstallationToken;
|
|
103
|
+
/**
|
|
104
|
+
* Check if token is expired
|
|
105
|
+
*/
|
|
106
|
+
private isExpired;
|
|
107
|
+
/**
|
|
108
|
+
* Check if token is expiring soon
|
|
109
|
+
*/
|
|
110
|
+
private isExpiringSoon;
|
|
111
|
+
/**
|
|
112
|
+
* Trigger background token refresh with retry (non-blocking)
|
|
113
|
+
*/
|
|
114
|
+
private triggerBackgroundRefresh;
|
|
115
|
+
/**
|
|
116
|
+
* Refresh token with exponential backoff retry
|
|
117
|
+
*
|
|
118
|
+
* @param maxRetries - Maximum number of retry attempts
|
|
119
|
+
* @param baseDelayMs - Base delay in milliseconds (doubles each retry)
|
|
120
|
+
*/
|
|
121
|
+
private refreshWithRetry;
|
|
122
|
+
/**
|
|
123
|
+
* Sleep helper for retry delays
|
|
124
|
+
*/
|
|
125
|
+
private sleep;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Token Provider Interface
|
|
129
|
+
*
|
|
130
|
+
* Abstract interface for getting tokens, supporting both PAT and GitHub App
|
|
131
|
+
*/
|
|
132
|
+
export interface TokenProvider {
|
|
133
|
+
getToken(): Promise<string>;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Static Token Provider
|
|
137
|
+
*
|
|
138
|
+
* Simple provider for static PAT tokens
|
|
139
|
+
*/
|
|
140
|
+
export declare class StaticTokenProvider implements TokenProvider {
|
|
141
|
+
private token;
|
|
142
|
+
constructor(token: string);
|
|
143
|
+
getToken(): Promise<string>;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* GitHub App Token Provider
|
|
147
|
+
*
|
|
148
|
+
* Provider that uses GitHubAppAuth for dynamic token generation
|
|
149
|
+
*/
|
|
150
|
+
export declare class GitHubAppTokenProvider implements TokenProvider {
|
|
151
|
+
private auth;
|
|
152
|
+
constructor(auth: GitHubAppAuth);
|
|
153
|
+
getToken(): Promise<string>;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=github-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-app.d.ts","sourceRoot":"","sources":["../../src/auth/github-app.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,eAAe,GAAG,QAAQ,CAAC;IACzC,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqBD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;WACU,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAiD3D;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAUtC;AAED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAgC;IAGtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAiB;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAO;IAEjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAEtD,MAAM,EAAE,eAAe;IAInC;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBjC;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAerC;;;;OAIG;IACH,mBAAmB,IAAI,OAAO;IAK9B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B;;OAEG;YACW,SAAS;IAcvB;;OAEG;YACW,WAAW;IAoBzB;;OAEG;YACW,4BAA4B;IA2D1C;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAWhC;;;;;OAKG;YACW,gBAAgB;IAmC9B;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAC3C,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;IAE3B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAGlC;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAC9C,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAEjC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAGlC"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fractary/faber - GitHub App Authentication
|
|
3
|
+
*
|
|
4
|
+
* Provides JWT generation, installation token exchange, and token caching
|
|
5
|
+
* for GitHub App authentication.
|
|
6
|
+
*
|
|
7
|
+
* This module is used by both the SDK and CLI for GitHub App auth.
|
|
8
|
+
*/
|
|
9
|
+
import jwt from 'jsonwebtoken';
|
|
10
|
+
import fs from 'fs/promises';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import os from 'os';
|
|
13
|
+
/**
|
|
14
|
+
* Private Key Loader
|
|
15
|
+
*
|
|
16
|
+
* Loads private keys from file path or environment variable
|
|
17
|
+
*/
|
|
18
|
+
export class PrivateKeyLoader {
|
|
19
|
+
/**
|
|
20
|
+
* Load private key from configured sources.
|
|
21
|
+
* Priority: env var > file path
|
|
22
|
+
*
|
|
23
|
+
* @param config - GitHub App configuration
|
|
24
|
+
* @returns The private key content
|
|
25
|
+
* @throws Error if private key cannot be loaded
|
|
26
|
+
*/
|
|
27
|
+
static async load(config) {
|
|
28
|
+
// Try environment variable first (priority)
|
|
29
|
+
if (config.private_key_env_var) {
|
|
30
|
+
const envValue = process.env[config.private_key_env_var];
|
|
31
|
+
if (envValue) {
|
|
32
|
+
try {
|
|
33
|
+
// Decode base64-encoded key
|
|
34
|
+
const decoded = Buffer.from(envValue, 'base64').toString('utf-8');
|
|
35
|
+
if (PrivateKeyLoader.validate(decoded)) {
|
|
36
|
+
return decoded;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Invalid base64, fall through to file path
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Try file path
|
|
45
|
+
if (config.private_key_path) {
|
|
46
|
+
try {
|
|
47
|
+
// Expand ~ to home directory
|
|
48
|
+
const expandedPath = config.private_key_path.startsWith('~')
|
|
49
|
+
? config.private_key_path.replace('~', os.homedir())
|
|
50
|
+
: config.private_key_path;
|
|
51
|
+
const resolvedPath = path.resolve(expandedPath);
|
|
52
|
+
const key = await fs.readFile(resolvedPath, 'utf-8');
|
|
53
|
+
if (PrivateKeyLoader.validate(key)) {
|
|
54
|
+
return key;
|
|
55
|
+
}
|
|
56
|
+
throw new Error('Invalid private key format. Expected PEM-encoded RSA private key');
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof Error && error.message.includes('ENOENT')) {
|
|
60
|
+
throw new Error(`GitHub App private key not found at '${config.private_key_path}'. ` +
|
|
61
|
+
`Check 'private_key_path' in config or set ${config.private_key_env_var || 'GITHUB_APP_PRIVATE_KEY'} env var`);
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new Error('GitHub App private key not found. ' +
|
|
67
|
+
"Configure 'private_key_path' in .fractary/config.yaml or set GITHUB_APP_PRIVATE_KEY env var");
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Validate private key format.
|
|
71
|
+
*
|
|
72
|
+
* @param key - The private key content
|
|
73
|
+
* @returns true if valid PEM format
|
|
74
|
+
*/
|
|
75
|
+
static validate(key) {
|
|
76
|
+
// Check for PEM format (RSA or PKCS#8)
|
|
77
|
+
const trimmed = key.trim();
|
|
78
|
+
return ((trimmed.startsWith('-----BEGIN RSA PRIVATE KEY-----') &&
|
|
79
|
+
trimmed.endsWith('-----END RSA PRIVATE KEY-----')) ||
|
|
80
|
+
(trimmed.startsWith('-----BEGIN PRIVATE KEY-----') &&
|
|
81
|
+
trimmed.endsWith('-----END PRIVATE KEY-----')));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* GitHub App Authentication
|
|
86
|
+
*
|
|
87
|
+
* Handles JWT generation, installation token exchange, and caching
|
|
88
|
+
*/
|
|
89
|
+
export class GitHubAppAuth {
|
|
90
|
+
cache = new Map();
|
|
91
|
+
config;
|
|
92
|
+
refreshPromise = null;
|
|
93
|
+
// Token refresh threshold (5 minutes before expiration)
|
|
94
|
+
static REFRESH_THRESHOLD_MS = 5 * 60 * 1000;
|
|
95
|
+
// JWT validity period (reduced to 5 minutes to handle clock skew)
|
|
96
|
+
static JWT_EXPIRY_SECONDS = 300;
|
|
97
|
+
// GitHub API base URL
|
|
98
|
+
static GITHUB_API_URL = 'https://api.github.com';
|
|
99
|
+
constructor(config) {
|
|
100
|
+
this.config = config;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the configuration
|
|
104
|
+
*/
|
|
105
|
+
getConfig() {
|
|
106
|
+
return this.config;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get a valid installation token.
|
|
110
|
+
* Returns cached token if still valid, otherwise generates new one.
|
|
111
|
+
*
|
|
112
|
+
* @returns Installation access token
|
|
113
|
+
*/
|
|
114
|
+
async getToken() {
|
|
115
|
+
const cacheKey = this.config.installation_id;
|
|
116
|
+
const cached = this.cache.get(cacheKey);
|
|
117
|
+
if (cached && !this.isExpired(cached) && !this.isExpiringSoon(cached)) {
|
|
118
|
+
return cached.token;
|
|
119
|
+
}
|
|
120
|
+
// If token is expiring soon but still valid, trigger background refresh
|
|
121
|
+
if (cached && !this.isExpired(cached) && this.isExpiringSoon(cached)) {
|
|
122
|
+
this.triggerBackgroundRefresh();
|
|
123
|
+
return cached.token;
|
|
124
|
+
}
|
|
125
|
+
// Token expired or missing, must refresh synchronously
|
|
126
|
+
return this.refreshToken();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Force refresh the token.
|
|
130
|
+
*
|
|
131
|
+
* @returns New installation access token
|
|
132
|
+
*/
|
|
133
|
+
async refreshToken() {
|
|
134
|
+
// Deduplicate concurrent refresh requests
|
|
135
|
+
if (this.refreshPromise) {
|
|
136
|
+
return this.refreshPromise;
|
|
137
|
+
}
|
|
138
|
+
this.refreshPromise = this.doRefresh();
|
|
139
|
+
try {
|
|
140
|
+
return await this.refreshPromise;
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
this.refreshPromise = null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if token needs refresh (within 5 minutes of expiration).
|
|
148
|
+
*
|
|
149
|
+
* @returns true if token should be refreshed
|
|
150
|
+
*/
|
|
151
|
+
isTokenExpiringSoon() {
|
|
152
|
+
const cached = this.cache.get(this.config.installation_id);
|
|
153
|
+
return cached ? this.isExpiringSoon(cached) : true;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validate the configuration and private key.
|
|
157
|
+
*
|
|
158
|
+
* @throws Error if configuration is invalid
|
|
159
|
+
*/
|
|
160
|
+
async validate() {
|
|
161
|
+
// Validate required fields
|
|
162
|
+
if (!this.config.id) {
|
|
163
|
+
throw new Error("GitHub App ID is required. Configure 'app.id' in .fractary/config.yaml");
|
|
164
|
+
}
|
|
165
|
+
if (!this.config.installation_id) {
|
|
166
|
+
throw new Error("GitHub App Installation ID is required. Configure 'app.installation_id' in .fractary/config.yaml");
|
|
167
|
+
}
|
|
168
|
+
// Validate private key can be loaded
|
|
169
|
+
await PrivateKeyLoader.load(this.config);
|
|
170
|
+
// Attempt to generate JWT to validate key
|
|
171
|
+
await this.generateJWT();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Perform the actual token refresh
|
|
175
|
+
*/
|
|
176
|
+
async doRefresh() {
|
|
177
|
+
const jwtToken = await this.generateJWT();
|
|
178
|
+
const installationToken = await this.exchangeForInstallationToken(jwtToken);
|
|
179
|
+
// Cache the token
|
|
180
|
+
this.cache.set(this.config.installation_id, {
|
|
181
|
+
token: installationToken.token,
|
|
182
|
+
expires_at: new Date(installationToken.expires_at),
|
|
183
|
+
installation_id: this.config.installation_id,
|
|
184
|
+
});
|
|
185
|
+
return installationToken.token;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Generate a JWT for GitHub App authentication
|
|
189
|
+
*/
|
|
190
|
+
async generateJWT() {
|
|
191
|
+
const privateKey = await PrivateKeyLoader.load(this.config);
|
|
192
|
+
const now = Math.floor(Date.now() / 1000);
|
|
193
|
+
const payload = {
|
|
194
|
+
iat: now - 60, // Issued 60 seconds ago to allow for clock drift
|
|
195
|
+
exp: now + GitHubAppAuth.JWT_EXPIRY_SECONDS,
|
|
196
|
+
iss: this.config.id,
|
|
197
|
+
};
|
|
198
|
+
try {
|
|
199
|
+
return jwt.sign(payload, privateKey, { algorithm: 'RS256' });
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error instanceof Error) {
|
|
203
|
+
throw new Error(`Failed to generate JWT: ${error.message}`);
|
|
204
|
+
}
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Exchange JWT for installation access token
|
|
210
|
+
*/
|
|
211
|
+
async exchangeForInstallationToken(jwtToken) {
|
|
212
|
+
const url = `${GitHubAppAuth.GITHUB_API_URL}/app/installations/${this.config.installation_id}/access_tokens`;
|
|
213
|
+
let response;
|
|
214
|
+
try {
|
|
215
|
+
response = await fetch(url, {
|
|
216
|
+
method: 'POST',
|
|
217
|
+
headers: {
|
|
218
|
+
Accept: 'application/vnd.github+json',
|
|
219
|
+
Authorization: `Bearer ${jwtToken}`,
|
|
220
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (error instanceof Error) {
|
|
226
|
+
throw new Error(`Failed to connect to GitHub API: ${error.message}`);
|
|
227
|
+
}
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
if (!response.ok) {
|
|
231
|
+
const errorBody = await response.text().catch(() => 'Unknown error');
|
|
232
|
+
if (response.status === 401) {
|
|
233
|
+
throw new Error(`Failed to authenticate with GitHub App. Status: ${response.status}, Response: ${errorBody}`);
|
|
234
|
+
}
|
|
235
|
+
if (response.status === 404) {
|
|
236
|
+
throw new Error(`GitHub App installation not found (ID: ${this.config.installation_id}). ` +
|
|
237
|
+
'Verify the Installation ID is correct and the app is installed.');
|
|
238
|
+
}
|
|
239
|
+
if (response.status === 403) {
|
|
240
|
+
// Check for rate limiting
|
|
241
|
+
const rateLimitRemaining = response.headers.get('x-ratelimit-remaining');
|
|
242
|
+
const rateLimitReset = response.headers.get('x-ratelimit-reset');
|
|
243
|
+
if (rateLimitRemaining === '0' && rateLimitReset) {
|
|
244
|
+
const resetValue = parseInt(rateLimitReset, 10);
|
|
245
|
+
if (!isNaN(resetValue)) {
|
|
246
|
+
const resetTime = new Date(resetValue * 1000);
|
|
247
|
+
const secondsUntilReset = Math.ceil((resetTime.getTime() - Date.now()) / 1000);
|
|
248
|
+
throw new Error(`GitHub API rate limited. Retry after ${secondsUntilReset} seconds.`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
throw new Error(`Failed to get installation token: ${response.status} ${errorBody}`);
|
|
253
|
+
}
|
|
254
|
+
return response.json();
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Check if token is expired
|
|
258
|
+
*/
|
|
259
|
+
isExpired(cached) {
|
|
260
|
+
return cached.expires_at.getTime() <= Date.now();
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Check if token is expiring soon
|
|
264
|
+
*/
|
|
265
|
+
isExpiringSoon(cached) {
|
|
266
|
+
return cached.expires_at.getTime() - Date.now() < GitHubAppAuth.REFRESH_THRESHOLD_MS;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Trigger background token refresh with retry (non-blocking)
|
|
270
|
+
*/
|
|
271
|
+
triggerBackgroundRefresh() {
|
|
272
|
+
if (this.refreshPromise) {
|
|
273
|
+
return; // Already refreshing
|
|
274
|
+
}
|
|
275
|
+
// Retry with exponential backoff for transient failures
|
|
276
|
+
this.refreshWithRetry(3, 1000).catch(error => {
|
|
277
|
+
console.error('[GitHubAppAuth] Background token refresh failed after retries:', error.message);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Refresh token with exponential backoff retry
|
|
282
|
+
*
|
|
283
|
+
* @param maxRetries - Maximum number of retry attempts
|
|
284
|
+
* @param baseDelayMs - Base delay in milliseconds (doubles each retry)
|
|
285
|
+
*/
|
|
286
|
+
async refreshWithRetry(maxRetries, baseDelayMs) {
|
|
287
|
+
let lastError = null;
|
|
288
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
289
|
+
try {
|
|
290
|
+
return await this.refreshToken();
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
294
|
+
// Don't retry auth errors (invalid credentials, wrong installation ID)
|
|
295
|
+
const errorMessage = lastError.message.toLowerCase();
|
|
296
|
+
if (errorMessage.includes('401') ||
|
|
297
|
+
errorMessage.includes('404') ||
|
|
298
|
+
errorMessage.includes('invalid') ||
|
|
299
|
+
errorMessage.includes('not found')) {
|
|
300
|
+
throw lastError;
|
|
301
|
+
}
|
|
302
|
+
// If we have retries left, wait with exponential backoff
|
|
303
|
+
if (attempt < maxRetries) {
|
|
304
|
+
const delay = baseDelayMs * Math.pow(2, attempt);
|
|
305
|
+
console.error(`[GitHubAppAuth] Token refresh failed (attempt ${attempt + 1}/${maxRetries + 1}), ` +
|
|
306
|
+
`retrying in ${delay}ms: ${lastError.message}`);
|
|
307
|
+
await this.sleep(delay);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
throw lastError || new Error('Token refresh failed after retries');
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Sleep helper for retry delays
|
|
315
|
+
*/
|
|
316
|
+
sleep(ms) {
|
|
317
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Static Token Provider
|
|
322
|
+
*
|
|
323
|
+
* Simple provider for static PAT tokens
|
|
324
|
+
*/
|
|
325
|
+
export class StaticTokenProvider {
|
|
326
|
+
token;
|
|
327
|
+
constructor(token) {
|
|
328
|
+
this.token = token;
|
|
329
|
+
}
|
|
330
|
+
async getToken() {
|
|
331
|
+
return this.token;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* GitHub App Token Provider
|
|
336
|
+
*
|
|
337
|
+
* Provider that uses GitHubAppAuth for dynamic token generation
|
|
338
|
+
*/
|
|
339
|
+
export class GitHubAppTokenProvider {
|
|
340
|
+
auth;
|
|
341
|
+
constructor(auth) {
|
|
342
|
+
this.auth = auth;
|
|
343
|
+
}
|
|
344
|
+
async getToken() {
|
|
345
|
+
return this.auth.getToken();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=github-app.js.map
|