Skip to content

Commit 4d09466

Browse files
committed
streamer errors
1 parent 5d53e3d commit 4d09466

4 files changed

Lines changed: 23 additions & 6 deletions

File tree

tastytrade/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
VERSION = "9.12"
88

99
__version__ = VERSION
10+
version_str = f"tastyware/tastytrade:v{VERSION}"
1011

1112
logger = logging.getLogger(__name__)
1213
logger.setLevel(logging.DEBUG)

tastytrade/order.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from pydantic import computed_field, field_serializer, model_validator
77

8-
from tastytrade import VERSION
8+
from tastytrade import version_str
99
from tastytrade.utils import (
1010
PriceEffect,
1111
TastytradeJsonDataclass,
@@ -241,7 +241,7 @@ class NewOrder(TastytradeJsonDataclass):
241241

242242
time_in_force: OrderTimeInForce
243243
order_type: OrderType
244-
source: str = f"tastyware/tastytrade:v{VERSION}"
244+
source: str = version_str
245245
legs: list[Leg]
246246
gtc_date: Optional[date] = None
247247
#: For a stop/stop limit order. If the latter, use price for the limit price
@@ -277,7 +277,7 @@ class NewComplexOrder(TastytradeJsonDataclass):
277277
"""
278278

279279
orders: list[NewOrder]
280-
source: str = f"tastyware/tastytrade:v{VERSION}"
280+
source: str = version_str
281281
trigger_order: Optional[NewOrder] = None
282282
type: ComplexOrderType = ComplexOrderType.OCO
283283

tastytrade/session.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ def __init__(
341341
headers=self.sync_client.headers.copy(),
342342
proxy=proxy,
343343
)
344+
#: expiration for session token
345+
self.session_expiration = datetime.fromisoformat(
346+
data["session-expiration"].replace("Z", "+00:00")
347+
)
344348

345349
# Pull streamer tokens and urls
346350
url = (
@@ -349,10 +353,15 @@ def __init__(
349353
else "/quote-streamer-tokens"
350354
)
351355
data = self._get(url)
356+
352357
#: Auth token for dxfeed websocket
353358
self.streamer_token = data["token"]
354359
#: URL for dxfeed websocket
355360
self.dxlink_url = data["dxlink-url"]
361+
#: expiration for streamer token
362+
self.streamer_expiration = datetime.fromisoformat(
363+
data["expires-at"].replace("Z", "+00:00")
364+
)
356365

357366
def __enter__(self):
358367
return self

tastytrade/streamer.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from websockets.asyncio.client import ClientConnection, connect
2222
from websockets.exceptions import ConnectionClosed
2323

24-
from tastytrade import logger
24+
from tastytrade import logger, version_str
2525
from tastytrade.account import Account, AccountBalance, CurrentPosition, TradingStatus
2626
from tastytrade.dxfeed import (
2727
Event,
@@ -48,7 +48,7 @@
4848
CERT_STREAMER_URL = "wss://streamer.cert.tastyworks.com"
4949
STREAMER_URL = "wss://streamer.tastyworks.com"
5050

51-
DXLINK_VERSION = "0.1-js/1.0.0-beta.4"
51+
DXLINK_VERSION = "0.1-DXF-JS/0.3.0"
5252

5353

5454
class QuoteAlert(TastytradeJsonDataclass):
@@ -361,6 +361,7 @@ async def _subscribe(
361361
"auth-token": self.token,
362362
"action": subscription.value,
363363
"request-id": self.request_id,
364+
"source": version_str,
364365
}
365366
if value:
366367
message["value"] = value
@@ -512,17 +513,23 @@ async def _connect(self) -> None:
512513
logger.debug("Feed configured: %s", message)
513514
elif message["type"] == "KEEPALIVE":
514515
pass
516+
elif message["type"] == "ERROR":
517+
logger.error(f"Fatal streamer error: {message['message']}")
518+
asyncio.create_task(self.close())
519+
return
515520
else:
516-
logger.error(f"Streamer error: {message}")
521+
logger.error(f"Unknown message: {message}")
517522
except ConnectionClosed as e:
518523
logger.error(f"Websocket connection closed with {e}")
519524
if e.rcvd and e.rcvd.code == 1009:
520525
logger.error(
521526
"Subscription message too long! Try reducing the number of symbols."
522527
)
528+
asyncio.create_task(self.close())
523529
return
524530
except asyncio.CancelledError:
525531
logger.debug("Websocket interrupted, cancelling main loop.")
532+
asyncio.create_task(self.close())
526533
return
527534
logger.debug("Websocket connection closed, retrying...")
528535
reconnecting = True

0 commit comments

Comments
 (0)