# AWS Websocket
https://aws.amazon.com/blogs/compute/from-poll-to-push-transform-apis-using-amazon-api-gateway-rest-apis-and-websockets/
## problemi con client Ruby
## EventMachine
https://www.generacodice.com/en/articolo/718927/why-is-eventmachine-s-defer-slower-than-a-ruby-thread
https://www.rubydoc.info/gems/eventmachine-eventmachine/EventMachine.defer
:::info
#defer serve per integrare operazioni bloccanti nel flusso di controllo di EventMachine. Chiama #defer con uno o due blocchi, come mostrato di seguito (il secondo blocco è opzionale):
```ruby
operazione = proc {
\# esegue qui un'operazione di lunga durata, come una query al database.
"result" # come al solito, l'ultima espressione valutata nel blocco sarà il valore di ritorno.
}
callback = proc {|risultato|
\#fa qualcosa con il risultato qui, come ad esempio rimandarlo ad un client di rete.
}
```
EventMachine.defer( operazione, callback )
L'azione di #defer è quella di prendere il blocco specificato nel primo parametro (l'"operazione") e programmarlo per **l'esecuzione asincrona su un pool di thread interno mantenuto da EventMachine**. Quando l'operazione completa, passerà il risultato calcolato dal blocco (se esiste) al reattore EventMachine. **Quindi, EventMachine chiama il blocco specificato nel secondo parametro di #defer (il "callback"), come parte del suo normale ciclo sincrono di gestione degli eventi.** Il risultato calcolato dal blocco operativo viene passato come parametro alla callback. Potete omettere il parametro callback se non avete bisogno di eseguire alcun codice dopo il completamento dell'operazione.
:::
:::warning
Nota attentamente che il codice della tua operazione differita sarà eseguito *su un thread separato dall'elaborazione principale di EventMachine e da tutti gli altri thread di Ruby che possono esistere nel tuo programma. Inoltre, più operazioni differite possono essere eseguite contemporaneamente! Pertanto, sei responsabile di assicurare che il codice della tua operazione sia threadsafe*. [Non scrivete un'operazione differita che si bloccherà per sempre. Se è così, l'implementazione corrente non rileverà il problema e il thread non verrà mai restituito al pool. EventMachine limita il numero di thread nel suo pool, quindi se lo fate abbastanza volte, le vostre successive operazioni differite non avranno la possibilità di essere eseguite. [Potremmo inserire un timer per rilevare questo problema].
- OSSERVATE che #next_tick intacca questo meccanismo, quindi non fate alcun cambiamento qui senza sincronizzarlo lì.
:::
https://stackoverflow.com/questions/20074518/better-use-em-next-tick-or-em-defer-for-long-running-calculation-with-eventmachi
## threading Ruby
https://www.slideshare.net/autonomous/ruby-concurrency-and-eventmachine
https://www.rubydoc.info/github/eventmachine/eventmachine/EventMachine#run-class_method
https://www.codeotaku.com/journal/2018-06/improving-ruby-concurrency/index
https://www.codeotaku.com/journal/2018-06/asynchronous-ruby/index
https://socketry.github.io/async/
https://www.slideshare.net/autonomous/ruby-concurrency-and-eventmachine
## websocket client Ruby
https://socketry.github.io/async-websocket/ (non usato)
## WebSocket Client (browser) javascript
https://cheatcode.co/tutorials/how-to-set-up-a-websocket-client-with-javascript
## AWS
https://medium.com/serverless-transformation/asynchronous-client-interaction-in-aws-serverless-polling-websocket-server-sent-events-or-acf10167cc67
## Architettura AWS
## webSocket + apiGateway per avvio asincrono della lambda per long-process
```mermaid
sequenceDiagram
browser client->>websocket: "action":"start-process"
websocket-->>browser client: "starterConnectionId":"I0J8Rcj1joECIpw="
browser client->>apiGateway: GET /totals-per-project/2015/01/I17VmcMcjoECHSw=/project
apiGateway->>lamdba timesheet report rounded:"async call"
apiGateway->>browser client: long_process_started
loop Every minute
lamdba timesheet report rounded-->> websocket:"progress %"
websocket-->>browser client:"progress %"
end
lamdba timesheet report rounded-->>websocket:"action":"done","ref":"reportUrl","data":[...]
websocket-->>browser client:"action":"done","ref":"reportUrl","data":[...]
```
## Lambda Integration
https://medium.com/@lakshmanLD/lambda-proxy-vs-lambda-integration-in-aws-api-gateway-3a9397af0e6d
```
```