diff --git a/lib/graphql/subscriptions/serialize.rb b/lib/graphql/subscriptions/serialize.rb index e9cd802b76..f58f282b72 100644 --- a/lib/graphql/subscriptions/serialize.rb +++ b/lib/graphql/subscriptions/serialize.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true require "set" +require "ostruct" + module GraphQL class Subscriptions # Serialization helpers for passing subscription data around. diff --git a/spec/dummy/app/assets/javascripts/application.js b/spec/dummy/app/assets/javascripts/application.js index fa3cb17b7c..470abfb253 100644 --- a/spec/dummy/app/assets/javascripts/application.js +++ b/spec/dummy/app/assets/javascripts/application.js @@ -28,7 +28,8 @@ var receivedCallback = options.received // Unique-ish var uuid = Math.round(Date.now() + Math.random() * 100000).toString(16) - return { + var subscription = { + _subscribed: false, subscription: App.cable.subscriptions.create({ channel: "GraphqlChannel", id: uuid, @@ -41,7 +42,8 @@ console.log("Connected", query, variables) }, received: function(payload) { - console.log("received", query, variables, payload) + subscription._subscribed = true + App.logToBody("ActionCable received: " + JSON.stringify(payload)) if (payload.result) { receivedCallback(payload) } @@ -53,12 +55,27 @@ } ), trigger: function(options) { - this.subscription.perform("make_trigger", options) + if (!subscription._subscribed) { + options.retries ||= 0 + options.retries++ + if (options.retries > 5) { + throw new Error("Retried 5 times, failed to trigger: " + JSON.stringify(options)) + } else { + App.logToBody("Retrying trigger " + options.retries + " : " + JSON.stringify(options)) + setTimeout(function() { + subscription.trigger(options) + }, 500) + } + } else { + App.logToBody("Triggering " + JSON.stringify(options)) + this.subscription.perform("make_trigger", options) + } }, unsubscribe: function() { this.subscription.unsubscribe() }, } + return subscription } // Add `text` to the HTML body, for debugging @@ -67,5 +84,6 @@ var logEntry = document.createElement("p") logEntry.innerText = text bodyLog.appendChild(logEntry) + bodyLog.append("\n") } }).call(this); diff --git a/spec/dummy/app/views/pages/show.html b/spec/dummy/app/views/pages/show.html index b1357b8576..67c80fb909 100644 --- a/spec/dummy/app/views/pages/show.html +++ b/spec/dummy/app/views/pages/show.html @@ -75,28 +75,36 @@