dsh-mobile 0.5.4 → 0.5.5
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 +11 -0
- package/CONTRIBUTORS.md +6 -4
- package/README.en.md +17 -10
- package/README.md +18 -11
- package/docs/CLOUDFLARE_TUNNEL.en.md +3 -1
- package/docs/CLOUDFLARE_TUNNEL.md +3 -1
- package/lib/client.js +51 -10
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +21 -5
- package/lib/index.mjs +133 -23
- package/lib/index.mjs.map +1 -1
- package/lib/mobile-layout.js +3 -2
- package/lib/mobile-layout.js.map +1 -1
- package/node_modules/dsh-mobile-question-fixes/package.json +1 -1
- package/package.json +4 -1
- package/packages/question-fixes/package.json +1 -1
package/lib/index.d.mts
CHANGED
|
@@ -1560,10 +1560,12 @@ export declare class OriginController implements RemoteProviderController {
|
|
|
1560
1560
|
/**
|
|
1561
1561
|
* Pinned cloudflared components fetched only after an explicit user action.
|
|
1562
1562
|
*
|
|
1563
|
-
*
|
|
1564
|
-
*
|
|
1565
|
-
*
|
|
1566
|
-
*
|
|
1563
|
+
* Cloudflare ships bare executables for Windows and Linux but a `.tgz` for
|
|
1564
|
+
* macOS, so an artifact carries two digests: the bytes on the wire
|
|
1565
|
+
* (`downloadBytes`/`downloadSha256`) and the executable that ends up installed
|
|
1566
|
+
* (`executableBytes`/`executableSha256`). For bare artifacts the two pairs are
|
|
1567
|
+
* identical. `--no-autoupdate` is passed at runtime as well, so the pinned
|
|
1568
|
+
* bytes stay the bytes that were verified.
|
|
1567
1569
|
*/
|
|
1568
1570
|
interface CloudflaredArtifact {
|
|
1569
1571
|
readonly version: string;
|
|
@@ -1573,7 +1575,19 @@ interface CloudflaredArtifact {
|
|
|
1573
1575
|
readonly downloadBytes: number;
|
|
1574
1576
|
readonly downloadSha256: string;
|
|
1575
1577
|
readonly executableName: string;
|
|
1576
|
-
|
|
1578
|
+
/** Bytes of the installed executable; equals `downloadBytes` for bare artifacts. */
|
|
1579
|
+
readonly executableBytes: number;
|
|
1580
|
+
readonly executableSha256: string;
|
|
1581
|
+
/** Set when the download is an archive rather than the executable itself. */
|
|
1582
|
+
readonly archive?: CloudflaredArchive;
|
|
1583
|
+
}
|
|
1584
|
+
interface CloudflaredArchive {
|
|
1585
|
+
readonly format: 'tgz';
|
|
1586
|
+
/** Member basename to install, e.g. `cloudflared`. */
|
|
1587
|
+
readonly member: string;
|
|
1588
|
+
}
|
|
1589
|
+
/** Pinned official cloudflared release metadata for supported desktop targets. */
|
|
1590
|
+
export declare const CLOUDFLARED_COMPONENT_RELEASES: Readonly<Record<string, CloudflaredArtifact>>;
|
|
1577
1591
|
/**
|
|
1578
1592
|
* Canonical release metadata. New code should select from
|
|
1579
1593
|
* {@link CLOUDFLARED_COMPONENT_RELEASES} by platform and architecture; this
|
|
@@ -1603,6 +1617,7 @@ interface CloudflaredComponentManagerOptions {
|
|
|
1603
1617
|
readonly platform?: NodeJS.Platform;
|
|
1604
1618
|
readonly arch?: string;
|
|
1605
1619
|
readonly fetchArtifact?: (url: string, signal: AbortSignal) => Promise<Uint8Array>;
|
|
1620
|
+
readonly extractArtifact?: (archive: string, destination: string, member: string) => Promise<void>;
|
|
1606
1621
|
}
|
|
1607
1622
|
/** Owns the optional cloudflared binary inside DSH Mobile state. */
|
|
1608
1623
|
export declare class CloudflaredComponentManager {
|
|
@@ -1616,6 +1631,7 @@ export declare class CloudflaredComponentManager {
|
|
|
1616
1631
|
private readonly arch;
|
|
1617
1632
|
private readonly release;
|
|
1618
1633
|
private readonly fetchArtifact;
|
|
1634
|
+
private readonly extractArtifact;
|
|
1619
1635
|
private installed;
|
|
1620
1636
|
private errorCode;
|
|
1621
1637
|
private queue;
|
package/lib/index.mjs
CHANGED
|
@@ -2867,6 +2867,7 @@ function renderPairPage(locale) {
|
|
|
2867
2867
|
<html lang="${copy.lang}">
|
|
2868
2868
|
<meta charset="utf-8">
|
|
2869
2869
|
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
2870
|
+
<style>input,textarea{font-size:16px}</style>
|
|
2870
2871
|
<title>${copy.pairTitle}</title>
|
|
2871
2872
|
<main>
|
|
2872
2873
|
<h1>${copy.pairHeading}</h1>
|
|
@@ -5777,8 +5778,8 @@ var MemoryDeviceStore = class {
|
|
|
5777
5778
|
//#endregion
|
|
5778
5779
|
//#region src/frp-component.ts
|
|
5779
5780
|
const FRP_VERSION$1 = "0.70.1";
|
|
5780
|
-
const MAX_ARCHIVE_ENTRIES = 128;
|
|
5781
|
-
const MAX_ARCHIVE_LIST_BYTES = 262144;
|
|
5781
|
+
const MAX_ARCHIVE_ENTRIES$1 = 128;
|
|
5782
|
+
const MAX_ARCHIVE_LIST_BYTES$1 = 262144;
|
|
5782
5783
|
/** Pinned official FRP release metadata for supported desktop targets. */
|
|
5783
5784
|
const FRP_COMPONENT_RELEASES = Object.freeze(Object.fromEntries([
|
|
5784
5785
|
{
|
|
@@ -5883,12 +5884,12 @@ async function replaceDirectory(target, candidate) {
|
|
|
5883
5884
|
function sha256$2(bytes) {
|
|
5884
5885
|
return createHash("sha256").update(bytes).digest("hex");
|
|
5885
5886
|
}
|
|
5886
|
-
async function runCapture(file, args) {
|
|
5887
|
+
async function runCapture$1(file, args) {
|
|
5887
5888
|
return new Promise((resolveRun, reject) => {
|
|
5888
5889
|
execFile(file, [...args], {
|
|
5889
5890
|
windowsHide: true,
|
|
5890
5891
|
timeout: 12e4,
|
|
5891
|
-
maxBuffer: MAX_ARCHIVE_LIST_BYTES,
|
|
5892
|
+
maxBuffer: MAX_ARCHIVE_LIST_BYTES$1,
|
|
5892
5893
|
encoding: "utf8"
|
|
5893
5894
|
}, (error, stdout) => {
|
|
5894
5895
|
if (error === null) resolveRun(stdout);
|
|
@@ -5896,7 +5897,7 @@ async function runCapture(file, args) {
|
|
|
5896
5897
|
});
|
|
5897
5898
|
});
|
|
5898
5899
|
}
|
|
5899
|
-
function validatedArchiveEntry(rawEntry) {
|
|
5900
|
+
function validatedArchiveEntry$1(rawEntry) {
|
|
5900
5901
|
if (rawEntry.length === 0 || rawEntry.includes("\\") || rawEntry.includes("\0") || rawEntry.startsWith("/") || /^[a-zA-Z]:/u.test(rawEntry)) throw new Error("frp_archive_path_invalid");
|
|
5901
5902
|
const segments = rawEntry.replace(/\/$/u, "").split("/");
|
|
5902
5903
|
if (segments.some((segment) => segment === "" || segment === "." || segment === "..")) throw new Error("frp_archive_path_invalid");
|
|
@@ -5904,10 +5905,10 @@ function validatedArchiveEntry(rawEntry) {
|
|
|
5904
5905
|
}
|
|
5905
5906
|
/** Select exactly one nested frpc executable from a safe archive listing. */
|
|
5906
5907
|
function selectFrpExecutableEntry(entries, executableName) {
|
|
5907
|
-
if (entries.length === 0 || entries.length > MAX_ARCHIVE_ENTRIES) throw new Error("frp_archive_entries_invalid");
|
|
5908
|
+
if (entries.length === 0 || entries.length > MAX_ARCHIVE_ENTRIES$1) throw new Error("frp_archive_entries_invalid");
|
|
5908
5909
|
let executableEntry;
|
|
5909
5910
|
for (const entry of entries) {
|
|
5910
|
-
const segments = validatedArchiveEntry(entry);
|
|
5911
|
+
const segments = validatedArchiveEntry$1(entry);
|
|
5911
5912
|
if (segments.length >= 2 && segments.at(-1) === executableName) {
|
|
5912
5913
|
if (executableEntry !== void 0) throw new Error("frp_archive_executable_ambiguous");
|
|
5913
5914
|
executableEntry = entry.replace(/\/$/u, "");
|
|
@@ -5916,22 +5917,22 @@ function selectFrpExecutableEntry(entries, executableName) {
|
|
|
5916
5917
|
if (executableEntry === void 0) throw new Error("frp_archive_executable_missing");
|
|
5917
5918
|
return executableEntry;
|
|
5918
5919
|
}
|
|
5919
|
-
async function defaultExtractArtifact$
|
|
5920
|
+
async function defaultExtractArtifact$2(archive, destination, executableName) {
|
|
5920
5921
|
const tar = process.platform === "win32" ? "tar.exe" : "tar";
|
|
5921
|
-
const executableEntry = selectFrpExecutableEntry((await runCapture(tar, ["-tf", archive])).split(/\r?\n/u).filter((entry) => entry.length > 0), executableName);
|
|
5922
|
+
const executableEntry = selectFrpExecutableEntry((await runCapture$1(tar, ["-tf", archive])).split(/\r?\n/u).filter((entry) => entry.length > 0), executableName);
|
|
5922
5923
|
const unpacked = join(destination, "archive");
|
|
5923
5924
|
await mkdir(unpacked, {
|
|
5924
5925
|
recursive: true,
|
|
5925
5926
|
mode: 448
|
|
5926
5927
|
});
|
|
5927
|
-
await runCapture(tar, [
|
|
5928
|
+
await runCapture$1(tar, [
|
|
5928
5929
|
"-xf",
|
|
5929
5930
|
archive,
|
|
5930
5931
|
"-C",
|
|
5931
5932
|
unpacked,
|
|
5932
5933
|
executableEntry
|
|
5933
5934
|
]);
|
|
5934
|
-
const extracted = join(unpacked, ...validatedArchiveEntry(executableEntry));
|
|
5935
|
+
const extracted = join(unpacked, ...validatedArchiveEntry$1(executableEntry));
|
|
5935
5936
|
if (!await regularFile$2(extracted)) throw new Error("frp_archive_executable_invalid");
|
|
5936
5937
|
await copyFile(extracted, join(destination, executableName));
|
|
5937
5938
|
}
|
|
@@ -5971,7 +5972,7 @@ async function defaultFetchArtifact$2(artifact, signal) {
|
|
|
5971
5972
|
return bytes;
|
|
5972
5973
|
}
|
|
5973
5974
|
async function defaultInspectExecutable(executable) {
|
|
5974
|
-
return (await runCapture(executable, ["--version"])).trim();
|
|
5975
|
+
return (await runCapture$1(executable, ["--version"])).trim();
|
|
5975
5976
|
}
|
|
5976
5977
|
/** Owns the optional official frpc binary inside the DSH Mobile state directory. */
|
|
5977
5978
|
var FrpComponentManager = class {
|
|
@@ -6006,7 +6007,7 @@ var FrpComponentManager = class {
|
|
|
6006
6007
|
this.stagingRoot
|
|
6007
6008
|
]) if (!inside$2(stateDirectory, child)) throw new Error("frp component path escaped its state directory");
|
|
6008
6009
|
this.fetchArtifact = options.fetchArtifact ?? defaultFetchArtifact$2;
|
|
6009
|
-
this.extractArtifact = options.extractArtifact ?? defaultExtractArtifact$
|
|
6010
|
+
this.extractArtifact = options.extractArtifact ?? defaultExtractArtifact$2;
|
|
6010
6011
|
this.inspectExecutable = options.inspectExecutable ?? defaultInspectExecutable;
|
|
6011
6012
|
}
|
|
6012
6013
|
/** Inspect the managed executable without relying on global FRP installations. */
|
|
@@ -8909,6 +8910,10 @@ async function downloadPinnedArtifact(request) {
|
|
|
8909
8910
|
}
|
|
8910
8911
|
//#endregion
|
|
8911
8912
|
//#region src/cloudflared-component.ts
|
|
8913
|
+
/** Upper bound for `tar -t` output; a pinned release listing is a few lines. */
|
|
8914
|
+
const MAX_ARCHIVE_LIST_BYTES = 1048576;
|
|
8915
|
+
const MAX_ARCHIVE_ENTRIES = 256;
|
|
8916
|
+
const DOWNLOAD_TIMEOUT_MS = 3e5;
|
|
8912
8917
|
const CLOUDFLARED_VERSION = "2026.9.1";
|
|
8913
8918
|
/** Pinned official cloudflared release metadata for supported desktop targets. */
|
|
8914
8919
|
const CLOUDFLARED_COMPONENT_RELEASES = Object.freeze(Object.fromEntries([
|
|
@@ -8919,7 +8924,9 @@ const CLOUDFLARED_COMPONENT_RELEASES = Object.freeze(Object.fromEntries([
|
|
|
8919
8924
|
downloadUrl: `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-windows-amd64.exe`,
|
|
8920
8925
|
downloadBytes: 54976432,
|
|
8921
8926
|
downloadSha256: "2837888cc0f5d58f15b6dc478376de90b4d3ba5241c7947455d1e0a0df429712",
|
|
8922
|
-
executableName: "cloudflared.exe"
|
|
8927
|
+
executableName: "cloudflared.exe",
|
|
8928
|
+
executableBytes: 54976432,
|
|
8929
|
+
executableSha256: "2837888cc0f5d58f15b6dc478376de90b4d3ba5241c7947455d1e0a0df429712"
|
|
8923
8930
|
},
|
|
8924
8931
|
{
|
|
8925
8932
|
version: CLOUDFLARED_VERSION,
|
|
@@ -8928,7 +8935,9 @@ const CLOUDFLARED_COMPONENT_RELEASES = Object.freeze(Object.fromEntries([
|
|
|
8928
8935
|
downloadUrl: `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-amd64`,
|
|
8929
8936
|
downloadBytes: 39838488,
|
|
8930
8937
|
downloadSha256: "03f1f25d1cc93b9ad6c60569d44060bc4f17ed97075760ed8cfca4b12dcd68cc",
|
|
8931
|
-
executableName: "cloudflared"
|
|
8938
|
+
executableName: "cloudflared",
|
|
8939
|
+
executableBytes: 39838488,
|
|
8940
|
+
executableSha256: "03f1f25d1cc93b9ad6c60569d44060bc4f17ed97075760ed8cfca4b12dcd68cc"
|
|
8932
8941
|
},
|
|
8933
8942
|
{
|
|
8934
8943
|
version: CLOUDFLARED_VERSION,
|
|
@@ -8937,7 +8946,39 @@ const CLOUDFLARED_COMPONENT_RELEASES = Object.freeze(Object.fromEntries([
|
|
|
8937
8946
|
downloadUrl: `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64`,
|
|
8938
8947
|
downloadBytes: 37466252,
|
|
8939
8948
|
downloadSha256: "3d97437c71848bd8df68041e12436b484a661d95073ea1937f01a845ce88faa3",
|
|
8940
|
-
executableName: "cloudflared"
|
|
8949
|
+
executableName: "cloudflared",
|
|
8950
|
+
executableBytes: 37466252,
|
|
8951
|
+
executableSha256: "3d97437c71848bd8df68041e12436b484a661d95073ea1937f01a845ce88faa3"
|
|
8952
|
+
},
|
|
8953
|
+
{
|
|
8954
|
+
version: CLOUDFLARED_VERSION,
|
|
8955
|
+
platform: "darwin",
|
|
8956
|
+
arch: "x64",
|
|
8957
|
+
downloadUrl: `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-darwin-amd64.tgz`,
|
|
8958
|
+
downloadBytes: 21118723,
|
|
8959
|
+
downloadSha256: "ff0d3b51d5ff70eceef89d6b32145fee985018a2174596a5dbe405e2766e2ac4",
|
|
8960
|
+
executableName: "cloudflared",
|
|
8961
|
+
executableBytes: 41731488,
|
|
8962
|
+
executableSha256: "1ea07ae775b03236bd6be18ca1848d6bdc4af2f4f3bce398823b5a36e5761b75",
|
|
8963
|
+
archive: {
|
|
8964
|
+
format: "tgz",
|
|
8965
|
+
member: "cloudflared"
|
|
8966
|
+
}
|
|
8967
|
+
},
|
|
8968
|
+
{
|
|
8969
|
+
version: CLOUDFLARED_VERSION,
|
|
8970
|
+
platform: "darwin",
|
|
8971
|
+
arch: "arm64",
|
|
8972
|
+
downloadUrl: `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-darwin-arm64.tgz`,
|
|
8973
|
+
downloadBytes: 19217478,
|
|
8974
|
+
downloadSha256: "c27ab8fd0aa489449e3d201eb02f957ef460a13b613662928b1b23394bf1bcfe",
|
|
8975
|
+
executableName: "cloudflared",
|
|
8976
|
+
executableBytes: 38893072,
|
|
8977
|
+
executableSha256: "9a0b19f67dc7a3011bc6b972c7ce06a5fcea8784ac6bd599ffa382ea4aeb5a6e",
|
|
8978
|
+
archive: {
|
|
8979
|
+
format: "tgz",
|
|
8980
|
+
member: "cloudflared"
|
|
8981
|
+
}
|
|
8941
8982
|
}
|
|
8942
8983
|
].map((release) => [`${release.platform}-${release.arch}`, Object.freeze(release)])));
|
|
8943
8984
|
/**
|
|
@@ -8964,6 +9005,60 @@ async function regularFile$1(file, expectedBytes) {
|
|
|
8964
9005
|
throw error;
|
|
8965
9006
|
}
|
|
8966
9007
|
}
|
|
9008
|
+
async function runCapture(file, args) {
|
|
9009
|
+
return new Promise((resolveRun, reject) => {
|
|
9010
|
+
execFile(file, [...args], {
|
|
9011
|
+
windowsHide: true,
|
|
9012
|
+
timeout: 12e4,
|
|
9013
|
+
maxBuffer: MAX_ARCHIVE_LIST_BYTES,
|
|
9014
|
+
encoding: "utf8"
|
|
9015
|
+
}, (error, stdout) => {
|
|
9016
|
+
if (error === null) resolveRun(stdout);
|
|
9017
|
+
else reject(error);
|
|
9018
|
+
});
|
|
9019
|
+
});
|
|
9020
|
+
}
|
|
9021
|
+
/** Reject absolute, traversing, or Windows-shaped archive members. */
|
|
9022
|
+
function validatedArchiveEntry(rawEntry) {
|
|
9023
|
+
if (rawEntry.length === 0 || rawEntry.includes("\\") || rawEntry.includes("\0") || rawEntry.startsWith("/") || /^[a-zA-Z]:/u.test(rawEntry)) throw new Error("cloudflared_archive_path_invalid");
|
|
9024
|
+
const segments = rawEntry.replace(/\/$/u, "").split("/");
|
|
9025
|
+
if (segments.some((segment) => segment === "" || segment === "." || segment === "..")) throw new Error("cloudflared_archive_path_invalid");
|
|
9026
|
+
return segments;
|
|
9027
|
+
}
|
|
9028
|
+
/** Select exactly one archive member named `member`, wherever it sits in the tree. */
|
|
9029
|
+
function selectCloudflaredArchiveEntry(entries, member) {
|
|
9030
|
+
if (entries.length === 0 || entries.length > MAX_ARCHIVE_ENTRIES) throw new Error("cloudflared_archive_entries_invalid");
|
|
9031
|
+
let selected;
|
|
9032
|
+
for (const entry of entries) if (validatedArchiveEntry(entry).at(-1) === member) {
|
|
9033
|
+
if (selected !== void 0) throw new Error("cloudflared_archive_executable_ambiguous");
|
|
9034
|
+
selected = entry.replace(/\/$/u, "");
|
|
9035
|
+
}
|
|
9036
|
+
if (selected === void 0) throw new Error("cloudflared_archive_executable_missing");
|
|
9037
|
+
return selected;
|
|
9038
|
+
}
|
|
9039
|
+
/**
|
|
9040
|
+
* Unpack the pinned member out of a `.tgz` using the system `tar`, which ships
|
|
9041
|
+
* with Windows 10+, macOS, and every supported Linux base.
|
|
9042
|
+
*/
|
|
9043
|
+
async function defaultExtractArtifact$1(archive, destination, member) {
|
|
9044
|
+
const tar = process.platform === "win32" ? "tar.exe" : "tar";
|
|
9045
|
+
const selected = selectCloudflaredArchiveEntry((await runCapture(tar, ["-tzf", archive])).split(/\r?\n/u).filter((entry) => entry.length > 0), member);
|
|
9046
|
+
const unpacked = join(destination, "archive");
|
|
9047
|
+
await mkdir(unpacked, {
|
|
9048
|
+
recursive: true,
|
|
9049
|
+
mode: 448
|
|
9050
|
+
});
|
|
9051
|
+
await runCapture(tar, [
|
|
9052
|
+
"-xzf",
|
|
9053
|
+
archive,
|
|
9054
|
+
"-C",
|
|
9055
|
+
unpacked,
|
|
9056
|
+
selected
|
|
9057
|
+
]);
|
|
9058
|
+
const extracted = join(unpacked, ...validatedArchiveEntry(selected));
|
|
9059
|
+
if (!await regularFile$1(extracted)) throw new Error("cloudflared_archive_executable_invalid");
|
|
9060
|
+
await copyFile(extracted, join(destination, member));
|
|
9061
|
+
}
|
|
8967
9062
|
async function defaultFetchArtifact$1(url, signal, expectedBytes) {
|
|
8968
9063
|
return downloadPinnedArtifact({
|
|
8969
9064
|
url,
|
|
@@ -8988,6 +9083,7 @@ var CloudflaredComponentManager = class {
|
|
|
8988
9083
|
arch;
|
|
8989
9084
|
release;
|
|
8990
9085
|
fetchArtifact;
|
|
9086
|
+
extractArtifact;
|
|
8991
9087
|
installed = false;
|
|
8992
9088
|
errorCode;
|
|
8993
9089
|
queue = Promise.resolve();
|
|
@@ -9012,12 +9108,14 @@ var CloudflaredComponentManager = class {
|
|
|
9012
9108
|
]) if (!inside$1(stateDirectory, child)) throw new Error("cloudflared component path escaped its state directory");
|
|
9013
9109
|
const release = this.release;
|
|
9014
9110
|
this.fetchArtifact = options.fetchArtifact ?? ((url, signal) => defaultFetchArtifact$1(url, signal, release?.downloadBytes ?? 0));
|
|
9111
|
+
this.extractArtifact = options.extractArtifact ?? defaultExtractArtifact$1;
|
|
9015
9112
|
}
|
|
9016
9113
|
/** Inspect the managed binary without using any global cloudflared state. */
|
|
9017
9114
|
async initialize() {
|
|
9018
9115
|
const release = this.release;
|
|
9019
|
-
this.
|
|
9020
|
-
|
|
9116
|
+
this.errorCode = void 0;
|
|
9117
|
+
this.installed = release !== void 0 && await regularFile$1(this.executable, release.executableBytes);
|
|
9118
|
+
if (this.installed && release !== void 0 && await sha256$1(this.executable) !== release.executableSha256) {
|
|
9021
9119
|
this.installed = false;
|
|
9022
9120
|
this.errorCode = "cloudflared_component_invalid";
|
|
9023
9121
|
}
|
|
@@ -9030,7 +9128,7 @@ var CloudflaredComponentManager = class {
|
|
|
9030
9128
|
installed: this.installed,
|
|
9031
9129
|
version: release.version,
|
|
9032
9130
|
downloadBytes: release.downloadBytes,
|
|
9033
|
-
installedBytes: release.
|
|
9131
|
+
installedBytes: release.executableBytes,
|
|
9034
9132
|
sourceUrl: release.downloadUrl,
|
|
9035
9133
|
downloadPage: DOWNLOAD_PAGE$1,
|
|
9036
9134
|
termsUrl: TERMS_URL$1,
|
|
@@ -9052,7 +9150,7 @@ var CloudflaredComponentManager = class {
|
|
|
9052
9150
|
const controller = new AbortController();
|
|
9053
9151
|
const timeout = setTimeout(() => {
|
|
9054
9152
|
controller.abort();
|
|
9055
|
-
},
|
|
9153
|
+
}, DOWNLOAD_TIMEOUT_MS);
|
|
9056
9154
|
timeout.unref();
|
|
9057
9155
|
let bytes;
|
|
9058
9156
|
try {
|
|
@@ -9063,12 +9161,24 @@ var CloudflaredComponentManager = class {
|
|
|
9063
9161
|
if (bytes.byteLength !== release.downloadBytes) throw new Error("cloudflared_download_size_mismatch");
|
|
9064
9162
|
if (createHash("sha256").update(bytes).digest("hex") !== release.downloadSha256) throw new Error("cloudflared_download_hash_mismatch");
|
|
9065
9163
|
const staged = join(staging, release.executableName);
|
|
9066
|
-
await writeFile(staged, bytes, {
|
|
9164
|
+
if (release.archive === void 0) await writeFile(staged, bytes, {
|
|
9067
9165
|
flag: "wx",
|
|
9068
9166
|
mode: 384
|
|
9069
9167
|
});
|
|
9168
|
+
else {
|
|
9169
|
+
const downloaded = join(staging, `${release.executableName}.download`);
|
|
9170
|
+
await writeFile(downloaded, bytes, {
|
|
9171
|
+
flag: "wx",
|
|
9172
|
+
mode: 384
|
|
9173
|
+
});
|
|
9174
|
+
try {
|
|
9175
|
+
await this.extractArtifact(downloaded, staging, release.archive.member);
|
|
9176
|
+
} finally {
|
|
9177
|
+
await rm(downloaded, { force: true });
|
|
9178
|
+
}
|
|
9179
|
+
}
|
|
9070
9180
|
await chmod(staged, 448);
|
|
9071
|
-
if (!await regularFile$1(staged, release.
|
|
9181
|
+
if (!await regularFile$1(staged, release.executableBytes) || await sha256$1(staged) !== release.executableSha256) throw new Error("cloudflared_executable_hash_mismatch");
|
|
9072
9182
|
const candidate = join(this.componentRoot, `.install-${randomBytes(12).toString("hex")}`);
|
|
9073
9183
|
await mkdir(candidate, {
|
|
9074
9184
|
recursive: true,
|
|
@@ -14260,6 +14370,6 @@ async function apply(ctx, config) {
|
|
|
14260
14370
|
}, "dsh-mobile: independent LAN and selectable remote providers with /mobile command");
|
|
14261
14371
|
}
|
|
14262
14372
|
//#endregion
|
|
14263
|
-
export { AUTH_PREFIX, AccessController, AccessError, BlockedUpgradePathLog, BoundedRateLimiter, CERT_EXPIRING_DAYS, CLOUDFLARED_COMPONENT_RELEASE, CSRF_COOKIE, CSRF_HEADER, CloudflaredComponentManager, CloudflaredController, CloudflaredTunnelStore, Config, DEFAULT_ORIGIN_LISTEN_PORT, FRP_VHOST_HTTP_PORT as DEFAULT_VHOST_HTTP_PORT, FRP_VHOST_HTTP_PORT, DEVICE_COOKIE, EXTENSION_LIMITS, FRP_ATTACH_DISCOVERY_PATH, FRP_ATTACH_LOCAL_DECLARATION, FRP_ATTACH_SELF_SIGNED_DECLARATION, FRP_ATTACH_VPS_DECLARATION, FRP_CADDY_IMPORT_LINE, FRP_CADDY_SNIPPET_MARKER, FRP_CADDY_SNIPPET_PATH, FRP_COMPONENT_RELEASES, FRP_DEFAULT_PROXY_NAME, FRP_DEFAULT_PUBLIC_PORT, FRP_RESERVED_PORTS, FrpComponentManager, FrpConfigStore, FrpController, JsonDeviceStore, JsonMobileAccessControlStore, JsonRemoteProviderStore, LOCAL_ADMIN_PREFIX, MAX_BLOCKED_UPGRADE_PATHS, MAX_EXTRA_WEBSOCKET_PATHS, MAX_WEBSOCKET_PATH_LENGTH, MemoryDeviceStore, MobileAccessGateway, MobileAccessGatewayController, MobileAccessService, MobileExtensionError, OriginConfigStore, OriginController, REMOTE_PROVIDERS, RequestTrustPolicy, SESSION_COOKIE, TASK_EVENT_DEBOUNCE_MS, TaskEventHub, WS_PATHS, WebSocketPathStore, addressAllowed, apply, assertExtensionId, configuredRemoteProvider, createCaddySite, createFrpAttachPlan, createFrpAttachTemplate, createFrpAttachTemplateParts, createFrpServerTemplate, createFrpcToml, createMobileAccessService, createRestrictedFrpServerTemplate, ensureFrpIngressCertificate, evaluateCertificateLifetime, frpAttachVpsParts, frpIngressPaths, frpIngressSelfCheck, frpProxyName, inject, isCloudflaredRegistration, isFrpSelfSignedIngress, isGloballyRoutableIpv4, isLoopbackAddress, issueServerCertificate, mergeSavedCloudflaredTunnelSettings, mergeSavedFrpSettings, mergeSavedFrpTarget, name, normalizeWebSocketPaths, originGatewayConfig, parseAuthority, parseCidr, parseCloudflaredOrigin, parseCloudflaredTunnelSettings, parseControlFile, parseDeviceSnapshot, parseExtensionManifest, parseFrpSettings, parseGatewayConfig, parseMobileAccessControlState, parseOriginSettings, parseRemoteProviderState, probeOriginCertificate, readCertificateRenewal, resolveAuthority, resolveFrpEntryTls, resolveFrpMode, resolveFrpPublicPort, resolveFrpVhostHttpPort, rewriteMobileIndex, validateAttachSettings, validateCloudflaredTunnelHostname, validateCloudflaredTunnelPort, validateCloudflaredTunnelToken, validateFrpEntryTls, validateFrpMode, validateFrpProxyName, validateFrpPublicOrigin, validateFrpPublicPort, validateFrpServerAddress, validateFrpServerPort, validateFrpToken, validateFrpVhostHttpPort, validateOriginAllowedCidrs, validateOriginListenHost, validateOriginListenPort, validateOriginPublicOrigin, validateWebSocketPath, watchTaskCompletions };
|
|
14373
|
+
export { AUTH_PREFIX, AccessController, AccessError, BlockedUpgradePathLog, BoundedRateLimiter, CERT_EXPIRING_DAYS, CLOUDFLARED_COMPONENT_RELEASE, CLOUDFLARED_COMPONENT_RELEASES, CSRF_COOKIE, CSRF_HEADER, CloudflaredComponentManager, CloudflaredController, CloudflaredTunnelStore, Config, DEFAULT_ORIGIN_LISTEN_PORT, FRP_VHOST_HTTP_PORT as DEFAULT_VHOST_HTTP_PORT, FRP_VHOST_HTTP_PORT, DEVICE_COOKIE, EXTENSION_LIMITS, FRP_ATTACH_DISCOVERY_PATH, FRP_ATTACH_LOCAL_DECLARATION, FRP_ATTACH_SELF_SIGNED_DECLARATION, FRP_ATTACH_VPS_DECLARATION, FRP_CADDY_IMPORT_LINE, FRP_CADDY_SNIPPET_MARKER, FRP_CADDY_SNIPPET_PATH, FRP_COMPONENT_RELEASES, FRP_DEFAULT_PROXY_NAME, FRP_DEFAULT_PUBLIC_PORT, FRP_RESERVED_PORTS, FrpComponentManager, FrpConfigStore, FrpController, JsonDeviceStore, JsonMobileAccessControlStore, JsonRemoteProviderStore, LOCAL_ADMIN_PREFIX, MAX_BLOCKED_UPGRADE_PATHS, MAX_EXTRA_WEBSOCKET_PATHS, MAX_WEBSOCKET_PATH_LENGTH, MemoryDeviceStore, MobileAccessGateway, MobileAccessGatewayController, MobileAccessService, MobileExtensionError, OriginConfigStore, OriginController, REMOTE_PROVIDERS, RequestTrustPolicy, SESSION_COOKIE, TASK_EVENT_DEBOUNCE_MS, TaskEventHub, WS_PATHS, WebSocketPathStore, addressAllowed, apply, assertExtensionId, configuredRemoteProvider, createCaddySite, createFrpAttachPlan, createFrpAttachTemplate, createFrpAttachTemplateParts, createFrpServerTemplate, createFrpcToml, createMobileAccessService, createRestrictedFrpServerTemplate, ensureFrpIngressCertificate, evaluateCertificateLifetime, frpAttachVpsParts, frpIngressPaths, frpIngressSelfCheck, frpProxyName, inject, isCloudflaredRegistration, isFrpSelfSignedIngress, isGloballyRoutableIpv4, isLoopbackAddress, issueServerCertificate, mergeSavedCloudflaredTunnelSettings, mergeSavedFrpSettings, mergeSavedFrpTarget, name, normalizeWebSocketPaths, originGatewayConfig, parseAuthority, parseCidr, parseCloudflaredOrigin, parseCloudflaredTunnelSettings, parseControlFile, parseDeviceSnapshot, parseExtensionManifest, parseFrpSettings, parseGatewayConfig, parseMobileAccessControlState, parseOriginSettings, parseRemoteProviderState, probeOriginCertificate, readCertificateRenewal, resolveAuthority, resolveFrpEntryTls, resolveFrpMode, resolveFrpPublicPort, resolveFrpVhostHttpPort, rewriteMobileIndex, validateAttachSettings, validateCloudflaredTunnelHostname, validateCloudflaredTunnelPort, validateCloudflaredTunnelToken, validateFrpEntryTls, validateFrpMode, validateFrpProxyName, validateFrpPublicOrigin, validateFrpPublicPort, validateFrpServerAddress, validateFrpServerPort, validateFrpToken, validateFrpVhostHttpPort, validateOriginAllowedCidrs, validateOriginListenHost, validateOriginListenPort, validateOriginPublicOrigin, validateWebSocketPath, watchTaskCompletions };
|
|
14264
14374
|
|
|
14265
14375
|
//# sourceMappingURL=index.mjs.map
|