Skip to content

Instantly share code, notes, and snippets.

@niedbalski
Created February 28, 2025 10:04
Show Gist options
  • Save niedbalski/b7a29eaa78eed8b690715795a4f2af05 to your computer and use it in GitHub Desktop.
Save niedbalski/b7a29eaa78eed8b690715795a4f2af05 to your computer and use it in GitHub Desktop.
import select,socket,asyncio,datetime,dataclasses,typing
s,sk,a,G,T,c=select,socket,asyncio,typing.Generic,typing.TypeVar('T'),typing.cast
class X:
def __init__(s,c):s.c,s.g,s.r,s.e,s.x=c,c.__await__(),None,None,0
def cancel(s):s.x=1
class R(G[T]):
def __await__(s):r=yield s;return c(T,r)
@dataclasses.dataclass
class S(R[None]):s:float
@dataclasses.dataclass
class T0(R[None]):s:sk.socket
@dataclasses.dataclass
class T1(R[None]):s:sk.socket
@dataclasses.dataclass
class T2(R[None]):s:sk.socket
@dataclasses.dataclass
class T3(R[X]):c:typing.Any
@dataclasses.dataclass
class T4(R[None]):t:X
class W:
def __init__(s,k,t):s.s,s.t=k,t;s.s.setblocking(0)
def fileno(s):return s.s.fileno()
def __eq__(s,o):return s.s==o.s if isinstance(o,W)else NotImplemented
def __hash__(s):return hash(s.s)
def L(m):
q,r,w,e,t=[(X(m),None)],set(),set(),set(),[]
while 1:
while q:
z,d=q.pop(0)
try:y=z.c.send(d);K=z.x
except StopIteration as x:z.r=x.value;break
except:z.e=1;break
if K:
try:z.g.throw(a.CancelledError());q.append((z,None))
except StopIteration as x:z.r=x.value
except:z.e=1
continue
if isinstance(y,T3):n=X(y.c);q[:0]=[(z,n)];q+=(n,None),
elif isinstance(y,T4):y.t.cancel();q[:0]=[(z,None)]
elif isinstance(y,S):t+=[(datetime.datetime.now()+datetime.timedelta(seconds=y.s),z)]
elif isinstance(y,T0):r.add(W(y.s,z))
elif isinstance(y,T1):w.add(W(y.s,z))
elif isinstance(y,T2):e.add(W(y.s,z))
t=[(i,j)for i,j in t if not j.x]
h=min(t,key=lambda x:x[0])[0]if t else None
r={i for i in r if i.fileno()>=0and not i.t.x}
w={i for i in w if i.fileno()>=0and not i.t.x}
e={i for i in e if i.fileno()>=0and not i.t.x}
if r or w or e or h:
try:
o=max((h-datetime.datetime.now()).total_seconds(),0)if h else None
x,y,z=s.select(r,w,e,o)
for i in x:q+=[(i.t,i)];r.remove(i)
for i in y:q+=[(i.t,i)];w.remove(i)
for i in z:q+=[(i.t,i)];e.remove(i)
for i,(j,k)in enumerate(t):
if datetime.datetime.now()>=j:q+=[(k,None)];t.pop(i)
except:continue
if not q:break
async def H(c):return await T3(c)
async def J(t):await T4(t)
async def K(s):await S(s)
async def O(s,c):await T0(s);return s.recv(c)
async def P(s,d):await T1(s);return s.send(d)
async def Q(h,p):
s=sk.socket(sk.AF_INET,sk.SOCK_STREAM);s.setblocking(0)
try:s.connect((h,p))
except:0
await T1(s)
e=s.getsockopt(sk.SOL_SOCKET,sk.SO_ERROR)
if e:raise ConnectionError()
return s
async def R0(h,p,b=5):
s=sk.socket(sk.AF_INET,sk.SOCK_STREAM)
s.setsockopt(sk.SOL_SOCKET,sk.SO_REUSEADDR,1)
s.setblocking(0);s.bind((h,p));s.listen(b)
await T0(s);return s
async def Z(s):await T0(s);c,a=s.accept();c.setblocking(0);return c,a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment