ugly-app 0.1.675 → 0.1.677

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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.675";
1
+ export declare const CLI_VERSION = "0.1.677";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.675";
2
+ export const CLI_VERSION = "0.1.677";
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,27 @@
1
+ import type { UglyNative } from './protocol.js';
2
+ import type { ProxyClient } from './proxyClient.js';
3
+ /** Namespaces that require a desktop host (RCE-grade / filesystem / long-running tasks). */
4
+ export declare const DESKTOP_NAMESPACES: ReadonlySet<string>;
5
+ export declare function isDesktopChannel(channel: string): boolean;
6
+ export interface WithProxyOpts {
7
+ client: ProxyClient;
8
+ /**
9
+ * Whether a given channel should tunnel to the host. Default: desktop-cap channels go
10
+ * to the proxy when it's connected. On a real desktop (full local impl) pass a predicate
11
+ * that returns false so everything stays local.
12
+ */
13
+ shouldProxy?: (channel: string) => boolean;
14
+ /** True on platforms with no local desktop-cap implementation (mobile/web). */
15
+ desktopCapsAreRemoteOnly?: boolean;
16
+ }
17
+ /**
18
+ * Wrap a base UglyNative so desktop-capability calls route through the proxy. Events from
19
+ * the host must be fed back into the base event bus by wiring the proxy client's `onEvent`
20
+ * to a `dispatchNativeEvent` (below) — then `base.subscribe` delivers them unchanged.
21
+ */
22
+ export declare function withProxy(base: UglyNative, opts: WithProxyOpts): UglyNative;
23
+ /** Dispatch a proxy event onto the same 'uglyNative' CustomEvent bus base.subscribe reads. */
24
+ export declare function dispatchNativeEvent(win: {
25
+ dispatchEvent(e: unknown): boolean;
26
+ }, event: string, data: unknown): void;
27
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +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,EAAE,MAAM,kBAAkB,CAAC;AAEpD,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,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"}
@@ -0,0 +1,49 @@
1
+ import { NativeUnavailableError } from './protocol.js';
2
+ /** Namespaces that require a desktop host (RCE-grade / filesystem / long-running tasks). */
3
+ export const DESKTOP_NAMESPACES = new Set([
4
+ 'fs',
5
+ 'process',
6
+ 'net',
7
+ 'serve',
8
+ 'workers',
9
+ 'terminal',
10
+ 'sandbox',
11
+ 'mcp',
12
+ 'secrets',
13
+ 'browse',
14
+ 'task',
15
+ ]);
16
+ export function isDesktopChannel(channel) {
17
+ const ns = channel.includes('.') ? channel.slice(0, channel.indexOf('.')) : channel;
18
+ return DESKTOP_NAMESPACES.has(ns);
19
+ }
20
+ /**
21
+ * Wrap a base UglyNative so desktop-capability calls route through the proxy. Events from
22
+ * the host must be fed back into the base event bus by wiring the proxy client's `onEvent`
23
+ * to a `dispatchNativeEvent` (below) — then `base.subscribe` delivers them unchanged.
24
+ */
25
+ export function withProxy(base, opts) {
26
+ const shouldProxy = opts.shouldProxy ?? ((ch) => isDesktopChannel(ch) && opts.client.isOpen());
27
+ return {
28
+ platform: base.platform,
29
+ invoke: ((channel, payload) => {
30
+ if (shouldProxy(channel))
31
+ return opts.client.invoke(channel, payload);
32
+ if (opts.desktopCapsAreRemoteOnly && isDesktopChannel(channel)) {
33
+ // No host selected and no local impl — surface a clear, actionable error.
34
+ return Promise.reject(new NativeUnavailableError(channel));
35
+ }
36
+ return base.invoke(channel, payload);
37
+ }),
38
+ subscribe: base.subscribe,
39
+ };
40
+ }
41
+ /** Dispatch a proxy event onto the same 'uglyNative' CustomEvent bus base.subscribe reads. */
42
+ export function dispatchNativeEvent(win, event, data) {
43
+ const detail = { event, data };
44
+ const ev = typeof CustomEvent === 'function'
45
+ ? new CustomEvent('uglyNative', { detail })
46
+ : { type: 'uglyNative', detail };
47
+ win.dispatchEvent(ev);
48
+ }
49
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/native/proxy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAGvD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,IAAI;IACJ,SAAS;IACT,KAAK;IACL,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,KAAK;IACL,SAAS;IACT,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpF,OAAO,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,IAAmB;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvG,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,CAAC,CAAC,OAAe,EAAE,OAAgB,EAAE,EAAE;YAC7C,IAAI,WAAW,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,wBAAwB,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/D,0EAA0E;gBAC1E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAgB,EAAE,OAAgB,CAAC,CAAC;QACzD,CAAC,CAAyB;QAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,mBAAmB,CACjC,GAA2C,EAC3C,KAAa,EACb,IAAa;IAEb,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/B,MAAM,EAAE,GACN,OAAO,WAAW,KAAK,UAAU;QAC/B,CAAC,CAAC,IAAI,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC;QAC3C,CAAC,CAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAuB,CAAC;IAC3D,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type ProxySigner } from './proxyCrypto.js';
2
+ /** Subset of ugly-app's client Socket the proxy needs (emit/on are runtime-generic). */
3
+ export interface ProxySocket {
4
+ emit(type: string, data: object): void;
5
+ on(event: string, handler: (data: unknown) => void): () => void;
6
+ /** Request/response (used for presence:query). */
7
+ send?(type: string, data: object, timeout?: number): Promise<unknown>;
8
+ }
9
+ export type RTCFactory = (config: RTCConfiguration) => RTCPeerConnection;
10
+ export interface HostInfo {
11
+ deviceId: string;
12
+ label: string;
13
+ isHost: boolean;
14
+ lastSeen: number;
15
+ }
16
+ export interface ProxyClientOpts {
17
+ socket: ProxySocket;
18
+ /** This device's id (so listHosts can exclude self). */
19
+ selfDeviceId: string;
20
+ /** When set, sign our offer fingerprint + verify the host's answer fingerprint. */
21
+ signer?: ProxySigner;
22
+ iceServers?: RTCIceServer[];
23
+ rtcFactory?: RTCFactory;
24
+ /** evt frames from the host (UglyNative subscribe events, task deltas) land here. */
25
+ onEvent?: (event: string, data: unknown) => void;
26
+ requestTimeoutMs?: number;
27
+ openTimeoutMs?: number;
28
+ }
29
+ export interface ProxyClient {
30
+ /** Query the worker for this user's online desktop hosts. */
31
+ listHosts(): Promise<HostInfo[]>;
32
+ /** Establish (or re-establish) the DataChannel to a host. Resolves when open. */
33
+ connect(hostDeviceId: string): Promise<void>;
34
+ /** Tunnel one UglyNative invoke over the DataChannel. */
35
+ invoke(channel: string, payload: unknown): Promise<unknown>;
36
+ isOpen(): boolean;
37
+ hostDeviceId(): string | null;
38
+ close(): void;
39
+ }
40
+ export declare function createProxyClient(opts: ProxyClientOpts): ProxyClient;
41
+ //# sourceMappingURL=proxyClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyClient.d.ts","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChE,kDAAkD;IAClD,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,iBAAiB,CAAC;AAEzE,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,iFAAiF;IACjF,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,yDAAyD;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAC;IAClB,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAsHpE"}
@@ -0,0 +1,145 @@
1
+ // Client side of the Ugly Proxy: from a phone/web (or a desktop acting as a client), open
2
+ // a WebRTC DataChannel to a chosen desktop host and tunnel UglyNative calls over it (the
3
+ // "dumb pipe"). Signaling rides the app Socket's rtc:* messages; DTLS gives e2e transport
4
+ // encryption; the MSK-bound fingerprint check (proxyCrypto) authenticates the host.
5
+ // RTCPeerConnection + Socket are injectable so the framing/correlation is unit-testable.
6
+ import { parseFingerprint } from './proxyCrypto.js';
7
+ function rec(d) {
8
+ return (d ?? {});
9
+ }
10
+ export function createProxyClient(opts) {
11
+ const rtcFactory = opts.rtcFactory ?? ((cfg) => new RTCPeerConnection(cfg));
12
+ const reqTimeout = opts.requestTimeoutMs ?? 30_000;
13
+ const openTimeout = opts.openTimeoutMs ?? 15_000;
14
+ let pc = null;
15
+ let dc = null;
16
+ let host = null;
17
+ let seq = 0;
18
+ const pending = new Map();
19
+ const offs = [];
20
+ function cleanup() {
21
+ for (const off of offs) {
22
+ try {
23
+ off();
24
+ }
25
+ catch { /* noop */ }
26
+ }
27
+ offs.length = 0;
28
+ for (const p of pending.values()) {
29
+ if (p.timer)
30
+ clearTimeout(p.timer);
31
+ p.reject(new Error('proxy connection closed'));
32
+ }
33
+ pending.clear();
34
+ try {
35
+ dc?.close();
36
+ }
37
+ catch { /* noop */ }
38
+ try {
39
+ pc?.close();
40
+ }
41
+ catch { /* noop */ }
42
+ dc = null;
43
+ pc = null;
44
+ }
45
+ function onDcMessage(raw) {
46
+ let f;
47
+ try {
48
+ f = JSON.parse(typeof raw === 'string' ? raw : new TextDecoder().decode(raw));
49
+ }
50
+ catch {
51
+ return;
52
+ }
53
+ if (f.t === 'res' && f.id !== undefined) {
54
+ const p = pending.get(f.id);
55
+ if (!p)
56
+ return;
57
+ pending.delete(f.id);
58
+ if (p.timer)
59
+ clearTimeout(p.timer);
60
+ if (f.ok)
61
+ p.resolve(f.result);
62
+ else
63
+ p.reject(new Error(f.error ?? 'proxy error'));
64
+ }
65
+ else if (f.t === 'evt' && f.event) {
66
+ opts.onEvent?.(f.event, f.data);
67
+ }
68
+ }
69
+ async function listHosts() {
70
+ if (!opts.socket.send)
71
+ throw new Error('socket lacks request support for presence:query');
72
+ const res = rec(await opts.socket.send('presence:query', {}));
73
+ const devices = res['devices'] ?? [];
74
+ return devices.filter((d) => d.isHost && d.deviceId !== opts.selfDeviceId);
75
+ }
76
+ async function connect(hostDeviceId) {
77
+ cleanup();
78
+ host = hostDeviceId;
79
+ const conn = rtcFactory({ iceServers: opts.iceServers ?? [] });
80
+ pc = conn;
81
+ const channel = conn.createDataChannel('proxy');
82
+ dc = channel;
83
+ conn.onicecandidate = (e) => {
84
+ if (e.candidate)
85
+ opts.socket.emit('rtc:ice', { to: hostDeviceId, candidate: e.candidate.toJSON() });
86
+ };
87
+ channel.onmessage = (e) => onDcMessage(e.data);
88
+ offs.push(opts.socket.on('rtc:answer', (d) => { void onAnswer(rec(d)); }));
89
+ offs.push(opts.socket.on('rtc:ice', (d) => { void onRemoteIce(rec(d)); }));
90
+ offs.push(opts.socket.on('rtc:error', (d) => { if (rec(d)['from'] === host)
91
+ cleanup(); }));
92
+ const opened = new Promise((resolve, reject) => {
93
+ const timer = setTimeout(() => reject(new Error('proxy DataChannel open timeout')), openTimeout);
94
+ channel.onopen = () => { clearTimeout(timer); resolve(); };
95
+ });
96
+ const offer = await conn.createOffer();
97
+ await conn.setLocalDescription(offer);
98
+ const sdp = conn.localDescription?.sdp ?? offer.sdp ?? '';
99
+ const tag = opts.signer ? await opts.signer.sign('client', parseFingerprint(sdp) ?? '') : undefined;
100
+ opts.socket.emit('rtc:offer', { to: hostDeviceId, sdp, fpTag: tag });
101
+ await opened;
102
+ }
103
+ async function onAnswer(d) {
104
+ if (!pc || d['from'] !== host)
105
+ return;
106
+ const sdp = String(d['sdp'] ?? '');
107
+ if (opts.signer) {
108
+ const ok = await opts.signer.verify('host', parseFingerprint(sdp) ?? '', String(d['fpTag'] ?? ''));
109
+ if (!ok) {
110
+ cleanup();
111
+ return;
112
+ }
113
+ }
114
+ await pc.setRemoteDescription({ type: 'answer', sdp });
115
+ }
116
+ async function onRemoteIce(d) {
117
+ if (!pc || d['from'] !== host)
118
+ return;
119
+ try {
120
+ await pc.addIceCandidate(d['candidate']);
121
+ }
122
+ catch { /* benign */ }
123
+ }
124
+ function invoke(channel, payload) {
125
+ if (!dc || dc.readyState !== 'open')
126
+ return Promise.reject(new Error('proxy not connected'));
127
+ const id = String(seq++);
128
+ return new Promise((resolve, reject) => {
129
+ const timer = reqTimeout > 0
130
+ ? setTimeout(() => { pending.delete(id); reject(new Error(`proxy invoke timed out: ${channel}`)); }, reqTimeout)
131
+ : null;
132
+ pending.set(id, { resolve, reject, timer });
133
+ dc.send(JSON.stringify({ t: 'req', id, channel, payload }));
134
+ });
135
+ }
136
+ return {
137
+ listHosts,
138
+ connect,
139
+ invoke,
140
+ isOpen: () => dc?.readyState === 'open',
141
+ hostDeviceId: () => host,
142
+ close: cleanup,
143
+ };
144
+ }
145
+ //# sourceMappingURL=proxyClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyClient.js","sourceRoot":"","sources":["../../src/native/proxyClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type ProxyRole = 'client' | 'host';
2
+ /** Extract + normalize the DTLS fingerprint from an SDP blob ("sha-256 AB:CD:.."). */
3
+ export declare function parseFingerprint(sdp: string): string | null;
4
+ export declare function fpTag(msk: Uint8Array, role: ProxyRole, fingerprint: string): Promise<string>;
5
+ export declare function verifyFpTag(msk: Uint8Array, role: ProxyRole, fingerprint: string | null, tag: string | undefined): Promise<boolean>;
6
+ /** Convenience signer bound to an MSK — what proxyClient expects when MSK is in-JS. */
7
+ export interface ProxySigner {
8
+ sign(role: ProxyRole, fingerprint: string): Promise<string>;
9
+ verify(role: ProxyRole, fingerprint: string, tag: string): Promise<boolean>;
10
+ }
11
+ export declare function mskSigner(msk: Uint8Array): ProxySigner;
12
+ //# sourceMappingURL=proxyCrypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyCrypto.d.ts","sourceRoot":"","sources":["../../src/native/proxyCrypto.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AA0B1C,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED,wBAAsB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlG;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAKtD"}
@@ -0,0 +1,53 @@
1
+ // Client-side fingerprint auth for the Ugly Proxy. Binds the WebRTC DTLS fingerprint to
2
+ // the per-user MSK (from the cookie-sync system) so the signaling relay can't MITM the
3
+ // handshake. Implemented with WebCrypto (HKDF + HMAC-SHA256) — no extra dependency, and
4
+ // byte-compatible with the host side's @noble implementation (same RFC 5869 / RFC 2104).
5
+ const INFO = 'ugly-native-proxy-v1';
6
+ const enc = new TextEncoder();
7
+ function toHex(buf) {
8
+ const b = new Uint8Array(buf);
9
+ let s = '';
10
+ for (let i = 0; i < b.length; i++)
11
+ s += b[i].toString(16).padStart(2, '0');
12
+ return s;
13
+ }
14
+ function subtle() {
15
+ const c = globalThis.crypto;
16
+ if (!c?.subtle)
17
+ throw new Error('[proxyCrypto] WebCrypto SubtleCrypto unavailable');
18
+ return c.subtle;
19
+ }
20
+ /** HKDF-SHA256(MSK) → 32-byte proxy-auth key, imported as an HMAC signing key. */
21
+ async function deriveHmacKey(msk) {
22
+ const base = await subtle().importKey('raw', msk, 'HKDF', false, ['deriveBits']);
23
+ const bits = await subtle().deriveBits({ name: 'HKDF', hash: 'SHA-256', salt: new Uint8Array(0), info: enc.encode(INFO) }, base, 256);
24
+ return subtle().importKey('raw', bits, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
25
+ }
26
+ /** Extract + normalize the DTLS fingerprint from an SDP blob ("sha-256 AB:CD:.."). */
27
+ export function parseFingerprint(sdp) {
28
+ const m = /a=fingerprint:(\S+)\s+([0-9A-Fa-f:]+)/.exec(sdp || '');
29
+ return m ? `${m[1].toLowerCase()} ${m[2].toUpperCase()}` : null;
30
+ }
31
+ export async function fpTag(msk, role, fingerprint) {
32
+ const key = await deriveHmacKey(msk);
33
+ const sig = await subtle().sign('HMAC', key, enc.encode(`${role}|${fingerprint}`));
34
+ return toHex(sig);
35
+ }
36
+ export async function verifyFpTag(msk, role, fingerprint, tag) {
37
+ if (!fingerprint || !tag)
38
+ return false;
39
+ const expected = await fpTag(msk, role, fingerprint);
40
+ if (expected.length !== tag.length)
41
+ return false;
42
+ let diff = 0;
43
+ for (let i = 0; i < expected.length; i++)
44
+ diff |= expected.charCodeAt(i) ^ tag.charCodeAt(i);
45
+ return diff === 0;
46
+ }
47
+ export function mskSigner(msk) {
48
+ return {
49
+ sign: (role, fp) => fpTag(msk, role, fp),
50
+ verify: (role, fp, tag) => verifyFpTag(msk, role, fp, tag),
51
+ };
52
+ }
53
+ //# sourceMappingURL=proxyCrypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxyCrypto.js","sourceRoot":"","sources":["../../src/native/proxyCrypto.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createWorkersApp.d.ts","sourceRoot":"","sources":["../../../../src/server/adapter/workers/createWorkersApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createWorkersApp.d.ts","sourceRoot":"","sources":["../../../../src/server/adapter/workers/createWorkersApp.ts"],"names":[],"mappings":"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"}
@@ -135,8 +135,10 @@ export class SessionDO {
135
135
  // their subsequent frames (e.g. `tts:start`) are already authenticated.
136
136
  let initial = { userId: null, userToken: null };
137
137
  let queryToken = null;
138
+ let params = null;
138
139
  try {
139
- queryToken = new URL(request.url).searchParams.get('token');
140
+ params = new URL(request.url).searchParams;
141
+ queryToken = params.get('token');
140
142
  }
141
143
  catch {
142
144
  /* no token */
@@ -151,6 +153,17 @@ export class SessionDO {
151
153
  // Leave unauthenticated; a later `auth` message can still authenticate.
152
154
  }
153
155
  }
156
+ // Ugly Proxy: seed device identity from the WS URL (createSocket `getUrlParams`),
157
+ // since the framework's `auth` payload is fixed to `{token}`. The `auth` handler
158
+ // preserves these on the attachment and registers presence once authenticated.
159
+ if (params) {
160
+ const did = params.get('deviceId');
161
+ if (did) {
162
+ initial.deviceId = did;
163
+ initial.deviceLabel = params.get('deviceLabel') ?? undefined;
164
+ initial.isHost = params.get('isHost') === 'true';
165
+ }
166
+ }
154
167
  pair[1].serializeAttachment(initial);
155
168
  this.clientWs = pair[1];
156
169
  return new Response(null, {