2016-04-24 16:04:21 -04:00
|
|
|
# This module should be imported from REPL, not run from command line.
|
|
|
|
import socket
|
|
|
|
import uos
|
|
|
|
import websocket
|
|
|
|
import websocket_helper
|
|
|
|
|
|
|
|
listen_s = None
|
|
|
|
client_s = None
|
|
|
|
|
2016-04-25 11:44:37 -04:00
|
|
|
def setup_conn(port):
|
2016-04-24 16:04:21 -04:00
|
|
|
global listen_s, client_s
|
|
|
|
listen_s = socket.socket()
|
|
|
|
listen_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
|
|
2016-04-25 11:44:37 -04:00
|
|
|
ai = socket.getaddrinfo("0.0.0.0", port)
|
2016-04-24 16:04:21 -04:00
|
|
|
print("Bind address info:", ai)
|
|
|
|
addr = ai[0][4]
|
|
|
|
|
|
|
|
listen_s.bind(addr)
|
|
|
|
listen_s.listen(1)
|
2016-04-24 17:31:43 -04:00
|
|
|
listen_s.setsockopt(socket.SOL_SOCKET, 20, accept_conn)
|
2016-04-25 11:44:37 -04:00
|
|
|
print("WebREPL daemon started on port %d" % port)
|
2016-04-24 16:04:21 -04:00
|
|
|
|
|
|
|
|
2016-04-24 17:31:43 -04:00
|
|
|
def accept_conn(listen_sock):
|
|
|
|
global client_s
|
|
|
|
cl, remote_addr = listen_sock.accept()
|
|
|
|
client_s = cl
|
2016-04-24 16:04:21 -04:00
|
|
|
websocket_helper.server_handshake(cl)
|
|
|
|
ws = websocket.websocket(cl, True)
|
|
|
|
cl.setblocking(False)
|
|
|
|
# notify REPL on socket incoming data
|
|
|
|
cl.setsockopt(socket.SOL_SOCKET, 20, uos.dupterm_notify)
|
|
|
|
uos.dupterm(ws)
|
2016-04-24 17:31:43 -04:00
|
|
|
print("WebREPL connected\n>>> ", end="")
|
|
|
|
|
|
|
|
|
|
|
|
def stop():
|
|
|
|
global listen_s, client_s
|
|
|
|
uos.dupterm(None)
|
|
|
|
if client_s:
|
|
|
|
client_s.close()
|
|
|
|
if listen_s:
|
|
|
|
listen_s.close()
|
|
|
|
|
|
|
|
|
2016-04-25 11:44:37 -04:00
|
|
|
def start(port=8266):
|
2016-04-24 17:31:43 -04:00
|
|
|
stop()
|
2016-04-25 11:44:37 -04:00
|
|
|
setup_conn(port)
|