dsh-pocket 1.14.1 → 1.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/proxy.mjs +9 -1
- package/lib/tunnel.mjs +4 -1
- package/package.json +1 -1
package/lib/proxy.mjs
CHANGED
|
@@ -27,7 +27,15 @@ const DEFAULT_UPSTREAM = { host: '127.0.0.1', port: 3080 };
|
|
|
27
27
|
* 带 data-dsh-pocket-polyfill 标记:注入判重用它,而不是搜索 "crypto.randomUUID"
|
|
28
28
|
* 字样(dsh 页面源码里可能恰好出现该字符串,导致误判为已注入而跳过)。
|
|
29
29
|
*/
|
|
30
|
-
export const RANDOM_UUID_POLYFILL = `<script data-dsh-pocket-polyfill="1"
|
|
30
|
+
export const RANDOM_UUID_POLYFILL = `<script data-dsh-pocket-polyfill="1">/* issue #58:局域网访问时 location.hostname 是局域网 IP,DSH 客户端据此判定
|
|
31
|
+
isLoopback=false → settings mirror 降级 memory 模式 → 模型设置页
|
|
32
|
+
"settings are unavailable in this browser"。location.hostname 是 WebIDL
|
|
33
|
+
unforgeable 属性无法直接覆盖;改用全局 let location 词法绑定遮蔽 +
|
|
34
|
+
Proxy 转发(其他属性/方法转发真实 location,只把 hostname 伪装成 127.0.0.1)。
|
|
35
|
+
DSH 的 API 基址走 globalThis.location.origin(不受影响)。*/
|
|
36
|
+
let __dshPocketLoc = new Proxy(window.location, { get: function (t, p) { if (p === 'hostname') return '127.0.0.1'; var v = t[p]; if (typeof v === 'function') return v.bind(t); return v; }, set: function (t, p, v) { t[p] = v; return true; } });
|
|
37
|
+
let location = __dshPocketLoc;
|
|
38
|
+
!function(){try{if(self.crypto&&!self.crypto.randomUUID){self.crypto.randomUUID=function(){var b=new Uint8Array(16);self.crypto.getRandomValues(b);b[6]=b[6]&15|64;b[8]=b[8]&63|128;var h="";for(var i=0;i<16;i++){var x=b[i].toString(16);h+=(x.length<2?"0":"")+x;if(i===3||i===5||i===7||i===9)h+="-";}return h;}}}catch(e){}}();
|
|
31
39
|
!function(){try{if(self.AbortSignal&&!self.AbortSignal.any){self.AbortSignal.any=function(signals){var controller=new AbortController();var list=Array.from(signals||[]);var done=false;var handlers=list.map(function(signal){return function(){abort(signal);};});function cleanup(){for(var i=0;i<list.length;i++){try{list[i].removeEventListener('abort',handlers[i]);}catch(e){}}}function abort(signal){if(done)return;done=true;cleanup();try{controller.abort(signal.reason);}catch(e){controller.abort();}}for(var j=0;j<list.length;j++){var sig=list[j];if(sig.aborted){abort(sig);break;}sig.addEventListener('abort',handlers[j],{once:true});}return controller.signal;};}}catch(e){}}();</script>`;
|
|
32
40
|
|
|
33
41
|
const INJECT_MARK = 'data-dsh-pocket-polyfill="1"';
|
package/lib/tunnel.mjs
CHANGED
|
@@ -379,7 +379,10 @@ export async function startQuickTunnel({ port, home, signal, onPhase = () => {}
|
|
|
379
379
|
};
|
|
380
380
|
const onExit = (code) => {
|
|
381
381
|
cleanup();
|
|
382
|
-
|
|
382
|
+
// 带上 cloudflared 自己的输出尾段(stderr 常含具体原因:403/协议/网络等),
|
|
383
|
+
// 否则「code=1」用户无从排查(issue #65)
|
|
384
|
+
const tail = buf.trim().split(/\r?\n/).slice(-3).join('\n').trim();
|
|
385
|
+
reject(new Error(`cloudflared 退出(code=${code})${tail ? ':' + tail.slice(0, 500) : ''}`));
|
|
383
386
|
};
|
|
384
387
|
cleanup = () => {
|
|
385
388
|
child.stdout.off('data', onData);
|
package/package.json
CHANGED