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.
- package/dist/scan-ipp-sdk.es.js +40 -37
- package/dist/scan-ipp-sdk.umd.js +1 -1
- package/package.json +1 -1
package/dist/scan-ipp-sdk.es.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
const E = "_ipp._tcp";
|
|
2
|
-
let P = !1,
|
|
3
|
-
function
|
|
4
|
-
|
|
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,
|
|
7
|
-
P && (console.warn("[LAN-SCAN] Discovery timeout, no devices found"),
|
|
8
|
-
}, 15e3), n === "android" ?
|
|
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
|
|
11
|
-
if (
|
|
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 (
|
|
24
|
+
if (h && I)
|
|
25
25
|
try {
|
|
26
|
-
|
|
26
|
+
h.stopServiceDiscovery(I);
|
|
27
27
|
} catch (t) {
|
|
28
28
|
console.warn("[Android] Stop discovery warning: ", t);
|
|
29
29
|
}
|
|
30
|
-
|
|
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,
|
|
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
|
|
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 (
|
|
49
|
-
e && e("Failed to get NsdManager"),
|
|
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,
|
|
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),
|
|
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),
|
|
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
|
-
}),
|
|
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),
|
|
81
|
+
C = null, e && e(n.message), y();
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
function
|
|
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 || !
|
|
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
|
-
|
|
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
|
|
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),
|
|
177
|
+
console.error("[iOS] " + s), e && e(s), y();
|
|
178
178
|
return;
|
|
179
179
|
}
|
|
180
|
-
O = new t(), console.log("[iOS] Browser created"),
|
|
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),
|
|
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"),
|
|
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:",
|
|
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),
|
|
209
|
+
console.error("[iOS] Exception in startIOSScan:", t), e && e(t.message), y();
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
|
-
function
|
|
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),
|
|
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),
|
|
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
|
|
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 =
|
|
346
|
+
const J = {
|
|
347
|
+
startDiscovery: j,
|
|
348
|
+
stopDiscovery: y
|
|
349
|
+
};
|
|
347
350
|
export {
|
|
348
351
|
J as default,
|
|
349
|
-
|
|
350
|
-
|
|
352
|
+
j as startDiscovery,
|
|
353
|
+
y as stopDiscovery
|
|
351
354
|
};
|
package/dist/scan-ipp-sdk.umd.js
CHANGED
|
@@ -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"}})});
|