From f31bf69d23eeacd39a4ddfaa6077de7819c39740 Mon Sep 17 00:00:00 2001 From: "W. Brian Gourlie" Date: Sun, 12 Feb 2017 17:41:54 -0600 Subject: [PATCH] Fix exponential backoff Fixes #17 --- elm-package.json | 2 +- src/WebSocket.elm | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/elm-package.json b/elm-package.json index 5ff5ae2..4a56f05 100644 --- a/elm-package.json +++ b/elm-package.json @@ -1,5 +1,5 @@ { - "version": "1.0.2", + "version": "1.0.3", "summary": "Persistent network connections, making client/server communication faster.", "repository": "http://github.com/elm-lang/websocket.git", "license": "BSD3", diff --git a/src/WebSocket.elm b/src/WebSocket.elm index 5aa256d..a55834b 100644 --- a/src/WebSocket.elm +++ b/src/WebSocket.elm @@ -27,7 +27,6 @@ many unique connections to the same endpoint, you need a different library. import Dict import Process import Task exposing (Task) -import Time exposing (Time) import WebSocket.LowLevel as WS @@ -257,10 +256,13 @@ onSelfMsg router selfMsg state = Nothing -> Task.succeed state - Just _ -> + Just (Connected _) -> attemptOpen router 0 name |> Task.andThen (\pid -> Task.succeed (updateSocket name (Opening 0 pid) state)) + Just (Opening n _) -> + retryConnection router n name state + GoodOpen name socket -> case Dict.get name state.queues of Nothing -> @@ -278,13 +280,23 @@ onSelfMsg router selfMsg state = Task.succeed state Just (Opening n _) -> - attemptOpen router (n + 1) name - |> Task.andThen (\pid -> Task.succeed (updateSocket name (Opening (n + 1) pid) state)) + retryConnection router n name state Just (Connected _) -> Task.succeed state +retryConnection + : Platform.Router msg Msg + -> Int + -> String + -> State msg + -> Task x (State msg) +retryConnection router n name state = + attemptOpen router (n + 1) name + |> Task.andThen (\pid -> Task.succeed (updateSocket name (Opening (n + 1) pid) state)) + + updateSocket : String -> Connection -> State msg -> State msg updateSocket name connection state = { state | sockets = Dict.insert name connection state.sockets }