dsh-pocket 1.13.2 → 1.13.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 +7 -4
- package/lib/service.mjs +3 -3
- package/package.json +1 -1
package/lib/proxy.mjs
CHANGED
|
@@ -19,13 +19,16 @@ import { createHash } from 'node:crypto';
|
|
|
19
19
|
const DEFAULT_UPSTREAM = { host: '127.0.0.1', port: 3080 };
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
* 非安全上下文(http://<LAN-IP
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* 非安全上下文(http://<LAN-IP>:端口)里浏览器缺两个 API,由代理注入 polyfill
|
|
23
|
+
* (只在缺少时生效,不覆盖原生实现):
|
|
24
|
+
* 1. crypto.randomUUID——DSH 连接层 mint RPC id 用,缺失直接抛错;
|
|
25
|
+
* 2. AbortSignal.any(issue #53)——Android 厂商浏览器/WebView(Chrome < 116)
|
|
26
|
+
* 无原生实现,DSH 连接层发送消息会调 AbortSignal.any([...]),缺失则消息发不出。
|
|
25
27
|
* 带 data-dsh-pocket-polyfill 标记:注入判重用它,而不是搜索 "crypto.randomUUID"
|
|
26
28
|
* 字样(dsh 页面源码里可能恰好出现该字符串,导致误判为已注入而跳过)。
|
|
27
29
|
*/
|
|
28
|
-
const RANDOM_UUID_POLYFILL = `<script data-dsh-pocket-polyfill="1">!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){}}()
|
|
30
|
+
export const RANDOM_UUID_POLYFILL = `<script data-dsh-pocket-polyfill="1">!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
|
+
!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>`;
|
|
29
32
|
|
|
30
33
|
const INJECT_MARK = 'data-dsh-pocket-polyfill="1"';
|
|
31
34
|
|
package/lib/service.mjs
CHANGED
|
@@ -27,11 +27,11 @@ export async function qrDataUrl(text, { width = 220, margin = 1 } = {}) {
|
|
|
27
27
|
/** RFC1918 私网地址:手机与电脑连同一局域网时通常可直连。 */
|
|
28
28
|
const PRIVATE_IPV4_RE = /^(?:10\.|192\.168\.|172\.(?:1[6-9]|2\d|3[01])\.)/;
|
|
29
29
|
|
|
30
|
-
/** 名称像真实物理网卡的接口(WLAN / Wi-Fi / Ethernet / 以太网 / en / eth)。 */
|
|
31
|
-
const PHYSICAL_IFACE_RE = /^(?:wlan|wi-?fi|wireless|ethernet|eth\d|en\d|wlp\d
|
|
30
|
+
/** 名称像真实物理网卡的接口(WLAN / Wi-Fi / Ethernet / 以太网 / 有线 / 无线 / en / eth)。 */
|
|
31
|
+
const PHYSICAL_IFACE_RE = /^(?:wlan|wi-?fi|wireless|ethernet|eth\d|en\d|wlp\d|以太网|有线|无线|本地连接)/i;
|
|
32
32
|
|
|
33
33
|
/** 常见的 VPN / 虚拟网卡名称:手机通常无法通过它们直连电脑。 */
|
|
34
|
-
const VPN_IFACE_RE = /(?:radmin|tailscale|zerotier|tun|tap|vpn|vethernet|virtual|vmware|virtualbox|wsl|docker|teredo|hamachi|bluetooth|bridge)/i;
|
|
34
|
+
const VPN_IFACE_RE = /(?:radmin|tailscale|zerotier|easytier|et_|tun|tap|vpn|vethernet|virtual|vmware|virtualbox|wsl|docker|teredo|hamachi|bluetooth|bridge)/i;
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* 从 networkInterfaces() 返回的接口表里选出手机最可能可达的 IPv4。
|
package/package.json
CHANGED