Skip to content

Commit

Permalink
fix: various fixes in python port
Browse files Browse the repository at this point in the history
  • Loading branch information
ivelin committed Jan 7, 2020
1 parent ed7c608 commit ceac7ab
Show file tree
Hide file tree
Showing 8 changed files with 105 additions and 76 deletions.
24 changes: 15 additions & 9 deletions cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
# import argparse
import asyncio
import logging
from peerjs.peerroom import PeerRoom
import sys

# from aiortc import RTCIceCandidate, RTCSessionDescription
from peerjs.peer import Peer
from peerjs.peer import Peer, PeerOptions
from peerjs.peerroom import PeerRoom

print(sys.version)

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -137,12 +141,13 @@ async def pnp_service_connect() -> Peer:
# Unless the user explicitly requests a refresh.
global myPeerId
log.info('pnpService: last saved myPeerId', myPeerId)
peer = Peer(id=myPeerId, {
'host': AMBIANIC_PNP_HOST,
'port': AMBIANIC_PNP_PORT,
'secure': AMBIANIC_PNP_SECURE,
'debug': 2
})
options = PeerOptions(
host=AMBIANIC_PNP_HOST,
port=AMBIANIC_PNP_PORT,
secure=AMBIANIC_PNP_SECURE,
debug=2
)
peer = Peer(id=myPeerId, peer_options=options)
log.info('pnpService: peer created')
await peer.start()
log.info('pnpService: peer activated')
Expand Down Expand Up @@ -175,7 +180,8 @@ def stop():
# add_signaling_arguments(parser)
# args = parser.parse_args()
# if args.verbose:
logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
log.debug('Log level set to debug')
# signaling = create_signaling(args)
# signaling = AmbianicPnpSignaling(args)
# pc = RTCPeerConnection()
Expand Down
20 changes: 14 additions & 6 deletions run-dev.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f "$0")
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname "$SCRIPT")
# Dir to this script, e.g. /home/user/bin/
SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
echo $SCRIPTPATH

set -ex
# pip3 install --editable src
# set quick exit and verbose shell output
# set -ex

# check if setup files have been touched recently
SETUP_PY_MOD=$(expr $(expr $(date +%s) - $(date -r "$SCRIPTPATH/src/setup.py" +"%s")) / 60)
SETUP_CFG_MOD=$(expr $(expr $(date +%s) - $(date -r "$SCRIPTPATH/src/setup.cfg" +"%s")) / 60)

if [ 2 -gt $SETUP_PY_MOD ] || [ 2 -gt $SETUP_CFG_MOD ]; then
echo "Installing peerjs"
pip3 install --editable src
fi

python3 $SCRIPTPATH/cli.py
9 changes: 6 additions & 3 deletions src/peerjs/api.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
"""Client side abstraction for commonly used REST APIs."""

import time
import math
import logging
import math
import time
from typing import Any

import aiohttp

from .enums import HttpMethod
from .util import util

Expand All @@ -30,7 +33,7 @@ async def fetch(url=None, method=None, body=None):
class API:
"""Client side methods for commonly used REST APIs."""

def __init__(self, options=None):
def __init__(self, options: Any = None):
"""Create API instance."""
self._options = options

Expand Down
10 changes: 6 additions & 4 deletions src/peerjs/baseconnection.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
"""Base abstractions for peer to peer connections."""
from pyee import AsyncIOEventEmitter
from .servermessage import ServerMessage
from .enums import ConnectionType
from abc import abstractmethod

from aiortc import RTCPeerConnection
from pyee import AsyncIOEventEmitter

from .enums import ConnectionType
from .servermessage import ServerMessage


class BaseConnection(AsyncIOEventEmitter):
Expand All @@ -25,7 +27,7 @@ def __init__(
options: any = None
):
"""Create connection construct."""
super()
super().__init__()
self.metadata = options.metadata
self._open = False
self.connectionId: str = None
Expand Down
87 changes: 46 additions & 41 deletions src/peerjs/peer.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,57 @@
"""Python port of PeerJS client with built in signaling to PeerJS server."""
from typing import List
from pyee import AsyncIOEventEmitter, BaseEventEmitter
import logging
from .enums import \
ConnectionType, \
PeerErrorType, \
PeerEventType, \
SocketEventType, \
ServerMessageType
# import json
# import websockets
# from websockets import WebSocket, ConnectionClosed
import asyncio
from .socket import Socket
from .dataconnection import DataConnection
import logging
from dataclasses import dataclass
from typing import Any, List

import attr
from pyee import AsyncIOEventEmitter, BaseEventEmitter

from .api import API
from .baseconnection import BaseConnection
from .dataconnection import DataConnection
from .enums import (
ConnectionType,
PeerErrorType,
PeerEventType,
ServerMessageType,
SocketEventType,
)
from .servermessage import ServerMessage
from .api import API
from .socket import Socket
from .util import util

log = logging.getLogger(__name__)


@dataclass
class PeerConnectOption:
"""Peer connection configuration options."""

def __init__(self, **kwargs):
"""Create a peer connection options instance."""
self.label: str = None
self.metadata = None
self.serialization: str = None
self.reliable: bool = None
label: str = None
metadata: Any = None
serialization: str = None
reliable: bool = None


