nativescript-dna-netservices
Version:
NativeScript plugin for Bonjour/ZeroConf and network monitoring. RxJS based APIs for Android and iOS.
149 lines • 6.46 kB
JavaScript
import { Observable, throwError } from "rxjs";
import { ZeroConf, zeroConfStatus, zeroConfError } from "./netservice.common";
export class ZeroConfService {
publish(o) {
if (o.port === 0) {
const port = this.availablePort();
if (port < 0)
throwError(zeroConfError.failedToFindAvailablePort);
else
o.port = port;
}
return new Observable((observer) => {
let netService = NSNetService.alloc().initWithDomainTypeNamePort(o.domain, o.type, o.name, o.port);
netService.delegate = ZeroConfServiceDelegate.new().initWithObserver(observer);
netService.publish();
return () => {
netService.stop();
netService.delegate = null;
netService = null;
};
});
}
resolve(o) {
return new Observable((observer) => {
let netService = NSNetService.alloc().initWithDomainTypeName(o.domain, o.type, o.name);
netService.delegate = ZeroConfServiceDelegate.new().initWithObserver(observer);
netService.resolveWithTimeout(9000);
return () => {
netService.stop();
netService.delegate = null;
netService = null;
};
});
}
availablePort() {
const SIZE_OF_SOCKADDR_IN = 16;
const sock = socket(2, 1, 0);
if (sock < 0) {
return -1;
}
let sockAddrIn = new sockaddr_in();
sockAddrIn.sin_len = SIZE_OF_SOCKADDR_IN;
sockAddrIn.sin_family = 2;
sockAddrIn.sin_port = 0;
sockAddrIn.sin_addr.s_addr = 0;
const sockAddrRef = new interop.Reference(sockaddr, sockAddrIn);
if (bind(sock, sockAddrRef, SIZE_OF_SOCKADDR_IN) < 0) {
return -1;
}
const length = new interop.Reference(SIZE_OF_SOCKADDR_IN);
if (getsockname(sock, sockAddrRef, length) < 0) {
return -1;
}
close(sock);
const port = (sockAddrIn.sin_port << 8) | (sockAddrIn.sin_port >> 8);
const portIs16Bits = port & 0xffff;
return portIs16Bits;
}
}
var ZeroConfServiceDelegate = /** @class */ (function (_super) {
__extends(ZeroConfServiceDelegate, _super);
function ZeroConfServiceDelegate() {
return _super !== null && _super.apply(this, arguments) || this;
}
ZeroConfServiceDelegate.new = function () {
return _super.new.call(this);
};
ZeroConfServiceDelegate.prototype.initWithObserver = function (observer) {
this._observer = observer;
return this;
};
ZeroConfServiceDelegate.prototype.netServiceDidNotPublish = function (sender, errorDict) {
var errCode = Number(errorDict.objectForKey("NSNetServicesErrorCode"));
var status = zeroConfStatus.failed;
var zc = ZeroConfServiceDelegate.getZeroConf(status, sender);
this._observer.error({ errorCode: errCode, zeroConf: zc });
};
ZeroConfServiceDelegate.prototype.netServiceDidNotResolve = function (sender, errorDict) {
var errCode = Number(errorDict.objectForKey("NSNetServicesErrorCode"));
var status = zeroConfStatus.failed;
var zc = ZeroConfServiceDelegate.getZeroConf(status, sender);
this._observer.error({ errorCode: errCode, zeroConf: zc });
};
ZeroConfServiceDelegate.prototype.netServiceDidPublish = function (sender) {
var status = zeroConfStatus.success;
this._observer.next(ZeroConfServiceDelegate.getZeroConf(status, sender));
};
ZeroConfServiceDelegate.prototype.netServiceDidResolveAddress = function (sender) {
var INET6_ADDRLEN = 46;
var addrCount = sender.addresses.count;
var addrs = [];
for (var count = 0; count < addrCount; count++) {
var bytes = sender.addresses.objectAtIndex(count).bytes;
var sockAddrRef = new interop.Reference(sockaddr_in, bytes);
var sinAddr = null;
if (sockAddrRef.value.sin_family === 2 /*AF_INET*/) {
sinAddr = sockAddrRef.value.sin_addr;
}
else if (sockAddrRef.value.sin_family === 30 /*AF_INET6*/) {
// At the 8th bytes offset,from the start of the structure, IPv6
// address starts
sinAddr = interop.handleof(sockAddrRef).add(8);
}
if (sinAddr) {
var sinFamily = sockAddrRef.value.sin_family;
var addrStr = interop.alloc(INET6_ADDRLEN);
var result = inet_ntop(sinFamily, sinAddr, addrStr, INET6_ADDRLEN);
if (result) {
var addr = NSString.stringWithUTF8String(addrStr).toString();
var address = { address: addr, type: sinFamily };
addrs.push(address);
}
}
}
if (addrs.length) {
var status = zeroConfStatus.success;
var zc = ZeroConfServiceDelegate.getZeroConf(status, sender, addrs);
this._observer.next(zc);
}
};
ZeroConfServiceDelegate.prototype.netServiceDidStop = function (sender) {
var status = zeroConfStatus.serviceEnds;
this._observer.next(new ZeroConf({ status: status }));
};
ZeroConfServiceDelegate.prototype.netServiceDidUpdateTXTRecordData = function (sender, data) { };
ZeroConfServiceDelegate.prototype.netServiceWillPublish = function (sender) {
var status = zeroConfStatus.serviceBegins;
this._observer.next(ZeroConfServiceDelegate.getZeroConf(status, sender));
};
ZeroConfServiceDelegate.prototype.netServiceWillResolve = function (sender) {
var status = zeroConfStatus.serviceBegins;
this._observer.next(ZeroConfServiceDelegate.getZeroConf(status, sender));
};
ZeroConfServiceDelegate.getZeroConf = function (status, sender, addresses) {
return new ZeroConf({
status: status,
domain: sender.domain,
type: sender.type,
hostName: sender.hostName,
name: sender.name,
port: sender.port,
addresses: addresses
});
};
// Note: This ObjCProtocols is needed.
ZeroConfServiceDelegate.ObjCProtocols = [NSNetServiceDelegate];
return ZeroConfServiceDelegate;
}(NSObject));
//# sourceMappingURL=zeroconf-service.ios.js.map