Sans-IO pattern, language server protocol implementation
Project description
Language Server Protocol implementation in sans-io pattern. Which is highly inspired by Sans-IO pattern. And some relatived projects: - hyper-h2 - h11
So it can be integreted with trio, asyncio, or some other frameworks easily.
Required python version
Python >= 3.6
Features
Pure python implementation
Don’t relatived to other site-packages
Can (should) easily integreted with high level framework like trio, asyncio
How to install it
There are two ways to install lsp
Install via pip (recommended)
pip install lsp
Install via setup.py
python setup.py install
Basic Usage example
Client side
import socket
from lsp import Connection, NEED_DATA, DataReceived, MessageEnd
sock = socket.socket()
sock.connect(("localhost", 10001))
conn = Connection("client")
answer = input("Send request?(y/n)")
while answer == "y":
# use connection send_json method to convert json object to bytes
request_data = conn.send_json({"method": "didOpen"})
# then we can send data to server
sock.sendall(request_data)
while True:
# and then we can get next_event of connection, it can indicate
# that what should we do.
event = conn.next_event()
# we need to receive data from server
if event is NEED_DATA:
try:
data = sock.recv(1024)
except ConnectionResetError:
print('The server connection is closed, So I will leave:)')
conn.close()
sock.close()
exit(0)
else:
print("return from sock.recv")
conn.receive(data)
# we have receive data from server
elif isinstance(event, DataReceived):
print("Receive event, content:")
print(event)
elif isinstance(event, MessageEnd):
print("Server sending data complete.")
break
# then we can call get_received_data() to extract out what we get
header, response_body = conn.get_received_data()
print("Response header from server:")
print(header)
print("Response body from server:")
print(response_body)
answer = input("Send request?(y/n)")
conn.go_next_circle()
Server side
import socket
from lsp import Connection, NEED_DATA, RequestReceived, DataReceived, MessageEnd
sock = socket.socket()
sock.bind(("0.0.0.0", 10001))
sock.listen(1)
client_sock, addr = sock.accept()
print(f"get connection from {client_sock}")
conn = Connection("server")
try:
while True:
while True:
# call next event to indicate what server socket should do.
event = conn.next_event()
# no data coming yet, so the return value is NEED_DATA
if event is NEED_DATA:
data = client_sock.recv(1024)
if data == b"":
print("Client connection is closed, I will exit.")
exit(0)
conn.receive(data)
# Request header is coming :)
elif isinstance(event, RequestReceived):
print("Receive request header")
print(event.to_data())
# Request data is coming :)
elif isinstance(event, DataReceived):
print("Receive request data")
print(event.to_data())
# client has send data completely.
elif isinstance(event, MessageEnd):
print("Data receive complete:)")
break
# so we can call con.get_received_data to fetch what client send.
received_data = conn.get_received_data()
print(f"Receiving data: {received_data}")
# send response back to client.
print(f"Sending response to client")
data = conn.send_json({"Content": "I am received:)"})
client_sock.sendall(data)
print(f"For now, go to next circle")
# then we need to call go_next_circle, to get another request from client.
conn.go_next_circle()
finally:
sock.close()
For more usage example, please check out files in examples/servers folder.
Main API in lsp
Want to send json data? You can try
conn.send_json
.Want to know what we should do next? You can try
conn.next_event
.After receive data, please don’t forget to call
conn.receive(data)
. Which will save data into inner buffer, and it can driveconn.next_event
method returns other events.When Receive
MessageEnd
event, we can just callconn.get_received_data
to fetch for incoming data.
Main events we will get from next_event
Client
Client side will get the following values from next_events:
NEED_DATA - which indicate that we need to receive data from server.
ResponseReceived - Client have receive response header.
DataReceived - Client have receive resposne body.
MessageEnd - Receive data from server complete.
Server
Server side will get the following values from next_events:
NEED_DATA - which indicate that we need to receive data from client.
RequestReceived - Client have send request header, and we receive it.
DataReceived - Server have receive response body from client.
MessageEnd - Client sending request complete.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file lsp-0.1.1.tar.gz
.
File metadata
- Download URL: lsp-0.1.1.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.6.3 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.0rc1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 28006638eacd60393ddcb7018d70cf7dbf835eced6ccb87c9dcecf3ec30bb5c3 |
|
MD5 | 48538bd84d7d1c349752d89442233dc9 |
|
BLAKE2b-256 | d8270e78fe8276757802a267af7c81f8e02c2d4d67e5ecccd71595ccf21e1848 |