PEER_DEFAULT_KEY = "peerjs"


@dataclass
class PeerOptions:
"""Peer configuration options."""

def __init__(self, **kwargs):
"""Create a peer options instance."""
self.debug: int = 0 # 1: Errors, 2: Warnings, 3: All logs
self.host: str = util.CLOUD_HOST
self.port: int = util.CLOUD_PORT
self.path: str = "/"
self.key: str = Peer.DEFAULT_KEY
self.token: str = util.randomToken()
self.config = util.defaultConfig
self.secure: bool = None
for k, v in kwargs:
setattr(self, k, v)
debug: int = 0 # 1: Errors, 2: Warnings, 3: All logs
host: str = attr.ib(default=util.CLOUD_HOST)
port: int = util.CLOUD_PORT
path: str = "/"
key: str = PEER_DEFAULT_KEY
token: str = util.randomToken()
config: Any = util.defaultConfig
secure: bool = False


# 0: None, 1: Errors, 2: Warnings, 3: All logs
Expand Down Expand Up @@ -88,15 +92,15 @@ def __init__(self, **kwargs):
class Peer(AsyncIOEventEmitter):
"""A peer that can initiate direct connections with other peers."""

def __init__(self, id: str = None, **options):
def __init__(self,
id: str = None,
peer_options: PeerOptions = None):
"""Create a peer instance."""
super()

self._DEFAULT_KEY = "peerjs"
super().__init__()

self._options: PeerOptions
self._api: API
self._socket: Socket
self._options: PeerOptions = peer_options
self._api: API = None
self._socket: Socket = None

self._id: str = id
self._lastServerId: str = None
Expand All @@ -119,13 +123,13 @@ def __init__(self, id: str = None, **options):
self._id = id

# Configure options
self._options = PeerOptions(**options)
self._options = peer_options

# Set path correctly.
if self._options.path:
if self._options.path[0] != "/":
self._options.path = "/" + self._options.path
if self._options.path[self._options.path.length - 1] != "/":
if self._options.path[len(self._options.path) - 1] != "/":
self._options.path += "/"

self.debug: int = 0 # 1: Errors, 2: Warnings, 3: All logs
Expand All @@ -136,7 +140,7 @@ def __init__(self, id: str = None, **options):
log.warning('Debug level option specified as {} '
'which is outside the allowed 0-3 range.'
'Setting to lowest log level: 0', self._options.debug)
self._api = API(**options)
self._api = API(peer_options)

async def start(self):
"""Activate Peer instance."""
Expand Down Expand Up @@ -527,7 +531,8 @@ def disconnect(self) -> None:
log.debug(f'Disconnect peer with ID:${currentId}')
self._disconnected = True
self._open = False
self.socket.close()
if (self.socket is not None):
self.socket.close()
self._lastServerId = currentId
self._id = None
self.emit(PeerEventType.Disconnected, currentId)
Expand Down
12 changes: 7 additions & 5 deletions src/peerjs/socket.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
"""Convenience class to manage peer websocket connection."""
from pyee import AsyncIOEventEmitter
import logging
from .enums import SocketEventType
import asyncio
import json
import logging

import websockets
from pyee import AsyncIOEventEmitter
from websockets.exceptions import ConnectionClosedError
import asyncio

from .enums import SocketEventType

log = logging.getLogger(__name__)

Expand All @@ -26,7 +28,7 @@ def __init__(
pingInterval: int = 5000
) -> None:
"""Create new wrapper around websocket."""
self.super()
super().__init__()
wsProtocol = "wss://" if secure else "ws://"
self._baseUrl: str = f"{wsProtocol}{host}:{port}{path}peerjs?key={key}"
self._disconnected: bool = True
Expand Down
18 changes: 10 additions & 8 deletions src/peerjs/util.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
"""Helper utility structures and methods."""
import logging
import random

from aiortc import RTCDataChannel, RTCPeerConnection
from aiortc.rtcconfiguration import RTCConfiguration, RTCIceServer
import logging
import math

# import asyncio
# import aiofiles

Expand Down Expand Up @@ -119,18 +121,18 @@ def chunk(self, blob):
# callback(contents)
# asyncio.create_task(load_file)

def binaryStringToArrayBuffer(binary: str = None) -> bytes:
def binaryStringToArrayBuffer(self, binary: str = None) -> bytes:
"""Convert a string to an immutable byte array."""
byteArray = binary.encode()
return byteArray

def randomToken() -> str:
def randomToken(self) -> str:
"""Generate a random token."""
return math.random() \
.toString(36) \
.substr(2)
token = f'{random.random()}'[2:]
log.debug('Generated random token: %s', token)
return

def isSecure(url=None) -> bool:
def isSecure(self, url=None) -> bool:
"""Return True if using https for the signaling server connection."""
return url.startswith("https:")

Expand Down
1 change: 1 addition & 0 deletions src/setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ install_requires =
aiohttp>=3.6
pyee>=6.0
websockets>=8.1
attrs>=19.3

[coverage:run]
source = peerjs
Expand Down

0 comments on commit ceac7ab

Please sign in to comment.