diff --git a/mdns/mdns-tests.ts b/mdns/mdns-tests.ts new file mode 100644 index 0000000000..20a336025c --- /dev/null +++ b/mdns/mdns-tests.ts @@ -0,0 +1,84 @@ +/** + * Created by stefansteinhart on 30.01.15. + */ + +/// + +var mdns = require('mdns') + +var ad:MDNS.Advertisement = mdns.createAdvertisement(mdns.tcp('http'), 4321); + +ad.start(); + +var browser = mdns.createBrowser(mdns.tcp('http')); + +browser.on('serviceUp', function(service:MDNS.Service) { + console.log("service up: ", service); +}); +browser.on('serviceDown', function(service:MDNS.Service) { + console.log("service down: ", service); +}); + +browser.start(); + +var r0 = mdns.tcp('http') // string form: _http._tcp + , r1 = mdns.udp('osc', 'api-v1') // string form: _osc._udp,_api-v1 + , r2 = new mdns.ServiceType('http', 'tcp') // string form: _http._tcp + , r3 = mdns.makeServiceType('https', 'tcp') // string form: _https._tcp + ; + +var txt_record = { + name: 'bacon' + , chunky: true + , strips: 5 +}; +var ad:MDNS.Advertisement = mdns.createAdvertisement(mdns.tcp('http'), 4321, {txtRecord: txt_record}); + +var sequence = [ + mdns.rst.DNSServiceResolve() + , mdns.rst.DNSServiceGetAddrInfo({families: [4] }) +]; + +var browser = mdns.createBrowser(mdns.tcp('http'), {resolverSequence: sequence}); + +interface HammerTimeService extends MDNS.Service { + hammerTime:Date; +} + +function MCHammer(options:any) { + options = options || {}; + return function MCHammer(service:HammerTimeService, next:()=>void) { + console.log('STOP!'); + setTimeout(function() { + console.log('hammertime...'); + service.hammerTime = new Date(); + next(); + }, options.delay || 1000); + } +} + +var browser = mdns.createBrowser( mdns.tcp('http') + , { networkInterface: mdns.loopbackInterface()}); + +var ad:MDNS.Advertisement; + +function createAdvertisement() { + try { + ad = mdns.createAdvertisement(mdns.tcp('http'), 1337); + ad.on('error', handleError); + ad.start(); + } catch (ex) { + handleError(ex); + } +} + +function handleError(error:MDNS.DnsSdError) { + switch (error.errorCode) { + case mdns.kDNSServiceErr_Unknown: + console.warn(error); + setTimeout(createAdvertisement, 5000); + break; + default: + throw error; + } +} \ No newline at end of file diff --git a/mdns/mdns.d.ts b/mdns/mdns.d.ts new file mode 100755 index 0000000000..032d7c5af4 --- /dev/null +++ b/mdns/mdns.d.ts @@ -0,0 +1,295 @@ +// Type definitions for node_mdns +// Project: https://github.com/agnat/node_mdns +// Definitions by: Stefan Steinhart +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +declare module MDNS { + + // --- Error --- + + interface DnsSdError extends Error { + errorCode?:number; + } + + // --- Ads --- + + interface AdvertisementOptions { + name?:string; + interfaceIndex?:number; + networkInterface?:string; + txtRecord?:any; + host?:any; + domain?:any; + flags?:any; + context?:any; + } + + interface AdvertisementCreatable { + new(serviceType:ServiceType, port:number, options?:AdvertisementOptions, callback?:(error:DnsSdError, service:Service)=>void):Advertisement; + } + + interface Advertisement extends NodeJS.EventEmitter { + start():void; + stop():void; + } + + // --- Browser --- + + interface BrowserOptions { + resolverSequence?:Array<(service:Service, next:()=>void)=>boolean>; + interfaceIndex?:number; + networkInterface?:string; + domain?:any; + context?:any; + flags?:any; + } + + interface Browser extends NodeJS.EventEmitter { + start():any; + stop():any; + } + + interface BrowserStatic { + new(serviceType:ServiceType, options?:BrowserOptions):Browser; + defaultResolverSequence:Array<(service:Service, next:()=>void)=>boolean> + } + + // --- Services --- + + interface Service { + addresses:Array; + flags:number; + fullname:string; + host:string; + interfaceIndex: number; + name?:string; + networkInterface:string; + port:number; + replyDomain:string; + type:ServiceType; + } + + interface ServiceType { + new(serviceTypeIdentifier:string):ServiceType; + new(name:string, protocol:string, ...subtypes:string[]):ServiceType; + new(serviceTypeIdentifier:Array):ServiceType; + new(serviceTypeIdentifier:{name:string; protocol:string; subtypes?:Array}):ServiceType; + new(serviceType:ServiceType):ServiceType; + + fullyQualified:boolean; + name:string; + protocol:string; + subtypes:Array; + + toString():string; + fromString(serviceTypeIdentifier:string):ServiceType; + + toArray():Array; + fromArray(serviceTypeIdentifier:Array):ServiceType; + + fromJSON(serviceTypeIdentifier:{name:string; protocol:string; subtypes?:Array}):ServiceType; + fromJSON(serviceType:ServiceType):ServiceType; + } + + // interface for extending with custom resolvers + interface MDNSResolverSequenceTasks { + + } + + interface DefaultResolverSequenceTasks extends MDNSResolverSequenceTasks { + DNSServiceResolve(options?:{flags:any}):(service:Service, next:()=>void)=>boolean; + DNSServiceGetAddrInfo(options?:any):(service:Service, next:()=>void)=>boolean; + getaddrinfo(options?:any):(service:Service, next:()=>void)=>boolean; + makeAddressesUnique():(service:Service, next:()=>void)=>boolean; + filterAddresses(fn:(address:string, index?:number, addresses?:Array)=>boolean):void; + logService():void; + } + + // --- Statics & Classes --- + + var Advertisement:AdvertisementCreatable; + var Browser:BrowserStatic; + var ServiceType:ServiceType; + var rst:DefaultResolverSequenceTasks; + + // static functions + + function tcp(name:string, ...subtypes:string[]):ServiceType; + + function udp(name:string, ...subtypes:string[]):ServiceType; + + function makeServiceType(name:string, protocol:string, ...subtypes:string[]):ServiceType; + + function makeServiceType(serviceTypeIdentifier:string):ServiceType; + + function makeServiceType(serviceTypeIdentifier:Array):ServiceType; + + function makeServiceType(serviceTypeIdentifier:{name:string; protocol:string; subtypes?:Array}):ServiceType; + + function makeServiceType(serviceType:ServiceType):ServiceType; + + function createBrowser(serviceType:ServiceType, options?:BrowserOptions):Browser; + + function createAdvertisement(serviceType:ServiceType, port:number, options?:AdvertisementOptions, callback?:(error:DnsSdError, service:Service)=>void):Advertisement; + + function resolve(service:Service, sequence?:Array<(service:Service, next:()=>void)=>boolean>, callback?:(error:DnsSdError, service:Service)=>void):void; + + function browseThemAll(options:BrowserOptions):Browser; + + function loopbackInterface():any; + + // constants + + var isAvahi:boolean; + + // -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- + + //Constants from dns_sd.h (C-Code of Bonjour -> see https://developer.apple.com/library/mac/documentation/Networking/Reference/DNSServiceDiscovery_CRef/Reference/reference.html) + + var _DNS_SD_H:number; + + var kDNSServiceMaxDomainName:string; + var kDNSServiceMaxServiceName:number; + var kDNSServiceOutputFlags:any; + var kDNSServiceProperty_DaemonVersion:number; + + var kDNSServiceClass_IN:number; + + var kDNSServiceErr_NoError:number; + var kDNSServiceErr_Unknown:number; + var kDNSServiceErr_NoSuchName:number; + var kDNSServiceErr_NoMemory:number; + var kDNSServiceErr_BadParam:number; + var kDNSServiceErr_BadReference:number; + var kDNSServiceErr_BadState:number; + var kDNSServiceErr_BadFlags:number; + var kDNSServiceErr_Unsupported:number; + var kDNSServiceErr_NotInitialized:number; + var kDNSServiceErr_AlreadyRegistered:number; + var kDNSServiceErr_NameConflict:number; + var kDNSServiceErr_Invalid:number; + var kDNSServiceErr_Firewall:number; + var kDNSServiceErr_Incompatible:number; + var kDNSServiceErr_BadInterfaceIndex:number; + var kDNSServiceErr_Refused:number; + var kDNSServiceErr_NoSuchRecord:number; + var kDNSServiceErr_NoAuth:number; + var kDNSServiceErr_NoSuchKey:number; + var kDNSServiceErr_NATTraversal:number; + var kDNSServiceErr_DoubleNAT:number; + var kDNSServiceErr_BadTime:number; + var kDNSServiceErr_BadSig:number; + var kDNSServiceErr_BadKey:number; + var kDNSServiceErr_Transient:number; + var kDNSServiceErr_ServiceNotRunning:number; + var kDNSServiceErr_NATPortMappingUnsupported:number; + var kDNSServiceErr_NATPortMappingDisabled:number; + var kDNSServiceErr_NoRouter:number; + var kDNSServiceErr_PollingMode:number; + var kDNSServiceErr_Timeout:number; + + var kDNSServiceType_A:number; + var kDNSServiceType_NS:number; + var kDNSServiceType_MD:number; + var kDNSServiceType_MF:number; + var kDNSServiceType_CNAME:number; + var kDNSServiceType_SOA:number; + var kDNSServiceType_MB:number; + var kDNSServiceType_MG:number; + var kDNSServiceType_MR:number; + var kDNSServiceType_NULL:number; + var kDNSServiceType_WKS:number; + var kDNSServiceType_PTR:number; + var kDNSServiceType_HINFO:number; + var kDNSServiceType_MINFO:number; + var kDNSServiceType_MX:number; + var kDNSServiceType_TXT:number; + var kDNSServiceType_RP:number; + var kDNSServiceType_AFSDB:number; + var kDNSServiceType_X25:number; + var kDNSServiceType_ISDN:number; + var kDNSServiceType_RT:number; + var kDNSServiceType_NSAP:number; + var kDNSServiceType_NSAP_PTR:number; + var kDNSServiceType_SIG:number; + var kDNSServiceType_KEY:number; + var kDNSServiceType_PX:number; + var kDNSServiceType_GPOS:number; + var kDNSServiceType_AAAA:number; + var kDNSServiceType_LOC:number; + var kDNSServiceType_NXT:number; + var kDNSServiceType_EID:number; + var kDNSServiceType_NIMLOC:number; + var kDNSServiceType_SRV:number; + var kDNSServiceType_ATMA:number; + var kDNSServiceType_NAPTR:number; + var kDNSServiceType_KX:number; + var kDNSServiceType_CERT:number; + var kDNSServiceType_A6:number; + var kDNSServiceType_DNAME:number; + var kDNSServiceType_SINK:number; + var kDNSServiceType_OPT:number; + var kDNSServiceType_APL:number; + var kDNSServiceType_DS:number; + var kDNSServiceType_SSHFP:number; + var kDNSServiceType_IPSECKEY:number; + var kDNSServiceType_RRSIG:number; + var kDNSServiceType_NSEC:number; + var kDNSServiceType_DNSKEY:number; + var kDNSServiceType_DHCID:number; + var kDNSServiceType_NSEC3:number; + var kDNSServiceType_NSEC3PARAM:number; + var kDNSServiceType_HIP:number; + var kDNSServiceType_SPF:number; + var kDNSServiceType_UINFO:number; + var kDNSServiceType_UID:number; + var kDNSServiceType_GID:number; + var kDNSServiceType_UNSPEC:number; + var kDNSServiceType_TKEY:number; + var kDNSServiceType_TSIG:number; + var kDNSServiceType_IXFR:number; + var kDNSServiceType_AXFR:number; + var kDNSServiceType_MAILB:number; + var kDNSServiceType_MAILA:number; + var kDNSServiceType_ANY:number; + + var kDNSServiceFlagsMoreComing:number; + var kDNSServiceFlagsAdd:number; + var kDNSServiceFlagsDefault:number; + var kDNSServiceFlagsNoAutoRename:number; + var kDNSServiceFlagsShared:number; + var kDNSServiceFlagsUnique:number; + var kDNSServiceFlagsBrowseDomains:number; + var kDNSServiceFlagsRegistrationDomains:number; + var kDNSServiceFlagsLongLivedQuery:number; + var kDNSServiceFlagsAllowRemoteQuery:number; + var kDNSServiceFlagsForceMulticast:number; + var kDNSServiceFlagsKnownUnique:number; + var kDNSServiceFlagsReturnIntermediates:number; + var kDNSServiceFlagsNonBrowsable:number; + var kDNSServiceFlagsShareConnection:number; + var kDNSServiceFlagsSuppressUnusable:number; + var kDNSServiceFlagsWakeOnResolve:number; + var kDNSServiceFlagsBackgroundTrafficClass:number; + var kDNSServiceFlagsIncludeAWDL:number; + var kDNSServiceFlagsValidate:number; + var kDNSServiceFlagsSecure:number; + var kDNSServiceFlagsInsecure:number; + var kDNSServiceFlagsBogus:number; + var kDNSServiceFlagsIndeterminate:number; + var kDNSServiceFlagsUnicastResponse:number; + var kDNSServiceFlagsValidateOptional:number; + var kDNSServiceFlagsWakeOnlyService:number; + + var kDNSServiceProtocol_IPv4:number; + var kDNSServiceProtocol_IPv6:number; + var kDNSServiceProtocol_UDP:number; + var kDNSServiceProtocol_TCP:number; +} + +declare module "mdns" { + + export = MDNS; +} \ No newline at end of file