scan-ipp-sdk 1.0.1 → 1.0.2

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,14 +1,14 @@
1
1
  const E = "_ipp._tcp";
2
- let P = !1, y = null, T = null, W = null, b = [], D = !1, C = null, O = null, $ = null, k = [], I = null;
3
- function q(o, e) {
4
- h();
2
+ let P = !1, h = null, I = null, W = null, b = [], D = !1, C = null, O = null, M = null, k = [], T = null;
3
+ function j(o, e) {
4
+ y();
5
5
  const n = uni.getSystemInfoSync().platform;
6
- console.log(`[LAN-SCAN] Starting discovery on ${n} for ${E}`), P = !0, b = [], D = !1, I = setTimeout(() => {
7
- P && (console.warn("[LAN-SCAN] Discovery timeout, no devices found"), h(), I = null, clearTimeout(I));
8
- }, 15e3), n === "android" ? j(o, e) : n === "ios" ? H(o, e) : (e && e("Unsupported platform"), h());
6
+ console.log(`[LAN-SCAN] Starting discovery on ${n} for ${E}`), P = !0, b = [], D = !1, T = setTimeout(() => {
7
+ P && (console.warn("[LAN-SCAN] Discovery timeout, no devices found"), y(), T = null, clearTimeout(T));
8
+ }, 15e3), n === "android" ? _(o, e) : n === "ios" ? X(o, e) : (e && e("Unsupported platform"), y());
9
9
  }
10
- function h() {
11
- if (I && (clearTimeout(I), I = null), !(!P && !C && !y && !O)) {
10
+ function y() {
11
+ if (T && (clearTimeout(T), T = null), !(!P && !C && !h && !O)) {
12
12
  console.log("[LAN-SCAN] Stopping discovery");
13
13
  try {
14
14
  if (C) {
@@ -21,36 +21,36 @@ function h() {
21
21
  }
22
22
  const e = uni.getSystemInfoSync().platform;
23
23
  if (e === "android") {
24
- if (y && T)
24
+ if (h && I)
25
25
  try {
26
- y.stopServiceDiscovery(T);
26
+ h.stopServiceDiscovery(I);
27
27
  } catch (t) {
28
28
  console.warn("[Android] Stop discovery warning: ", t);
29
29
  }
30
- T = null, W = null, y = null, b = [], D = !1;
30
+ I = null, W = null, h = null, b = [], D = !1;
31
31
  } else e === "ios" && (k && k.length > 0 && k.forEach((t) => {
32
32
  if (t.service)
33
33
  try {
34
34
  t.service.stop(), t.service.setDelegate(null);
35
35
  } catch {
36
36
  }
37
- }), k = [], O && (O.stop(), O.setDelegate(null)), O = null, $ = null);
37
+ }), k = [], O && (O.stop(), O.setDelegate(null)), O = null, M = null);
38
38
  } catch (o) {
39
39
  console.error("[LAN-SCAN] Error stopping discovery:", o);
40
40
  }
41
41
  P = !1;
42
42
  }
43
43
  }
44
- function j(o, e) {
44
+ function _(o, e) {
45
45
  let t = null;
46
46
  try {
47
47
  const n = plus.android.importClass("android.content.Context"), s = plus.android.importClass("android.net.nsd.NsdManager"), c = plus.android.importClass("android.net.nsd.NsdServiceInfo"), i = plus.android.runtimeMainActivity();
48
- if (y = i.getSystemService(n.NSD_SERVICE), !y) {
49
- e && e("Failed to get NsdManager"), h();
48
+ if (h = i.getSystemService(n.NSD_SERVICE), !h) {
49
+ e && e("Failed to get NsdManager"), y();
50
50
  return;
51
51
  }
52
52
  const r = plus.android.importClass("android.net.wifi.WifiManager");
53
- t = i.getSystemService(n.WIFI_SERVICE).createMulticastLock("ipp-discovery"), t.setReferenceCounted(!0), t.acquire(), console.log("[Android] Multicast lock acquired"), C = t, T = plus.android.implements("android.net.nsd.NsdManager$DiscoveryListener", {
53
+ t = i.getSystemService(n.WIFI_SERVICE).createMulticastLock("ipp-discovery"), t.setReferenceCounted(!0), t.acquire(), console.log("[Android] Multicast lock acquired"), C = t, I = plus.android.implements("android.net.nsd.NsdManager$DiscoveryListener", {
54
54
  onDiscoveryStarted: function(a) {
55
55
  console.log("[Android] Discovery started: " + a);
56
56
  },
@@ -58,18 +58,18 @@ function j(o, e) {
58
58
  console.log("[Android] Discovery stopped: " + a);
59
59
  },
60
60
  onServiceFound: function(a) {
61
- console.log("[Android] Service found: " + a.getServiceName(), a), _(a, o);
61
+ console.log("[Android] Service found: " + a.getServiceName(), a), H(a, o);
62
62
  },
63
63
  onServiceLost: function(a) {
64
64
  console.log("[Android] Service lost: " + a.getServiceName());
65
65
  },
66
66
  onStartDiscoveryFailed: function(a, d) {
67
- console.error("[Android] Discovery failed: Error code:" + d), e && e("Start discovery failed code: " + d), h();
67
+ console.error("[Android] Discovery failed: Error code:" + d), e && e("Start discovery failed code: " + d), y();
68
68
  },
69
69
  onStopDiscoveryFailed: function(a, d) {
70
70
  console.error("[Android] Stop discovery failed: Error code:" + d);
71
71
  }
72
- }), y.discoverServices("_ipp._tcp", s.PROTOCOL_DNS_SD, T);
72
+ }), h.discoverServices("_ipp._tcp", s.PROTOCOL_DNS_SD, I);
73
73
  } catch (n) {
74
74
  if (console.error("[Android] Exception in startAndroidScan:", n), t) {
75
75
  try {
@@ -78,14 +78,14 @@ function j(o, e) {
78
78
  }
79
79
  t = null;
80
80
  }
81
- C = null, e && e(n.message), h();
81
+ C = null, e && e(n.message), y();
82
82
  }
83
83
  }
84
- function _(o, e) {
84
+ function H(o, e) {
85
85
  b.push(o), R(e);
86
86
  }
87
87
  function R(o) {
88
- if (D || b.length === 0 || !y)
88
+ if (D || b.length === 0 || !h)
89
89
  return;
90
90
  const e = b.shift();
91
91
  D = !0, console.log("[Android] Processing resolve for: " + e.getServiceName());
@@ -164,20 +164,20 @@ function R(o) {
164
164
  }
165
165
  });
166
166
  try {
167
- y.resolveService(e, t);
167
+ h.resolveService(e, t);
168
168
  } catch (n) {
169
169
  console.error("[Android] resolveService exception", n), D = !1, R(o);
170
170
  }
171
171
  }
172
- function H(o, e) {
172
+ function X(o, e) {
173
173
  try {
174
174
  const t = plus.ios.importClass("NSNetServiceBrowser"), n = plus.ios.importClass("NSNetService");
175
175
  if (!t || !n) {
176
176
  const s = "Failed to import iOS classes: NSNetServiceBrowser/NSNetService";
177
- console.error("[iOS] " + s), e && e(s), h();
177
+ console.error("[iOS] " + s), e && e(s), y();
178
178
  return;
179
179
  }
180
- O = new t(), console.log("[iOS] Browser created"), $ = plus.ios.implements("NSNetServiceBrowserDelegate", {
180
+ O = new t(), console.log("[iOS] Browser created"), M = plus.ios.implements("NSNetServiceBrowserDelegate", {
181
181
  "netServiceBrowserWillSearch:": function(s) {
182
182
  console.log("[iOS] Search started successfully");
183
183
  },
@@ -188,7 +188,7 @@ function H(o, e) {
188
188
  } catch (f) {
189
189
  console.error("[iOS] Error getting service name: " + f.message);
190
190
  }
191
- console.log("[iOS] Service found: " + r), X(c, o);
191
+ console.log("[iOS] Service found: " + r), q(c, o);
192
192
  },
193
193
  "netServiceBrowser:didRemoveService:moreComing:": function(s, c, i) {
194
194
  let r = "Unknown";
@@ -202,14 +202,14 @@ function H(o, e) {
202
202
  console.log("[iOS] Search stopped");
203
203
  },
204
204
  "netServiceBrowser:didNotSearch:": function(s, c) {
205
- console.error("[iOS] Search failed", c), e && e("iOS Search failed, check permissions in manifest.json"), h();
205
+ console.error("[iOS] Search failed", c), e && e("iOS Search failed, check permissions in manifest.json"), y();
206
206
  }
207
- }), plus.ios.invoke(O, "setDelegate:", $), console.log("[iOS] Invoking searchForServicesOfType:inDomain: with " + E), plus.ios.invoke(O, "searchForServicesOfType:inDomain:", E, "local.");
207
+ }), plus.ios.invoke(O, "setDelegate:", M), console.log("[iOS] Invoking searchForServicesOfType:inDomain: with " + E), plus.ios.invoke(O, "searchForServicesOfType:inDomain:", E, "local.");
208
208
  } catch (t) {
209
- console.error("[iOS] Exception in startIOSScan:", t), e && e(t.message), h();
209
+ console.error("[iOS] Exception in startIOSScan:", t), e && e(t.message), y();
210
210
  }
211
211
  }
212
- function X(o, e) {
212
+ function q(o, e) {
213
213
  console.log("[iOS] Starting resolution for service object");
214
214
  const t = plus.ios.implements("NSNetServiceDelegate", {
215
215
  "netServiceDidResolveAddress:": function(n) {
@@ -293,10 +293,10 @@ function X(o, e) {
293
293
  ippUrl: S,
294
294
  paper: B(f)
295
295
  };
296
- typeof e == "function" && e(N), M(t);
296
+ typeof e == "function" && e(N), $(t);
297
297
  },
298
298
  "netService:didNotResolve:": function(n, s) {
299
- console.error("[iOS] Resolve failed for " + (plus.ios.invoke(n, "name") || "Unknown"), s), M(t);
299
+ console.error("[iOS] Resolve failed for " + (plus.ios.invoke(n, "name") || "Unknown"), s), $(t);
300
300
  }
301
301
  });
302
302
  k.push({
@@ -304,7 +304,7 @@ function X(o, e) {
304
304
  service: o
305
305
  }), console.log("[iOS] Setting delegate for resolution"), plus.ios.invoke(o, "setDelegate:", t), console.log("[iOS] Invoking resolveWithTimeout"), plus.ios.invoke(o, "resolveWithTimeout:", 5);
306
306
  }
307
- function M(o) {
307
+ function $(o) {
308
308
  const e = k.findIndex((t) => t.delegate === o);
309
309
  if (e > -1) {
310
310
  const t = k[e];
@@ -343,9 +343,12 @@ function B(o) {
343
343
  const t = (o.PaperMax || "").toLowerCase(), n = (o.ty || o.product || "").toLowerCase();
344
344
  return (t.includes("a3") || n.includes("a3")) && e.push("A3"), e;
345
345
  }
346
- const J = ScanIPPPSDK;
346
+ const J = {
347
+ startDiscovery: j,
348
+ stopDiscovery: y
349
+ };
347
350
  export {
348
351
  J as default,
349
- q as startDiscovery,
350
- h as stopDiscovery
352
+ j as startDiscovery,
353
+ y as stopDiscovery
351
354
  };
@@ -1 +1 @@
1
- (function(N,w){typeof exports=="object"&&typeof module<"u"?w(exports):typeof define=="function"&&define.amd?define(["exports"],w):(N=typeof globalThis<"u"?globalThis:N||self,w(N.ScanIPPPSDK={}))})(this,function(N){"use strict";const w="_ipp._tcp";let M=!1,h=null,x=null,W=null,R=[],D=!1,b=null,O=null,$=null,k=[],C=null;function j(o,e){y();const n=uni.getSystemInfoSync().platform;console.log(`[LAN-SCAN] Starting discovery on ${n} for ${w}`),M=!0,R=[],D=!1,C=setTimeout(()=>{M&&(console.warn("[LAN-SCAN] Discovery timeout, no devices found"),y(),C=null,clearTimeout(C))},15e3),n==="android"?_(o,e):n==="ios"?X(o,e):(e&&e("Unsupported platform"),y())}function y(){if(C&&(clearTimeout(C),C=null),!(!M&&!b&&!h&&!O)){console.log("[LAN-SCAN] Stopping discovery");try{if(b){try{b.release(),console.log("[Android] Multicast lock released")}catch(t){console.warn("[Android] Release multicast lock warning:",t)}b=null}const e=uni.getSystemInfoSync().platform;if(e==="android"){if(h&&x)try{h.stopServiceDiscovery(x)}catch(t){console.warn("[Android] Stop discovery warning: ",t)}x=null,W=null,h=null,R=[],D=!1}else e==="ios"&&(k&&k.length>0&&k.forEach(t=>{if(t.service)try{t.service.stop(),t.service.setDelegate(null)}catch{}}),k=[],O&&(O.stop(),O.setDelegate(null)),O=null,$=null)}catch(o){console.error("[LAN-SCAN] Error stopping discovery:",o)}M=!1}}function _(o,e){let t=null;try{const n=plus.android.importClass("android.content.Context"),i=plus.android.importClass("android.net.nsd.NsdManager"),c=plus.android.importClass("android.net.nsd.NsdServiceInfo"),s=plus.android.runtimeMainActivity();if(h=s.getSystemService(n.NSD_SERVICE),!h){e&&e("Failed to get NsdManager"),y();return}const r=plus.android.importClass("android.net.wifi.WifiManager");t=s.getSystemService(n.WIFI_SERVICE).createMulticastLock("ipp-discovery"),t.setReferenceCounted(!0),t.acquire(),console.log("[Android] Multicast lock acquired"),b=t,x=plus.android.implements("android.net.nsd.NsdManager$DiscoveryListener",{onDiscoveryStarted:function(a){console.log("[Android] Discovery started: "+a)},onDiscoveryStopped:function(a){console.log("[Android] Discovery stopped: "+a)},onServiceFound:function(a){console.log("[Android] Service found: "+a.getServiceName(),a),H(a,o)},onServiceLost:function(a){console.log("[Android] Service lost: "+a.getServiceName())},onStartDiscoveryFailed:function(a,d){console.error("[Android] Discovery failed: Error code:"+d),e&&e("Start discovery failed code: "+d),y()},onStopDiscoveryFailed:function(a,d){console.error("[Android] Stop discovery failed: Error code:"+d)}}),h.discoverServices("_ipp._tcp",i.PROTOCOL_DNS_SD,x)}catch(n){if(console.error("[Android] Exception in startAndroidScan:",n),t){try{t.release()}catch{}t=null}b=null,e&&e(n.message),y()}}function H(o,e){R.push(o),E(e)}function E(o){if(D||R.length===0||!h)return;const e=R.shift();D=!0,console.log("[Android] Processing resolve for: "+e.getServiceName());const t=plus.android.implements("android.net.nsd.NsdManager$ResolveListener",{onResolveFailed:function(n,i){console.error("[Android] Resolve failed: "+i),D=!1,setTimeout(()=>E(o),100)},onServiceResolved:function(n){const i=plus.android.invoke(n,"toString");console.log("[Android] Service resolved raw: "+i);const c=n.getHost();let s="";if(c){const l=plus.android.invoke(c,"getHostAddress");l&&l.indexOf(":")===-1&&(s=l,console.log("[Android] Got IP from getHostAddress: "+s))}if(!s&&i){const l=/(?:\/)?((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/g;let p;for(;(p=l.exec(i))!==null;){const g=p[1];if(g!=="127.0.0.1"&&g!=="0.0.0.0"){s=g,console.log("[Android] Extracted IPv4 from string: "+s);break}}!s&&c&&(s=plus.android.invoke(c,"getHostAddress"))}let r=n.getPort();if((!r||r<=0)&&i){const l=/port:\s*(\d+)/,p=i.match(l);p&&p[1]&&(r=parseInt(p[1]),console.log("[Android] Extracted Port from string: "+r))}console.log("Port:",r);const f={};try{const l=plus.android.invoke(n,"getAttributes");if(l){const p=plus.android.importClass("java.lang.String"),g=plus.android.invoke(l,"keySet"),m=plus.android.invoke(g,"iterator");for(;plus.android.invoke(m,"hasNext");){const v=plus.android.invoke(m,"next"),T=plus.android.invoke(l,"get",v);let P="";if(T)try{P=new p(T,"UTF-8").toString()}catch{console.warn("Failed to convert TXT value for key: "+v)}f[v]=P}console.log("[Android] TXT Records: "+JSON.stringify(f))}}catch(l){console.warn("[Android] Failed to get attributes: "+l.message)}s&&s.startsWith("/")&&(s=s.substring(1));const a=plus.android.invoke(n,"getServiceName");let d="";c&&(d=plus.android.invoke(c,"getHostName"));let S=f.rp||"ipp/print";S.startsWith("/")&&(S=S.substring(1));let A="";s&&r?A=`ipp://${s}:${r}/${S}`:d&&r&&(A=`ipp://${d}:${r}/${S}`);const u={name:a,ip:s,port:r,hostName:d,attributes:f,ippUrl:A,paper:U(f)};console.log("Device Object Constructed: "+JSON.stringify(u)),typeof o=="function"?o(u):console.error("[Android] onDeviceFound callback is not a function!"),D=!1,setTimeout(()=>E(o),100)}});try{h.resolveService(e,t)}catch(n){console.error("[Android] resolveService exception",n),D=!1,E(o)}}function X(o,e){try{const t=plus.ios.importClass("NSNetServiceBrowser"),n=plus.ios.importClass("NSNetService");if(!t||!n){const i="Failed to import iOS classes: NSNetServiceBrowser/NSNetService";console.error("[iOS] "+i),e&&e(i),y();return}O=new t,console.log("[iOS] Browser created"),$=plus.ios.implements("NSNetServiceBrowserDelegate",{"netServiceBrowserWillSearch:":function(i){console.log("[iOS] Search started successfully")},"netServiceBrowser:didFindService:moreComing:":function(i,c,s){let r="Unknown";try{r=plus.ios.invoke(c,"name")}catch(f){console.error("[iOS] Error getting service name: "+f.message)}console.log("[iOS] Service found: "+r),q(c,o)},"netServiceBrowser:didRemoveService:moreComing:":function(i,c,s){let r="Unknown";try{r=plus.ios.invoke(c,"name")}catch{}console.log("[iOS] Service removed: "+r)},"netServiceBrowserDidStopSearch:":function(i){console.log("[iOS] Search stopped")},"netServiceBrowser:didNotSearch:":function(i,c){console.error("[iOS] Search failed",c),e&&e("iOS Search failed, check permissions in manifest.json"),y()}}),plus.ios.invoke(O,"setDelegate:",$),console.log("[iOS] Invoking searchForServicesOfType:inDomain: with "+w),plus.ios.invoke(O,"searchForServicesOfType:inDomain:",w,"local.")}catch(t){console.error("[iOS] Exception in startIOSScan:",t),e&&e(t.message),y()}}function q(o,e){console.log("[iOS] Starting resolution for service object");const t=plus.ios.implements("NSNetServiceDelegate",{"netServiceDidResolveAddress:":function(n){console.log("[iOS] netServiceDidResolveAddress triggered");let i="",c=0,s="";try{i=plus.ios.invoke(n,"name"),c=plus.ios.invoke(n,"port"),s=plus.ios.invoke(n,"hostName"),console.log(`[iOS] Basic Info - Name: ${i}, Port: ${c}, HostName: ${s}`)}catch(u){console.error("[iOS] Failed to get basic info: "+u.message)}let r="";try{const u=plus.ios.invoke(n,"addresses");if(u){const l=plus.ios.invoke(u,"count");console.log("[iOS] Found "+l+" addresses");for(let p=0;p<l;p++){const g=plus.ios.invoke(u,"objectAtIndex:",p);if(!g)continue;const m=plus.ios.invoke(g,"base64EncodedStringWithOptions:",0);if(m){const v=B(m);if(!v||v.length<4)continue;if(v.length>=8&&v[1]===2){r=`${v[4]}.${v[5]}.${v[6]}.${v[7]}`,console.log("[iOS] Parsed IPv4: "+r);break}}}}else console.warn("[iOS] addresses is null")}catch(u){console.error("[iOS] Error parsing addresses: "+u.message)}r||(r=s,console.log("[iOS] No IPv4 found, using hostName: "+r));let f={};try{const u=plus.ios.invoke(n,"TXTRecordData");if(u){const l=plus.ios.invoke(u,"base64EncodedStringWithOptions:",0);if(l){const p=B(l);if(p){let g=0;for(;g<p.length;){const m=p[g];if(g++,g+m>p.length)break;if(m>0){const v=p.subarray(g,g+m);let T="";for(let I=0;I<m;I++)T+=String.fromCharCode(v[I]);const P=T.indexOf("=");if(P>0){const I=T.substring(0,P),K=T.substring(P+1);f[I]=K}}g+=m}console.log("[iOS] Parsed TXT Records: "+JSON.stringify(f))}}}}catch(u){console.warn("[iOS] Failed to parse TXT record: "+u.message)}let a=f.rp||"ipp/print";a.startsWith("/")&&(a=a.substring(1));let d=r;!d&&s&&(d=s),!d&&i&&(d=i.replace(/\s+/g,"-")+".local",console.log("[iOS] Constructed hostTarget from name: "+d));let S="";d&&c?(S=`ipp://${d}:${c}/${a}`,console.log("[iOS] Generated IPP URL: "+S)):console.warn("[iOS] Cannot generate IPP URL, missing host or port");const A={name:i,ip:r,port:c,hostName:s,isIOS:!0,attributes:f,ippUrl:S,paper:U(f)};typeof e=="function"&&e(A),L(t)},"netService:didNotResolve:":function(n,i){console.error("[iOS] Resolve failed for "+(plus.ios.invoke(n,"name")||"Unknown"),i),L(t)}});k.push({delegate:t,service:o}),console.log("[iOS] Setting delegate for resolution"),plus.ios.invoke(o,"setDelegate:",t),console.log("[iOS] Invoking resolveWithTimeout"),plus.ios.invoke(o,"resolveWithTimeout:",5)}function L(o){const e=k.findIndex(t=>t.delegate===o);if(e>-1){const t=k[e];if(t.service)try{t.service.setDelegate(null),t.service.stop()}catch{}k.splice(e,1)}}function B(o){if(!o)return null;if(typeof atob=="function")try{const S=atob(o),A=S.length,u=new Uint8Array(A);for(let l=0;l<A;l++)u[l]=S.charCodeAt(l);return u}catch(S){return console.error("atob failed",S),null}const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let t=o.length*.75;const n=o.length;let i,c=0,s,r,f,a;o[o.length-1]==="="&&(t--,o[o.length-2]==="="&&t--);const d=new Uint8Array(t);for(i=0;i<n;i+=4)s=e.indexOf(o[i]),r=e.indexOf(o[i+1]),f=e.indexOf(o[i+2]),a=e.indexOf(o[i+3]),d[c++]=s<<2|r>>4,f!=64&&(d[c++]=(r&15)<<4|f>>2),a!=64&&(d[c++]=(f&3)<<6|a);return d}function U(o){let e=[];if(!o)return e;const t=(o.PaperMax||"").toLowerCase(),n=(o.ty||o.product||"").toLowerCase();return(t.includes("a3")||n.includes("a3"))&&e.push("A3"),e}const J=ScanIPPPSDK;N.default=J,N.startDiscovery=j,N.stopDiscovery=y,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(N,w){typeof exports=="object"&&typeof module<"u"?w(exports):typeof define=="function"&&define.amd?define(["exports"],w):(N=typeof globalThis<"u"?globalThis:N||self,w(N.ScanIPPPSDK={}))})(this,function(N){"use strict";const w="_ipp._tcp";let M=!1,h=null,P=null,j=null,R=[],D=!1,C=null,O=null,$=null,k=[],I=null;function L(o,e){m();const n=uni.getSystemInfoSync().platform;console.log(`[LAN-SCAN] Starting discovery on ${n} for ${w}`),M=!0,R=[],D=!1,I=setTimeout(()=>{M&&(console.warn("[LAN-SCAN] Discovery timeout, no devices found"),m(),I=null,clearTimeout(I))},15e3),n==="android"?_(o,e):n==="ios"?X(o,e):(e&&e("Unsupported platform"),m())}function m(){if(I&&(clearTimeout(I),I=null),!(!M&&!C&&!h&&!O)){console.log("[LAN-SCAN] Stopping discovery");try{if(C){try{C.release(),console.log("[Android] Multicast lock released")}catch(t){console.warn("[Android] Release multicast lock warning:",t)}C=null}const e=uni.getSystemInfoSync().platform;if(e==="android"){if(h&&P)try{h.stopServiceDiscovery(P)}catch(t){console.warn("[Android] Stop discovery warning: ",t)}P=null,j=null,h=null,R=[],D=!1}else e==="ios"&&(k&&k.length>0&&k.forEach(t=>{if(t.service)try{t.service.stop(),t.service.setDelegate(null)}catch{}}),k=[],O&&(O.stop(),O.setDelegate(null)),O=null,$=null)}catch(o){console.error("[LAN-SCAN] Error stopping discovery:",o)}M=!1}}function _(o,e){let t=null;try{const n=plus.android.importClass("android.content.Context"),i=plus.android.importClass("android.net.nsd.NsdManager"),c=plus.android.importClass("android.net.nsd.NsdServiceInfo"),s=plus.android.runtimeMainActivity();if(h=s.getSystemService(n.NSD_SERVICE),!h){e&&e("Failed to get NsdManager"),m();return}const r=plus.android.importClass("android.net.wifi.WifiManager");t=s.getSystemService(n.WIFI_SERVICE).createMulticastLock("ipp-discovery"),t.setReferenceCounted(!0),t.acquire(),console.log("[Android] Multicast lock acquired"),C=t,P=plus.android.implements("android.net.nsd.NsdManager$DiscoveryListener",{onDiscoveryStarted:function(a){console.log("[Android] Discovery started: "+a)},onDiscoveryStopped:function(a){console.log("[Android] Discovery stopped: "+a)},onServiceFound:function(a){console.log("[Android] Service found: "+a.getServiceName(),a),H(a,o)},onServiceLost:function(a){console.log("[Android] Service lost: "+a.getServiceName())},onStartDiscoveryFailed:function(a,d){console.error("[Android] Discovery failed: Error code:"+d),e&&e("Start discovery failed code: "+d),m()},onStopDiscoveryFailed:function(a,d){console.error("[Android] Stop discovery failed: Error code:"+d)}}),h.discoverServices("_ipp._tcp",i.PROTOCOL_DNS_SD,P)}catch(n){if(console.error("[Android] Exception in startAndroidScan:",n),t){try{t.release()}catch{}t=null}C=null,e&&e(n.message),m()}}function H(o,e){R.push(o),E(e)}function E(o){if(D||R.length===0||!h)return;const e=R.shift();D=!0,console.log("[Android] Processing resolve for: "+e.getServiceName());const t=plus.android.implements("android.net.nsd.NsdManager$ResolveListener",{onResolveFailed:function(n,i){console.error("[Android] Resolve failed: "+i),D=!1,setTimeout(()=>E(o),100)},onServiceResolved:function(n){const i=plus.android.invoke(n,"toString");console.log("[Android] Service resolved raw: "+i);const c=n.getHost();let s="";if(c){const l=plus.android.invoke(c,"getHostAddress");l&&l.indexOf(":")===-1&&(s=l,console.log("[Android] Got IP from getHostAddress: "+s))}if(!s&&i){const l=/(?:\/)?((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))/g;let p;for(;(p=l.exec(i))!==null;){const g=p[1];if(g!=="127.0.0.1"&&g!=="0.0.0.0"){s=g,console.log("[Android] Extracted IPv4 from string: "+s);break}}!s&&c&&(s=plus.android.invoke(c,"getHostAddress"))}let r=n.getPort();if((!r||r<=0)&&i){const l=/port:\s*(\d+)/,p=i.match(l);p&&p[1]&&(r=parseInt(p[1]),console.log("[Android] Extracted Port from string: "+r))}console.log("Port:",r);const f={};try{const l=plus.android.invoke(n,"getAttributes");if(l){const p=plus.android.importClass("java.lang.String"),g=plus.android.invoke(l,"keySet"),y=plus.android.invoke(g,"iterator");for(;plus.android.invoke(y,"hasNext");){const v=plus.android.invoke(y,"next"),T=plus.android.invoke(l,"get",v);let x="";if(T)try{x=new p(T,"UTF-8").toString()}catch{console.warn("Failed to convert TXT value for key: "+v)}f[v]=x}console.log("[Android] TXT Records: "+JSON.stringify(f))}}catch(l){console.warn("[Android] Failed to get attributes: "+l.message)}s&&s.startsWith("/")&&(s=s.substring(1));const a=plus.android.invoke(n,"getServiceName");let d="";c&&(d=plus.android.invoke(c,"getHostName"));let S=f.rp||"ipp/print";S.startsWith("/")&&(S=S.substring(1));let A="";s&&r?A=`ipp://${s}:${r}/${S}`:d&&r&&(A=`ipp://${d}:${r}/${S}`);const u={name:a,ip:s,port:r,hostName:d,attributes:f,ippUrl:A,paper:W(f)};console.log("Device Object Constructed: "+JSON.stringify(u)),typeof o=="function"?o(u):console.error("[Android] onDeviceFound callback is not a function!"),D=!1,setTimeout(()=>E(o),100)}});try{h.resolveService(e,t)}catch(n){console.error("[Android] resolveService exception",n),D=!1,E(o)}}function X(o,e){try{const t=plus.ios.importClass("NSNetServiceBrowser"),n=plus.ios.importClass("NSNetService");if(!t||!n){const i="Failed to import iOS classes: NSNetServiceBrowser/NSNetService";console.error("[iOS] "+i),e&&e(i),m();return}O=new t,console.log("[iOS] Browser created"),$=plus.ios.implements("NSNetServiceBrowserDelegate",{"netServiceBrowserWillSearch:":function(i){console.log("[iOS] Search started successfully")},"netServiceBrowser:didFindService:moreComing:":function(i,c,s){let r="Unknown";try{r=plus.ios.invoke(c,"name")}catch(f){console.error("[iOS] Error getting service name: "+f.message)}console.log("[iOS] Service found: "+r),q(c,o)},"netServiceBrowser:didRemoveService:moreComing:":function(i,c,s){let r="Unknown";try{r=plus.ios.invoke(c,"name")}catch{}console.log("[iOS] Service removed: "+r)},"netServiceBrowserDidStopSearch:":function(i){console.log("[iOS] Search stopped")},"netServiceBrowser:didNotSearch:":function(i,c){console.error("[iOS] Search failed",c),e&&e("iOS Search failed, check permissions in manifest.json"),m()}}),plus.ios.invoke(O,"setDelegate:",$),console.log("[iOS] Invoking searchForServicesOfType:inDomain: with "+w),plus.ios.invoke(O,"searchForServicesOfType:inDomain:",w,"local.")}catch(t){console.error("[iOS] Exception in startIOSScan:",t),e&&e(t.message),m()}}function q(o,e){console.log("[iOS] Starting resolution for service object");const t=plus.ios.implements("NSNetServiceDelegate",{"netServiceDidResolveAddress:":function(n){console.log("[iOS] netServiceDidResolveAddress triggered");let i="",c=0,s="";try{i=plus.ios.invoke(n,"name"),c=plus.ios.invoke(n,"port"),s=plus.ios.invoke(n,"hostName"),console.log(`[iOS] Basic Info - Name: ${i}, Port: ${c}, HostName: ${s}`)}catch(u){console.error("[iOS] Failed to get basic info: "+u.message)}let r="";try{const u=plus.ios.invoke(n,"addresses");if(u){const l=plus.ios.invoke(u,"count");console.log("[iOS] Found "+l+" addresses");for(let p=0;p<l;p++){const g=plus.ios.invoke(u,"objectAtIndex:",p);if(!g)continue;const y=plus.ios.invoke(g,"base64EncodedStringWithOptions:",0);if(y){const v=U(y);if(!v||v.length<4)continue;if(v.length>=8&&v[1]===2){r=`${v[4]}.${v[5]}.${v[6]}.${v[7]}`,console.log("[iOS] Parsed IPv4: "+r);break}}}}else console.warn("[iOS] addresses is null")}catch(u){console.error("[iOS] Error parsing addresses: "+u.message)}r||(r=s,console.log("[iOS] No IPv4 found, using hostName: "+r));let f={};try{const u=plus.ios.invoke(n,"TXTRecordData");if(u){const l=plus.ios.invoke(u,"base64EncodedStringWithOptions:",0);if(l){const p=U(l);if(p){let g=0;for(;g<p.length;){const y=p[g];if(g++,g+y>p.length)break;if(y>0){const v=p.subarray(g,g+y);let T="";for(let b=0;b<y;b++)T+=String.fromCharCode(v[b]);const x=T.indexOf("=");if(x>0){const b=T.substring(0,x),V=T.substring(x+1);f[b]=V}}g+=y}console.log("[iOS] Parsed TXT Records: "+JSON.stringify(f))}}}}catch(u){console.warn("[iOS] Failed to parse TXT record: "+u.message)}let a=f.rp||"ipp/print";a.startsWith("/")&&(a=a.substring(1));let d=r;!d&&s&&(d=s),!d&&i&&(d=i.replace(/\s+/g,"-")+".local",console.log("[iOS] Constructed hostTarget from name: "+d));let S="";d&&c?(S=`ipp://${d}:${c}/${a}`,console.log("[iOS] Generated IPP URL: "+S)):console.warn("[iOS] Cannot generate IPP URL, missing host or port");const A={name:i,ip:r,port:c,hostName:s,isIOS:!0,attributes:f,ippUrl:S,paper:W(f)};typeof e=="function"&&e(A),B(t)},"netService:didNotResolve:":function(n,i){console.error("[iOS] Resolve failed for "+(plus.ios.invoke(n,"name")||"Unknown"),i),B(t)}});k.push({delegate:t,service:o}),console.log("[iOS] Setting delegate for resolution"),plus.ios.invoke(o,"setDelegate:",t),console.log("[iOS] Invoking resolveWithTimeout"),plus.ios.invoke(o,"resolveWithTimeout:",5)}function B(o){const e=k.findIndex(t=>t.delegate===o);if(e>-1){const t=k[e];if(t.service)try{t.service.setDelegate(null),t.service.stop()}catch{}k.splice(e,1)}}function U(o){if(!o)return null;if(typeof atob=="function")try{const S=atob(o),A=S.length,u=new Uint8Array(A);for(let l=0;l<A;l++)u[l]=S.charCodeAt(l);return u}catch(S){return console.error("atob failed",S),null}const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let t=o.length*.75;const n=o.length;let i,c=0,s,r,f,a;o[o.length-1]==="="&&(t--,o[o.length-2]==="="&&t--);const d=new Uint8Array(t);for(i=0;i<n;i+=4)s=e.indexOf(o[i]),r=e.indexOf(o[i+1]),f=e.indexOf(o[i+2]),a=e.indexOf(o[i+3]),d[c++]=s<<2|r>>4,f!=64&&(d[c++]=(r&15)<<4|f>>2),a!=64&&(d[c++]=(f&3)<<6|a);return d}function W(o){let e=[];if(!o)return e;const t=(o.PaperMax||"").toLowerCase(),n=(o.ty||o.product||"").toLowerCase();return(t.includes("a3")||n.includes("a3"))&&e.push("A3"),e}const J={startDiscovery:L,stopDiscovery:m};N.default=J,N.startDiscovery=L,N.stopDiscovery=m,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scan-ipp-sdk",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "扫描IPPP码SDK(Vite 打包)",
5
5
  "main": "dist/scan-ipp-sdk.umd.js",
6
6
  "module": "dist/scan-ipp-sdk.es.js",