ugly-app 0.1.683 → 0.1.685
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/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/native/index.d.ts +1 -1
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +1 -1
- package/dist/native/index.js.map +1 -1
- package/dist/native/proxy.d.ts +17 -1
- package/dist/native/proxy.d.ts.map +1 -1
- package/dist/native/proxy.js +29 -1
- package/dist/native/proxy.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/native/index.ts +1 -1
- package/src/native/proxy.ts +38 -2
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.685";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/dist/native/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type { TerminalFacade } from './facades/terminal.js';
|
|
|
17
17
|
export { MCP_CATALOG } from './mcp-catalog.js';
|
|
18
18
|
export { createProxyClient, nativeSigner } from './proxyClient.js';
|
|
19
19
|
export type { ProxyClient, ProxyClientOpts, ProxySocket, HostInfo, RTCFactory, } from './proxyClient.js';
|
|
20
|
-
export { isDesktopChannel, withProxy, enableUglyProxy, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
20
|
+
export { isDesktopChannel, withProxy, enableUglyProxy, installProxyClient, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
21
21
|
export type { WithProxyOpts } from './proxy.js';
|
|
22
22
|
export { fpTag, verifyFpTag, parseFingerprint, mskSigner } from './proxyCrypto.js';
|
|
23
23
|
export type { ProxyRole, ProxySigner } from './proxyCrypto.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvI,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/native/index.js
CHANGED
|
@@ -6,6 +6,6 @@ export { native, permissions, nativePlatform, isNativeAvailable } from './wrappe
|
|
|
6
6
|
export { MCP_CATALOG } from './mcp-catalog.js';
|
|
7
7
|
// ── Ugly Proxy (remote UglyNative over WebRTC) ──
|
|
8
8
|
export { createProxyClient, nativeSigner } from './proxyClient.js';
|
|
9
|
-
export { isDesktopChannel, withProxy, enableUglyProxy, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
9
|
+
export { isDesktopChannel, withProxy, enableUglyProxy, installProxyClient, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
10
10
|
export { fpTag, verifyFpTag, parseFingerprint, mskSigner } from './proxyCrypto.js';
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAStF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,mDAAmD;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQnE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAStF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,mDAAmD;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQnE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvI,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/native/proxy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { UglyNative } from './protocol.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type ProxyClient, type ProxySocket, type RTCFactory } from './proxyClient.js';
|
|
3
3
|
/** Namespaces that require a desktop host (RCE-grade / filesystem / long-running tasks). */
|
|
4
4
|
export declare const DESKTOP_NAMESPACES: ReadonlySet<string>;
|
|
5
5
|
export declare function isDesktopChannel(channel: string): boolean;
|
|
@@ -31,6 +31,22 @@ export declare function enableUglyProxy(opts: {
|
|
|
31
31
|
native: UglyNative;
|
|
32
32
|
client: ProxyClient;
|
|
33
33
|
}): UglyNative;
|
|
34
|
+
/**
|
|
35
|
+
* One-call client bootstrap: build the WebRTC proxy client (signer = the native keychain
|
|
36
|
+
* channel, events fed back to the subscribe bus) and return an UglyNative that lazily
|
|
37
|
+
* connects + proxies desktop capabilities. Mobile/web shells call this once at startup and
|
|
38
|
+
* assign the result to `globalThis.UglyNative`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function installProxyClient(opts: {
|
|
41
|
+
native: UglyNative;
|
|
42
|
+
socket: ProxySocket;
|
|
43
|
+
selfDeviceId: string;
|
|
44
|
+
iceServers?: RTCIceServer[];
|
|
45
|
+
rtcFactory?: RTCFactory;
|
|
46
|
+
win?: {
|
|
47
|
+
dispatchEvent(e: unknown): boolean;
|
|
48
|
+
};
|
|
49
|
+
}): UglyNative;
|
|
34
50
|
/** Dispatch a proxy event onto the same 'uglyNative' CustomEvent bus base.subscribe reads. */
|
|
35
51
|
export declare function dispatchNativeEvent(win: {
|
|
36
52
|
dispatchEvent(e: unknown): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAmC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvI,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAYjD,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,+EAA+E;IAC/E,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,UAAU,CAc3E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB,GAAG,UAAU,CAmEb;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE;QAAE,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,CAAC;CAC9C,GAAG,UAAU,CAWb;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,EAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,IAAI,CAON"}
|
package/dist/native/proxy.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NativeUnavailableError } from './protocol.js';
|
|
2
|
+
import { createProxyClient, nativeSigner } from './proxyClient.js';
|
|
2
3
|
/** Namespaces that require a desktop host (RCE-grade / filesystem / long-running tasks). */
|
|
3
4
|
export const DESKTOP_NAMESPACES = new Set([
|
|
4
5
|
'fs',
|
|
@@ -49,6 +50,7 @@ export function enableUglyProxy(opts) {
|
|
|
49
50
|
const { native, client } = opts;
|
|
50
51
|
let connecting = null;
|
|
51
52
|
let lastLabel;
|
|
53
|
+
let forceRepick = false;
|
|
52
54
|
const setStatus = (state, hostLabel) => {
|
|
53
55
|
void native.invoke('proxy.setStatus', { state, hostLabel }).catch(() => { });
|
|
54
56
|
};
|
|
@@ -59,7 +61,7 @@ export function enableUglyProxy(opts) {
|
|
|
59
61
|
return connecting;
|
|
60
62
|
connecting = (async () => {
|
|
61
63
|
try {
|
|
62
|
-
const existing = client.hostDeviceId();
|
|
64
|
+
const existing = forceRepick ? null : client.hostDeviceId();
|
|
63
65
|
if (existing) {
|
|
64
66
|
// Silent reconnect to the previously chosen host.
|
|
65
67
|
setStatus('reconnecting', lastLabel);
|
|
@@ -67,6 +69,7 @@ export function enableUglyProxy(opts) {
|
|
|
67
69
|
setStatus('connected', lastLabel);
|
|
68
70
|
return true;
|
|
69
71
|
}
|
|
72
|
+
forceRepick = false;
|
|
70
73
|
setStatus('connecting');
|
|
71
74
|
const hosts = await client.listHosts();
|
|
72
75
|
const picked = (await native.invoke('proxy.pickHost', {
|
|
@@ -91,6 +94,13 @@ export function enableUglyProxy(opts) {
|
|
|
91
94
|
})();
|
|
92
95
|
return connecting;
|
|
93
96
|
}
|
|
97
|
+
// The native drawer's "switch desktop" pill emits this — drop the current host and
|
|
98
|
+
// re-run the picker.
|
|
99
|
+
native.subscribe('proxy:switch', (() => {
|
|
100
|
+
forceRepick = true;
|
|
101
|
+
client.close();
|
|
102
|
+
void ensureConnected();
|
|
103
|
+
}));
|
|
94
104
|
return {
|
|
95
105
|
platform: native.platform,
|
|
96
106
|
subscribe: native.subscribe,
|
|
@@ -111,6 +121,24 @@ export function enableUglyProxy(opts) {
|
|
|
111
121
|
}),
|
|
112
122
|
};
|
|
113
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* One-call client bootstrap: build the WebRTC proxy client (signer = the native keychain
|
|
126
|
+
* channel, events fed back to the subscribe bus) and return an UglyNative that lazily
|
|
127
|
+
* connects + proxies desktop capabilities. Mobile/web shells call this once at startup and
|
|
128
|
+
* assign the result to `globalThis.UglyNative`.
|
|
129
|
+
*/
|
|
130
|
+
export function installProxyClient(opts) {
|
|
131
|
+
const win = opts.win ?? globalThis;
|
|
132
|
+
const client = createProxyClient({
|
|
133
|
+
socket: opts.socket,
|
|
134
|
+
selfDeviceId: opts.selfDeviceId,
|
|
135
|
+
signer: nativeSigner(opts.native),
|
|
136
|
+
iceServers: opts.iceServers,
|
|
137
|
+
rtcFactory: opts.rtcFactory,
|
|
138
|
+
onEvent: (event, data) => dispatchNativeEvent(win, event, data),
|
|
139
|
+
});
|
|
140
|
+
return enableUglyProxy({ native: opts.native, client });
|
|
141
|
+
}
|
|
114
142
|
/** Dispatch a proxy event onto the same 'uglyNative' CustomEvent bus base.subscribe reads. */
|
|
115
143
|
export function dispatchNativeEvent(win, event, data) {
|
|
116
144
|
const detail = { event, data };
|
package/dist/native/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.685",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.685";
|
package/src/native/index.ts
CHANGED
|
@@ -58,7 +58,7 @@ export type {
|
|
|
58
58
|
HostInfo,
|
|
59
59
|
RTCFactory,
|
|
60
60
|
} from './proxyClient.js';
|
|
61
|
-
export { isDesktopChannel, withProxy, enableUglyProxy, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
61
|
+
export { isDesktopChannel, withProxy, enableUglyProxy, installProxyClient, dispatchNativeEvent, DESKTOP_NAMESPACES } from './proxy.js';
|
|
62
62
|
export type { WithProxyOpts } from './proxy.js';
|
|
63
63
|
export { fpTag, verifyFpTag, parseFingerprint, mskSigner } from './proxyCrypto.js';
|
|
64
64
|
export type { ProxyRole, ProxySigner } from './proxyCrypto.js';
|
package/src/native/proxy.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// base UglyNative with `withProxy(...)`; the core install.ts is untouched.
|
|
6
6
|
import type { UglyNative } from './protocol.js';
|
|
7
7
|
import { NativeUnavailableError } from './protocol.js';
|
|
8
|
-
import type
|
|
8
|
+
import { createProxyClient, nativeSigner, type ProxyClient, type ProxySocket, type HostInfo, type RTCFactory } from './proxyClient.js';
|
|
9
9
|
|
|
10
10
|
/** Namespaces that require a desktop host (RCE-grade / filesystem / long-running tasks). */
|
|
11
11
|
export const DESKTOP_NAMESPACES: ReadonlySet<string> = new Set([
|
|
@@ -74,6 +74,7 @@ export function enableUglyProxy(opts: {
|
|
|
74
74
|
const { native, client } = opts;
|
|
75
75
|
let connecting: Promise<boolean> | null = null;
|
|
76
76
|
let lastLabel: string | undefined;
|
|
77
|
+
let forceRepick = false;
|
|
77
78
|
|
|
78
79
|
const setStatus = (state: string, hostLabel?: string): void => {
|
|
79
80
|
void native.invoke('proxy.setStatus' as never, { state, hostLabel } as never).catch(() => {});
|
|
@@ -84,7 +85,7 @@ export function enableUglyProxy(opts: {
|
|
|
84
85
|
if (connecting) return connecting;
|
|
85
86
|
connecting = (async () => {
|
|
86
87
|
try {
|
|
87
|
-
const existing = client.hostDeviceId();
|
|
88
|
+
const existing = forceRepick ? null : client.hostDeviceId();
|
|
88
89
|
if (existing) {
|
|
89
90
|
// Silent reconnect to the previously chosen host.
|
|
90
91
|
setStatus('reconnecting', lastLabel);
|
|
@@ -92,6 +93,7 @@ export function enableUglyProxy(opts: {
|
|
|
92
93
|
setStatus('connected', lastLabel);
|
|
93
94
|
return true;
|
|
94
95
|
}
|
|
96
|
+
forceRepick = false;
|
|
95
97
|
setStatus('connecting');
|
|
96
98
|
const hosts = await client.listHosts();
|
|
97
99
|
const picked = (await native.invoke('proxy.pickHost' as never, {
|
|
@@ -112,6 +114,14 @@ export function enableUglyProxy(opts: {
|
|
|
112
114
|
return connecting;
|
|
113
115
|
}
|
|
114
116
|
|
|
117
|
+
// The native drawer's "switch desktop" pill emits this — drop the current host and
|
|
118
|
+
// re-run the picker.
|
|
119
|
+
native.subscribe('proxy:switch' as never, (() => {
|
|
120
|
+
forceRepick = true;
|
|
121
|
+
client.close();
|
|
122
|
+
void ensureConnected();
|
|
123
|
+
}) as never);
|
|
124
|
+
|
|
115
125
|
return {
|
|
116
126
|
platform: native.platform,
|
|
117
127
|
subscribe: native.subscribe,
|
|
@@ -129,6 +139,32 @@ export function enableUglyProxy(opts: {
|
|
|
129
139
|
};
|
|
130
140
|
}
|
|
131
141
|
|
|
142
|
+
/**
|
|
143
|
+
* One-call client bootstrap: build the WebRTC proxy client (signer = the native keychain
|
|
144
|
+
* channel, events fed back to the subscribe bus) and return an UglyNative that lazily
|
|
145
|
+
* connects + proxies desktop capabilities. Mobile/web shells call this once at startup and
|
|
146
|
+
* assign the result to `globalThis.UglyNative`.
|
|
147
|
+
*/
|
|
148
|
+
export function installProxyClient(opts: {
|
|
149
|
+
native: UglyNative;
|
|
150
|
+
socket: ProxySocket;
|
|
151
|
+
selfDeviceId: string;
|
|
152
|
+
iceServers?: RTCIceServer[];
|
|
153
|
+
rtcFactory?: RTCFactory;
|
|
154
|
+
win?: { dispatchEvent(e: unknown): boolean };
|
|
155
|
+
}): UglyNative {
|
|
156
|
+
const win = opts.win ?? (globalThis as unknown as { dispatchEvent(e: unknown): boolean });
|
|
157
|
+
const client = createProxyClient({
|
|
158
|
+
socket: opts.socket,
|
|
159
|
+
selfDeviceId: opts.selfDeviceId,
|
|
160
|
+
signer: nativeSigner(opts.native),
|
|
161
|
+
iceServers: opts.iceServers,
|
|
162
|
+
rtcFactory: opts.rtcFactory,
|
|
163
|
+
onEvent: (event, data) => dispatchNativeEvent(win, event, data),
|
|
164
|
+
});
|
|
165
|
+
return enableUglyProxy({ native: opts.native, client });
|
|
166
|
+
}
|
|
167
|
+
|
|
132
168
|
/** Dispatch a proxy event onto the same 'uglyNative' CustomEvent bus base.subscribe reads. */
|
|
133
169
|
export function dispatchNativeEvent(
|
|
134
170
|
win: { dispatchEvent(e: unknown): boolean },
|