GlobalLiquidity

Untitled

Mar 19th, 2019
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { IMessageBusMessage,IMessageBus, IScene, IMessageBusLink } from "../../interfaces";
  2. import { Queue } from 'queue-typescript';
  3. import { MessageBusMessage } from "../../../messaging/messagebusmessage";
  4. import { link } from "fs";
  5. import { AblyMessageBus } from "../../../messaging/ablymessagebusmanager";
  6. import { TradingRigManagerScene } from "./tradingrigmanagerscene";
  7.  
  8.  
  9.  
  10. import { Machine, MachineConfig, StateMachine, EventObject, interpret } from 'xstate';
  11. import { Interpreter } from "xstate/lib/interpreter";
  12. import { OrderUpdate } from "../../../market/orderupdate";
  13. import { AblyMessageBusLink } from "../../../messaging/messagebuslink";
  14. import { OrderStatus, MarketSide, OrderSide } from "../../../market/enums";
  15.  
  16. export class OrderUpdateEvent
  17. {
  18.     constructor(public type : string, public update:OrderUpdate)
  19.     {
  20.     }
  21.  
  22. }
  23.  
  24. //Acts as a bridge between the message bus and the scene
  25. //Message Bus messages are interpreted as events by the finite state machine
  26. //We create data objects representing market events (order updates) and
  27. //Place them on to a Queue managed by the Scene.
  28. export class TradingRigManagerLink extends AblyMessageBusLink
  29. {
  30.    
  31.     private fsm:StateMachine<Record<string,any>,any, EventObject>;
  32.     private fsmService:Interpreter<Record<string,any>,any, EventObject>;
  33.  
  34.     constructor(public scene : TradingRigManagerScene)
  35.     {
  36.         super(scene);
  37.         this.messageBus = new AblyMessageBus(this);
  38.  
  39.         this.fsm = Machine({
  40.             id: "monitor",
  41.             initial: "listening",
  42.             states: {
  43.               listening: {
  44.                 onEntry: 'connectToMessageBus',
  45.                 on: { SEND_KEY : "sending_key" }
  46.               },
  47.               sending_key: {
  48.                 onEntry: 'sendKeyToRig',
  49.                 on: { KEY_RECEIVED : "monitoring_account" }
  50.               },
  51.               monitoring_account: {
  52.                 on: { ORDER_UPDATE: {actions: "updateScene"} }  
  53.               },
  54.               updating_scene: {
  55.                 onEntry: 'updateScene',
  56.                 on: { SCENE_UPDATED: "monitoring_account" }
  57.               }
  58.             }
  59.           },
  60.           {
  61.               actions: {
  62.                 connectToMessageBus: (ctx, event) => {
  63.                     this.messageBus.connect("eZKP_Q.Rt63UA:C7sWf1WgiFmdJU_p");
  64.                     this.messageBus.joinChannel("test");
  65.  
  66.                 },
  67.                 sendKeyToRig: (ctx, event) => {
  68.                     console.log("sending key to rig");
  69.                     this.messageBus.sendMessage("SENDING_KEY","0GhabqBc0mhrzfcZsUepT7JEie8JRYCjmDY3zyYiAChsEvAOXSsqKYA6A95gMQfy");
  70.                 },
  71.                 updateScene: (ctx, event) => {
  72.  
  73.                     let orderUpdateEvent : OrderUpdateEvent = event as OrderUpdateEvent;
  74.  
  75.                     console.log("adding order update to scene...");
  76.                     let orderUpdate = orderUpdateEvent.update;
  77.                     console.log(orderUpdate.id + "|" + orderUpdate.symbol + "|" + orderUpdate.side + "|" + orderUpdate.price + "|" + orderUpdate.quantity);
  78.                     scene.orderUpdateQueue.enqueue(orderUpdate);        
  79.                 }
  80.               }
  81.             });
  82.  
  83.             this.fsmService = interpret(this.fsm);
  84.             this.fsmService.start();  
  85.     }
  86.  
  87.     connect(apikey: string)
  88.     {
  89.         this.messageBus.connect(apikey)
  90.     }
  91.    
  92.     joinChannel(channelName: string) {
  93.         throw new Error("Method not implemented.");
  94.     }
  95.  
  96.     sendMessage(topic: string, message: string) {
  97.         throw new Error("Method not implemented.");
  98.     }
  99.    
  100.     processEvent(eventName: string, eventData:string)
  101.     {
  102.         console.log('link processing event: ' + eventName + " : " + eventData);
  103.        
  104.         switch(eventName)
  105.         {
  106.             case "ORDER_UPDATE":
  107.             {
  108.                 var orderUpdateObject = JSON.parse(eventData);
  109.  
  110.                 let orderUpdate : OrderUpdate = new OrderUpdate(orderUpdateObject.s,
  111.                                                                  orderUpdateObject.S,
  112.                                                                 orderUpdateObject.q,
  113.                                                                 orderUpdateObject.p,
  114.                                                                 orderUpdateObject.X,
  115.                                                                 orderUpdateObject.T,
  116.                                                                 orderUpdateObject.i);
  117.  
  118.                 let orderUpdateEvent : OrderUpdateEvent = new OrderUpdateEvent("ORDER_UPDATE",orderUpdate);                                            
  119.                 this.fsmService.send(orderUpdateEvent);
  120.  
  121.                 break;
  122.             }
  123.             default:
  124.             {
  125.                 this.fsmService.send(eventName);
  126.             }
  127.         }
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment