@foss.global/gitmanager 1.4.0 → 1.6.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.
- package/changelog.md +20 -0
- package/dist_rust/rustgitmanager_linux_amd64 +0 -0
- package/dist_rust/rustgitmanager_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.gitmanager.d.ts +20 -1
- package/dist_ts/classes.gitmanager.js +233 -1
- package/dist_ts/models.d.ts +21 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/rust-gitmanager-bridge.d.ts +1 -1
- package/dist_ts/rust-gitmanager-bridge.js +16 -4
- package/package.json +7 -6
- package/readme.md +20 -4
- package/thirdparty.md +83 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +283 -0
- package/ts/models.ts +32 -0
- package/ts/plugins.ts +2 -1
- package/ts/rust-gitmanager-bridge.ts +17 -3
package/changelog.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-08-04 - 1.6.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add bounded GitManager readiness checks (readiness)
|
|
8
|
+
- Add checkReadiness() with timeout validation and AbortSignal cancellation support.
|
|
9
|
+
- Return structured readiness failure reasons for lifecycle, abort, timeout, and unavailable states.
|
|
10
|
+
- Use Smart HTTP /healthz loopback probes when available to keep readiness responsive while management commands are busy.
|
|
11
|
+
|
|
12
|
+
## 2026-07-31 - 1.5.0
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- validate repository archive extraction metadata (repository-archives)
|
|
17
|
+
- Inspect generated tar.gz archives before publication and reject invalid structure, unsafe paths, symlink cycles, trailing data, or exceeded limits.
|
|
18
|
+
- Add maxArchiveExtractedBytes and maxArchiveEntries options with defaults and runtime validation.
|
|
19
|
+
- Return extractedSizeBytes and entryCount from createRepositoryArchive and validate those values in the TypeScript bridge.
|
|
20
|
+
- Hold exclusive transfer directory ownership while running and clean interrupted archive temporary files on startup.
|
|
21
|
+
- Add archive conformance and limit coverage for metadata validation.
|
|
22
|
+
|
|
3
23
|
## 2026-07-21 - 1.4.0
|
|
4
24
|
|
|
5
25
|
### Features
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/gitmanager',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.6.0',
|
|
7
7
|
description: 'Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtGQUErRjtDQUM3RyxDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerMergeRequest, IGitManagerMergeResult, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, IGitManagerRepositoryLfsPointer, IGitManagerRepositoryServiceRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions } from './models.js';
|
|
2
|
+
import type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffRequest, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerMergeRequest, IGitManagerMergeResult, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerProtectedRefsApplyResult, IGitManagerSmartHttpRepositoryProtectedRefs, IGitManagerRepositoryBundle, IGitManagerRepositoryArchive, IGitManagerRepositoryArchiveRequest, IGitManagerRepositoryLfsPointer, IGitManagerRepositoryServiceRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerRestoreBundleRequest, IGitManagerSmartHttpRepositoryAccess, IGitManagerSmartHttpRepositoryVisibility, IGitManagerStatus, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, IGitManagerOptions, IGitManagerReadinessOptions, TGitManagerReadinessResult } from './models.js';
|
|
3
3
|
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
4
4
|
export declare class GitManager extends plugins.EventEmitter {
|
|
5
5
|
private bridge;
|
|
@@ -8,10 +8,22 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
8
8
|
private stopRequested;
|
|
9
9
|
private config;
|
|
10
10
|
private readonly repositoryServices;
|
|
11
|
+
private lifecycleEpoch;
|
|
12
|
+
private smartHttpProbeUrl;
|
|
13
|
+
private readonly activeReadinessControllers;
|
|
14
|
+
private managementStatusProbePromise;
|
|
11
15
|
constructor(optionsArg?: IGitManagerOptions);
|
|
12
16
|
start(): Promise<void>;
|
|
13
17
|
stop(): Promise<void>;
|
|
14
18
|
getStatus(): Promise<IGitManagerStatus>;
|
|
19
|
+
/**
|
|
20
|
+
* Performs a bounded, read-only probe to verify engine readiness. When Git
|
|
21
|
+
* Smart HTTP is configured, the probe uses its independent /healthz route so
|
|
22
|
+
* readiness stays available while the serial management loop is busy with a
|
|
23
|
+
* long-running command; otherwise a single-flight bounded getStatus round
|
|
24
|
+
* trip is used, which queues behind in-flight management commands.
|
|
25
|
+
*/
|
|
26
|
+
checkReadiness(optionsArg?: IGitManagerReadinessOptions): Promise<TGitManagerReadinessResult>;
|
|
15
27
|
setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void>;
|
|
16
28
|
setSmartHttpRepositoryVisibility(visibilityArg: IGitManagerSmartHttpRepositoryVisibility): Promise<void>;
|
|
17
29
|
setSmartHttpRepositoryProtectedRefs(protectedRefsArg: IGitManagerSmartHttpRepositoryProtectedRefs): Promise<IGitManagerProtectedRefsApplyResult>;
|
|
@@ -36,6 +48,13 @@ export declare class GitManager extends plugins.EventEmitter {
|
|
|
36
48
|
listTags(requestArg: IGitManagerListTagsRequest): Promise<IGitManagerTag[]>;
|
|
37
49
|
getTag(requestArg: IGitManagerTagRequest): Promise<IGitManagerTag>;
|
|
38
50
|
private startInternal;
|
|
51
|
+
private captureSmartHttpProbeUrl;
|
|
52
|
+
private resolveSmartHttpProbeUrl;
|
|
53
|
+
private probeSmartHttpHealth;
|
|
54
|
+
private probeManagementStatus;
|
|
55
|
+
private getReadinessLifecycleReason;
|
|
56
|
+
private createReadinessFailure;
|
|
57
|
+
private abortActiveReadinessProbes;
|
|
39
58
|
private assertRunning;
|
|
40
59
|
private closeRepositoryServices;
|
|
41
60
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
3
3
|
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
4
|
+
const readinessDefaultTimeoutMs = 2_000;
|
|
5
|
+
const readinessMaximumTimeoutMs = 30_000;
|
|
4
6
|
export class GitManager extends plugins.EventEmitter {
|
|
5
7
|
constructor(optionsArg = {}) {
|
|
6
8
|
super();
|
|
@@ -9,6 +11,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
9
11
|
this.startPromise = null;
|
|
10
12
|
this.stopRequested = false;
|
|
11
13
|
this.repositoryServices = new Set();
|
|
14
|
+
this.lifecycleEpoch = 0;
|
|
15
|
+
this.smartHttpProbeUrl = null;
|
|
16
|
+
this.activeReadinessControllers = new Set();
|
|
17
|
+
this.managementStatusProbePromise = null;
|
|
12
18
|
const dataDir = optionsArg.dataDir
|
|
13
19
|
?? plugins.path.resolve(process.cwd(), '.nogit', 'gitmanager');
|
|
14
20
|
const smartHttpOptions = optionsArg.smartHttp;
|
|
@@ -17,6 +23,8 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
17
23
|
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
18
24
|
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
19
25
|
maxArchiveBytes: optionsArg.maxArchiveBytes ?? 128 * 1024 * 1024,
|
|
26
|
+
maxArchiveExtractedBytes: optionsArg.maxArchiveExtractedBytes ?? 64 * 1024 * 1024 * 1024,
|
|
27
|
+
maxArchiveEntries: optionsArg.maxArchiveEntries ?? 1_000_000,
|
|
20
28
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
21
29
|
? {
|
|
22
30
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -53,6 +61,9 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
53
61
|
};
|
|
54
62
|
this.bridge.on('exit', (code, signal) => {
|
|
55
63
|
this.started = false;
|
|
64
|
+
this.lifecycleEpoch++;
|
|
65
|
+
this.smartHttpProbeUrl = null;
|
|
66
|
+
this.abortActiveReadinessProbes();
|
|
56
67
|
this.emit('exit', code, signal);
|
|
57
68
|
});
|
|
58
69
|
this.bridge.on('stderr', (line) => {
|
|
@@ -67,6 +78,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
67
78
|
throw new Error('GitManager is already starting');
|
|
68
79
|
}
|
|
69
80
|
this.stopRequested = false;
|
|
81
|
+
this.lifecycleEpoch++;
|
|
70
82
|
this.startPromise = this.startInternal();
|
|
71
83
|
try {
|
|
72
84
|
await this.startPromise;
|
|
@@ -77,6 +89,9 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
77
89
|
}
|
|
78
90
|
async stop() {
|
|
79
91
|
this.stopRequested = true;
|
|
92
|
+
this.lifecycleEpoch++;
|
|
93
|
+
this.smartHttpProbeUrl = null;
|
|
94
|
+
this.abortActiveReadinessProbes();
|
|
80
95
|
if (this.startPromise) {
|
|
81
96
|
await this.startPromise.catch(() => undefined);
|
|
82
97
|
}
|
|
@@ -104,6 +119,78 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
104
119
|
}
|
|
105
120
|
return this.bridge.getStatus();
|
|
106
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Performs a bounded, read-only probe to verify engine readiness. When Git
|
|
124
|
+
* Smart HTTP is configured, the probe uses its independent /healthz route so
|
|
125
|
+
* readiness stays available while the serial management loop is busy with a
|
|
126
|
+
* long-running command; otherwise a single-flight bounded getStatus round
|
|
127
|
+
* trip is used, which queues behind in-flight management commands.
|
|
128
|
+
*/
|
|
129
|
+
async checkReadiness(optionsArg = {}) {
|
|
130
|
+
const startedAt = performance.now();
|
|
131
|
+
const timeoutMs = optionsArg.timeoutMs ?? readinessDefaultTimeoutMs;
|
|
132
|
+
if (!Number.isSafeInteger(timeoutMs) ||
|
|
133
|
+
timeoutMs <= 0 ||
|
|
134
|
+
timeoutMs > readinessMaximumTimeoutMs) {
|
|
135
|
+
throw new TypeError(`Readiness timeoutMs must be a positive safe integer no greater than ${readinessMaximumTimeoutMs}.`);
|
|
136
|
+
}
|
|
137
|
+
const callerSignal = optionsArg.signal;
|
|
138
|
+
if (callerSignal?.aborted) {
|
|
139
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
140
|
+
}
|
|
141
|
+
const lifecycleReason = this.getReadinessLifecycleReason();
|
|
142
|
+
if (lifecycleReason) {
|
|
143
|
+
return this.createReadinessFailure(lifecycleReason, startedAt);
|
|
144
|
+
}
|
|
145
|
+
const lifecycleEpoch = this.lifecycleEpoch;
|
|
146
|
+
const readinessController = new AbortController();
|
|
147
|
+
let abortSource;
|
|
148
|
+
const abortForCaller = () => {
|
|
149
|
+
if (!abortSource) {
|
|
150
|
+
abortSource = 'caller';
|
|
151
|
+
}
|
|
152
|
+
readinessController.abort();
|
|
153
|
+
};
|
|
154
|
+
callerSignal?.addEventListener('abort', abortForCaller, { once: true });
|
|
155
|
+
const deadlineTimer = setTimeout(() => {
|
|
156
|
+
if (!abortSource) {
|
|
157
|
+
abortSource = 'deadline';
|
|
158
|
+
}
|
|
159
|
+
readinessController.abort();
|
|
160
|
+
}, timeoutMs);
|
|
161
|
+
this.activeReadinessControllers.add(readinessController);
|
|
162
|
+
let probeOutcome;
|
|
163
|
+
try {
|
|
164
|
+
probeOutcome = this.smartHttpProbeUrl
|
|
165
|
+
? await this.probeSmartHttpHealth(this.smartHttpProbeUrl, readinessController.signal)
|
|
166
|
+
: await this.probeManagementStatus(readinessController.signal);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
clearTimeout(deadlineTimer);
|
|
170
|
+
callerSignal?.removeEventListener('abort', abortForCaller);
|
|
171
|
+
this.activeReadinessControllers.delete(readinessController);
|
|
172
|
+
}
|
|
173
|
+
if (this.lifecycleEpoch !== lifecycleEpoch) {
|
|
174
|
+
return this.createReadinessFailure(this.getReadinessLifecycleReason() ?? 'unavailable', startedAt);
|
|
175
|
+
}
|
|
176
|
+
if (probeOutcome === 'aborted') {
|
|
177
|
+
if (abortSource === 'caller') {
|
|
178
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
179
|
+
}
|
|
180
|
+
if (abortSource === 'deadline') {
|
|
181
|
+
return this.createReadinessFailure('timeout', startedAt);
|
|
182
|
+
}
|
|
183
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
184
|
+
}
|
|
185
|
+
if (probeOutcome === 'unavailable') {
|
|
186
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
ready: true,
|
|
190
|
+
status: 'ready',
|
|
191
|
+
durationMs: performance.now() - startedAt,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
107
194
|
async setSmartHttpRepositoryAccess(accessArg) {
|
|
108
195
|
this.assertRunning();
|
|
109
196
|
return this.bridge.setSmartHttpRepositoryAccess({
|
|
@@ -249,6 +336,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
249
336
|
throw new Error('GitManager start was cancelled');
|
|
250
337
|
}
|
|
251
338
|
this.started = true;
|
|
339
|
+
await this.captureSmartHttpProbeUrl();
|
|
252
340
|
}
|
|
253
341
|
catch (error) {
|
|
254
342
|
this.bridge.kill();
|
|
@@ -256,6 +344,150 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
256
344
|
throw error;
|
|
257
345
|
}
|
|
258
346
|
}
|
|
347
|
+
async captureSmartHttpProbeUrl() {
|
|
348
|
+
if (!this.config.smartHttp) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
try {
|
|
352
|
+
const status = await this.bridge.getStatus({ timeoutMs: 5_000 });
|
|
353
|
+
this.smartHttpProbeUrl = this.resolveSmartHttpProbeUrl(status);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
this.smartHttpProbeUrl = null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
resolveSmartHttpProbeUrl(statusArg) {
|
|
360
|
+
const smartHttpStatus = statusArg.smartHttp;
|
|
361
|
+
if (!smartHttpStatus?.running || !smartHttpStatus.baseUrl) {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
let baseUrl;
|
|
365
|
+
try {
|
|
366
|
+
baseUrl = new URL(smartHttpStatus.baseUrl);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
if (baseUrl.hostname === '0.0.0.0') {
|
|
372
|
+
baseUrl.hostname = '127.0.0.1';
|
|
373
|
+
}
|
|
374
|
+
else if (baseUrl.hostname === '::' || baseUrl.hostname === '[::]') {
|
|
375
|
+
baseUrl.hostname = '[::1]';
|
|
376
|
+
}
|
|
377
|
+
const hostname = baseUrl.hostname;
|
|
378
|
+
const isLoopback = hostname === 'localhost' ||
|
|
379
|
+
hostname === '::1' ||
|
|
380
|
+
hostname === '[::1]' ||
|
|
381
|
+
hostname.startsWith('127.');
|
|
382
|
+
if (!isLoopback) {
|
|
383
|
+
return null;
|
|
384
|
+
}
|
|
385
|
+
return baseUrl.origin;
|
|
386
|
+
}
|
|
387
|
+
probeSmartHttpHealth(probeUrlArg, signalArg) {
|
|
388
|
+
return new Promise((resolve) => {
|
|
389
|
+
let settled = false;
|
|
390
|
+
let healthRequest;
|
|
391
|
+
const settle = (outcomeArg) => {
|
|
392
|
+
if (settled) {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
settled = true;
|
|
396
|
+
signalArg.removeEventListener('abort', abortProbe);
|
|
397
|
+
resolve(outcomeArg);
|
|
398
|
+
};
|
|
399
|
+
const abortProbe = () => {
|
|
400
|
+
healthRequest?.destroy();
|
|
401
|
+
settle('aborted');
|
|
402
|
+
};
|
|
403
|
+
signalArg.addEventListener('abort', abortProbe, { once: true });
|
|
404
|
+
if (signalArg.aborted) {
|
|
405
|
+
abortProbe();
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
try {
|
|
409
|
+
healthRequest = plugins.http.request(new URL('/healthz', probeUrlArg), { method: 'GET', agent: false }, (response) => {
|
|
410
|
+
const outcome = response.statusCode === 200 ? 'ready' : 'unavailable';
|
|
411
|
+
// The body is never needed; destroying immediately keeps a peer
|
|
412
|
+
// that stalls mid-body from retaining the socket indefinitely.
|
|
413
|
+
healthRequest?.destroy();
|
|
414
|
+
settle(outcome);
|
|
415
|
+
});
|
|
416
|
+
healthRequest.on('error', () => settle('unavailable'));
|
|
417
|
+
healthRequest.end();
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
settle('unavailable');
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
probeManagementStatus(signalArg) {
|
|
425
|
+
if (!this.managementStatusProbePromise) {
|
|
426
|
+
const probeEpoch = this.lifecycleEpoch;
|
|
427
|
+
const managementProbe = this.bridge
|
|
428
|
+
.getStatus({ timeoutMs: readinessMaximumTimeoutMs })
|
|
429
|
+
.then((status) => {
|
|
430
|
+
if (this.lifecycleEpoch === probeEpoch &&
|
|
431
|
+
this.config.smartHttp &&
|
|
432
|
+
!this.smartHttpProbeUrl) {
|
|
433
|
+
this.smartHttpProbeUrl = this.resolveSmartHttpProbeUrl(status);
|
|
434
|
+
}
|
|
435
|
+
return status.running ? 'ready' : 'unavailable';
|
|
436
|
+
}, () => 'unavailable');
|
|
437
|
+
this.managementStatusProbePromise = managementProbe;
|
|
438
|
+
void managementProbe.finally(() => {
|
|
439
|
+
if (this.managementStatusProbePromise === managementProbe) {
|
|
440
|
+
this.managementStatusProbePromise = null;
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
const sharedProbe = this.managementStatusProbePromise;
|
|
445
|
+
return new Promise((resolve) => {
|
|
446
|
+
let settled = false;
|
|
447
|
+
const settle = (outcomeArg) => {
|
|
448
|
+
if (settled) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
settled = true;
|
|
452
|
+
signalArg.removeEventListener('abort', abortWait);
|
|
453
|
+
resolve(outcomeArg);
|
|
454
|
+
};
|
|
455
|
+
const abortWait = () => {
|
|
456
|
+
settle('aborted');
|
|
457
|
+
};
|
|
458
|
+
signalArg.addEventListener('abort', abortWait, { once: true });
|
|
459
|
+
if (signalArg.aborted) {
|
|
460
|
+
abortWait();
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
void sharedProbe.then(settle);
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
getReadinessLifecycleReason() {
|
|
467
|
+
if (this.startPromise) {
|
|
468
|
+
return 'starting';
|
|
469
|
+
}
|
|
470
|
+
if (!this.running) {
|
|
471
|
+
return 'not_running';
|
|
472
|
+
}
|
|
473
|
+
if (this.stopRequested) {
|
|
474
|
+
return 'stopping';
|
|
475
|
+
}
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
createReadinessFailure(reasonArg, startedAtArg) {
|
|
479
|
+
return {
|
|
480
|
+
ready: false,
|
|
481
|
+
status: 'unavailable',
|
|
482
|
+
reason: reasonArg,
|
|
483
|
+
durationMs: performance.now() - startedAtArg,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
abortActiveReadinessProbes() {
|
|
487
|
+
for (const readinessController of [...this.activeReadinessControllers]) {
|
|
488
|
+
readinessController.abort();
|
|
489
|
+
}
|
|
490
|
+
}
|
|
259
491
|
assertRunning() {
|
|
260
492
|
if (!this.running) {
|
|
261
493
|
throw new Error('GitManager is not running');
|
|
@@ -267,4 +499,4 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
267
499
|
await Promise.all(services.map((service) => service.close()));
|
|
268
500
|
}
|
|
269
501
|
}
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBcUN4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBUWxELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVJGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFYix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUkzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTztlQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osT0FBTztZQUNQLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDOUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUNuRSxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsSUFBSSxHQUFHLEdBQUcsSUFBSSxH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
|
|
502
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBd0N4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztBQUt6QyxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBWWxELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVpGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFYix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUNyRSxtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLCtCQUEwQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBQ2pFLGlDQUE0QixHQUFxRCxJQUFJLENBQUM7UUFJNUYsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFB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QyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNDO1FBQzFELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQXlDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQW9DO1FBQ3pELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQWtDO1FBQ3JELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNDO1FBQzFELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQWlDO1FBQ25ELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxD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
|
package/dist_ts/models.d.ts
CHANGED
|
@@ -61,6 +61,8 @@ export interface IGitManagerRepositoryArchive extends IGitManagerRepositorySelec
|
|
|
61
61
|
archivePath: string;
|
|
62
62
|
sizeBytes: number;
|
|
63
63
|
sha256: string;
|
|
64
|
+
extractedSizeBytes: number;
|
|
65
|
+
entryCount: number;
|
|
64
66
|
}
|
|
65
67
|
export interface IGitManagerRepositoryLfsPointer {
|
|
66
68
|
oid: string;
|
|
@@ -93,6 +95,8 @@ export interface IGitManagerOptions {
|
|
|
93
95
|
transferDir?: string;
|
|
94
96
|
maxBundleBytes?: number;
|
|
95
97
|
maxArchiveBytes?: number;
|
|
98
|
+
maxArchiveExtractedBytes?: number;
|
|
99
|
+
maxArchiveEntries?: number;
|
|
96
100
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
97
101
|
}
|
|
98
102
|
export interface IRustGitManagerSmartHttpConfig {
|
|
@@ -123,6 +127,8 @@ export interface IRustGitManagerConfig {
|
|
|
123
127
|
transferDir: string;
|
|
124
128
|
maxBundleBytes: number;
|
|
125
129
|
maxArchiveBytes: number;
|
|
130
|
+
maxArchiveExtractedBytes: number;
|
|
131
|
+
maxArchiveEntries: number;
|
|
126
132
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
127
133
|
}
|
|
128
134
|
export interface IGitManagerSmartHttpStatus {
|
|
@@ -137,4 +143,19 @@ export interface IGitManagerStatus {
|
|
|
137
143
|
uptimeMs: number;
|
|
138
144
|
smartHttp?: IGitManagerSmartHttpStatus;
|
|
139
145
|
}
|
|
146
|
+
export interface IGitManagerReadinessOptions {
|
|
147
|
+
timeoutMs?: number;
|
|
148
|
+
signal?: AbortSignal;
|
|
149
|
+
}
|
|
150
|
+
export type TGitManagerReadinessFailureReason = 'not_running' | 'starting' | 'stopping' | 'aborted' | 'timeout' | 'unavailable';
|
|
151
|
+
export type TGitManagerReadinessResult = {
|
|
152
|
+
ready: true;
|
|
153
|
+
status: 'ready';
|
|
154
|
+
durationMs: number;
|
|
155
|
+
} | {
|
|
156
|
+
ready: false;
|
|
157
|
+
status: 'unavailable';
|
|
158
|
+
reason: TGitManagerReadinessFailureReason;
|
|
159
|
+
durationMs: number;
|
|
160
|
+
};
|
|
140
161
|
export type { IGitManagerCommitDetail, IGitManagerCommitRequest, IGitManagerCommitSummary, IGitManagerDiff, IGitManagerDiffFile, IGitManagerDiffHunk, IGitManagerDiffLine, IGitManagerDiffRequest, IGitManagerDiffStats, IGitManagerFileContent, IGitManagerImportMirrorRequest, IGitManagerInitBareRepositoryRequest, IGitManagerListCommitsRequest, IGitManagerListTagsRequest, IGitManagerMergeRequest, IGitManagerMergeResult, IGitManagerReadFileRequest, IGitManagerRef, IGitManagerRefRequest, IGitManagerRepositoryInfo, IGitManagerRepositorySelector, IGitManagerTag, IGitManagerTagRequest, IGitManagerTreeEntry, IGitManagerTreeRequest, TGitManagerDiffFileStatus, TGitManagerDiffLineKind, TGitManagerMergeMethod, TGitManagerMergeStatus, TGitManagerObjectType, TGitManagerRefType, TGitManagerTreeEntryType, } from '@foss.global/interfaces';
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as childProcess from 'node:child_process';
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
+
import * as http from 'node:http';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
5
|
import * as stream from 'node:stream';
|
|
5
6
|
import * as url from 'node:url';
|
|
6
|
-
export { childProcess, EventEmitter, path, stream, url };
|
|
7
|
+
export { childProcess, EventEmitter, http, path, stream, url };
|
|
7
8
|
import * as smartrust from '@push.rocks/smartrust';
|
|
8
9
|
export { smartrust };
|
package/dist_ts/plugins.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// node native scope
|
|
2
2
|
import * as childProcess from 'node:child_process';
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
|
+
import * as http from 'node:http';
|
|
4
5
|
import * as path from 'node:path';
|
|
5
6
|
import * as stream from 'node:stream';
|
|
6
7
|
import * as url from 'node:url';
|
|
7
|
-
export { childProcess, EventEmitter, path, stream, url };
|
|
8
|
+
export { childProcess, EventEmitter, http, path, stream, url };
|
|
8
9
|
// @push.rocks scope
|
|
9
10
|
import * as smartrust from '@push.rocks/smartrust';
|
|
10
11
|
export { smartrust };
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUUvRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
|
|
@@ -8,7 +8,7 @@ export declare class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
8
8
|
get running(): boolean;
|
|
9
9
|
startGitManager(configArg: IRustGitManagerConfig): Promise<void>;
|
|
10
10
|
stopGitManager(): Promise<void>;
|
|
11
|
-
getStatus(): Promise<IGitManagerStatus>;
|
|
11
|
+
getStatus(optionsArg?: plugins.smartrust.IRustBridgeRequestOptions): Promise<IGitManagerStatus>;
|
|
12
12
|
setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void>;
|
|
13
13
|
setSmartHttpRepositoryVisibility(visibilityArg: IGitManagerSmartHttpRepositoryVisibility): Promise<void>;
|
|
14
14
|
setSmartHttpRepositoryProtectedRefs(protectedRefsArg: IGitManagerSmartHttpRepositoryProtectedRefs): Promise<IGitManagerProtectedRefsApplyResult>;
|
|
@@ -55,8 +55,8 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
55
55
|
async stopGitManager() {
|
|
56
56
|
await this.bridge.sendCommand('stop', {});
|
|
57
57
|
}
|
|
58
|
-
async getStatus() {
|
|
59
|
-
return this.bridge.sendCommand('getStatus', {});
|
|
58
|
+
async getStatus(optionsArg) {
|
|
59
|
+
return this.bridge.sendCommand('getStatus', {}, optionsArg);
|
|
60
60
|
}
|
|
61
61
|
async setSmartHttpRepositoryAccess(accessArg) {
|
|
62
62
|
await this.bridge.sendCommand('setSmartHttpRepositoryAccess', accessArg);
|
|
@@ -83,7 +83,19 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
83
83
|
return this.bridge.sendCommand('createRepositoryBundle', requestArg);
|
|
84
84
|
}
|
|
85
85
|
async createRepositoryArchive(requestArg) {
|
|
86
|
-
|
|
86
|
+
const result = await this.bridge.sendCommand('createRepositoryArchive', requestArg, {
|
|
87
|
+
timeoutMs: 65 * 60 * 1000,
|
|
88
|
+
});
|
|
89
|
+
for (const [field, value] of [
|
|
90
|
+
['sizeBytes', result.sizeBytes],
|
|
91
|
+
['extractedSizeBytes', result.extractedSizeBytes],
|
|
92
|
+
['entryCount', result.entryCount],
|
|
93
|
+
]) {
|
|
94
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
95
|
+
throw new Error(`Rust GitManager returned an invalid ${field}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
87
99
|
}
|
|
88
100
|
async prepareRepositoryService(requestArg) {
|
|
89
101
|
return this.bridge.sendCommand('prepareRepositoryService', requestArg);
|
|
@@ -125,4 +137,4 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
125
137
|
return this.bridge.sendCommand('getTag', requestArg);
|
|
126
138
|
}
|
|
127
139
|
}
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1naXRtYW5hZ2VyLWJyaWRnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1c3QtZ2l0bWFuYWdlci1icmlkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFrRXhDLFNBQVMsY0FBYztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakYsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsdUJBQXVCO0lBQzlCLE1BQU0sT0FBTyxHQUEyQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQy9GLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUU3RixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsT0FBTyxDQUFDLFlBQVk7SUFHNUQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBc0I7WUFDbEUsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixVQUFVLEVBQUUsd0JBQXdCO1lBQ3BDLHFCQUFxQixFQUFFLHlCQUF5QjtZQUNoRCxVQUFVLEVBQUUsZUFBZSxFQUFFO1lBQzdCLGdCQUFnQixFQUFFLE1BQU07WUFDeEIsY0FBYyxFQUFFLEtBQUs7U0FDdEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBZ0M7UUFDM0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWM7UUFDekIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQ3BCLFVBQXdEO1FBRXhELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sS0FBSyxDQUFDLDRCQUE0QixDQUFDLFNBQStDO1FBQ3ZGLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsOEJBQThCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsYUFBdUQ7UUFFdkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU0sS0FBSyxDQUFDLG1DQUFtQyxDQUM5QyxnQkFBNkQ7UUFFN0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDNUIscUNBQXFDLEVBQ3JDLGdCQUFnQixDQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFnRDtRQUM5RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQTBDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQXlDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBeUM7UUFDckUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUNqQyxVQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFVBQStDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMseUJBQXlCLEVBQUUsVUFBVSxFQUFFO1lBQ2xGLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQzNCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDL0IsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDakQsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztTQUN6QixFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUNuQyxVQUErQztRQUUvQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDBCQUEwQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLFVBQTJDO1FBRTNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMseUJBQXlCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFpQztRQUNyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QixDQUNwQyxVQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDJCQUEyQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixVQUFtQztRQUVuQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQWtDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNDO1FBQzFELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQXlDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQW9DO1FBQ3pELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQWtDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNDO1FBQzFELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQWlDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foss.global/gitmanager",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.",
|
|
6
6
|
"exports": {
|
|
@@ -10,15 +10,16 @@
|
|
|
10
10
|
"author": "Task Venture Capital GmbH",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@foss.global/interfaces": "^0.
|
|
14
|
-
"@push.rocks/smartrust": "^1.
|
|
13
|
+
"@foss.global/interfaces": "^0.11.0",
|
|
14
|
+
"@push.rocks/smartrust": "^1.5.0"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
+
"@foss.global/ci-spec": "0.2.0",
|
|
17
18
|
"@git.zone/tsbuild": "^4.4.2",
|
|
18
19
|
"@git.zone/tsdoc": "^2.1.1",
|
|
19
|
-
"@git.zone/tsrun": "^2.0.
|
|
20
|
-
"@git.zone/tsrust": "^1.
|
|
21
|
-
"@git.zone/tstest": "^3.6.
|
|
20
|
+
"@git.zone/tsrun": "^2.0.6",
|
|
21
|
+
"@git.zone/tsrust": "^1.7.0",
|
|
22
|
+
"@git.zone/tstest": "^3.6.7",
|
|
22
23
|
"@types/node": "^26.1.1"
|
|
23
24
|
},
|
|
24
25
|
"files": [
|
package/readme.md
CHANGED
|
@@ -74,7 +74,9 @@ await gitManager.restoreRepositoryBundle({
|
|
|
74
74
|
|
|
75
75
|
`transferDir` defaults to `<dataDir>/transfers`; both paths must be absolute. `maxBundleBytes` defaults to 8 GiB and is enforced after export and before restore. Restore accepts only a direct, non-empty `.bundle` file inside `transferDir`, requires the declared default branch, runs strict full `git fsck`, and moves the restored bare repository into place atomically. Empty repositories have no Git refs and therefore cannot produce a bundle; persist their catalog metadata and recreate them with `initBareRepository()`.
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Exact-commit source archives default to a 128 MiB compressed limit, a 64 GiB extracted regular-file limit, and 1,000,000 filesystem entries. Configure these with `maxArchiveBytes`, `maxArchiveExtractedBytes`, and `maxArchiveEntries`; their hard ceilings are 16 GiB, 64 GiB, and 1,000,000 respectively. CI source consumers apply their negotiated compressed limit, which is at most 8 GiB in runner protocol v2. Before publication, GitManager validates the exact generated gzip/tar stream against the returned `extractedSizeBytes` and `entryCount`, including paths, entry types, links, PAX metadata, checksums, padding, and archive terminators.
|
|
78
|
+
|
|
79
|
+
The transfer directory is disposable staging, not persistence. GitManager holds exclusive ownership of it while running so startup can safely remove interrupted archive temporary files. The caller owns upload/download completion and removal of finished transfer files. Durable repository bytes belong in managed object storage.
|
|
78
80
|
|
|
79
81
|
## Git Smart HTTP
|
|
80
82
|
|
|
@@ -209,12 +211,26 @@ const result = await service.completed;
|
|
|
209
211
|
|
|
210
212
|
The returned service counts request, response, and stderr bytes, runs with an isolated Git environment, has its own process group and deadline, and is terminated when `GitManager.stop()` runs. Receive-pack uses the same private managed pre-receive hook and exact policy snapshot as Smart HTTP. The caller must authenticate the SSH key, authorize the repository operation, cap sessions, serialize writes with HTTP pushes and policy changes, inspect refs, persist the repository, record downstream events, and withhold the final receive-pack status until all durable work succeeds.
|
|
211
213
|
|
|
214
|
+
## Bounded readiness
|
|
215
|
+
|
|
216
|
+
`checkReadiness()` performs one bounded, read-only probe. Lifecycle states return failure results instead of throwing; only an invalid `timeoutMs` throws a `TypeError`. The default timeout is 2000 ms, the maximum is 30000 ms, and an `AbortSignal` cancels the local wait.
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
const readiness = await gitManager.checkReadiness({ timeoutMs: 2000 });
|
|
220
|
+
if (!readiness.ready) {
|
|
221
|
+
console.error(`GitManager unavailable: ${readiness.reason}`);
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
When Git Smart HTTP is running on a loopback bind, the probe targets the engine's own `GET /healthz` route out-of-band, so readiness stays available while the serial management channel is busy with a long-running command such as a mirror import or archive creation. Without a loopback Smart HTTP route, including a service bound to a non-loopback address with `allowUnsafeNonLoopback`, one shared bounded `getStatus` round trip per instance is used; that fallback queues behind in-flight management commands and a Smart HTTP probe failure never falls through to it. Failure reasons are `not_running`, `starting`, `stopping`, `aborted`, `timeout`, and `unavailable`; the result matches the readiness contracts of `@push.rocks/smartdata` and `@push.rocks/smartbucket`.
|
|
226
|
+
|
|
212
227
|
## Public API
|
|
213
228
|
|
|
214
229
|
- `GitManager`: TypeScript facade for the Rust engine lifecycle.
|
|
215
230
|
- `GitManager.start()`: spawns the Rust binary through `smartrust` and starts the engine.
|
|
216
231
|
- `GitManager.stop()`: asks the engine to stop and always kills the bridge process in cleanup.
|
|
217
232
|
- `GitManager.getStatus()`: returns `{ running, dataDir, uptimeMs, smartHttp? }`.
|
|
233
|
+
- `GitManager.checkReadiness()`: performs a bounded, cancellable read-only readiness probe and returns `{ ready, status, durationMs }` plus a failure `reason` when unavailable.
|
|
218
234
|
- `GitManager.setSmartHttpRepositoryAccess()`: atomically replaces the running Smart HTTP allow-all/allowlist state.
|
|
219
235
|
- `GitManager.setSmartHttpRepositoryVisibility()`: applies one revision-ordered repository visibility update.
|
|
220
236
|
- `GitManager.setSmartHttpRepositoryProtectedRefs()`: applies a complete revision-fenced set of exact protected-head rules and returns its effective revision and digest.
|
|
@@ -223,7 +239,7 @@ The returned service counts request, response, and stderr bytes, runs with an is
|
|
|
223
239
|
- `GitManager.refreshMirror()`: atomically fetches and verifies the configured mirror source.
|
|
224
240
|
- `GitManager.verifyRepository()`: runs a strict full integrity check.
|
|
225
241
|
- `GitManager.createRepositoryBundle()`: writes a bounded full Git bundle into `transferDir` and returns its temporary path and size.
|
|
226
|
-
- `GitManager.createRepositoryArchive()`: writes a bounded deterministic exact-commit `tar.gz` archive into `transferDir` and returns its digest, size, and temporary path.
|
|
242
|
+
- `GitManager.createRepositoryArchive()`: writes a bounded deterministic exact-commit `tar.gz` archive into `transferDir` and returns its digest, compressed size, extracted regular-file size, entry count, and temporary path.
|
|
227
243
|
- `GitManager.restoreRepositoryBundle()`: validates and atomically restores a bounded bundle from `transferDir`.
|
|
228
244
|
- `GitManager.openRepositoryService()`: opens a bounded upload-pack or protected receive-pack stream for an authenticated SSH-style ingress.
|
|
229
245
|
- `GitManager.listRepositories()`: lists local repositories managed below the configured data directory.
|
|
@@ -237,7 +253,7 @@ The returned service counts request, response, and stderr bytes, runs with an is
|
|
|
237
253
|
- `GitManager.getTag()`: reads one tag by exact name.
|
|
238
254
|
- `GitManager.running`: local facade running state.
|
|
239
255
|
- `RustGitManagerBridge`: lower-level typed bridge around `@push.rocks/smartrust`.
|
|
240
|
-
- `IGitManagerOptions`, `IGitManagerStatus`, `IRustGitManagerConfig`, `IGitManagerProtectedRefRule`, `IGitManagerSmartHttpRepositoryProtectedRefs`, `TGitManagerProtectedRefsApplyStatus`, and `IGitManagerProtectedRefsApplyResult`: exported option, status, and protected-ref contracts.
|
|
256
|
+
- `IGitManagerOptions`, `IGitManagerStatus`, `IGitManagerReadinessOptions`, `TGitManagerReadinessResult`, `TGitManagerReadinessFailureReason`, `IRustGitManagerConfig`, `IGitManagerProtectedRefRule`, `IGitManagerSmartHttpRepositoryProtectedRefs`, `TGitManagerProtectedRefsApplyStatus`, and `IGitManagerProtectedRefsApplyResult`: exported option, status, readiness, and protected-ref contracts.
|
|
241
257
|
|
|
242
258
|
Repository/read DTO contracts are re-exported from the published `@foss.global/interfaces` package.
|
|
243
259
|
|
|
@@ -264,7 +280,7 @@ pnpm run test:rust
|
|
|
264
280
|
pnpm run build
|
|
265
281
|
```
|
|
266
282
|
|
|
267
|
-
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API, raw upload-pack/receive-pack preparation, clone/fetch denial, trusted receive-pack denial, explicit policy initialization, protected create/delete/non-fast-forward enforcement, inherited self-test hardening, restart replay, and real push tests through `smartrust`.
|
|
283
|
+
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, bounded readiness, local mirror/read API, raw upload-pack/receive-pack preparation, clone/fetch denial, trusted receive-pack denial, explicit policy initialization, protected create/delete/non-fast-forward enforcement, inherited self-test hardening, restart replay, and real push tests through `smartrust`.
|
|
268
284
|
|
|
269
285
|
## License and Legal Information
|
|
270
286
|
|
package/thirdparty.md
CHANGED
|
@@ -4,6 +4,7 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
4
4
|
|
|
5
5
|
| Crate | Version | License |
|
|
6
6
|
| --- | --- | --- |
|
|
7
|
+
| adler2 | 2.0.1 | 0BSD OR MIT OR Apache-2.0 |
|
|
7
8
|
| aho-corasick | 1.1.4 | MIT OR Unlicense |
|
|
8
9
|
| anstream | 1.0.0 | Apache-2.0 OR MIT |
|
|
9
10
|
| anstyle | 1.0.14 | Apache-2.0 OR MIT |
|
|
@@ -25,9 +26,11 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
25
26
|
| clap_lex | 1.1.0 | Apache-2.0 OR MIT |
|
|
26
27
|
| colorchoice | 1.0.5 | Apache-2.0 OR MIT |
|
|
27
28
|
| cpufeatures | 0.2.17 | MIT OR Apache-2.0 |
|
|
29
|
+
| crc32fast | 1.5.0 | MIT OR Apache-2.0 |
|
|
28
30
|
| crypto-common | 0.1.7 | MIT OR Apache-2.0 |
|
|
29
31
|
| digest | 0.10.7 | MIT OR Apache-2.0 |
|
|
30
32
|
| errno | 0.3.14 | Apache-2.0 OR MIT |
|
|
33
|
+
| flate2 | 1.1.9 | MIT OR Apache-2.0 |
|
|
31
34
|
| form_urlencoded | 1.2.2 | Apache-2.0 OR MIT |
|
|
32
35
|
| futures-channel | 0.3.33 | Apache-2.0 OR MIT |
|
|
33
36
|
| futures-core | 0.3.33 | Apache-2.0 OR MIT |
|
|
@@ -54,6 +57,7 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
54
57
|
| matchit | 0.8.4 | BSD-3-Clause AND MIT |
|
|
55
58
|
| memchr | 2.8.2 | MIT OR Unlicense |
|
|
56
59
|
| mime | 0.3.17 | Apache-2.0 OR MIT |
|
|
60
|
+
| miniz_oxide | 0.8.9 | MIT OR Zlib OR Apache-2.0 |
|
|
57
61
|
| mio | 1.2.1 | MIT |
|
|
58
62
|
| nu-ansi-term | 0.50.3 | MIT |
|
|
59
63
|
| once_cell | 1.21.4 | Apache-2.0 OR MIT |
|
|
@@ -78,6 +82,7 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
78
82
|
| sha2 | 0.10.9 | MIT OR Apache-2.0 |
|
|
79
83
|
| sharded-slab | 0.1.7 | MIT |
|
|
80
84
|
| signal-hook-registry | 1.4.8 | Apache-2.0 OR MIT |
|
|
85
|
+
| simd-adler32 | 0.3.10 | MIT |
|
|
81
86
|
| slab | 0.4.12 | MIT |
|
|
82
87
|
| smallvec | 1.15.2 | Apache-2.0 OR MIT |
|
|
83
88
|
| socket2 | 0.6.4 | Apache-2.0 OR MIT |
|
|
@@ -106,3 +111,81 @@ This package bundles Rust binaries in `dist_rust/`. Those binaries are built fro
|
|
|
106
111
|
| windows-link | 0.2.1 | Apache-2.0 OR MIT |
|
|
107
112
|
| windows-sys | 0.61.2 | Apache-2.0 OR MIT |
|
|
108
113
|
| zmij | 1.0.21 | MIT |
|
|
114
|
+
|
|
115
|
+
## MIT Notices For Compression Dependencies
|
|
116
|
+
|
|
117
|
+
### crc32fast 1.5.0
|
|
118
|
+
|
|
119
|
+
MIT License
|
|
120
|
+
|
|
121
|
+
Copyright (c) 2018 Sam Rijs, Alex Crichton and contributors
|
|
122
|
+
|
|
123
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
124
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
125
|
+
in the Software without restriction, including without limitation the rights
|
|
126
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
127
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
128
|
+
furnished to do so, subject to the following conditions:
|
|
129
|
+
|
|
130
|
+
The above copyright notice and this permission notice shall be included in all
|
|
131
|
+
copies or substantial portions of the Software.
|
|
132
|
+
|
|
133
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
134
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
135
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
136
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
137
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
138
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
139
|
+
SOFTWARE.
|
|
140
|
+
|
|
141
|
+
### flate2 1.1.9
|
|
142
|
+
|
|
143
|
+
Copyright (c) 2014-2026 Alex Crichton
|
|
144
|
+
|
|
145
|
+
Permission is hereby granted, free of charge, to any
|
|
146
|
+
person obtaining a copy of this software and associated
|
|
147
|
+
documentation files (the "Software"), to deal in the
|
|
148
|
+
Software without restriction, including without
|
|
149
|
+
limitation the rights to use, copy, modify, merge,
|
|
150
|
+
publish, distribute, sublicense, and/or sell copies of
|
|
151
|
+
the Software, and to permit persons to whom the Software
|
|
152
|
+
is furnished to do so, subject to the following
|
|
153
|
+
conditions:
|
|
154
|
+
|
|
155
|
+
The above copyright notice and this permission notice
|
|
156
|
+
shall be included in all copies or substantial portions
|
|
157
|
+
of the Software.
|
|
158
|
+
|
|
159
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
160
|
+
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
161
|
+
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
162
|
+
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
163
|
+
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
164
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
165
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
166
|
+
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
167
|
+
DEALINGS IN THE SOFTWARE.
|
|
168
|
+
|
|
169
|
+
### simd-adler32 0.3.10
|
|
170
|
+
|
|
171
|
+
MIT License
|
|
172
|
+
|
|
173
|
+
Copyright (c) [2021] [Marvin Countryman]
|
|
174
|
+
|
|
175
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
176
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
177
|
+
in the Software without restriction, including without limitation the rights
|
|
178
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
179
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
180
|
+
furnished to do so, subject to the following conditions:
|
|
181
|
+
|
|
182
|
+
The above copyright notice and this permission notice shall be included in all
|
|
183
|
+
copies or substantial portions of the Software.
|
|
184
|
+
|
|
185
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
186
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
187
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
188
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
189
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
190
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
191
|
+
SOFTWARE.
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gitmanager.ts
CHANGED
|
@@ -33,11 +33,20 @@ import type {
|
|
|
33
33
|
IGitManagerTreeEntry,
|
|
34
34
|
IGitManagerTreeRequest,
|
|
35
35
|
IGitManagerOptions,
|
|
36
|
+
IGitManagerReadinessOptions,
|
|
36
37
|
IRustGitManagerConfig,
|
|
38
|
+
TGitManagerReadinessFailureReason,
|
|
39
|
+
TGitManagerReadinessResult,
|
|
37
40
|
} from './models.js';
|
|
38
41
|
import { RustGitManagerBridge } from './rust-gitmanager-bridge.js';
|
|
39
42
|
import { GitManagerRepositoryService } from './classes.repositoryservice.js';
|
|
40
43
|
|
|
44
|
+
const readinessDefaultTimeoutMs = 2_000;
|
|
45
|
+
const readinessMaximumTimeoutMs = 30_000;
|
|
46
|
+
|
|
47
|
+
type TGitManagerReadinessAbortSource = 'caller' | 'deadline';
|
|
48
|
+
type TGitManagerReadinessProbeOutcome = 'ready' | 'aborted' | 'unavailable';
|
|
49
|
+
|
|
41
50
|
export class GitManager extends plugins.EventEmitter {
|
|
42
51
|
private bridge = new RustGitManagerBridge();
|
|
43
52
|
private started = false;
|
|
@@ -45,6 +54,10 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
45
54
|
private stopRequested = false;
|
|
46
55
|
private config: IRustGitManagerConfig;
|
|
47
56
|
private readonly repositoryServices = new Set<GitManagerRepositoryService>();
|
|
57
|
+
private lifecycleEpoch = 0;
|
|
58
|
+
private smartHttpProbeUrl: string | null = null;
|
|
59
|
+
private readonly activeReadinessControllers = new Set<AbortController>();
|
|
60
|
+
private managementStatusProbePromise: Promise<TGitManagerReadinessProbeOutcome> | null = null;
|
|
48
61
|
|
|
49
62
|
constructor(optionsArg: IGitManagerOptions = {}) {
|
|
50
63
|
super();
|
|
@@ -56,6 +69,9 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
56
69
|
transferDir: optionsArg.transferDir ?? plugins.path.join(dataDir, 'transfers'),
|
|
57
70
|
maxBundleBytes: optionsArg.maxBundleBytes ?? 8 * 1024 * 1024 * 1024,
|
|
58
71
|
maxArchiveBytes: optionsArg.maxArchiveBytes ?? 128 * 1024 * 1024,
|
|
72
|
+
maxArchiveExtractedBytes:
|
|
73
|
+
optionsArg.maxArchiveExtractedBytes ?? 64 * 1024 * 1024 * 1024,
|
|
74
|
+
maxArchiveEntries: optionsArg.maxArchiveEntries ?? 1_000_000,
|
|
59
75
|
smartHttp: smartHttpOptions && smartHttpOptions.enabled !== false
|
|
60
76
|
? {
|
|
61
77
|
bindAddress: smartHttpOptions.bindAddress ?? '127.0.0.1',
|
|
@@ -95,6 +111,9 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
95
111
|
};
|
|
96
112
|
this.bridge.on('exit', (code: number | null, signal: string | null) => {
|
|
97
113
|
this.started = false;
|
|
114
|
+
this.lifecycleEpoch++;
|
|
115
|
+
this.smartHttpProbeUrl = null;
|
|
116
|
+
this.abortActiveReadinessProbes();
|
|
98
117
|
this.emit('exit', code, signal);
|
|
99
118
|
});
|
|
100
119
|
this.bridge.on('stderr', (line: string) => {
|
|
@@ -111,6 +130,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
111
130
|
}
|
|
112
131
|
|
|
113
132
|
this.stopRequested = false;
|
|
133
|
+
this.lifecycleEpoch++;
|
|
114
134
|
this.startPromise = this.startInternal();
|
|
115
135
|
try {
|
|
116
136
|
await this.startPromise;
|
|
@@ -121,6 +141,9 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
121
141
|
|
|
122
142
|
public async stop(): Promise<void> {
|
|
123
143
|
this.stopRequested = true;
|
|
144
|
+
this.lifecycleEpoch++;
|
|
145
|
+
this.smartHttpProbeUrl = null;
|
|
146
|
+
this.abortActiveReadinessProbes();
|
|
124
147
|
if (this.startPromise) {
|
|
125
148
|
await this.startPromise.catch(() => undefined);
|
|
126
149
|
}
|
|
@@ -149,6 +172,94 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
149
172
|
return this.bridge.getStatus();
|
|
150
173
|
}
|
|
151
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Performs a bounded, read-only probe to verify engine readiness. When Git
|
|
177
|
+
* Smart HTTP is configured, the probe uses its independent /healthz route so
|
|
178
|
+
* readiness stays available while the serial management loop is busy with a
|
|
179
|
+
* long-running command; otherwise a single-flight bounded getStatus round
|
|
180
|
+
* trip is used, which queues behind in-flight management commands.
|
|
181
|
+
*/
|
|
182
|
+
public async checkReadiness(
|
|
183
|
+
optionsArg: IGitManagerReadinessOptions = {},
|
|
184
|
+
): Promise<TGitManagerReadinessResult> {
|
|
185
|
+
const startedAt = performance.now();
|
|
186
|
+
const timeoutMs = optionsArg.timeoutMs ?? readinessDefaultTimeoutMs;
|
|
187
|
+
if (
|
|
188
|
+
!Number.isSafeInteger(timeoutMs) ||
|
|
189
|
+
timeoutMs <= 0 ||
|
|
190
|
+
timeoutMs > readinessMaximumTimeoutMs
|
|
191
|
+
) {
|
|
192
|
+
throw new TypeError(
|
|
193
|
+
`Readiness timeoutMs must be a positive safe integer no greater than ${readinessMaximumTimeoutMs}.`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const callerSignal = optionsArg.signal;
|
|
198
|
+
if (callerSignal?.aborted) {
|
|
199
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
200
|
+
}
|
|
201
|
+
const lifecycleReason = this.getReadinessLifecycleReason();
|
|
202
|
+
if (lifecycleReason) {
|
|
203
|
+
return this.createReadinessFailure(lifecycleReason, startedAt);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const lifecycleEpoch = this.lifecycleEpoch;
|
|
207
|
+
const readinessController = new AbortController();
|
|
208
|
+
let abortSource: TGitManagerReadinessAbortSource | undefined;
|
|
209
|
+
const abortForCaller = (): void => {
|
|
210
|
+
if (!abortSource) {
|
|
211
|
+
abortSource = 'caller';
|
|
212
|
+
}
|
|
213
|
+
readinessController.abort();
|
|
214
|
+
};
|
|
215
|
+
callerSignal?.addEventListener('abort', abortForCaller, { once: true });
|
|
216
|
+
const deadlineTimer = setTimeout(() => {
|
|
217
|
+
if (!abortSource) {
|
|
218
|
+
abortSource = 'deadline';
|
|
219
|
+
}
|
|
220
|
+
readinessController.abort();
|
|
221
|
+
}, timeoutMs);
|
|
222
|
+
this.activeReadinessControllers.add(readinessController);
|
|
223
|
+
|
|
224
|
+
let probeOutcome: TGitManagerReadinessProbeOutcome;
|
|
225
|
+
try {
|
|
226
|
+
probeOutcome = this.smartHttpProbeUrl
|
|
227
|
+
? await this.probeSmartHttpHealth(
|
|
228
|
+
this.smartHttpProbeUrl,
|
|
229
|
+
readinessController.signal,
|
|
230
|
+
)
|
|
231
|
+
: await this.probeManagementStatus(readinessController.signal);
|
|
232
|
+
} finally {
|
|
233
|
+
clearTimeout(deadlineTimer);
|
|
234
|
+
callerSignal?.removeEventListener('abort', abortForCaller);
|
|
235
|
+
this.activeReadinessControllers.delete(readinessController);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (this.lifecycleEpoch !== lifecycleEpoch) {
|
|
239
|
+
return this.createReadinessFailure(
|
|
240
|
+
this.getReadinessLifecycleReason() ?? 'unavailable',
|
|
241
|
+
startedAt,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
if (probeOutcome === 'aborted') {
|
|
245
|
+
if (abortSource === 'caller') {
|
|
246
|
+
return this.createReadinessFailure('aborted', startedAt);
|
|
247
|
+
}
|
|
248
|
+
if (abortSource === 'deadline') {
|
|
249
|
+
return this.createReadinessFailure('timeout', startedAt);
|
|
250
|
+
}
|
|
251
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
252
|
+
}
|
|
253
|
+
if (probeOutcome === 'unavailable') {
|
|
254
|
+
return this.createReadinessFailure('unavailable', startedAt);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
ready: true,
|
|
258
|
+
status: 'ready',
|
|
259
|
+
durationMs: performance.now() - startedAt,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
152
263
|
public async setSmartHttpRepositoryAccess(
|
|
153
264
|
accessArg: IGitManagerSmartHttpRepositoryAccess,
|
|
154
265
|
): Promise<void> {
|
|
@@ -339,6 +450,7 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
339
450
|
throw new Error('GitManager start was cancelled');
|
|
340
451
|
}
|
|
341
452
|
this.started = true;
|
|
453
|
+
await this.captureSmartHttpProbeUrl();
|
|
342
454
|
} catch (error) {
|
|
343
455
|
this.bridge.kill();
|
|
344
456
|
this.started = false;
|
|
@@ -346,6 +458,177 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
346
458
|
}
|
|
347
459
|
}
|
|
348
460
|
|
|
461
|
+
private async captureSmartHttpProbeUrl(): Promise<void> {
|
|
462
|
+
if (!this.config.smartHttp) {
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
try {
|
|
466
|
+
const status = await this.bridge.getStatus({ timeoutMs: 5_000 });
|
|
467
|
+
this.smartHttpProbeUrl = this.resolveSmartHttpProbeUrl(status);
|
|
468
|
+
} catch {
|
|
469
|
+
this.smartHttpProbeUrl = null;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
private resolveSmartHttpProbeUrl(statusArg: IGitManagerStatus): string | null {
|
|
474
|
+
const smartHttpStatus = statusArg.smartHttp;
|
|
475
|
+
if (!smartHttpStatus?.running || !smartHttpStatus.baseUrl) {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
let baseUrl: URL;
|
|
479
|
+
try {
|
|
480
|
+
baseUrl = new URL(smartHttpStatus.baseUrl);
|
|
481
|
+
} catch {
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
if (baseUrl.hostname === '0.0.0.0') {
|
|
485
|
+
baseUrl.hostname = '127.0.0.1';
|
|
486
|
+
} else if (baseUrl.hostname === '::' || baseUrl.hostname === '[::]') {
|
|
487
|
+
baseUrl.hostname = '[::1]';
|
|
488
|
+
}
|
|
489
|
+
const hostname = baseUrl.hostname;
|
|
490
|
+
const isLoopback =
|
|
491
|
+
hostname === 'localhost' ||
|
|
492
|
+
hostname === '::1' ||
|
|
493
|
+
hostname === '[::1]' ||
|
|
494
|
+
hostname.startsWith('127.');
|
|
495
|
+
if (!isLoopback) {
|
|
496
|
+
return null;
|
|
497
|
+
}
|
|
498
|
+
return baseUrl.origin;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
private probeSmartHttpHealth(
|
|
502
|
+
probeUrlArg: string,
|
|
503
|
+
signalArg: AbortSignal,
|
|
504
|
+
): Promise<TGitManagerReadinessProbeOutcome> {
|
|
505
|
+
return new Promise((resolve) => {
|
|
506
|
+
let settled = false;
|
|
507
|
+
let healthRequest: plugins.http.ClientRequest | undefined;
|
|
508
|
+
const settle = (outcomeArg: TGitManagerReadinessProbeOutcome): void => {
|
|
509
|
+
if (settled) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
settled = true;
|
|
513
|
+
signalArg.removeEventListener('abort', abortProbe);
|
|
514
|
+
resolve(outcomeArg);
|
|
515
|
+
};
|
|
516
|
+
const abortProbe = (): void => {
|
|
517
|
+
healthRequest?.destroy();
|
|
518
|
+
settle('aborted');
|
|
519
|
+
};
|
|
520
|
+
signalArg.addEventListener('abort', abortProbe, { once: true });
|
|
521
|
+
if (signalArg.aborted) {
|
|
522
|
+
abortProbe();
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
try {
|
|
526
|
+
healthRequest = plugins.http.request(
|
|
527
|
+
new URL('/healthz', probeUrlArg),
|
|
528
|
+
{ method: 'GET', agent: false },
|
|
529
|
+
(response) => {
|
|
530
|
+
const outcome: TGitManagerReadinessProbeOutcome =
|
|
531
|
+
response.statusCode === 200 ? 'ready' : 'unavailable';
|
|
532
|
+
// The body is never needed; destroying immediately keeps a peer
|
|
533
|
+
// that stalls mid-body from retaining the socket indefinitely.
|
|
534
|
+
healthRequest?.destroy();
|
|
535
|
+
settle(outcome);
|
|
536
|
+
},
|
|
537
|
+
);
|
|
538
|
+
healthRequest.on('error', () => settle('unavailable'));
|
|
539
|
+
healthRequest.end();
|
|
540
|
+
} catch {
|
|
541
|
+
settle('unavailable');
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
private probeManagementStatus(
|
|
547
|
+
signalArg: AbortSignal,
|
|
548
|
+
): Promise<TGitManagerReadinessProbeOutcome> {
|
|
549
|
+
if (!this.managementStatusProbePromise) {
|
|
550
|
+
const probeEpoch = this.lifecycleEpoch;
|
|
551
|
+
const managementProbe = this.bridge
|
|
552
|
+
.getStatus({ timeoutMs: readinessMaximumTimeoutMs })
|
|
553
|
+
.then(
|
|
554
|
+
(status): TGitManagerReadinessProbeOutcome => {
|
|
555
|
+
if (
|
|
556
|
+
this.lifecycleEpoch === probeEpoch &&
|
|
557
|
+
this.config.smartHttp &&
|
|
558
|
+
!this.smartHttpProbeUrl
|
|
559
|
+
) {
|
|
560
|
+
this.smartHttpProbeUrl = this.resolveSmartHttpProbeUrl(status);
|
|
561
|
+
}
|
|
562
|
+
return status.running ? 'ready' : 'unavailable';
|
|
563
|
+
},
|
|
564
|
+
(): TGitManagerReadinessProbeOutcome => 'unavailable',
|
|
565
|
+
);
|
|
566
|
+
this.managementStatusProbePromise = managementProbe;
|
|
567
|
+
void managementProbe.finally(() => {
|
|
568
|
+
if (this.managementStatusProbePromise === managementProbe) {
|
|
569
|
+
this.managementStatusProbePromise = null;
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
const sharedProbe = this.managementStatusProbePromise;
|
|
574
|
+
return new Promise((resolve) => {
|
|
575
|
+
let settled = false;
|
|
576
|
+
const settle = (outcomeArg: TGitManagerReadinessProbeOutcome): void => {
|
|
577
|
+
if (settled) {
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
settled = true;
|
|
581
|
+
signalArg.removeEventListener('abort', abortWait);
|
|
582
|
+
resolve(outcomeArg);
|
|
583
|
+
};
|
|
584
|
+
const abortWait = (): void => {
|
|
585
|
+
settle('aborted');
|
|
586
|
+
};
|
|
587
|
+
signalArg.addEventListener('abort', abortWait, { once: true });
|
|
588
|
+
if (signalArg.aborted) {
|
|
589
|
+
abortWait();
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
void sharedProbe.then(settle);
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
private getReadinessLifecycleReason():
|
|
597
|
+
| Extract<
|
|
598
|
+
TGitManagerReadinessFailureReason,
|
|
599
|
+
'not_running' | 'starting' | 'stopping'
|
|
600
|
+
>
|
|
601
|
+
| undefined {
|
|
602
|
+
if (this.startPromise) {
|
|
603
|
+
return 'starting';
|
|
604
|
+
}
|
|
605
|
+
if (!this.running) {
|
|
606
|
+
return 'not_running';
|
|
607
|
+
}
|
|
608
|
+
if (this.stopRequested) {
|
|
609
|
+
return 'stopping';
|
|
610
|
+
}
|
|
611
|
+
return undefined;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
private createReadinessFailure(
|
|
615
|
+
reasonArg: TGitManagerReadinessFailureReason,
|
|
616
|
+
startedAtArg: number,
|
|
617
|
+
): TGitManagerReadinessResult {
|
|
618
|
+
return {
|
|
619
|
+
ready: false,
|
|
620
|
+
status: 'unavailable',
|
|
621
|
+
reason: reasonArg,
|
|
622
|
+
durationMs: performance.now() - startedAtArg,
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
private abortActiveReadinessProbes(): void {
|
|
627
|
+
for (const readinessController of [...this.activeReadinessControllers]) {
|
|
628
|
+
readinessController.abort();
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
349
632
|
private assertRunning(): void {
|
|
350
633
|
if (!this.running) {
|
|
351
634
|
throw new Error('GitManager is not running');
|
package/ts/models.ts
CHANGED
|
@@ -81,6 +81,8 @@ export interface IGitManagerRepositoryArchive
|
|
|
81
81
|
archivePath: string;
|
|
82
82
|
sizeBytes: number;
|
|
83
83
|
sha256: string;
|
|
84
|
+
extractedSizeBytes: number;
|
|
85
|
+
entryCount: number;
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
export interface IGitManagerRepositoryLfsPointer {
|
|
@@ -125,6 +127,8 @@ export interface IGitManagerOptions {
|
|
|
125
127
|
transferDir?: string;
|
|
126
128
|
maxBundleBytes?: number;
|
|
127
129
|
maxArchiveBytes?: number;
|
|
130
|
+
maxArchiveExtractedBytes?: number;
|
|
131
|
+
maxArchiveEntries?: number;
|
|
128
132
|
smartHttp?: IGitManagerSmartHttpOptions;
|
|
129
133
|
}
|
|
130
134
|
|
|
@@ -159,6 +163,8 @@ export interface IRustGitManagerConfig {
|
|
|
159
163
|
transferDir: string;
|
|
160
164
|
maxBundleBytes: number;
|
|
161
165
|
maxArchiveBytes: number;
|
|
166
|
+
maxArchiveExtractedBytes: number;
|
|
167
|
+
maxArchiveEntries: number;
|
|
162
168
|
smartHttp?: IRustGitManagerSmartHttpConfig;
|
|
163
169
|
}
|
|
164
170
|
|
|
@@ -176,6 +182,32 @@ export interface IGitManagerStatus {
|
|
|
176
182
|
smartHttp?: IGitManagerSmartHttpStatus;
|
|
177
183
|
}
|
|
178
184
|
|
|
185
|
+
export interface IGitManagerReadinessOptions {
|
|
186
|
+
timeoutMs?: number;
|
|
187
|
+
signal?: AbortSignal;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type TGitManagerReadinessFailureReason =
|
|
191
|
+
| 'not_running'
|
|
192
|
+
| 'starting'
|
|
193
|
+
| 'stopping'
|
|
194
|
+
| 'aborted'
|
|
195
|
+
| 'timeout'
|
|
196
|
+
| 'unavailable';
|
|
197
|
+
|
|
198
|
+
export type TGitManagerReadinessResult =
|
|
199
|
+
| {
|
|
200
|
+
ready: true;
|
|
201
|
+
status: 'ready';
|
|
202
|
+
durationMs: number;
|
|
203
|
+
}
|
|
204
|
+
| {
|
|
205
|
+
ready: false;
|
|
206
|
+
status: 'unavailable';
|
|
207
|
+
reason: TGitManagerReadinessFailureReason;
|
|
208
|
+
durationMs: number;
|
|
209
|
+
};
|
|
210
|
+
|
|
179
211
|
export type {
|
|
180
212
|
IGitManagerCommitDetail,
|
|
181
213
|
IGitManagerCommitRequest,
|
package/ts/plugins.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// node native scope
|
|
2
2
|
import * as childProcess from 'node:child_process';
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
|
+
import * as http from 'node:http';
|
|
4
5
|
import * as path from 'node:path';
|
|
5
6
|
import * as stream from 'node:stream';
|
|
6
7
|
import * as url from 'node:url';
|
|
7
8
|
|
|
8
|
-
export { childProcess, EventEmitter, path, stream, url };
|
|
9
|
+
export { childProcess, EventEmitter, http, path, stream, url };
|
|
9
10
|
|
|
10
11
|
// @push.rocks scope
|
|
11
12
|
import * as smartrust from '@push.rocks/smartrust';
|
|
@@ -134,8 +134,10 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
134
134
|
await this.bridge.sendCommand('stop', {});
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
public async getStatus(
|
|
138
|
-
|
|
137
|
+
public async getStatus(
|
|
138
|
+
optionsArg?: plugins.smartrust.IRustBridgeRequestOptions,
|
|
139
|
+
): Promise<IGitManagerStatus> {
|
|
140
|
+
return this.bridge.sendCommand('getStatus', {}, optionsArg);
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
public async setSmartHttpRepositoryAccess(accessArg: IGitManagerSmartHttpRepositoryAccess): Promise<void> {
|
|
@@ -182,7 +184,19 @@ export class RustGitManagerBridge extends plugins.EventEmitter {
|
|
|
182
184
|
public async createRepositoryArchive(
|
|
183
185
|
requestArg: IGitManagerRepositoryArchiveRequest,
|
|
184
186
|
): Promise<IGitManagerRepositoryArchive> {
|
|
185
|
-
|
|
187
|
+
const result = await this.bridge.sendCommand('createRepositoryArchive', requestArg, {
|
|
188
|
+
timeoutMs: 65 * 60 * 1000,
|
|
189
|
+
});
|
|
190
|
+
for (const [field, value] of [
|
|
191
|
+
['sizeBytes', result.sizeBytes],
|
|
192
|
+
['extractedSizeBytes', result.extractedSizeBytes],
|
|
193
|
+
['entryCount', result.entryCount],
|
|
194
|
+
] as const) {
|
|
195
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
196
|
+
throw new Error(`Rust GitManager returned an invalid ${field}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
186
200
|
}
|
|
187
201
|
|
|
188
202
|
public async prepareRepositoryService(
|