UNPKG

nativescript-dna-netservices

Version:

NativeScript plugin for Bonjour/ZeroConf and network monitoring. RxJS based APIs for Android and iOS.

149 lines 6.46 kB
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