yt-dlp-bridge 0.1.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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/argv.d.ts +18 -0
- package/dist/argv.d.ts.map +1 -0
- package/dist/argv.js +276 -0
- package/dist/argv.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/environment.d.ts +27 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +80 -0
- package/dist/environment.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/filesystem.d.ts +23 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +57 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/generated/ytdlp-options.json +5513 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/option-catalog.d.ts +34 -0
- package/dist/option-catalog.d.ts.map +1 -0
- package/dist/option-catalog.js +89 -0
- package/dist/option-catalog.js.map +1 -0
- package/dist/parsers.d.ts +11 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +268 -0
- package/dist/parsers.js.map +1 -0
- package/dist/planner.d.ts +10 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +233 -0
- package/dist/planner.js.map +1 -0
- package/dist/redaction.d.ts +4 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +52 -0
- package/dist/redaction.js.map +1 -0
- package/dist/runner.d.ts +14 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +78 -0
- package/dist/runner.js.map +1 -0
- package/dist/schemas.d.ts +818 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +179 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +163 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -0
package/dist/planner.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { buildDownloadArgs } from "./argv.js";
|
|
2
|
+
import { CONFIG } from "./config.js";
|
|
3
|
+
import { resolveManagedPath, resolveOutputPolicy } from "./filesystem.js";
|
|
4
|
+
import { redactArgs } from "./redaction.js";
|
|
5
|
+
import {} from "./schemas.js";
|
|
6
|
+
import { checkEnvironment } from "./environment.js";
|
|
7
|
+
export async function planDownload(input, config = CONFIG) {
|
|
8
|
+
const outputPolicy = resolveOutputPolicy(config, input.output);
|
|
9
|
+
const argv = buildDownloadArgs(input, outputPolicy, config);
|
|
10
|
+
const dependencyReasons = requiredDependencyReasons(input);
|
|
11
|
+
const optionalReasons = optionalDependencyReasons(input);
|
|
12
|
+
const environment = await checkEnvironment(config);
|
|
13
|
+
const plan = {
|
|
14
|
+
intent: input.kind,
|
|
15
|
+
url: input.url,
|
|
16
|
+
argv,
|
|
17
|
+
redactedArgv: redactArgs(argv),
|
|
18
|
+
outputRoot: outputPolicy.outputRoot,
|
|
19
|
+
outputTemplate: outputPolicy.outputTemplate,
|
|
20
|
+
tempRoot: outputPolicy.tempRoot,
|
|
21
|
+
formatSort: input.format.formatSort,
|
|
22
|
+
requiredDependencies: pickDependencies(environment.dependencies, dependencyReasons),
|
|
23
|
+
optionalDependencies: pickDependencies(environment.dependencies, optionalReasons),
|
|
24
|
+
risks: risksFor(input),
|
|
25
|
+
sideEffects: sideEffectsFor(input, outputPolicy.allowOverwrite),
|
|
26
|
+
commandPreview: {
|
|
27
|
+
command: config.ytdlpPath,
|
|
28
|
+
args: argv,
|
|
29
|
+
redactedArgs: redactArgs(argv)
|
|
30
|
+
},
|
|
31
|
+
overwrite: outputPolicy.allowOverwrite,
|
|
32
|
+
cookies: cookiePlan(input, config),
|
|
33
|
+
expertMode: false
|
|
34
|
+
};
|
|
35
|
+
if (input.format.format)
|
|
36
|
+
plan.selectedFormat = input.format.format;
|
|
37
|
+
if (input.selection.downloadArchive) {
|
|
38
|
+
plan.archive = {
|
|
39
|
+
path: resolveManagedPath(outputPolicy.outputRoot, input.selection.downloadArchive, "downloadArchive", config.allowArbitraryOutputPaths),
|
|
40
|
+
mode: "read-write"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return plan;
|
|
44
|
+
}
|
|
45
|
+
export async function planPostprocess(input, config = CONFIG) {
|
|
46
|
+
const dependencyReasons = requiredPostprocessDependencyReasons(input);
|
|
47
|
+
const environment = await checkEnvironment(config);
|
|
48
|
+
const outputPolicy = resolveOutputPolicy(config, input.output);
|
|
49
|
+
return {
|
|
50
|
+
intent: "postprocess",
|
|
51
|
+
url: input.url,
|
|
52
|
+
inputFile: input.inputFile,
|
|
53
|
+
outputRoot: outputPolicy.outputRoot,
|
|
54
|
+
outputTemplate: outputPolicy.outputTemplate,
|
|
55
|
+
tempRoot: outputPolicy.tempRoot,
|
|
56
|
+
requiredDependencies: pickDependencies(environment.dependencies, dependencyReasons),
|
|
57
|
+
risks: postprocessRisks(input),
|
|
58
|
+
sideEffects: postprocessSideEffects(input),
|
|
59
|
+
cookies: {
|
|
60
|
+
enabled: Boolean(input.auth.cookiesFile ?? input.auth.cookiesFromBrowser ?? config.cookiesFile ?? config.cookiesFromBrowser)
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function requiredDependencyReasons(input) {
|
|
65
|
+
const deps = new Map();
|
|
66
|
+
addReason(deps, "yt-dlp", "execute all yt-dlp workflows");
|
|
67
|
+
for (const reason of ffmpegReasons(input))
|
|
68
|
+
addReason(deps, "ffmpeg", reason);
|
|
69
|
+
if (needsFfprobe(input))
|
|
70
|
+
addReason(deps, "ffprobe", "inspect media streams for audio extraction or conversion");
|
|
71
|
+
for (const downloader of input.download.downloader) {
|
|
72
|
+
const binary = downloader.split(":").pop()?.trim();
|
|
73
|
+
if (binary && !["default", "native"].includes(binary))
|
|
74
|
+
addReason(deps, binary, "requested external downloader");
|
|
75
|
+
}
|
|
76
|
+
if (input.network.impersonate)
|
|
77
|
+
addReason(deps, "curl_cffi", "requested browser impersonation target");
|
|
78
|
+
return deps;
|
|
79
|
+
}
|
|
80
|
+
function optionalDependencyReasons(input) {
|
|
81
|
+
const deps = new Map();
|
|
82
|
+
if (input.extractor.youtube?.fetchPot || input.extractor.youtube?.poToken.length)
|
|
83
|
+
addReason(deps, "deno", "optional JavaScript runtime for extractor challenges");
|
|
84
|
+
if (input.extractor.youtube?.fetchPot || input.extractor.youtube?.poToken.length)
|
|
85
|
+
addReason(deps, "node", "optional JavaScript runtime for extractor challenges");
|
|
86
|
+
if (input.postprocess.embedThumbnail)
|
|
87
|
+
addReason(deps, "AtomicParsley", "legacy thumbnail embedding fallback");
|
|
88
|
+
return deps;
|
|
89
|
+
}
|
|
90
|
+
function requiredPostprocessDependencyReasons(input) {
|
|
91
|
+
const deps = new Map();
|
|
92
|
+
if (input.postprocess.extractAudio ||
|
|
93
|
+
input.postprocess.audioFormat ||
|
|
94
|
+
input.postprocess.remuxVideo ||
|
|
95
|
+
input.postprocess.recodeVideo ||
|
|
96
|
+
input.postprocess.embedSubs ||
|
|
97
|
+
input.postprocess.embedThumbnail ||
|
|
98
|
+
input.postprocess.embedMetadata ||
|
|
99
|
+
input.postprocess.embedChapters ||
|
|
100
|
+
input.postprocess.embedInfoJson ||
|
|
101
|
+
input.postprocess.concatPlaylist ||
|
|
102
|
+
input.postprocess.splitChapters ||
|
|
103
|
+
input.postprocess.removeChapters.length > 0 ||
|
|
104
|
+
input.sponsorblock.remove) {
|
|
105
|
+
addReason(deps, "ffmpeg", "requested postprocessing requires muxing, conversion, embedding, section edits, or segment removal");
|
|
106
|
+
}
|
|
107
|
+
if (input.postprocess.extractAudio || input.postprocess.audioFormat)
|
|
108
|
+
addReason(deps, "ffprobe", "audio extraction/conversion needs stream probing");
|
|
109
|
+
return deps;
|
|
110
|
+
}
|
|
111
|
+
function needsFfprobe(input) {
|
|
112
|
+
return input.kind === "audio" || input.postprocess.extractAudio || Boolean(input.postprocess.audioFormat);
|
|
113
|
+
}
|
|
114
|
+
function risksFor(input) {
|
|
115
|
+
const risks = [];
|
|
116
|
+
if (input.kind === "video" && (!input.format.format || input.format.format.includes("+"))) {
|
|
117
|
+
risks.push("Default or combined format selection may choose separate audio/video streams; merging requires ffmpeg.");
|
|
118
|
+
}
|
|
119
|
+
if (input.kind === "playlist")
|
|
120
|
+
risks.push("Playlist downloads can create many files; use playlist ranges and download archives for repeatable runs.");
|
|
121
|
+
if (input.auth.password || input.auth.twofactor || input.auth.videoPassword)
|
|
122
|
+
risks.push("Authentication secrets are accepted and will be redacted from command previews and errors.");
|
|
123
|
+
if (input.download.downloaderArgs.length > 0 || input.postprocess.postprocessorArgs.length > 0)
|
|
124
|
+
risks.push("Advanced downloader/postprocessor args can change process behavior; prefer reviewed presets.");
|
|
125
|
+
if (input.sponsorblock.remove)
|
|
126
|
+
risks.push("SponsorBlock removal changes media content and requires ffmpeg.");
|
|
127
|
+
if (input.selection.downloadArchive)
|
|
128
|
+
risks.push("Download archive will be written by yt-dlp using extractor IDs.");
|
|
129
|
+
return risks;
|
|
130
|
+
}
|
|
131
|
+
function postprocessRisks(input) {
|
|
132
|
+
const risks = [];
|
|
133
|
+
if (input.postprocess.recodeVideo)
|
|
134
|
+
risks.push("Recoding can be slow and lossy depending on codec/container choices.");
|
|
135
|
+
if (input.postprocess.removeChapters.length > 0)
|
|
136
|
+
risks.push("Chapter removal changes media content.");
|
|
137
|
+
if (input.sponsorblock.remove)
|
|
138
|
+
risks.push("SponsorBlock removal changes media content.");
|
|
139
|
+
if (input.postprocess.postprocessorArgs.length > 0)
|
|
140
|
+
risks.push("Postprocessor args are advanced and should be reviewed.");
|
|
141
|
+
return risks;
|
|
142
|
+
}
|
|
143
|
+
function sideEffectsFor(input, overwrite) {
|
|
144
|
+
const sideEffects = ["create output files", "create temporary files"];
|
|
145
|
+
if (overwrite)
|
|
146
|
+
sideEffects.push("overwrite existing files");
|
|
147
|
+
if (input.selection.downloadArchive)
|
|
148
|
+
sideEffects.push("update download archive");
|
|
149
|
+
if (input.kind === "audio" || input.postprocess.extractAudio)
|
|
150
|
+
sideEffects.push("extract audio with ffmpeg");
|
|
151
|
+
if (input.postprocess.remuxVideo)
|
|
152
|
+
sideEffects.push("remux media container");
|
|
153
|
+
if (input.postprocess.recodeVideo)
|
|
154
|
+
sideEffects.push("recode media");
|
|
155
|
+
if (input.postprocess.embedSubs || input.postprocess.embedThumbnail || input.postprocess.embedMetadata)
|
|
156
|
+
sideEffects.push("embed assets/metadata");
|
|
157
|
+
if (input.sponsorblock.remove)
|
|
158
|
+
sideEffects.push("remove SponsorBlock segments");
|
|
159
|
+
return sideEffects;
|
|
160
|
+
}
|
|
161
|
+
function postprocessSideEffects(input) {
|
|
162
|
+
const sideEffects = [];
|
|
163
|
+
if (input.postprocess.remuxVideo)
|
|
164
|
+
sideEffects.push("remux media container");
|
|
165
|
+
if (input.postprocess.recodeVideo)
|
|
166
|
+
sideEffects.push("recode media");
|
|
167
|
+
if (input.postprocess.extractAudio || input.postprocess.audioFormat)
|
|
168
|
+
sideEffects.push("extract or convert audio");
|
|
169
|
+
if (input.postprocess.embedSubs || input.postprocess.embedThumbnail || input.postprocess.embedMetadata)
|
|
170
|
+
sideEffects.push("embed assets/metadata");
|
|
171
|
+
if (input.postprocess.splitChapters)
|
|
172
|
+
sideEffects.push("split media by chapters");
|
|
173
|
+
if (input.postprocess.removeChapters.length > 0 || input.sponsorblock.remove)
|
|
174
|
+
sideEffects.push("remove media segments");
|
|
175
|
+
return sideEffects;
|
|
176
|
+
}
|
|
177
|
+
function cookiePlan(input, config) {
|
|
178
|
+
const file = input.auth.cookiesFile ?? config.cookiesFile;
|
|
179
|
+
const browser = input.auth.cookiesFromBrowser ?? config.cookiesFromBrowser;
|
|
180
|
+
if (file)
|
|
181
|
+
return { enabled: true, source: "file", value: file };
|
|
182
|
+
if (browser)
|
|
183
|
+
return { enabled: true, source: "browser", value: browser };
|
|
184
|
+
return { enabled: false };
|
|
185
|
+
}
|
|
186
|
+
function ffmpegReasons(input) {
|
|
187
|
+
const reasons = [];
|
|
188
|
+
if (input.kind === "audio" || input.postprocess.extractAudio || input.postprocess.audioFormat)
|
|
189
|
+
reasons.push("audio extraction or conversion requires ffmpeg");
|
|
190
|
+
if ((input.kind === "video" && (!input.format.format || input.format.format.includes("+"))) || (input.kind === "audio" && Boolean(input.format.format?.includes("+")))) {
|
|
191
|
+
reasons.push("selected/default formats may require audio/video merge");
|
|
192
|
+
}
|
|
193
|
+
if (input.format.mergeOutputFormat || input.postprocess.remuxVideo)
|
|
194
|
+
reasons.push("remux requested");
|
|
195
|
+
if (input.postprocess.recodeVideo)
|
|
196
|
+
reasons.push("recode requested");
|
|
197
|
+
if (input.subtitles.convertSubs)
|
|
198
|
+
reasons.push("subtitle conversion requested");
|
|
199
|
+
if (input.thumbnails.convertThumbnails)
|
|
200
|
+
reasons.push("thumbnail conversion requested");
|
|
201
|
+
if (input.download.downloadSections.length > 0)
|
|
202
|
+
reasons.push("section download/cutting requested");
|
|
203
|
+
if (input.postprocess.splitChapters || input.postprocess.removeChapters.length > 0 || input.sponsorblock.remove)
|
|
204
|
+
reasons.push("chapter or SponsorBlock segment editing requested");
|
|
205
|
+
if (input.postprocess.embedSubs || input.postprocess.embedThumbnail || input.postprocess.embedMetadata || input.postprocess.embedChapters || input.postprocess.embedInfoJson)
|
|
206
|
+
reasons.push("asset or metadata embedding requested");
|
|
207
|
+
return reasons;
|
|
208
|
+
}
|
|
209
|
+
function addReason(map, dependency, reason) {
|
|
210
|
+
const current = map.get(dependency) ?? [];
|
|
211
|
+
if (!current.includes(reason))
|
|
212
|
+
current.push(reason);
|
|
213
|
+
map.set(dependency, current);
|
|
214
|
+
}
|
|
215
|
+
function pickDependencies(all, requirements) {
|
|
216
|
+
const byName = new Map(all.map((dependency) => [dependency.name, dependency]));
|
|
217
|
+
return [...requirements].map(([name, requiredFor]) => {
|
|
218
|
+
const detected = byName.get(name);
|
|
219
|
+
if (!detected) {
|
|
220
|
+
return {
|
|
221
|
+
name,
|
|
222
|
+
status: "unknown",
|
|
223
|
+
requiredFor,
|
|
224
|
+
notes: ["Dependency is not directly detectable by this bridge."]
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
...detected,
|
|
229
|
+
requiredFor
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAwBA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,SAAe,GAAG,MAAM,CAE5E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmBnD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CAG/D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const SECRET_PATTERNS = [
|
|
2
|
+
/(po_token=)([^,\s;]+)/gi,
|
|
3
|
+
/(password=)([^,\s;]+)/gi,
|
|
4
|
+
/(access[_-]?token=)([^,\s;&]+)/gi,
|
|
5
|
+
/(refresh[_-]?token=)([^,\s;&]+)/gi,
|
|
6
|
+
/(Authorization:\s*Bearer\s+)([A-Za-z0-9._~+/-]+)/gi,
|
|
7
|
+
/(Cookie:\s*)(.+)$/gim,
|
|
8
|
+
/([?&](?:sig|signature|token|key|auth|expire|expires|X-Amz-Signature)=)([^&\s]+)/gi
|
|
9
|
+
];
|
|
10
|
+
const SECRET_FLAGS = new Set([
|
|
11
|
+
"--password",
|
|
12
|
+
"-p",
|
|
13
|
+
"--twofactor",
|
|
14
|
+
"-2",
|
|
15
|
+
"--video-password",
|
|
16
|
+
"--ap-password",
|
|
17
|
+
"--client-certificate-password",
|
|
18
|
+
"--netrc-cmd",
|
|
19
|
+
"--add-headers",
|
|
20
|
+
"--cookies",
|
|
21
|
+
"--cookies-from-browser"
|
|
22
|
+
]);
|
|
23
|
+
export function redactText(value, replacement = "[REDACTED]") {
|
|
24
|
+
return SECRET_PATTERNS.reduce((text, pattern) => text.replace(pattern, `$1${replacement}`), value);
|
|
25
|
+
}
|
|
26
|
+
export function redactArgs(args) {
|
|
27
|
+
const redacted = [];
|
|
28
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
29
|
+
const arg = args[index] ?? "";
|
|
30
|
+
const flagName = arg.includes("=") ? arg.slice(0, arg.indexOf("=")) : arg;
|
|
31
|
+
if (SECRET_FLAGS.has(flagName)) {
|
|
32
|
+
if (arg.includes("="))
|
|
33
|
+
redacted.push(`${flagName}=[REDACTED]`);
|
|
34
|
+
else {
|
|
35
|
+
redacted.push(arg);
|
|
36
|
+
if (index + 1 < args.length) {
|
|
37
|
+
redacted.push("[REDACTED]");
|
|
38
|
+
index += 1;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
redacted.push(redactText(arg));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return redacted;
|
|
47
|
+
}
|
|
48
|
+
export function excerpt(value, maxLength = 1200) {
|
|
49
|
+
const cleaned = redactText(value.trim());
|
|
50
|
+
return cleaned.length <= maxLength ? cleaned : `${cleaned.slice(0, maxLength)}...`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACtB,yBAAyB;IACzB,yBAAyB;IACzB,kCAAkC;IAClC,mCAAmC;IACnC,oDAAoD;IACpD,sBAAsB;IACtB,mFAAmF;CACpF,CAAC;AAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,YAAY;IACZ,IAAI;IACJ,aAAa;IACb,IAAI;IACJ,kBAAkB;IAClB,eAAe;IACf,+BAA+B;IAC/B,aAAa;IACb,eAAe;IACf,WAAW;IACX,wBAAwB;CACzB,CAAC,CAAC;AAEH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,WAAW,GAAG,YAAY;IAClE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1E,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,aAAa,CAAC,CAAC;iBAC1D,CAAC;gBACJ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC5B,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,SAAS,GAAG,IAAI;IACrD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;AACrF,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandResult } from "./types.js";
|
|
2
|
+
export interface RunCommandOptions {
|
|
3
|
+
timeoutMs: number;
|
|
4
|
+
maxOutputBytes: number;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
export declare class CommandExecutionError extends Error {
|
|
10
|
+
readonly result: CommandResult;
|
|
11
|
+
constructor(message: string, result: CommandResult);
|
|
12
|
+
}
|
|
13
|
+
export declare function runCommand(command: string, args: string[], options: RunCommandOptions): Promise<CommandResult>;
|
|
14
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa;CAKnD;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmEpH"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { redactArgs, excerpt } from "./redaction.js";
|
|
3
|
+
export class CommandExecutionError extends Error {
|
|
4
|
+
result;
|
|
5
|
+
constructor(message, result) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "CommandExecutionError";
|
|
8
|
+
this.result = result;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function runCommand(command, args, options) {
|
|
12
|
+
const startedAt = Date.now();
|
|
13
|
+
const redactedArgs = redactArgs(args);
|
|
14
|
+
return await new Promise((resolve, reject) => {
|
|
15
|
+
let settled = false;
|
|
16
|
+
const child = spawn(command, args, {
|
|
17
|
+
cwd: options.cwd,
|
|
18
|
+
env: options.env,
|
|
19
|
+
shell: false,
|
|
20
|
+
windowsHide: true,
|
|
21
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
22
|
+
});
|
|
23
|
+
let stdout = "";
|
|
24
|
+
let stderr = "";
|
|
25
|
+
let timedOut = false;
|
|
26
|
+
let aborted = false;
|
|
27
|
+
const kill = (reason) => {
|
|
28
|
+
if (reason === "timeout")
|
|
29
|
+
timedOut = true;
|
|
30
|
+
if (reason === "abort")
|
|
31
|
+
aborted = true;
|
|
32
|
+
child.kill("SIGTERM");
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
if (!settled)
|
|
35
|
+
child.kill("SIGKILL");
|
|
36
|
+
}, 2_000).unref();
|
|
37
|
+
};
|
|
38
|
+
const timer = setTimeout(() => kill("timeout"), options.timeoutMs);
|
|
39
|
+
timer.unref();
|
|
40
|
+
const onAbort = () => kill("abort");
|
|
41
|
+
if (options.signal?.aborted)
|
|
42
|
+
onAbort();
|
|
43
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
44
|
+
const append = (current, chunk) => {
|
|
45
|
+
const next = current + chunk.toString("utf8");
|
|
46
|
+
return next.length <= options.maxOutputBytes ? next : next.slice(next.length - options.maxOutputBytes);
|
|
47
|
+
};
|
|
48
|
+
child.stdout.on("data", (chunk) => {
|
|
49
|
+
stdout = append(stdout, chunk);
|
|
50
|
+
});
|
|
51
|
+
child.stderr.on("data", (chunk) => {
|
|
52
|
+
stderr = append(stderr, chunk);
|
|
53
|
+
});
|
|
54
|
+
child.on("error", (error) => {
|
|
55
|
+
settled = true;
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
58
|
+
const result = makeResult(command, redactedArgs, stdout, error.message, 127, startedAt);
|
|
59
|
+
reject(new CommandExecutionError(`Failed to spawn ${command}: ${error.message}`, result));
|
|
60
|
+
});
|
|
61
|
+
child.on("close", (code) => {
|
|
62
|
+
settled = true;
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
65
|
+
const result = makeResult(command, redactedArgs, stdout, stderr, code ?? (timedOut ? 124 : aborted ? 130 : 1), startedAt);
|
|
66
|
+
if (result.exitCode === 0) {
|
|
67
|
+
resolve(result);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const reason = timedOut ? `Command timed out after ${options.timeoutMs}ms` : aborted ? "Command was cancelled" : `Command exited with code ${result.exitCode}`;
|
|
71
|
+
reject(new CommandExecutionError(`${reason}: ${command} ${redactedArgs.join(" ")}\n${excerpt(stderr || stdout)}`, result));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function makeResult(command, args, stdout, stderr, exitCode, startedAt) {
|
|
76
|
+
return { command, args, stdout, stderr, exitCode, durationMs: Date.now() - startedAt };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|