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/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
- * Unlike the cpolar archive each artifact IS the executable: there is nothing
1564
- * to unpack, so the download digest and the installed digest are the same pair.
1565
- * `--no-autoupdate` is passed at runtime as well, so the pinned bytes stay the
1566
- * bytes that were verified.
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$1(archive, destination, executableName) {
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$1;
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.installed = release !== void 0 && await regularFile$1(this.executable, release.downloadBytes);
9020
- if (this.installed && release !== void 0 && await sha256$1(this.executable) !== release.downloadSha256) {
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.downloadBytes,
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
- }, 3e5);
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.downloadBytes) || await sha256$1(staged) !== release.downloadSha256) throw new Error("cloudflared_executable_hash_mismatch");
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