Sinatra verwendet einen Websocket-Client, um auf eine http-Anfrage zu antworten

8

Ich schreibe einen Sinatra-Webserver, den ich gerne REST-fähig wäre, aber die Sache ist, dass er mit einem anderen Server interagieren muss, der ausschließlich über Web-Sockets kommuniziert. Also muss das passieren:

  1. Eine Anfrage kommt von einem Client auf meinen Sinatra-Server
  2. Mein Server öffnet einen Web-Socket für den fremden Server
  3. Mein Server wartet asynchron auf Nachrichten und Dinge vom fremden Server, bis der Socket geschlossen ist (dies sollte nur zweihundert oder so Millisekunden dauern)
  4. Mein Server sendet eine Antwort an den Client
  5. zurück

Ich bin mir sicher, dass das nicht zu kompliziert ist, aber ich bleibe ein bisschen dran. Wenn die gesamte Web-Socket-Logik in eine einzige Funktion eingebunden werden kann, dann könnte diese Funktion blockiert werden, und das wäre es auch. Aber ich weiß nicht, wie man die Web-Socket-Logik einpackt und blockiert. Was denken Sie? Eine vereinfachte Version von dem, was ich habe, ist unten.

%Vor%

BEARBEITEN

Nach weiterem Nachdenken wurde mir klar, dass dies mit einem Thread-Halt und einem Thread-Wake-Up geschehen könnte. Das fühlt sich ziemlich kompliziert an und ich bin mir nicht sicher, wie ich das richtig mit Ruby machen soll, aber das ist die Idee:

%Vor%

EDIT 2

Ich habe weitere Fortschritte gemacht. Ich verwende jetzt das Async Sinatra Juwel, für das Thin Webserver. So wird es eingerichtet:

%Vor%

Die Sache ist, es funktioniert immer noch nicht. Seine Konsolenausgabe ist wie erwartet:

%Vor%

Aber es sendet keine Daten zurück zum Client. Die Methode body 'Closed ...' scheint keine Wirkung zu haben.

    
tschwab 31.08.2017, 18:18
quelle

1 Antwort

0

Das Problem war, dass async-sinatra seine eigenen Threads verwendet hat und auch websocket-client-simple . Die Lösung besteht darin, Bindungen und die Funktion eval zu verwenden, obwohl dies überhaupt nicht sehr effizient ist. Ich hoffe, dass Optimierungen oder bessere Lösungen zur Verfügung stehen.

%Vor%     
tschwab 25.10.2017, 19:39
quelle