@blue-soda/dsh-remote 0.4.28 → 0.4.30
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 +9 -9
- package/dist/atomic-file.d.ts +16 -0
- package/dist/atomic-file.d.ts.map +1 -0
- package/dist/atomic-file.js +81 -0
- package/dist/atomic-file.js.map +1 -0
- package/dist/client-runtime.d.ts +137 -1
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +399 -22
- package/dist/client-runtime.js.map +1 -1
- package/dist/client-secure-transport.d.ts.map +1 -1
- package/dist/client-secure-transport.js +2 -1
- package/dist/client-secure-transport.js.map +1 -1
- package/dist/client-target-store.d.ts +40 -0
- package/dist/client-target-store.d.ts.map +1 -0
- package/dist/client-target-store.js +79 -0
- package/dist/client-target-store.js.map +1 -0
- package/dist/client.github.js +63 -15
- package/dist/client.js +63 -15
- package/dist/codex/domain.d.ts +9 -0
- package/dist/codex/domain.d.ts.map +1 -1
- package/dist/codex/domain.js +48 -7
- package/dist/codex/domain.js.map +1 -1
- package/dist/identity-store.d.ts.map +1 -1
- package/dist/identity-store.js +6 -3
- package/dist/identity-store.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +779 -220
- package/dist/index.js.map +4 -4
- package/dist/remote-typert-gateway.d.ts.map +1 -1
- package/dist/remote-typert-gateway.js +5 -3
- package/dist/remote-typert-gateway.js.map +1 -1
- package/dist/rpc-binary-attachments.d.ts +17 -0
- package/dist/rpc-binary-attachments.d.ts.map +1 -0
- package/dist/rpc-binary-attachments.js +89 -0
- package/dist/rpc-binary-attachments.js.map +1 -0
- package/dist/server-credentials.d.ts.map +1 -1
- package/dist/server-credentials.js +6 -3
- package/dist/server-credentials.js.map +1 -1
- package/dist/service.d.ts +10 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +17 -1
- package/dist/service.js.map +1 -1
- package/dist/tui-command.js +7 -5
- package/dist/tui-command.js.map +1 -1
- package/dist/typert-gateway-switch.d.ts.map +1 -1
- package/dist/typert-gateway-switch.js +56 -4
- package/dist/typert-gateway-switch.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dsh-plugin.json +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Continue DeepSeek Harness sessions and experimental Codex workspaces from another device over an end-to-end encrypted connection.
|
|
4
4
|
|
|
5
|
-
[GitHub](https://github.com/blue-soda/ds-harness-remote) · [Full guide](https://github.com/blue-soda/ds-harness-remote#readme) · [中文说明](https://github.com/blue-soda/ds-harness-remote/blob/main/README.zh.md) · [
|
|
5
|
+
[GitHub](https://github.com/blue-soda/ds-harness-remote) · [Full guide](https://github.com/blue-soda/ds-harness-remote#readme) · [中文说明](https://github.com/blue-soda/ds-harness-remote/blob/main/README.zh.md) · [Releases](https://github.com/blue-soda/ds-harness-remote/releases) · [Android app](https://github.com/blue-soda/deepseek-harness-android-app/tree/master)
|
|
6
6
|
|
|
7
7
|
`ds-harness-remote` is the Remote Host and workspace plugin for DeepSeek Harness. Harness keeps running on your work computer with its existing workspaces, tools, and permission controls; Remote gives authorized devices another window into that environment.
|
|
8
8
|
|
|
9
9
|
> Install this package with `dsh plugin`, not `npm install`. The DSH command updates the selected profile and adds the required bundle configuration.
|
|
10
10
|
|
|
11
|
-
> **This is a fork** of [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) (MIT),
|
|
12
|
-
> published as [`@blue-soda/dsh-remote`](https://www.npmjs.com/package/@blue-soda/dsh-remote).
|
|
13
|
-
> The original project and its contributors are credited in [LICENSE](LICENSE) and `contributors`.
|
|
14
|
-
|
|
11
|
+
> **This is a fork** of [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) (MIT),
|
|
12
|
+
> published as [`@blue-soda/dsh-remote`](https://www.npmjs.com/package/@blue-soda/dsh-remote).
|
|
13
|
+
> The original project and its contributors are credited in [LICENSE](LICENSE) and `contributors`.
|
|
14
|
+
|
|
15
15
|
## Install
|
|
16
16
|
|
|
17
17
|
### DSH Desktop
|
|
@@ -23,7 +23,7 @@ Continue DeepSeek Harness sessions and experimental Codex workspaces from anothe
|
|
|
23
23
|
Add the current package version to the `web` profile, then restart Harness:
|
|
24
24
|
|
|
25
25
|
```sh
|
|
26
|
-
dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.
|
|
26
|
+
dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.29
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
### dsh-TUI Host
|
|
@@ -31,7 +31,7 @@ dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.28
|
|
|
31
31
|
Remote can also run as a Host in a terminal-only [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile:
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
dsh plugin --profile dsh-tui add -w @blue-soda/dsh-remote@0.4.
|
|
34
|
+
dsh plugin --profile dsh-tui add -w @blue-soda/dsh-remote@0.4.29
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote status`, and `/remote logout`.
|
|
@@ -48,7 +48,7 @@ After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote
|
|
|
48
48
|
|
|
49
49
|
## Compatibility
|
|
50
50
|
|
|
51
|
-
Plugin `0.4.
|
|
51
|
+
Plugin `0.4.29` targets DeepSeek Harness `dsh-v0.2.0-rc.2` and retains `dsh-v0.1.7-rc.1` compatibility; it also supports `dsh-v0.1.6-alpha.2` and earlier settings hosts. It supports:
|
|
52
52
|
|
|
53
53
|
- `dsh-v0.1.1-rc.2` through the official legacy `ApiProxy`;
|
|
54
54
|
- `dsh-v0.1.2-alpha.1` through `dsh-v0.1.2-rc.1` through the official Typert Remote Gateway;
|
|
@@ -58,7 +58,7 @@ The same package feature-detects the older settings registry and the `0.1.7-rc.1
|
|
|
58
58
|
|
|
59
59
|
## Self-hosted Server
|
|
60
60
|
|
|
61
|
-
This repository includes a
|
|
61
|
+
This repository includes a self-hosted, Relay-only Server in [`apps/server`](https://github.com/blue-soda/ds-harness-remote/tree/main/apps/server) that supports multiple accounts, with devices and tokens namespaced per account. `DSH_SERVER_ACCOUNT` and `DSH_SERVER_PASSWORD` configure a seed account; account creation is off by default and can be enabled with `DSH_SERVER_REGISTRATION_CODE`, or replaced by DeepSeek platform sign-in (`DSH_SERVER_DEEPSEEK_LOGIN=on`) or a QR provider (`DSH_SERVER_OAUTH_PROVIDER`). It provides account login, device credentials, encrypted Control/Noise forwarding, Relay, and a device-status page. It does not provide the complete site - Remote Web session UI or Admin - or WebRTC/TURN deployment.
|
|
62
62
|
|
|
63
63
|
## Security boundary
|
|
64
64
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ReplaceFileOptions {
|
|
2
|
+
/** Delay before each retry. Fewer entries than failures means the last error is thrown. */
|
|
3
|
+
delaysMs?: readonly number[];
|
|
4
|
+
}
|
|
5
|
+
export interface SweepOptions {
|
|
6
|
+
maxAgeMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
9
|
+
export declare function replaceFile(temporary: string, target: string, options?: ReplaceFileOptions): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
12
|
+
* the paths removed. Only names this module produces are considered, and only once they
|
|
13
|
+
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sweepStaleTemporaries(directory: string, options?: SweepOptions): Promise<string[]>;
|
|
16
|
+
//# sourceMappingURL=atomic-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-file.d.ts","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,kBAAkB;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,kFAAkF;AAClF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB5G"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readdir, rename, rm, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Atomic replacement of a state file, with the retry Windows needs.
|
|
5
|
+
*
|
|
6
|
+
* On Windows `rename` is `MoveFileEx(..., MOVEFILE_REPLACE_EXISTING)`, which fails with
|
|
7
|
+
* `EPERM` while another handle holds the *destination* without `FILE_SHARE_DELETE`. The
|
|
8
|
+
* holders are short-lived and outside this process: antivirus and indexer scans, Explorer
|
|
9
|
+
* previews, backup or sync agents, and a second process writing the same state directory.
|
|
10
|
+
* Node always opens with `FILE_SHARE_DELETE` itself, so this process cannot cause it, and
|
|
11
|
+
* the failure disappears on the next attempt - which is why `EPERM` here means "retry",
|
|
12
|
+
* not "permission denied", and why exclusions or packaging changes do not fix it.
|
|
13
|
+
*
|
|
14
|
+
* A retry only hides a second *writer*: two instances sharing one `DSH_HOME` still race on
|
|
15
|
+
* a read-modify-write, so keep parallel Hosts on separate `DSH_HOME` values (see the
|
|
16
|
+
* refresh lock in `server-credentials.ts` for the same rule applied to credentials).
|
|
17
|
+
*/
|
|
18
|
+
const TRANSIENT_REPLACE_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
19
|
+
const REPLACE_RETRY_DELAYS_MS = [20, 40, 80, 160, 320];
|
|
20
|
+
/** `<state file>.<pid>.<uuid v7>.tmp`, the temporary name every caller here creates. */
|
|
21
|
+
const TEMPORARY_NAME = /\.\d+\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.tmp$/iu;
|
|
22
|
+
/** A live write lasts milliseconds, so anything this old was abandoned by a crash. */
|
|
23
|
+
const STALE_TEMPORARY_AGE_MS = 10 * 60 * 1000;
|
|
24
|
+
/** Replace `target` with `temporary`, retrying the transient Windows failures. */
|
|
25
|
+
export async function replaceFile(temporary, target, options = {}) {
|
|
26
|
+
const delays = options.delaysMs ?? REPLACE_RETRY_DELAYS_MS;
|
|
27
|
+
for (let attempt = 0;; attempt += 1) {
|
|
28
|
+
try {
|
|
29
|
+
await rename(temporary, target);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const delay = delays[attempt];
|
|
34
|
+
if (delay === undefined || !TRANSIENT_REPLACE_CODES.has(errorCode(error) ?? ''))
|
|
35
|
+
throw error;
|
|
36
|
+
await sleep(delay);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Remove abandoned `*.tmp` files a crashed write left beside the state files, and return
|
|
42
|
+
* the paths removed. Only names this module produces are considered, and only once they
|
|
43
|
+
* are old enough that no live writer can own them, so a concurrent write is never deleted.
|
|
44
|
+
*/
|
|
45
|
+
export async function sweepStaleTemporaries(directory, options = {}) {
|
|
46
|
+
const maxAgeMs = options.maxAgeMs ?? STALE_TEMPORARY_AGE_MS;
|
|
47
|
+
const removed = [];
|
|
48
|
+
let entries;
|
|
49
|
+
try {
|
|
50
|
+
entries = await readdir(directory);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return removed;
|
|
54
|
+
}
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (!TEMPORARY_NAME.test(entry))
|
|
57
|
+
continue;
|
|
58
|
+
const path = join(directory, entry);
|
|
59
|
+
try {
|
|
60
|
+
const info = await stat(path);
|
|
61
|
+
if (!info.isFile() || Date.now() - info.mtimeMs < maxAgeMs)
|
|
62
|
+
continue;
|
|
63
|
+
await rm(path, { force: true });
|
|
64
|
+
removed.push(path);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Best effort: a file another process is removing is already gone.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return removed;
|
|
71
|
+
}
|
|
72
|
+
function errorCode(error) {
|
|
73
|
+
if (typeof error !== 'object' || error === null || !('code' in error))
|
|
74
|
+
return undefined;
|
|
75
|
+
const code = error.code;
|
|
76
|
+
return typeof code === 'string' ? code : undefined;
|
|
77
|
+
}
|
|
78
|
+
function sleep(ms) {
|
|
79
|
+
return new Promise(resolve => { setTimeout(resolve, ms); });
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=atomic-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-file.js","sourceRoot":"","sources":["../src/atomic-file.ts"],"names":[],"mappings":"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"}
|
package/dist/client-runtime.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { CodexAppFrameData, CodexAppStreamClosedData } from '@dsh-remote/pr
|
|
|
3
3
|
import { RemoteClientCore } from '@dsh-remote/client-core';
|
|
4
4
|
import { type RtcPeerConnectionFactory } from '@dsh-remote/webrtc';
|
|
5
5
|
import { type HarnessMode } from './api-proxy-switch.js';
|
|
6
|
+
import { ClientTargetStore } from './client-target-store.js';
|
|
6
7
|
import type { ResolvedConfig } from './config.js';
|
|
7
8
|
import { type HostWebServerLike } from './control-route.js';
|
|
8
9
|
import type { IdentityStore } from './identity-store.js';
|
|
@@ -101,6 +102,19 @@ export interface HostAuthorizationControl {
|
|
|
101
102
|
codexOpenStream?(input: unknown, publish: (event: 'codex.app.frame' | 'codex.app.stream.closed', data: CodexAppFrameData | CodexAppStreamClosedData) => Promise<void>, signal?: AbortSignal): Promise<unknown>;
|
|
102
103
|
codexCloseStream?(input: unknown): Promise<unknown>;
|
|
103
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Whether a proof of life failed to reach the peer.
|
|
107
|
+
*
|
|
108
|
+
* The check asks for an answer, not for success, so the two outcomes are told apart by where the
|
|
109
|
+
* error came from. An answer arrives as an error carrying the peer's own code (METHOD_NOT_FOUND,
|
|
110
|
+
* FEATURE_NOT_SUPPORTED, ...). A local failure is either one of the core's own codes above or a raw
|
|
111
|
+
* transport error with no code at all - a send that failed on a socket this process has not noticed
|
|
112
|
+
* is closed. Counting that second kind as liveness would make the whole check useless exactly when
|
|
113
|
+
* it matters.
|
|
114
|
+
* @param error - the error the check rejected with.
|
|
115
|
+
* @returns true when no answer arrived, so the transport must be treated as lost.
|
|
116
|
+
*/
|
|
117
|
+
export declare function livenessProbeLost(error: unknown): boolean;
|
|
104
118
|
export declare class ClientModeRuntime {
|
|
105
119
|
private readonly config;
|
|
106
120
|
private readonly identities;
|
|
@@ -108,6 +122,7 @@ export declare class ClientModeRuntime {
|
|
|
108
122
|
private readonly logger;
|
|
109
123
|
private readonly host?;
|
|
110
124
|
private readonly rtcFactoryProvider;
|
|
125
|
+
private readonly targetStore?;
|
|
111
126
|
private preview?;
|
|
112
127
|
private identity?;
|
|
113
128
|
private connected?;
|
|
@@ -128,14 +143,58 @@ export declare class ClientModeRuntime {
|
|
|
128
143
|
*/
|
|
129
144
|
private remoteReconnectRun;
|
|
130
145
|
private pendingWorkspaceSelection?;
|
|
146
|
+
/**
|
|
147
|
+
* Transport a running fast reconnect is replacing.
|
|
148
|
+
*
|
|
149
|
+
* The rebuild opens its own control connection and the Server closes the older one for the same
|
|
150
|
+
* device, so that close belongs to our own replacement. Reading it as a lost peer is what made the
|
|
151
|
+
* fast level escalate itself into the fallback before it could ever succeed.
|
|
152
|
+
*/
|
|
153
|
+
private supersededClient?;
|
|
154
|
+
/**
|
|
155
|
+
* True while a fast reconnect is rebuilding the link.
|
|
156
|
+
*
|
|
157
|
+
* The probe must not judge the link in the middle of its own replacement: the Server closes the
|
|
158
|
+
* older connection for the device, so a check that ran then would read our replacement's side effect
|
|
159
|
+
* as a second miss and escalate the level that is busy recovering. The rebuild's own outcome decides
|
|
160
|
+
* first; only once it has settled does the cadence resume judging.
|
|
161
|
+
*/
|
|
162
|
+
private fastRebuildInFlight;
|
|
163
|
+
/**
|
|
164
|
+
* The last workspace the user opened for a Host.
|
|
165
|
+
*
|
|
166
|
+
* Kept so a reconnect can republish it: re-selecting the workspace is what makes the native UI
|
|
167
|
+
* re-read its session list, and without it a list poisoned by the outage stays wrong even after
|
|
168
|
+
* the link is back.
|
|
169
|
+
*/
|
|
170
|
+
private lastWorkspaceSelection?;
|
|
131
171
|
private codexVirtual?;
|
|
132
172
|
private readonly proxySwitch?;
|
|
133
173
|
private readonly gatewaySwitch;
|
|
134
174
|
private readonly codexStreams;
|
|
135
175
|
private connectionProgress?;
|
|
136
176
|
private connectionProgressRun;
|
|
177
|
+
/**
|
|
178
|
+
* Host a boot is trying to restore, reported to the UI while the retry loop runs.
|
|
179
|
+
*
|
|
180
|
+
* Nothing is connected yet, so without this the window would show the local shell while the
|
|
181
|
+
* user is still looking at the remote workspace they left.
|
|
182
|
+
*/
|
|
183
|
+
/**
|
|
184
|
+
* Recovery in progress, and which kind.
|
|
185
|
+
*
|
|
186
|
+
* `restore` is a start that is reconnecting to the recorded target, `fast` keeps the session on
|
|
187
|
+
* screen while its link is rebuilt, and `fallback` is the last resort that returns the user to
|
|
188
|
+
* the local shell. The UI shows all three, so a reconnect is never invisible, and the retry loop
|
|
189
|
+
* stops as soon as the user asks for local.
|
|
190
|
+
*/
|
|
191
|
+
private reconnecting?;
|
|
192
|
+
/** Periodic proof of life for the live remote session; absent while nothing is connected. */
|
|
193
|
+
private livenessTimer?;
|
|
194
|
+
private livenessInFlight;
|
|
195
|
+
private livenessFailures;
|
|
137
196
|
private closed;
|
|
138
|
-
constructor(config: ResolvedConfig, identities: IdentityStore, server: ClientServerApi, apiProxy: ApiProxy | undefined, typertGateway: TypertGatewayLike, logger: SafeLogger, host?: HostAuthorizationControl | undefined, rtcFactoryProvider?: (options?: WeriftFactoryOptions) => Promise<RtcPeerConnectionFactory | undefined
|
|
197
|
+
constructor(config: ResolvedConfig, identities: IdentityStore, server: ClientServerApi, apiProxy: ApiProxy | undefined, typertGateway: TypertGatewayLike, logger: SafeLogger, host?: HostAuthorizationControl | undefined, rtcFactoryProvider?: (options?: WeriftFactoryOptions) => Promise<RtcPeerConnectionFactory | undefined>, targetStore?: ClientTargetStore | undefined);
|
|
139
198
|
start(): Promise<void>;
|
|
140
199
|
/**
|
|
141
200
|
* Whether this installation already holds stored Server credentials for its
|
|
@@ -182,6 +241,64 @@ export declare class ClientModeRuntime {
|
|
|
182
241
|
clearClientAuthorization(): Promise<void>;
|
|
183
242
|
setHostAuthorization(enabled: boolean): Promise<unknown>;
|
|
184
243
|
setMode(mode: HarnessMode, targetDeviceId?: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
244
|
+
/**
|
|
245
|
+
* Prove the live remote link still answers, and act on the result.
|
|
246
|
+
*
|
|
247
|
+
* Only a missing answer counts as loss: the peer's own error (a refusal, an unknown method) came
|
|
248
|
+
* back over the same link and therefore proves it is there.
|
|
249
|
+
*
|
|
250
|
+
* The two recovery levels differ in what the user keeps. The first miss rebuilds the link in
|
|
251
|
+
* place, so the session, its workspace selection and the remote carriers all stay; the second
|
|
252
|
+
* gives up and returns to the local shell.
|
|
253
|
+
*/
|
|
254
|
+
private verifyRemoteLiveness;
|
|
255
|
+
/**
|
|
256
|
+
* Rebuild the link while the session stays on screen.
|
|
257
|
+
*
|
|
258
|
+
* This is what separates the two recovery levels: nothing is handed back to the local shell, so a
|
|
259
|
+
* link that recovers does not cost the user the view they were working in.
|
|
260
|
+
* @param targetDeviceId - the Host to rebuild the link to.
|
|
261
|
+
*/
|
|
262
|
+
private enterFastReconnect;
|
|
263
|
+
/**
|
|
264
|
+
* Build a new transport for the session already on screen.
|
|
265
|
+
*
|
|
266
|
+
* The carriers hold the previous client, so they are rebound to the new one before the old client
|
|
267
|
+
* is closed; leaving it open would keep pointing remote calls at a dead transport.
|
|
268
|
+
* @param targetDeviceId - the Host to reconnect to.
|
|
269
|
+
* @returns true when a new session is in place.
|
|
270
|
+
*/
|
|
271
|
+
private reestablish;
|
|
272
|
+
private rememberWorkspaceSelection;
|
|
273
|
+
/**
|
|
274
|
+
* Republish the workspace selection so the native UI re-reads its remote session list.
|
|
275
|
+
*
|
|
276
|
+
* The client half consumes status.workspaceSelection and reconnects that workspace; that refresh is
|
|
277
|
+
* what replaces a list the outage had filled with local answers.
|
|
278
|
+
* @param targetDeviceId - the Host the reconnect finished against.
|
|
279
|
+
*/
|
|
280
|
+
private restoreWorkspaceSelection;
|
|
281
|
+
private finishReconnect;
|
|
282
|
+
/**
|
|
283
|
+
* Check the live session now, outside the cadence.
|
|
284
|
+
*
|
|
285
|
+
* Used when the page becomes visible again, which is when a suspended client is most likely to be
|
|
286
|
+
* holding a link that already ended.
|
|
287
|
+
* @returns the status after the check.
|
|
288
|
+
*/
|
|
289
|
+
verifyRemoteConnection(): Promise<Record<string, unknown>>;
|
|
290
|
+
private armLivenessWatch;
|
|
291
|
+
private stopLivenessWatch;
|
|
292
|
+
/**
|
|
293
|
+
* Shared cleanup for a session whose transport is gone.
|
|
294
|
+
*
|
|
295
|
+
* A close event and an exhausted liveness check must leave exactly the same state behind, so both
|
|
296
|
+
* paths run this. The session is gone for good here, which is why the phase becomes 'fallback' and
|
|
297
|
+
* the retry loop keeps the UI saying that it is reconnecting.
|
|
298
|
+
* @param client - the client that was connected.
|
|
299
|
+
* @param targetDeviceId - the Host it was bound to.
|
|
300
|
+
*/
|
|
301
|
+
private handleRemoteTransportLost;
|
|
185
302
|
/**
|
|
186
303
|
* Re-establish a remote session whose transport closed.
|
|
187
304
|
*
|
|
@@ -193,6 +310,25 @@ export declare class ClientModeRuntime {
|
|
|
193
310
|
* @param targetDeviceId - the Host the dropped session was bound to.
|
|
194
311
|
*/
|
|
195
312
|
private reconnectRemoteSession;
|
|
313
|
+
/**
|
|
314
|
+
* Persist the target a later boot may have to restore.
|
|
315
|
+
*
|
|
316
|
+
* A failure here must not fail a connect: the only cost is that a killed process comes back to
|
|
317
|
+
* the local shell, which is where it would have been without this record.
|
|
318
|
+
* @param target - the target to record.
|
|
319
|
+
*/
|
|
320
|
+
private rememberTarget;
|
|
321
|
+
/**
|
|
322
|
+
* Reconnect to the target this device was last using, with the usual backoff.
|
|
323
|
+
*
|
|
324
|
+
* A resumed app can miss the transport close entirely - Android may reclaim the process - so
|
|
325
|
+
* nothing would start the retry loop and the user would face a local shell behind a remote
|
|
326
|
+
* workspace view. Restoring the recorded target gives that case the same loop a dropped
|
|
327
|
+
* transport gets. A target recorded for another Server is left alone: it is not reachable
|
|
328
|
+
* through the configured one.
|
|
329
|
+
* @returns true when a retry loop was started.
|
|
330
|
+
*/
|
|
331
|
+
restoreLastTarget(): Promise<boolean>;
|
|
196
332
|
listRemoteDirectory(targetDeviceId: string, path?: string, signal?: AbortSignal): Promise<RemoteDirectoryListing>;
|
|
197
333
|
listRemoteWorkspaces(targetDeviceId: string, signal?: AbortSignal): Promise<RemoteWorkspaceView[]>;
|
|
198
334
|
openRemoteWorkspace(targetDeviceId: string, path: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"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"}
|