ds-harness-remote 0.3.15 → 0.3.17
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/README.md +29 -10
- package/dist/client-runtime.d.ts +5 -1
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +83 -7
- package/dist/client-runtime.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.github.js +227 -9
- package/dist/client.js +227 -9
- package/dist/client.js.map +1 -1
- package/dist/file-viewer-bridge.d.ts +30 -0
- package/dist/file-viewer-bridge.d.ts.map +1 -0
- package/dist/file-viewer-bridge.js +128 -0
- package/dist/file-viewer-bridge.js.map +1 -0
- package/dist/file-viewer-contract.d.ts +5 -0
- package/dist/file-viewer-contract.d.ts.map +1 -0
- package/dist/file-viewer-contract.js +4 -0
- package/dist/file-viewer-contract.js.map +1 -0
- package/dist/harness-api-bridge.d.ts +3 -1
- package/dist/harness-api-bridge.d.ts.map +1 -1
- package/dist/harness-api-bridge.js +24 -8
- package/dist/harness-api-bridge.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +656 -268
- package/dist/index.js.map +4 -4
- package/dist/remote-file-content-provider.d.ts +28 -0
- package/dist/remote-file-content-provider.d.ts.map +1 -0
- package/dist/remote-file-content-provider.js +69 -0
- package/dist/remote-file-content-provider.js.map +1 -0
- package/dist/rpc-router.d.ts +4 -2
- package/dist/rpc-router.d.ts.map +1 -1
- package/dist/rpc-router.js +11 -2
- package/dist/rpc-router.js.map +1 -1
- package/dist/server-connection.d.ts +2 -1
- package/dist/server-connection.d.ts.map +1 -1
- package/dist/server-connection.js +9 -6
- package/dist/server-connection.js.map +1 -1
- package/dist/service.d.ts +3 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +9 -3
- package/dist/service.js.map +1 -1
- package/dist/typert-gateway-switch.d.ts +1 -1
- package/dist/typert-gateway-switch.d.ts.map +1 -1
- package/dist/typert-gateway-switch.js +7 -2
- package/dist/typert-gateway-switch.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/client.github.js
CHANGED
|
@@ -1620,7 +1620,61 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
1620
1620
|
});
|
|
1621
1621
|
|
|
1622
1622
|
// src/client.ts
|
|
1623
|
-
var import_qrcode = __toESM(require_browser(), 1)
|
|
1623
|
+
var import_qrcode = __toESM(require_browser(), 1);
|
|
1624
|
+
|
|
1625
|
+
// src/remote-file-content-provider.ts
|
|
1626
|
+
function createRemoteFileContentProvider(call) {
|
|
1627
|
+
return {
|
|
1628
|
+
id: "dsh-remote-files",
|
|
1629
|
+
priority: 1e4,
|
|
1630
|
+
supports: () => !0,
|
|
1631
|
+
async stat(locator, signal) {
|
|
1632
|
+
let value = await call("fileviewer.stat", { path: locator }, signal);
|
|
1633
|
+
if (value.exists)
|
|
1634
|
+
return {
|
|
1635
|
+
name: value.name,
|
|
1636
|
+
size: value.isDirectory ? 0 : value.size,
|
|
1637
|
+
mime: value.mime,
|
|
1638
|
+
mtimeMs: value.mtimeMs,
|
|
1639
|
+
isDirectory: value.isDirectory
|
|
1640
|
+
};
|
|
1641
|
+
},
|
|
1642
|
+
async read(locator, request) {
|
|
1643
|
+
if (!Number.isInteger(request.offset) || request.offset < 0) throw new Error("A non-negative integer offset is required.");
|
|
1644
|
+
if (!Number.isInteger(request.length) || request.length <= 0) throw new Error("A positive integer length is required.");
|
|
1645
|
+
let chunks = [], received = 0;
|
|
1646
|
+
for (; received < request.length; ) {
|
|
1647
|
+
request.signal.throwIfAborted();
|
|
1648
|
+
let length = Math.min(524288, request.length - received), offset = request.offset + received, range = await call("fileviewer.readRange", { path: locator, offset, length }, request.signal);
|
|
1649
|
+
if (range.offset !== offset) throw new Error("The Remote Host returned a mismatched file range.");
|
|
1650
|
+
let bytes = decodeBase64(range.data);
|
|
1651
|
+
if (bytes.byteLength > length) throw new Error("The Remote Host returned more file bytes than requested.");
|
|
1652
|
+
if (chunks.push(bytes), received += bytes.byteLength, range.eof || bytes.byteLength === 0) break;
|
|
1653
|
+
}
|
|
1654
|
+
let merged = new Uint8Array(received), cursor = 0;
|
|
1655
|
+
for (let chunk of chunks)
|
|
1656
|
+
merged.set(chunk, cursor), cursor += chunk.byteLength;
|
|
1657
|
+
return merged;
|
|
1658
|
+
},
|
|
1659
|
+
async list(locator, signal) {
|
|
1660
|
+
return (await call("fileviewer.list", { path: locator }, signal)).entries.map((entry) => ({
|
|
1661
|
+
locator: entry.path,
|
|
1662
|
+
name: entry.name,
|
|
1663
|
+
size: entry.isDirectory ? 0 : entry.size ?? 0,
|
|
1664
|
+
mtimeMs: entry.mtimeMs,
|
|
1665
|
+
isDirectory: entry.isDirectory
|
|
1666
|
+
}));
|
|
1667
|
+
}
|
|
1668
|
+
};
|
|
1669
|
+
}
|
|
1670
|
+
function decodeBase64(value) {
|
|
1671
|
+
let binary = atob(value), bytes = new Uint8Array(binary.length);
|
|
1672
|
+
for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
|
|
1673
|
+
return bytes;
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
// src/client.ts
|
|
1677
|
+
var clientModuleId = "dsh-remote", localeNamespace = "dsh-remote", en = {
|
|
1624
1678
|
pluginTitle: "DeepSeek Remote",
|
|
1625
1679
|
pluginDescription: "Connect once. Available anytime.",
|
|
1626
1680
|
expandSettings: "Show settings: {name}",
|
|
@@ -1740,7 +1794,39 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
1740
1794
|
connectionRouteTurn: "TURN relay service",
|
|
1741
1795
|
connectionRouteRelay: "Remote Server",
|
|
1742
1796
|
connectionRouteHost: "Work computer running Harness",
|
|
1797
|
+
connectionRouteLanDetail: "Direct transfer over the local network",
|
|
1798
|
+
connectionRouteP2pDetail: "Direct transfer over the internet",
|
|
1799
|
+
connectionRouteTurnDetail: "Encrypted transfer through the TURN service",
|
|
1800
|
+
connectionRouteRelayDetail: "Encrypted transfer through the Remote Server",
|
|
1743
1801
|
connectionRouteEncrypted: "Application data remains end-to-end encrypted along this route.",
|
|
1802
|
+
connectionDetailsConnection: "Connection",
|
|
1803
|
+
connectionDetailsWebRtc: "Network details \xB7 WebRTC / ICE",
|
|
1804
|
+
connectionId: "Connection ID",
|
|
1805
|
+
connectedAt: "Established",
|
|
1806
|
+
preferredTransports: "Attempt order",
|
|
1807
|
+
controlChannel: "Control channel",
|
|
1808
|
+
controlAddress: "Control address",
|
|
1809
|
+
controlStateConnecting: "Connecting",
|
|
1810
|
+
controlStateOpen: "Connected",
|
|
1811
|
+
controlStateClosing: "Closing",
|
|
1812
|
+
controlStateClosed: "Closed",
|
|
1813
|
+
peerState: "Peer connection",
|
|
1814
|
+
dataChannel: "DataChannel",
|
|
1815
|
+
localCandidate: "Local candidate",
|
|
1816
|
+
remoteCandidate: "Remote candidate",
|
|
1817
|
+
localAddress: "Local address",
|
|
1818
|
+
remoteAddress: "Remote address",
|
|
1819
|
+
networkProtocol: "Network protocol",
|
|
1820
|
+
relayProtocol: "TURN protocol",
|
|
1821
|
+
roundTripTime: "Round-trip time",
|
|
1822
|
+
availableBitrate: "Available outgoing bitrate",
|
|
1823
|
+
bytesSent: "WebRTC bytes sent",
|
|
1824
|
+
bytesReceived: "WebRTC bytes received",
|
|
1825
|
+
notProvided: "Not provided",
|
|
1826
|
+
candidateHost: "Local address \xB7 host",
|
|
1827
|
+
candidateSrflx: "Public address \xB7 srflx",
|
|
1828
|
+
candidatePrflx: "Peer address \xB7 prflx",
|
|
1829
|
+
candidateRelay: "TURN address \xB7 relay",
|
|
1744
1830
|
openLocalWorkspaces: "Open local workspaces",
|
|
1745
1831
|
clientSignInHint: "Sign in to this Server to list your remote Hosts.",
|
|
1746
1832
|
signInClient: "DeepSeek Harness Remote",
|
|
@@ -1874,7 +1960,39 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
1874
1960
|
connectionRouteTurn: "TURN \u4E2D\u7EE7\u670D\u52A1",
|
|
1875
1961
|
connectionRouteRelay: "Remote Server",
|
|
1876
1962
|
connectionRouteHost: "\u8FD0\u884C Harness \u7684\u5DE5\u4F5C\u7535\u8111",
|
|
1963
|
+
connectionRouteLanDetail: "\u5728\u672C\u5730\u7F51\u7EDC\u4E2D\u76F4\u63A5\u4F20\u8F93",
|
|
1964
|
+
connectionRouteP2pDetail: "\u901A\u8FC7\u4E92\u8054\u7F51\u76F4\u63A5\u4F20\u8F93",
|
|
1965
|
+
connectionRouteTurnDetail: "\u901A\u8FC7 TURN \u670D\u52A1\u8F6C\u53D1\u52A0\u5BC6\u6570\u636E",
|
|
1966
|
+
connectionRouteRelayDetail: "\u901A\u8FC7 Remote Server \u8F6C\u53D1\u52A0\u5BC6\u6570\u636E",
|
|
1877
1967
|
connectionRouteEncrypted: "\u7EBF\u8DEF\u4E0A\u7684\u4E1A\u52A1\u6570\u636E\u4FDD\u6301\u7AEF\u5230\u7AEF\u52A0\u5BC6\u3002",
|
|
1968
|
+
connectionDetailsConnection: "\u8FDE\u63A5",
|
|
1969
|
+
connectionDetailsWebRtc: "\u7F51\u7EDC\u8BE6\u60C5 \xB7 WebRTC / ICE",
|
|
1970
|
+
connectionId: "\u8FDE\u63A5\u7F16\u53F7",
|
|
1971
|
+
connectedAt: "\u5EFA\u7ACB\u65F6\u95F4",
|
|
1972
|
+
preferredTransports: "\u5C1D\u8BD5\u987A\u5E8F",
|
|
1973
|
+
controlChannel: "\u63A7\u5236\u901A\u9053",
|
|
1974
|
+
controlAddress: "\u63A7\u5236\u5730\u5740",
|
|
1975
|
+
controlStateConnecting: "\u8FDE\u63A5\u4E2D",
|
|
1976
|
+
controlStateOpen: "\u5DF2\u8FDE\u63A5",
|
|
1977
|
+
controlStateClosing: "\u6B63\u5728\u5173\u95ED",
|
|
1978
|
+
controlStateClosed: "\u5DF2\u5173\u95ED",
|
|
1979
|
+
peerState: "\u8FDE\u63A5\u72B6\u6001",
|
|
1980
|
+
dataChannel: "DataChannel",
|
|
1981
|
+
localCandidate: "\u672C\u5730\u5019\u9009",
|
|
1982
|
+
remoteCandidate: "\u8FDC\u7AEF\u5019\u9009",
|
|
1983
|
+
localAddress: "\u672C\u5730\u5730\u5740",
|
|
1984
|
+
remoteAddress: "\u8FDC\u7AEF\u5730\u5740",
|
|
1985
|
+
networkProtocol: "\u4F20\u8F93\u534F\u8BAE",
|
|
1986
|
+
relayProtocol: "TURN \u534F\u8BAE",
|
|
1987
|
+
roundTripTime: "\u5F80\u8FD4\u65F6\u5EF6",
|
|
1988
|
+
availableBitrate: "\u53EF\u7528\u4E0A\u884C\u5E26\u5BBD",
|
|
1989
|
+
bytesSent: "WebRTC \u5DF2\u53D1\u9001",
|
|
1990
|
+
bytesReceived: "WebRTC \u5DF2\u63A5\u6536",
|
|
1991
|
+
notProvided: "\u672A\u63D0\u4F9B",
|
|
1992
|
+
candidateHost: "\u672C\u5730\u5730\u5740 \xB7 host",
|
|
1993
|
+
candidateSrflx: "\u516C\u7F51\u5730\u5740 \xB7 srflx",
|
|
1994
|
+
candidatePrflx: "\u5BF9\u7AEF\u5730\u5740 \xB7 prflx",
|
|
1995
|
+
candidateRelay: "TURN \u5730\u5740 \xB7 relay",
|
|
1878
1996
|
openLocalWorkspaces: "\u6253\u5F00\u672C\u5730\u5DE5\u4F5C\u533A",
|
|
1879
1997
|
clientSignInHint: "\u767B\u5F55 Server \u540E\u5373\u53EF\u67E5\u770B\u81EA\u5DF1\u7684\u8FDC\u7AEF\u4E3B\u673A\u3002",
|
|
1880
1998
|
signInClient: "DeepSeek Harness Remote",
|
|
@@ -1893,6 +2011,22 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
1893
2011
|
let date = new Date(value);
|
|
1894
2012
|
return Number.isNaN(date.getTime()) ? "\u2014" : date.toLocaleString();
|
|
1895
2013
|
}
|
|
2014
|
+
function formatByteSize(value) {
|
|
2015
|
+
if (value < 1024) return `${value.toLocaleString()} B`;
|
|
2016
|
+
let units = ["KiB", "MiB", "GiB"], amount = value, unit = "B";
|
|
2017
|
+
for (let nextUnit of units)
|
|
2018
|
+
if (amount /= 1024, unit = nextUnit, amount < 1024) break;
|
|
2019
|
+
return `${amount.toLocaleString(void 0, { maximumFractionDigits: 1 })} ${unit}`;
|
|
2020
|
+
}
|
|
2021
|
+
function formatBitrate(value) {
|
|
2022
|
+
let units = ["bit/s", "Kbit/s", "Mbit/s", "Gbit/s"], amount = value, unitIndex = 0;
|
|
2023
|
+
for (; amount >= 1e3 && unitIndex < units.length - 1; )
|
|
2024
|
+
amount /= 1e3, unitIndex += 1;
|
|
2025
|
+
return `${amount.toLocaleString(void 0, { maximumFractionDigits: 1 })} ${units[unitIndex]}`;
|
|
2026
|
+
}
|
|
2027
|
+
function shortDeviceId(value) {
|
|
2028
|
+
return value.length <= 14 ? value : `${value.slice(0, 8)}\u2026${value.slice(-4)}`;
|
|
2029
|
+
}
|
|
1896
2030
|
function connectionErrorMessage(code, t) {
|
|
1897
2031
|
return t(code === "ACCOUNT_AUTH_REQUIRED" || code === "AUTH_INVALID" || code === "TOKEN_EXPIRED" ? "connectionAuthorizationExpired" : code === "DEVICE_REVOKED" ? "connectionDeviceRevoked" : code === "DEVICE_OWNERSHIP_REQUIRED" ? "connectionOwnershipRequired" : code === "RATE_LIMITED" ? "connectionRateLimited" : code === "UNSUPPORTED_VERSION" ? "connectionVersionMismatch" : code === "INVALID_MESSAGE" ? "connectionInvalidResponse" : code === "CONNECTION_FAILED" || code === "SERVER_NOT_CONFIGURED" ? "connectionReachability" : "connectionUnexpected");
|
|
1898
2032
|
}
|
|
@@ -2734,7 +2868,13 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2734
2868
|
}, []), React.useEffect(() => {
|
|
2735
2869
|
if (status?.mode === "remote")
|
|
2736
2870
|
return hideLocalSessionActions();
|
|
2737
|
-
}, [status?.mode]),
|
|
2871
|
+
}, [status?.mode]), React.useEffect(() => {
|
|
2872
|
+
if (!routeOpen) return;
|
|
2873
|
+
let closeOnEscape = (event) => {
|
|
2874
|
+
event.key === "Escape" && setRouteOpen(!1);
|
|
2875
|
+
};
|
|
2876
|
+
return document.addEventListener("keydown", closeOnEscape), () => document.removeEventListener("keydown", closeOnEscape);
|
|
2877
|
+
}, [routeOpen]), status?.mode !== "remote") return null;
|
|
2738
2878
|
let exit = async () => {
|
|
2739
2879
|
setBusy(!0);
|
|
2740
2880
|
try {
|
|
@@ -2742,7 +2882,12 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2742
2882
|
} finally {
|
|
2743
2883
|
setBusy(!1);
|
|
2744
2884
|
}
|
|
2745
|
-
}, transport = status.transport ?? "Disconnected", networkLabel = t(transport === "P2P" ? "remoteNetworkP2p" : transport === "TURN" ? "remoteNetworkTurn" : transport === "Relay" ? "remoteNetworkRelay" : transport === "LAN" ? "remoteNetworkLan" : "remoteNetworkOffline"), networkOnline = status.connected === !0 && transport !== "Disconnected", routeVia = t(transport === "P2P" ? "connectionRouteP2p" : transport === "TURN" ? "connectionRouteTurn" : transport === "Relay" ? "connectionRouteRelay" : "connectionRouteLan")
|
|
2885
|
+
}, transport = status.transport ?? "Disconnected", networkLabel = t(transport === "P2P" ? "remoteNetworkP2p" : transport === "TURN" ? "remoteNetworkTurn" : transport === "Relay" ? "remoteNetworkRelay" : transport === "LAN" ? "remoteNetworkLan" : "remoteNetworkOffline"), networkOnline = status.connected === !0 && transport !== "Disconnected", routeVia = t(transport === "P2P" ? "connectionRouteP2p" : transport === "TURN" ? "connectionRouteTurn" : transport === "Relay" ? "connectionRouteRelay" : "connectionRouteLan"), routeViaDetail = t(transport === "P2P" ? "connectionRouteP2pDetail" : transport === "TURN" ? "connectionRouteTurnDetail" : transport === "Relay" ? "connectionRouteRelayDetail" : "connectionRouteLanDetail"), network = status.network, webRtc = network?.webRtc, controlStateLabel = network?.controlChannelState === "connecting" ? t("controlStateConnecting") : network?.controlChannelState === "open" ? t("controlStateOpen") : network?.controlChannelState === "closing" ? t("controlStateClosing") : t("controlStateClosed"), detailValue = (value) => value === void 0 || value === "" ? t("notProvided") : String(value), candidateLabel = (value) => value === "host" ? t("candidateHost") : value === "srflx" ? t("candidateSrflx") : value === "prflx" ? t("candidatePrflx") : value === "relay" ? t("candidateRelay") : detailValue(value), fact = (label, value, mono = !1) => React.createElement(
|
|
2886
|
+
"div",
|
|
2887
|
+
null,
|
|
2888
|
+
React.createElement("dt", null, label),
|
|
2889
|
+
React.createElement("dd", { className: mono ? "isMono" : void 0, title: mono ? value : void 0 }, value)
|
|
2890
|
+
);
|
|
2746
2891
|
return React.createElement(
|
|
2747
2892
|
"div",
|
|
2748
2893
|
{ className: "dshRemoteSessionHeader", role: "status" },
|
|
@@ -2778,7 +2923,6 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2778
2923
|
{
|
|
2779
2924
|
className: "dshRemoteRoutePanel",
|
|
2780
2925
|
role: "dialog",
|
|
2781
|
-
"aria-modal": !0,
|
|
2782
2926
|
"aria-label": t("connectionRouteTitle")
|
|
2783
2927
|
},
|
|
2784
2928
|
React.createElement(
|
|
@@ -2790,9 +2934,62 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2790
2934
|
React.createElement(
|
|
2791
2935
|
"ol",
|
|
2792
2936
|
null,
|
|
2793
|
-
React.createElement(
|
|
2794
|
-
|
|
2795
|
-
|
|
2937
|
+
React.createElement(
|
|
2938
|
+
"li",
|
|
2939
|
+
null,
|
|
2940
|
+
React.createElement("small", null, t("connectionRouteFrom")),
|
|
2941
|
+
React.createElement("strong", null, network?.local.name ?? t("connectionRouteCurrentDevice")),
|
|
2942
|
+
network === void 0 ? null : React.createElement("span", null, `${network.local.platform} \xB7 ${shortDeviceId(network.local.deviceId)}`)
|
|
2943
|
+
),
|
|
2944
|
+
React.createElement(
|
|
2945
|
+
"li",
|
|
2946
|
+
null,
|
|
2947
|
+
React.createElement("small", null, t("connectionRouteVia")),
|
|
2948
|
+
React.createElement("strong", null, routeVia),
|
|
2949
|
+
React.createElement("span", null, routeViaDetail)
|
|
2950
|
+
),
|
|
2951
|
+
React.createElement(
|
|
2952
|
+
"li",
|
|
2953
|
+
null,
|
|
2954
|
+
React.createElement("small", null, t("connectionRouteTo")),
|
|
2955
|
+
React.createElement("strong", null, network?.remote.name ?? status.target?.name ?? t("host")),
|
|
2956
|
+
React.createElement("span", null, network === void 0 ? t("connectionRouteHost") : `${network.remote.platform} \xB7 ${shortDeviceId(network.remote.deviceId)}`)
|
|
2957
|
+
)
|
|
2958
|
+
),
|
|
2959
|
+
network === void 0 ? null : React.createElement(
|
|
2960
|
+
"section",
|
|
2961
|
+
{ className: "dshRemoteRouteSection" },
|
|
2962
|
+
React.createElement("h3", null, t("connectionDetailsConnection")),
|
|
2963
|
+
React.createElement(
|
|
2964
|
+
"dl",
|
|
2965
|
+
null,
|
|
2966
|
+
fact(t("connectionId"), detailValue(network.connectionId), !0),
|
|
2967
|
+
fact(t("connectedAt"), network.connectedAt === void 0 ? t("notProvided") : formatLocalTime(network.connectedAt)),
|
|
2968
|
+
fact(t("preferredTransports"), network.preferredTransports.map((value) => value.toUpperCase()).join(" \u2192 ")),
|
|
2969
|
+
fact(t("controlChannel"), `WebSocket \xB7 ${controlStateLabel}`),
|
|
2970
|
+
fact(t("controlAddress"), network.controlChannelUrl, !0)
|
|
2971
|
+
)
|
|
2972
|
+
),
|
|
2973
|
+
webRtc === void 0 ? null : React.createElement(
|
|
2974
|
+
"section",
|
|
2975
|
+
{ className: "dshRemoteRouteSection" },
|
|
2976
|
+
React.createElement("h3", null, t("connectionDetailsWebRtc")),
|
|
2977
|
+
React.createElement(
|
|
2978
|
+
"dl",
|
|
2979
|
+
null,
|
|
2980
|
+
fact(t("peerState"), `${webRtc.connectionState} \xB7 ICE ${webRtc.iceConnectionState}`),
|
|
2981
|
+
fact(t("dataChannel"), detailValue(webRtc.dataChannelState)),
|
|
2982
|
+
fact(t("localCandidate"), candidateLabel(webRtc.localCandidateType)),
|
|
2983
|
+
fact(t("remoteCandidate"), candidateLabel(webRtc.remoteCandidateType)),
|
|
2984
|
+
fact(t("localAddress"), detailValue(webRtc.localAddress), !0),
|
|
2985
|
+
fact(t("remoteAddress"), detailValue(webRtc.remoteAddress), !0),
|
|
2986
|
+
fact(t("networkProtocol"), detailValue(webRtc.protocol?.toUpperCase())),
|
|
2987
|
+
fact(t("relayProtocol"), detailValue(webRtc.relayProtocol?.toUpperCase())),
|
|
2988
|
+
fact(t("roundTripTime"), webRtc.currentRoundTripTimeMs === void 0 ? t("notProvided") : `${webRtc.currentRoundTripTimeMs.toLocaleString()} ms`),
|
|
2989
|
+
fact(t("availableBitrate"), webRtc.availableOutgoingBitrate === void 0 ? t("notProvided") : formatBitrate(webRtc.availableOutgoingBitrate)),
|
|
2990
|
+
fact(t("bytesSent"), webRtc.bytesSent === void 0 ? t("notProvided") : formatByteSize(webRtc.bytesSent)),
|
|
2991
|
+
fact(t("bytesReceived"), webRtc.bytesReceived === void 0 ? t("notProvided") : formatByteSize(webRtc.bytesReceived))
|
|
2992
|
+
)
|
|
2796
2993
|
),
|
|
2797
2994
|
React.createElement("p", null, t("connectionRouteEncrypted"))
|
|
2798
2995
|
)) : null
|
|
@@ -2838,7 +3035,7 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2838
3035
|
".dshRemoteModeButton:is(button):hover{background:var(--dsw-alias-interactive-bg-hover)}",
|
|
2839
3036
|
".dshRemoteSidebarEntry{box-sizing:border-box;position:relative;min-width:0;display:block;overflow:hidden}.dshRemoteSidebarEntry .dshRemoteModeButton{box-sizing:border-box;width:100%;min-width:0}.dshRemoteSidebarEntry.isWide{width:calc(100% + 8px);height:34px;margin:4px -4px}.dshRemoteSidebarEntry.isWide .dshRemoteModeButton{height:34px;min-height:34px;padding:6px 48px 6px 10px;border-radius:12px}.dshRemoteSidebarEntry.isRail{width:36px;height:54px}.dshRemoteSidebarEntry.isRail .dshRemoteModeButton{width:36px;height:36px;min-height:36px;justify-content:center;gap:0;margin:8px 0 10px;padding:0;border-radius:50%}.dshRemoteSidebarEntry.isActive .dshRemoteModeButton{color:var(--dsw-alias-label-secondary);background:transparent}.dshRemoteSidebarLabel{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dshRemoteExitLink{position:absolute;top:50%;right:10px;transform:translateY(-50%);white-space:nowrap;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:0;font:inherit;font-size:12px;line-height:20px;cursor:pointer}.dshRemoteExitLink:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteExitLink:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px;border-radius:2px}.dshRemoteExitLink:disabled{opacity:.45;cursor:default;text-decoration:none}",
|
|
2840
3037
|
".dshRemoteComputerIcon{box-sizing:border-box;width:18px;height:18px;flex:0 0 18px;color:var(--dsw-alias-label-secondary)}",
|
|
2841
|
-
'.dshRemoteSessionHeader{position:fixed;z-index:25;top:12px;left:50%;transform:translateX(-50%);max-width:calc(100vw - 360px);height:28px;display:inline-flex;align-items:center;gap:7px;color:var(--dsw-alias-label-secondary);font-size:12px;white-space:nowrap}.dshRemoteSessionHeader>svg{width:15px;height:15px;flex:0 0 auto}.dshRemoteSessionTarget{min-width:0;max-width:260px;overflow:hidden;text-overflow:ellipsis}.dshRemoteNetwork{flex:0 0 auto;border:0;background:transparent;color:inherit;font:inherit;padding:3px 2px;display:inline-flex;align-items:center;gap:5px;cursor:pointer}.dshRemoteNetwork:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteNetwork:disabled{cursor:default}.dshRemoteNetwork>i{width:6px;height:6px;border-radius:50%;background:var(--dsw-alias-label-tertiary)}.dshRemoteNetwork.isOnline>i{background:var(--dsw-alias-state-success-primary)}.dshRemoteNetwork.isOffline{color:var(--dsw-alias-state-error-primary)}.dshRemoteNetwork.isOffline>i{background:currentColor}.dshRemoteEncrypted{flex:0 0 auto;color:var(--dsw-alias-label-tertiary)}.dshRemoteHeaderExitLink{flex:0 0 auto;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:3px 2px;font:inherit;text-decoration:none;cursor:pointer}.dshRemoteHeaderExitLink:hover{text-decoration:underline;color:var(--dsw-alias-label-primary)}.dshRemoteHeaderExitLink:disabled{opacity:.45;cursor:default;text-decoration:none}.dshRemoteRouteBackdrop{position:fixed;inset:0;z-index:26}.dshRemoteRoutePanel{position:absolute;top:48px;right:28px;width:min(
|
|
3038
|
+
'.dshRemoteSessionHeader{position:fixed;z-index:25;top:12px;left:50%;transform:translateX(-50%);max-width:calc(100vw - 360px);height:28px;display:inline-flex;align-items:center;gap:7px;color:var(--dsw-alias-label-secondary);font-size:12px;white-space:nowrap}.dshRemoteSessionHeader>svg{width:15px;height:15px;flex:0 0 auto}.dshRemoteSessionTarget{min-width:0;max-width:260px;overflow:hidden;text-overflow:ellipsis}.dshRemoteNetwork{flex:0 0 auto;border:0;background:transparent;color:inherit;font:inherit;padding:3px 2px;display:inline-flex;align-items:center;gap:5px;cursor:pointer}.dshRemoteNetwork:hover:not(:disabled){color:var(--dsw-alias-label-primary);text-decoration:underline}.dshRemoteNetwork:disabled{cursor:default}.dshRemoteNetwork>i{width:6px;height:6px;border-radius:50%;background:var(--dsw-alias-label-tertiary)}.dshRemoteNetwork.isOnline>i{background:var(--dsw-alias-state-success-primary)}.dshRemoteNetwork.isOffline{color:var(--dsw-alias-state-error-primary)}.dshRemoteNetwork.isOffline>i{background:currentColor}.dshRemoteEncrypted{flex:0 0 auto;color:var(--dsw-alias-label-tertiary)}.dshRemoteHeaderExitLink{flex:0 0 auto;border:0;background:transparent;color:var(--dsw-alias-label-secondary);padding:3px 2px;font:inherit;text-decoration:none;cursor:pointer}.dshRemoteHeaderExitLink:hover{text-decoration:underline;color:var(--dsw-alias-label-primary)}.dshRemoteHeaderExitLink:disabled{opacity:.45;cursor:default;text-decoration:none}.dshRemoteNetwork:focus-visible,.dshRemoteHeaderExitLink:focus-visible,.dshRemoteRoutePanel>header button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.dshRemoteRouteBackdrop{position:fixed;inset:0;z-index:26}.dshRemoteRoutePanel{box-sizing:border-box;position:absolute;top:48px;right:28px;width:min(680px,calc(100vw - 32px));max-height:calc(100vh - 72px);overflow:auto;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:12px;padding:16px;white-space:normal}.dshRemoteRoutePanel>header{position:sticky;top:-16px;z-index:1;display:flex;align-items:center;justify-content:space-between;margin:-16px -16px 0;padding:16px;background:var(--dsw-alias-bg-layer-1)}.dshRemoteRoutePanel>header strong{font-size:14px}.dshRemoteRoutePanel>header button{width:28px;height:28px;border:0;border-radius:7px;background:transparent;color:inherit;font-size:20px;cursor:pointer}.dshRemoteRoutePanel>header button:hover{background:var(--dsw-alias-interactive-bg-hover)}.dshRemoteRoutePanel ol{display:flex;align-items:stretch;margin:12px 0 0;padding:0 0 16px;border-bottom:1px solid var(--dsw-alias-border-l2);list-style:none}.dshRemoteRoutePanel li{position:relative;min-width:0;flex:1;display:flex;flex-direction:column;gap:4px;padding-right:20px}.dshRemoteRoutePanel li:not(:last-child)::after{content:"\u2192";position:absolute;right:7px;top:21px;color:var(--dsw-alias-label-tertiary)}.dshRemoteRoutePanel li small{color:var(--dsw-alias-label-tertiary)}.dshRemoteRoutePanel li strong,.dshRemoteRoutePanel li span{overflow:hidden;text-overflow:ellipsis}.dshRemoteRoutePanel li strong{font-size:13px}.dshRemoteRoutePanel li span{color:var(--dsw-alias-label-secondary);font-size:11px}.dshRemoteRouteSection{padding-top:16px}.dshRemoteRouteSection h3{margin:0 0 10px;font-size:12px;font-weight:600;color:var(--dsw-alias-label-secondary)}.dshRemoteRouteSection dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 24px;margin:0}.dshRemoteRouteSection dl>div{min-width:0;display:grid;grid-template-columns:minmax(104px,auto) minmax(0,1fr);gap:10px;padding:7px 0;border-bottom:1px solid var(--dsw-alias-border-l2);font-size:12px;line-height:1.45}.dshRemoteRouteSection dt{color:var(--dsw-alias-label-tertiary)}.dshRemoteRouteSection dd{min-width:0;margin:0;text-align:right;overflow-wrap:anywhere}.dshRemoteRouteSection dd.isMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.dshRemoteRoutePanel>p{margin:16px 0 0;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font-size:12px;line-height:1.5}@media(max-width:620px){.dshRemoteSessionHeader{top:8px;max-width:calc(100vw - 112px)}.dshRemoteSessionHeader>svg{display:none}.dshRemoteSessionTarget{max-width:130px}.dshRemoteEncrypted{display:none}.dshRemoteRoutePanel{top:42px;right:12px;max-height:calc(100vh - 56px)}.dshRemoteRoutePanel ol{flex-direction:column;gap:18px}.dshRemoteRoutePanel li:not(:last-child)::after{content:"\u2193";top:auto;right:auto;bottom:-16px;left:3px}.dshRemoteRouteSection dl{grid-template-columns:1fr}}',
|
|
2842
3039
|
".dshRemoteSessionHeader{left:auto;right:148px;transform:none;max-width:calc(100vw - 420px)}@media(max-width:760px){.dshRemoteSessionHeader{left:auto;right:104px;transform:none;max-width:calc(100vw - 124px)}}",
|
|
2843
3040
|
".dshRemoteModeButton:focus-visible,.dshRemotePage button:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}",
|
|
2844
3041
|
".dshRemotePage{width:min(720px,100%);max-height:min(760px,calc(100vh - 40px));display:flex;flex-direction:column;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:14px;overflow:hidden;animation:dshRemotePageIn .18s cubic-bezier(.25,1,.5,1)}",
|
|
@@ -2898,7 +3095,28 @@ Minimum version required to store current data is: ` + bestVersion + `.
|
|
|
2898
3095
|
if (!result.ok) throw new Error(result.error?.message ?? t("remoteRequestFailed"));
|
|
2899
3096
|
return result.value;
|
|
2900
3097
|
};
|
|
2901
|
-
ctx.
|
|
3098
|
+
ctx.inject(["fileViewer"], (fileViewerContext) => {
|
|
3099
|
+
let viewer = fileViewerContext.get("fileViewer");
|
|
3100
|
+
viewer !== void 0 && fileViewerContext.effect(() => {
|
|
3101
|
+
let active = !0, unregister, sync = async () => {
|
|
3102
|
+
try {
|
|
3103
|
+
let status = await control("status");
|
|
3104
|
+
if (!active) return;
|
|
3105
|
+
status.mode === "remote" && unregister === void 0 ? unregister = viewer.registerContentProvider(createRemoteFileContentProvider(
|
|
3106
|
+
(endpoint, payload) => control(endpoint, payload)
|
|
3107
|
+
)) : status.mode === "local" && unregister !== void 0 && (unregister(), unregister = void 0);
|
|
3108
|
+
} catch {
|
|
3109
|
+
}
|
|
3110
|
+
};
|
|
3111
|
+
sync();
|
|
3112
|
+
let timer = window.setInterval(() => {
|
|
3113
|
+
sync();
|
|
3114
|
+
}, 1500);
|
|
3115
|
+
return () => {
|
|
3116
|
+
active = !1, window.clearInterval(timer), unregister?.();
|
|
3117
|
+
};
|
|
3118
|
+
}, "dsh-remote: remote file viewer provider");
|
|
3119
|
+
}), ctx.effect(() => ctx.locale.register(localeNamespace, { zh, en }), "dsh-remote: dictionaries"), ctx.effect(installStyle, "dsh-remote: client styles"), ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
2902
3120
|
name: "shell.overlay",
|
|
2903
3121
|
id: "dsh-remote-global-context",
|
|
2904
3122
|
order: 20,
|