2121"""
2222
2323import asyncio
24- import ipaddress
2524import random
2625from functools import lru_cache
26+ from ipaddress import IPv4Address , IPv6Address , _BaseAddress , ip_address
2727from typing import TYPE_CHECKING , Dict , List , Optional , Set , Union , cast
2828
2929from .._dns import (
@@ -90,7 +90,7 @@ def instance_name_from_service_info(info: "ServiceInfo") -> str:
9090 return info .name [: - len (service_name ) - 1 ]
9191
9292
93- _cached_ip_addresses = lru_cache (maxsize = 256 )(ipaddress . ip_address )
93+ _cached_ip_addresses = lru_cache (maxsize = 256 )(ip_address )
9494
9595
9696class ServiceInfo (RecordUpdateListener ):
@@ -158,8 +158,8 @@ def __init__(
158158 self .type = type_
159159 self ._name = name
160160 self .key = name .lower ()
161- self ._ipv4_addresses : List [ipaddress . IPv4Address ] = []
162- self ._ipv6_addresses : List [ipaddress . IPv6Address ] = []
161+ self ._ipv4_addresses : List [IPv4Address ] = []
162+ self ._ipv6_addresses : List [IPv6Address ] = []
163163 if addresses is not None :
164164 self .addresses = addresses
165165 elif parsed_addresses is not None :
@@ -260,7 +260,7 @@ def addresses_by_version(self, version: IPVersion) -> List[bytes]:
260260
261261 def ip_addresses_by_version (
262262 self , version : IPVersion
263- ) -> Union [List [ipaddress . IPv4Address ], List [ipaddress . IPv6Address ], List [ipaddress . _BaseAddress ]]:
263+ ) -> Union [List [IPv4Address ], List [IPv6Address ], List [_BaseAddress ]]:
264264 """List ip_address objects matching IP version.
265265
266266 Addresses are guaranteed to be returned in LIFO (last in, first out)
@@ -273,7 +273,7 @@ def ip_addresses_by_version(
273273
274274 def _ip_addresses_by_version_value (
275275 self , version_value : int
276- ) -> Union [List [ipaddress . IPv4Address ], List [ipaddress . IPv6Address ], List [ipaddress . _BaseAddress ]]:
276+ ) -> Union [List [IPv4Address ], List [IPv6Address ], List [_BaseAddress ]]:
277277 """Backend for addresses_by_version that uses the raw value."""
278278 if version_value == _IPVersion_All_value :
279279 return [* self ._ipv4_addresses , * self ._ipv6_addresses ]
@@ -366,31 +366,31 @@ def get_name(self) -> str:
366366
367367 def _get_ip_addresses_from_cache_lifo (
368368 self , zc : 'Zeroconf' , now : float , type : int
369- ) -> List [Union [ipaddress . IPv4Address , ipaddress . IPv6Address ]]:
369+ ) -> List [Union [IPv4Address , IPv6Address ]]:
370370 """Set IPv6 addresses from the cache."""
371- address_list : List [Union [ipaddress . IPv4Address , ipaddress . IPv6Address ]] = []
371+ address_list : List [Union [IPv4Address , IPv6Address ]] = []
372372 for record in self ._get_address_records_from_cache_by_type (zc , type ):
373373 if record .is_expired (now ):
374374 continue
375375 try :
376- ip_address = _cached_ip_addresses (record .address )
376+ ip_addr = _cached_ip_addresses (record .address )
377377 except ValueError :
378378 continue
379379 else :
380- address_list .append (ip_address )
380+ address_list .append (ip_addr )
381381 address_list .reverse () # Reverse to get LIFO order
382382 return address_list
383383
384384 def _set_ipv6_addresses_from_cache (self , zc : 'Zeroconf' , now : float ) -> None :
385385 """Set IPv6 addresses from the cache."""
386386 self ._ipv6_addresses = cast (
387- "List[ipaddress. IPv6Address]" , self ._get_ip_addresses_from_cache_lifo (zc , now , _TYPE_AAAA )
387+ "List[IPv6Address]" , self ._get_ip_addresses_from_cache_lifo (zc , now , _TYPE_AAAA )
388388 )
389389
390390 def _set_ipv4_addresses_from_cache (self , zc : 'Zeroconf' , now : float ) -> None :
391391 """Set IPv4 addresses from the cache."""
392392 self ._ipv4_addresses = cast (
393- "List[ipaddress. IPv4Address]" , self ._get_ip_addresses_from_cache_lifo (zc , now , _TYPE_A )
393+ "List[IPv4Address]" , self ._get_ip_addresses_from_cache_lifo (zc , now , _TYPE_A )
394394 )
395395
396396 def update_record (self , zc : 'Zeroconf' , now : float , record : Optional [DNSRecord ]) -> None :
@@ -431,46 +431,49 @@ def _process_record_threadsafe(self, zc: 'Zeroconf', record: DNSRecord, now: flo
431431 if record .is_expired (now ):
432432 return False
433433
434- if record .key == self .server_key and isinstance (record , DNSAddress ):
434+ record_key = record .key
435+ if record_key == self .server_key and type (record ) is DNSAddress :
435436 try :
436437 ip_addr = _cached_ip_addresses (record .address )
437438 except ValueError as ex :
438439 log .warning ("Encountered invalid address while processing %s: %s" , record , ex )
439440 return False
440441
441- if ip_addr . version == 4 :
442- if not self ._ipv4_addresses :
442+ if type ( ip_addr ) is IPv4Address :
443+ if self ._ipv4_addresses :
443444 self ._set_ipv4_addresses_from_cache (zc , now )
444445
445- if ip_addr not in self ._ipv4_addresses :
446- self ._ipv4_addresses .insert (0 , ip_addr )
446+ ipv4_addresses = self ._ipv4_addresses
447+ if ip_addr not in ipv4_addresses :
448+ ipv4_addresses .insert (0 , ip_addr )
447449 return True
448- elif ip_addr != self . _ipv4_addresses [0 ]:
449- self . _ipv4_addresses .remove (ip_addr )
450- self . _ipv4_addresses .insert (0 , ip_addr )
450+ elif ip_addr != ipv4_addresses [0 ]:
451+ ipv4_addresses .remove (ip_addr )
452+ ipv4_addresses .insert (0 , ip_addr )
451453
452454 return False
453455
454456 if not self ._ipv6_addresses :
455457 self ._set_ipv6_addresses_from_cache (zc , now )
456458
459+ ipv6_addresses = self ._ipv6_addresses
457460 if ip_addr not in self ._ipv6_addresses :
458- self . _ipv6_addresses .insert (0 , ip_addr )
461+ ipv6_addresses .insert (0 , ip_addr )
459462 return True
460463 elif ip_addr != self ._ipv6_addresses [0 ]:
461- self . _ipv6_addresses .remove (ip_addr )
462- self . _ipv6_addresses .insert (0 , ip_addr )
464+ ipv6_addresses .remove (ip_addr )
465+ ipv6_addresses .insert (0 , ip_addr )
463466
464467 return False
465468
466- if record . key != self .key :
469+ if record_key != self .key :
467470 return False
468471
469- if record .type == _TYPE_TXT and isinstance (record , DNSText ) :
472+ if record .type == _TYPE_TXT and type (record ) is DNSText :
470473 self ._set_text (record .text )
471474 return True
472475
473- if record .type == _TYPE_SRV and isinstance (record , DNSService ) :
476+ if record .type == _TYPE_SRV and type (record ) is DNSService :
474477 old_server_key = self .server_key
475478 self .name = record .name
476479 self .server = record .server
@@ -495,16 +498,17 @@ def dns_addresses(
495498 name = self .server or self .name
496499 ttl = override_ttl if override_ttl is not None else self .host_ttl
497500 class_ = _CLASS_IN | _CLASS_UNIQUE
501+ version_value = version .value
498502 return [
499503 DNSAddress (
500504 name ,
501- _TYPE_AAAA if address . version == 6 else _TYPE_A ,
505+ _TYPE_AAAA if type ( ip_addr ) is IPv6Address else _TYPE_A ,
502506 class_ ,
503507 ttl ,
504- address .packed ,
508+ ip_addr .packed ,
505509 created = created ,
506510 )
507- for address in self ._ip_addresses_by_version_value (version . value )
511+ for ip_addr in self ._ip_addresses_by_version_value (version_value )
508512 ]
509513
510514 def dns_pointer (self , override_ttl : Optional [int ] = None , created : Optional [float ] = None ) -> DNSPointer :
0 commit comments