Created
October 26, 2019 19:26
-
-
Save joladev/75b5b407cb0a39177943fdc0a6a90a94 to your computer and use it in GitHub Desktop.
Git diff of phoenix 1.4.9 and 1.4.10
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/CHANGELOG.md b/CHANGELOG.md | |
index e515143..36a412c 100644 | |
--- a/CHANGELOG.md | |
+++ b/CHANGELOG.md | |
@@ -24,6 +24,19 @@ Note the websocket/longpoll configuration given to socket/3 will only apply afte | |
The old APIs for building transports are also deprecated. The good news is: adapting an existing transport to the new API is a less error prone process where you should mostly remove code. | |
+## 1.4.10 (2019-09-05) | |
+ | |
+### Enhancements | |
+ * [Socket] support assigning multiple key/value pairs with keyword list or map with `assign/2`. | |
+ | |
+### Bug Fixes | |
+ * [Endpoint] Fix match error in failed websocket handshake | |
+ | |
+ | |
+## JavaScript client enhancements | |
+ * support `vsn` option for customizing serializer protocol version | |
+ | |
+ | |
## 1.4.9 (2019-07-03) | |
### Enhancements | |
diff --git a/assets/js/phoenix.js b/assets/js/phoenix.js | |
index 2a1835b..f1004e0 100644 | |
--- a/assets/js/phoenix.js | |
+++ b/assets/js/phoenix.js | |
@@ -188,7 +188,7 @@ | |
const globalSelf = typeof self !== "undefined" ? self : null | |
const phxWindow = typeof window !== "undefined" ? window : null | |
const global = globalSelf || phxWindow || this | |
-const VSN = "2.0.0" | |
+const DEFAULT_VSN = "2.0.0" | |
const SOCKET_STATES = {connecting: 0, open: 1, closing: 2, closed: 3} | |
const DEFAULT_TIMEOUT = 10000 | |
const WS_CLOSE_NORMAL = 1000 | |
@@ -721,6 +721,9 @@ export let Serializer = { | |
* | |
* Defaults to "arraybuffer" | |
* | |
+ * @param {vsn} [opts.vsn] - The serializer's protocol version to send on connect. | |
+ * | |
+ * Defaults to DEFAULT_VSN. | |
*/ | |
export class Socket { | |
constructor(endPoint, opts = {}){ | |
@@ -770,6 +773,7 @@ export class Socket { | |
this.longpollerTimeout = opts.longpollerTimeout || 20000 | |
this.params = closure(opts.params || {}) | |
this.endPoint = `${endPoint}/${TRANSPORTS.websocket}` | |
+ this.vsn = opts.vsn || DEFAULT_VSN | |
this.heartbeatTimer = null | |
this.pendingHeartbeatRef = null | |
this.reconnectTimer = new Timer(() => { | |
@@ -791,7 +795,7 @@ export class Socket { | |
*/ | |
endPointURL(){ | |
let uri = Ajax.appendParams( | |
- Ajax.appendParams(this.endPoint, this.params()), {vsn: VSN}) | |
+ Ajax.appendParams(this.endPoint, this.params()), {vsn: this.vsn}) | |
if(uri.charAt(0) !== "/"){ return uri } | |
if(uri.charAt(1) === "/"){ return `${this.protocol()}:${uri}` } | |
@@ -799,9 +803,13 @@ export class Socket { | |
} | |
/** | |
- * @param {Function} callback | |
- * @param {integer} code | |
- * @param {string} reason | |
+ * Disconnects the socket | |
+ * | |
+ * See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes for valid status codes. | |
+ * | |
+ * @param {Function} callback - Optional callback which is called after socket is disconnected. | |
+ * @param {integer} code - A status code for disconnection (Optional). | |
+ * @param {string} reason - A textual description of the reason to disconnect. (Optional) | |
*/ | |
disconnect(callback, code, reason){ | |
this.closeWasClean = true | |
diff --git a/assets/package.json b/assets/package.json | |
index 216e77f..c32ff5c 100644 | |
--- a/assets/package.json | |
+++ b/assets/package.json | |
@@ -1,6 +1,6 @@ | |
{ | |
"name": "phoenix", | |
- "version": "1.4.9", | |
+ "version": "1.4.10", | |
"description": "The official JavaScript client for the Phoenix web framework.", | |
"license": "MIT", | |
"main": "./priv/static/phoenix.js", | |
diff --git a/hex_metadata.config b/hex_metadata.config | |
index d201583..f5102c2 100644 | |
--- a/hex_metadata.config | |
+++ b/hex_metadata.config | |
@@ -123,4 +123,4 @@ | |
{<<"optional">>,true}, | |
{<<"repository">>,<<"hexpm">>}, | |
{<<"requirement">>,<<"~> 1.0">>}]]}. | |
-{<<"version">>,<<"1.4.9">>}. | |
+{<<"version">>,<<"1.4.10">>}. | |
diff --git a/lib/mix/phoenix/schema.ex b/lib/mix/phoenix/schema.ex | |
index 71cac44..d05544e 100644 | |
--- a/lib/mix/phoenix/schema.ex | |
+++ b/lib/mix/phoenix/schema.ex | |
@@ -73,7 +73,7 @@ defmodule Mix.Phoenix.Schema do | |
uniques = uniques(cli_attrs) | |
{assocs, attrs} = partition_attrs_and_assocs(module, attrs(cli_attrs)) | |
types = types(attrs) | |
- web_namespace = opts[:web] | |
+ web_namespace = opts[:web] && Phoenix.Naming.camelize(opts[:web]) | |
web_path = web_namespace && Phoenix.Naming.underscore(web_namespace) | |
embedded? = Keyword.get(opts, :embedded, false) | |
generate? = Keyword.get(opts, :schema, true) | |
diff --git a/lib/phoenix/code_reloader/server.ex b/lib/phoenix/code_reloader/server.ex | |
index 9f89e0c..b0e8171 100644 | |
--- a/lib/phoenix/code_reloader/server.ex | |
+++ b/lib/phoenix/code_reloader/server.ex | |
@@ -17,6 +17,22 @@ defmodule Phoenix.CodeReloader.Server do | |
GenServer.call(__MODULE__, {:reload!, endpoint}, :infinity) | |
end | |
+ @doc """ | |
+ Synchronizes with the code server if it is alive. | |
+ | |
+ If it is not running, it also returns true. | |
+ """ | |
+ def sync do | |
+ pid = Process.whereis(__MODULE__) | |
+ ref = Process.monitor(pid) | |
+ GenServer.cast(pid, {:sync, self(), ref}) | |
+ | |
+ receive do | |
+ ^ref -> :ok | |
+ {:DOWN, ^ref, _, _, _} -> :ok | |
+ end | |
+ end | |
+ | |
## Callbacks | |
def init(false) do | |
@@ -77,6 +93,15 @@ defmodule Phoenix.CodeReloader.Server do | |
{:noreply, state} | |
end | |
+ def handle_cast({:sync, pid, ref}, state) do | |
+ send(pid, ref) | |
+ {:noreply, state} | |
+ end | |
+ | |
+ def handle_info(_, state) do | |
+ {:noreply, state} | |
+ end | |
+ | |
defp default_reloadable_apps() do | |
if Mix.Project.umbrella? do | |
Enum.map(Mix.Dep.Umbrella.cached, &(&1.app)) | |
@@ -85,10 +110,6 @@ defmodule Phoenix.CodeReloader.Server do | |
end | |
end | |
- def handle_info(_, state) do | |
- {:noreply, state} | |
- end | |
- | |
defp os_symlink({:win32, _}), | |
do: " On Windows, the lack of symlinks may even cause empty assets to be served. " <> | |
"Luckily, you can address this issue by starting your Windows terminal at least " <> | |
diff --git a/lib/phoenix/endpoint/cowboy2_handler.ex b/lib/phoenix/endpoint/cowboy2_handler.ex | |
index 391f2d1..8b0a0aa 100644 | |
--- a/lib/phoenix/endpoint/cowboy2_handler.ex | |
+++ b/lib/phoenix/endpoint/cowboy2_handler.ex | |
@@ -12,54 +12,64 @@ defmodule Phoenix.Endpoint.Cowboy2Handler do | |
# Note we keep the websocket state as [handler | state] | |
# to avoid conflicts with {endpoint, opts}. | |
def init(req, {endpoint, opts}) do | |
- conn = @connection.conn(req) | |
- try do | |
- case endpoint.__handler__(conn, opts) do | |
- {:websocket, conn, handler, opts} -> | |
- case Phoenix.Transports.WebSocket.connect(conn, endpoint, handler, opts) do | |
- {:ok, %Plug.Conn{adapter: {@connection, req}} = conn, state} -> | |
- cowboy_opts = | |
- opts | |
- |> Enum.flat_map(fn | |
- {:timeout, timeout} -> [idle_timeout: timeout] | |
- {:compress, _} = opt -> [opt] | |
- {:max_frame_size, _} = opt -> [opt] | |
- _other -> [] | |
- end) | |
- |> Map.new() | |
- | |
- {:cowboy_websocket, copy_resp_headers(conn, req), [handler | state], cowboy_opts} | |
- | |
- {:error, %Plug.Conn{adapter: {@connection, req}} = conn} -> | |
- {:ok, copy_resp_headers(conn, req), {handler, opts}} | |
- end | |
- | |
- {:plug, conn, handler, opts} -> | |
- %{adapter: {@connection, req}} = | |
- conn | |
- |> handler.call(opts) | |
- |> maybe_send(handler) | |
- | |
- {:ok, req, {handler, opts}} | |
+ init(@connection.conn(req), endpoint, opts, true) | |
+ end | |
+ | |
+ defp init(conn, endpoint, opts, retry?) do | |
+ case endpoint.__handler__(conn, opts) do | |
+ {:websocket, conn, handler, opts} -> | |
+ case Phoenix.Transports.WebSocket.connect(conn, endpoint, handler, opts) do | |
+ {:ok, %Plug.Conn{adapter: {@connection, req}} = conn, state} -> | |
+ cowboy_opts = | |
+ opts | |
+ |> Enum.flat_map(fn | |
+ {:timeout, timeout} -> [idle_timeout: timeout] | |
+ {:compress, _} = opt -> [opt] | |
+ {:max_frame_size, _} = opt -> [opt] | |
+ _other -> [] | |
+ end) | |
+ |> Map.new() | |
+ | |
+ {:cowboy_websocket, copy_resp_headers(conn, req), [handler | state], cowboy_opts} | |
+ | |
+ {:error, %Plug.Conn{adapter: {@connection, req}} = conn} -> | |
+ {:ok, copy_resp_headers(conn, req), {handler, opts}} | |
+ end | |
+ | |
+ {:plug, conn, handler, opts} -> | |
+ %{adapter: {@connection, req}} = | |
+ conn | |
+ |> handler.call(opts) | |
+ |> maybe_send(handler) | |
+ | |
+ {:ok, req, {handler, opts}} | |
+ end | |
+ catch | |
+ :error, value -> | |
+ case System.stacktrace do | |
+ # Maybe the handler is not available because the code is being recompiled. | |
+ # Sync with the code reloader and retry once. | |
+ [{^endpoint, :__handler__, _, _} | _] when value == :undef and retry? -> | |
+ Phoenix.CodeReloader.Server.sync() | |
+ init(conn, endpoint, opts, false) | |
+ | |
+ _ -> | |
+ stack = System.stacktrace() | |
+ exception = Exception.normalize(:error, value, stack) | |
+ exit({{exception, stack}, {endpoint, :call, [conn, opts]}}) | |
end | |
- catch | |
- :error, value -> | |
- stack = System.stacktrace() | |
- exception = Exception.normalize(:error, value, stack) | |
- exit({{exception, stack}, {endpoint, :call, [conn, opts]}}) | |
- | |
- :throw, value -> | |
- stack = System.stacktrace() | |
- exit({{{:nocatch, value}, stack}, {endpoint, :call, [conn, opts]}}) | |
- | |
- :exit, value -> | |
- exit({value, {endpoint, :call, [conn, opts]}}) | |
+ | |
+ :throw, value -> | |
+ stack = System.stacktrace() | |
+ exit({{{:nocatch, value}, stack}, {endpoint, :call, [conn, opts]}}) | |
+ | |
+ :exit, value -> | |
+ exit({value, {endpoint, :call, [conn, opts]}}) | |
+ after | |
+ receive do | |
+ @already_sent -> :ok | |
after | |
- receive do | |
- @already_sent -> :ok | |
- after | |
- 0 -> :ok | |
- end | |
+ 0 -> :ok | |
end | |
end | |
diff --git a/lib/phoenix/endpoint/cowboy_websocket.ex b/lib/phoenix/endpoint/cowboy_websocket.ex | |
index 83bf131..d971bc5 100644 | |
--- a/lib/phoenix/endpoint/cowboy_websocket.ex | |
+++ b/lib/phoenix/endpoint/cowboy_websocket.ex | |
@@ -15,13 +15,13 @@ defmodule Phoenix.Endpoint.CowboyWebSocket do | |
conn = @connection.conn(req, transport) | |
try do | |
- case Phoenix.Transports.WebSocket.connect(conn, endpoint, handler, opts) do | |
+ case module.connect(conn, endpoint, handler, opts) do | |
{:ok, %Plug.Conn{adapter: {@connection, req}} = conn, args} -> | |
timeout = Keyword.fetch!(opts, :timeout) | |
req = Cowboy2Handler.copy_resp_headers(conn, req) | |
{:upgrade, :protocol, __MODULE__, req, {handler, args, timeout}} | |
- {:error, %Plug.Conn{adapter: {@connection, req} = conn}} -> | |
+ {:error, %Plug.Conn{adapter: {@connection, req}} = conn} -> | |
{:shutdown, Cowboy2Handler.copy_resp_headers(conn, req), :no_state} | |
end | |
catch | |
diff --git a/lib/phoenix/router/route.ex b/lib/phoenix/router/route.ex | |
index 3214773..60b70d4 100644 | |
--- a/lib/phoenix/router/route.ex | |
+++ b/lib/phoenix/router/route.ex | |
@@ -9,7 +9,7 @@ defmodule Phoenix.Router.Route do | |
@doc """ | |
The `Phoenix.Router.Route` struct. It stores: | |
- * `:verb` - the HTTP verb as an upcased string | |
+ * `:verb` - the HTTP verb as an atom | |
* `:line` - the line the route was defined | |
* `:kind` - the kind of route, one of `:match`, `:forward` | |
* `:path` - the normalized path as string | |
@@ -45,7 +45,7 @@ defmodule Phoenix.Router.Route do | |
Receives the verb, path, plug, options and helper | |
and returns a `Phoenix.Router.Route` struct. | |
""" | |
- @spec build(non_neg_integer, :match | :forward, String.t, String.t, String.t | nil, atom, atom, atom | nil, atom, %{}, %{}, atom) :: t | |
+ @spec build(non_neg_integer, :match | :forward, atom, String.t, String.t | nil, atom, atom, atom | nil, atom, %{}, %{}, atom) :: t | |
def build(line, kind, verb, path, host, plug, plug_opts, helper, pipe_through, private, assigns, log) | |
when is_atom(verb) and (is_binary(host) or is_nil(host)) and | |
is_atom(plug) and (is_binary(helper) or is_nil(helper)) and | |
diff --git a/lib/phoenix/router.ex b/lib/phoenix/router.ex | |
index 9146103..3d9793e 100644 | |
--- a/lib/phoenix/router.ex | |
+++ b/lib/phoenix/router.ex | |
@@ -572,6 +572,8 @@ defmodule Phoenix.Router do | |
See `pipeline/2` for more information. | |
""" | |
defmacro plug(plug, opts \\ []) do | |
+ plug = Macro.expand(plug, %{__CALLER__ | function: {:init, 1}}) | |
+ | |
quote do | |
if pipeline = @phoenix_pipeline do | |
@phoenix_pipeline [{unquote(plug), unquote(opts), true}|pipeline] | |
diff --git a/lib/phoenix/socket/pool_supervisor.ex b/lib/phoenix/socket/pool_supervisor.ex | |
index a23918b..7891e0e 100644 | |
--- a/lib/phoenix/socket/pool_supervisor.ex | |
+++ b/lib/phoenix/socket/pool_supervisor.ex | |
@@ -26,15 +26,22 @@ defmodule Phoenix.Socket.PoolSupervisor do | |
end | |
end | |
- @doc false | |
- def start_pooled(worker, ref, i) do | |
- case Supervisor.start_link([worker], strategy: :simple_one_for_one) do | |
- {:ok, pid} -> | |
- :ets.insert(ref, {i, pid}) | |
- {:ok, pid} | |
- | |
- {:error, reason} -> | |
- {:error, reason} | |
+ defmodule WorkerSupervisor do | |
+ @behaviour :supervisor | |
+ | |
+ def start_link(worker, ref, i) do | |
+ case :supervisor.start_link(__MODULE__, worker) do | |
+ {:ok, pid} -> | |
+ :ets.insert(ref, {i, pid}) | |
+ {:ok, pid} | |
+ | |
+ {:error, reason} -> | |
+ {:error, reason} | |
+ end | |
+ end | |
+ | |
+ def init(worker) do | |
+ {:ok, {%{strategy: :simple_one_for_one}, [worker]}} | |
end | |
end | |
@@ -48,7 +55,7 @@ defmodule Phoenix.Socket.PoolSupervisor do | |
children = | |
for i <- 0..(partitions - 1) do | |
- supervisor(__MODULE__, [worker, ref, i], id: i, function: :start_pooled) | |
+ supervisor(WorkerSupervisor, [worker, ref, i], id: i) | |
end | |
supervise(children, strategy: :one_for_one) | |
diff --git a/lib/phoenix/socket/serializer.ex b/lib/phoenix/socket/serializer.ex | |
index 9b4b3ef..1d05e89 100644 | |
--- a/lib/phoenix/socket/serializer.ex | |
+++ b/lib/phoenix/socket/serializer.ex | |
@@ -12,15 +12,15 @@ defmodule Phoenix.Socket.Serializer do | |
Encodes a `Phoenix.Socket.Broadcast` struct to fastlane format. | |
""" | |
@callback fastlane!(Phoenix.Socket.Broadcast.t()) :: | |
- {:socket_push, :text, String.t()} | |
- | {:socket_push, :binary, binary()} | |
+ {:socket_push, :text, iodata()} | |
+ | {:socket_push, :binary, iodata()} | |
@doc """ | |
Encodes `Phoenix.Socket.Message` and `Phoenix.Socket.Reply` structs to push format. | |
""" | |
@callback encode!(Phoenix.Socket.Message.t() | Phoenix.Socket.Reply.t()) :: | |
- {:socket_push, :text, String.t()} | |
- | {:socket_push, :binary, binary()} | |
+ {:socket_push, :text, iodata()} | |
+ | {:socket_push, :binary, iodata()} | |
@doc """ | |
Decodes iodata into `Phoenix.Socket.Message` struct. | |
diff --git a/lib/phoenix/socket.ex b/lib/phoenix/socket.ex | |
index c0b450e..e330960 100644 | |
--- a/lib/phoenix/socket.ex | |
+++ b/lib/phoenix/socket.ex | |
@@ -301,19 +301,24 @@ defmodule Phoenix.Socket do | |
## USER API | |
@doc """ | |
- Adds a key/value pair to socket assigns. | |
+ Adds key value pairs to socket assigns. | |
- ## Examples | |
+ A single key value pair may be passed, a keyword list or map | |
+ of assigns may be provided to be merged into existing socket | |
+ assigns. | |
- iex> socket.assigns[:token] | |
- nil | |
- iex> socket = assign(socket, :token, "bar") | |
- iex> socket.assigns[:token] | |
- "bar" | |
+ ## Examples | |
+ iex> assign(socket, :name, "Elixir") | |
+ iex> assign(socket, name: "Elixir", logo: "💧") | |
""" | |
- def assign(socket = %Socket{}, key, value) do | |
- put_in socket.assigns[key], value | |
+ def assign(%Socket{} = socket, key, value) do | |
+ assign(socket, [{key, value}]) | |
+ end | |
+ | |
+ def assign(%Socket{} = socket, attrs) | |
+ when is_map(attrs) or is_list(attrs) do | |
+ %{socket | assigns: Map.merge(socket.assigns, Map.new(attrs))} | |
end | |
@doc """ | |
diff --git a/lib/phoenix/test/channel_test.ex b/lib/phoenix/test/channel_test.ex | |
index 949a686..0fd24bb 100644 | |
--- a/lib/phoenix/test/channel_test.ex | |
+++ b/lib/phoenix/test/channel_test.ex | |
@@ -362,7 +362,7 @@ defmodule Phoenix.ChannelTest do | |
when is_atom(channel) and is_binary(topic) and is_map(payload) do | |
message = %Message{ | |
event: "phx_join", | |
- payload: payload, | |
+ payload: __stringify__(payload), | |
topic: topic, | |
ref: System.unique_integer([:positive]) | |
} | |
diff --git a/lib/phoenix/view.ex b/lib/phoenix/view.ex | |
index 929cc0a..3348e84 100644 | |
--- a/lib/phoenix/view.ex | |
+++ b/lib/phoenix/view.ex | |
@@ -346,8 +346,9 @@ defmodule Phoenix.View do | |
""" | |
def render_many(collection, view, template, assigns \\ %{}) do | |
assigns = to_map(assigns) | |
+ resource_name = get_resource_name(assigns, view) | |
Enum.map(collection, fn resource -> | |
- render view, template, assign_resource(assigns, view, resource) | |
+ render(view, template, Map.put(assigns, resource_name, resource)) | |
end) | |
end | |
@@ -384,12 +385,22 @@ defmodule Phoenix.View do | |
render view, template, assign_resource(assigns, view, resource) | |
end | |
+ @compile {:inline, [to_map: 1]} | |
+ | |
defp to_map(assigns) when is_map(assigns), do: assigns | |
defp to_map(assigns) when is_list(assigns), do: :maps.from_list(assigns) | |
+ @compile {:inline, [get_resource_name: 2]} | |
+ | |
+ defp get_resource_name(assigns, view) do | |
+ case assigns do | |
+ %{as: as} -> as | |
+ _ -> view.__resource__ | |
+ end | |
+ end | |
+ | |
defp assign_resource(assigns, view, resource) do | |
- as = Map.get(assigns, :as) || view.__resource__ | |
- Map.put(assigns, as, resource) | |
+ Map.put(assigns, get_resource_name(assigns, view), resource) | |
end | |
@doc """ | |
diff --git a/mix.exs b/mix.exs | |
index b07058e..8563688 100644 | |
--- a/mix.exs | |
+++ b/mix.exs | |
@@ -1,7 +1,7 @@ | |
defmodule Phoenix.MixProject do | |
use Mix.Project | |
- @version "1.4.9" | |
+ @version "1.4.10" | |
def project do | |
[ | |
@@ -136,6 +136,7 @@ defmodule Phoenix.MixProject do | |
"guides/testing/testing_channels.md", | |
"guides/deployment/deployment.md", | |
+ "guides/deployment/releases.md", | |
"guides/deployment/heroku.md" | |
] | |
end | |
diff --git a/package.json b/package.json | |
index a467fab..2203943 100644 | |
--- a/package.json | |
+++ b/package.json | |
@@ -1,6 +1,6 @@ | |
{ | |
"name": "phoenix", | |
- "version": "1.4.9", | |
+ "version": "1.4.10", | |
"description": "The official JavaScript client for the Phoenix web framework.", | |
"license": "MIT", | |
"main": "./priv/static/phoenix.js", | |
diff --git a/priv/static/phoenix.js b/priv/static/phoenix.js | |
index 29cf578..adb7013 100644 | |
--- a/priv/static/phoenix.js | |
+++ b/priv/static/phoenix.js | |
@@ -1 +1 @@ | |
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Phoenix=t():e.Phoenix=t()}(this,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){(function(t){e.exports=t.Phoenix=n(2)}).call(this,n(1))},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,o=!1,r=void 0;try{for(var s,a=e[Symbol.iterator]();!(i=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){o=!0,r=e}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}n.r(t),n.d(t,"Channel",function(){return b}),n.d(t,"Serializer",function(){return j}),n.d(t,"Socket",function(){return R}),n.d(t,"LongPoll",function(){return C}),n.d(t,"Ajax",function(){return T}),n.d(t,"Presence",function(){return w});var u="undefined"!=typeof self?self:null,h="undefined"!=typeof window?window:null,l=u||h||void 0,f={connecting:0,open:1,closing:2,closed:3},d=1e4,p={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},v={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},y=[v.close,v.error,v.join,v.reply,v.leave],m={longpoll:"longpoll",websocket:"websocket"},g=function(e){if("function"==typeof e)return e;return function(){return e}},k=function(){function e(t,n,i,o){s(this,e),this.channel=t,this.event=n,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=o,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}return c(e,[{key:"resend",value:function(e){this.timeout=e,this.reset(),this.send()}},{key:"send",value:function(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}},{key:"receive",value:function(e,t){return this.hasReceived(e)&&t(this.receivedResp.response),this.recHooks.push({status:e,callback:t}),this}},{key:"reset",value:function(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}},{key:"matchReceive",value:function(e){var t=e.status,n=e.response;e.ref;this.recHooks.filter(function(e){return e.status===t}).forEach(function(e){return e.callback(n)})}},{key:"cancelRefEvent",value:function(){this.refEvent&&this.channel.off(this.refEvent)}},{key:"cancelTimeout",value:function(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}},{key:"startTimeout",value:function(){var e=this;this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,function(t){e.cancelRefEvent(),e.cancelTimeout(),e.receivedResp=t,e.matchReceive(t)}),this.timeoutTimer=setTimeout(function(){e.trigger("timeout",{})},this.timeout)}},{key:"hasReceived",value:function(e){return this.receivedResp&&this.receivedResp.status===e}},{key:"trigger",value:function(e,t){this.channel.trigger(this.refEvent,{status:e,response:t})}}]),e}(),b=function(){function e(t,n,i){var o=this;s(this,e),this.state=p.closed,this.topic=t,this.params=g(n||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new k(this,v.join,this.params,this.timeout),this.pushBuffer=[],this.rejoinTimer=new E(function(){o.socket.isConnected()&&o.rejoin()},this.socket.rejoinAfterMs),this.socket.onError(function(){return o.rejoinTimer.reset()}),this.socket.onOpen(function(){o.rejoinTimer.reset(),o.isErrored()&&o.rejoin()}),this.joinPush.receive("ok",function(){o.state=p.joined,o.rejoinTimer.reset(),o.pushBuffer.forEach(function(e){return e.send()}),o.pushBuffer=[]}),this.joinPush.receive("error",function(){o.state=p.errored,o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.onClose(function(){o.rejoinTimer.reset(),o.socket.hasLogger()&&o.socket.log("channel","close ".concat(o.topic," ").concat(o.joinRef())),o.state=p.closed,o.socket.remove(o)}),this.onError(function(e){o.socket.hasLogger()&&o.socket.log("channel","error ".concat(o.topic),e),o.isJoining()&&o.joinPush.reset(),o.state=p.errored,o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",function(){o.socket.hasLogger()&&o.socket.log("channel","timeout ".concat(o.topic," (").concat(o.joinRef(),")"),o.joinPush.timeout),new k(o,v.leave,g({}),o.timeout).send(),o.state=p.errored,o.joinPush.reset(),o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.on(v.reply,function(e,t){o.trigger(o.replyEventName(t),e)})}return c(e,[{key:"join",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=e,this.joinedOnce=!0,this.rejoin(),this.joinPush}},{key:"onClose",value:function(e){this.on(v.close,e)}},{key:"onError",value:function(e){return this.on(v.error,function(t){return e(t)})}},{key:"on",value:function(e,t){var n=this.bindingRef++;return this.bindings.push({event:e,ref:n,callback:t}),n}},{key:"off",value:function(e,t){this.bindings=this.bindings.filter(function(n){return!(n.event===e&&(void 0===t||t===n.ref))})}},{key:"canPush",value:function(){return this.socket.isConnected()&&this.isJoined()}},{key:"push",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.timeout;if(!this.joinedOnce)throw new Error("tried to push '".concat(e,"' to '").concat(this.topic,"' before joining. Use channel.join() before pushing events"));var i=new k(this,e,function(){return t},n);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}},{key:"leave",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=p.leaving;var n=function(){e.socket.hasLogger()&&e.socket.log("channel","leave ".concat(e.topic)),e.trigger(v.close,"leave")},i=new k(this,v.leave,g({}),t);return i.receive("ok",function(){return n()}).receive("timeout",function(){return n()}),i.send(),this.canPush()||i.trigger("ok",{}),i}},{key:"onMessage",value:function(e,t,n){return t}},{key:"isLifecycleEvent",value:function(e){return y.indexOf(e)>=0}},{key:"isMember",value:function(e,t,n,i){return this.topic===e&&(!i||i===this.joinRef()||!this.isLifecycleEvent(t)||(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:e,event:t,payload:n,joinRef:i}),!1))}},{key:"joinRef",value:function(){return this.joinPush.ref}},{key:"sendJoin",value:function(e){this.state=p.joining,this.joinPush.resend(e)}},{key:"rejoin",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.isLeaving()||this.sendJoin(e)}},{key:"trigger",value:function(e,t,n,i){var o=this.onMessage(e,t,n,i);if(t&&!o)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");for(var r=0;r<this.bindings.length;r++){var s=this.bindings[r];s.event===e&&s.callback(o,n,i||this.joinRef())}}},{key:"replyEventName",value:function(e){return"chan_reply_".concat(e)}},{key:"isClosed",value:function(){return this.state===p.closed}},{key:"isErrored",value:function(){return this.state===p.errored}},{key:"isJoined",value:function(){return this.state===p.joined}},{key:"isJoining",value:function(){return this.state===p.joining}},{key:"isLeaving",value:function(){return this.state===p.leaving}}]),e}(),j={encode:function(e,t){var n=[e.join_ref,e.ref,e.topic,e.event,e.payload];return t(JSON.stringify(n))},decode:function(e,t){var n=r(JSON.parse(e),5);return t({join_ref:n[0],ref:n[1],topic:n[2],event:n[3],payload:n[4]})}},R=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e),this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=i.timeout||d,this.transport=i.transport||l.WebSocket||C,this.defaultEncoder=j.encode,this.defaultDecoder=j.decode,this.closeWasClean=!1,this.unloaded=!1,this.binaryType=i.binaryType||"arraybuffer",this.transport!==C?(this.encode=i.encode||this.defaultEncoder,this.decode=i.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder),h&&h.addEventListener&&h.addEventListener("beforeunload",function(e){n.conn&&(n.unloaded=!0,n.abnormalClose("unloaded"))}),this.heartbeatIntervalMs=i.heartbeatIntervalMs||3e4,this.rejoinAfterMs=function(e){return i.rejoinAfterMs?i.rejoinAfterMs(e):[1e3,2e3,5e3][e-1]||1e4},this.reconnectAfterMs=function(e){return n.unloaded?100:i.reconnectAfterMs?i.reconnectAfterMs(e):[10,50,100,150,200,250,500,1e3,2e3][e-1]||5e3},this.logger=i.logger||null,this.longpollerTimeout=i.longpollerTimeout||2e4,this.params=g(i.params||{}),this.endPoint="".concat(t,"/").concat(m.websocket),this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new E(function(){n.teardown(function(){return n.connect()})},this.reconnectAfterMs)}return c(e,[{key:"protocol",value:function(){return location.protocol.match(/^https/)?"wss":"ws"}},{key:"endPointURL",value:function(){var e=T.appendParams(T.appendParams(this.endPoint,this.params()),{vsn:"2.0.0"});return"/"!==e.charAt(0)?e:"/"===e.charAt(1)?"".concat(this.protocol(),":").concat(e):"".concat(this.protocol(),"://").concat(location.host).concat(e)}},{key:"disconnect",value:function(e,t,n){this.closeWasClean=!0,this.reconnectTimer.reset(),this.teardown(e,t,n)}},{key:"connect",value:function(e){var t=this;e&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=g(e)),this.conn||(this.closeWasClean=!1,this.conn=new this.transport(this.endPointURL()),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=function(){return t.onConnOpen()},this.conn.onerror=function(e){return t.onConnError(e)},this.conn.onmessage=function(e){return t.onConnMessage(e)},this.conn.onclose=function(e){return t.onConnClose(e)})}},{key:"log",value:function(e,t,n){this.logger(e,t,n)}},{key:"hasLogger",value:function(){return null!==this.logger}},{key:"onOpen",value:function(e){this.stateChangeCallbacks.open.push(e)}},{key:"onClose",value:function(e){this.stateChangeCallbacks.close.push(e)}},{key:"onError",value:function(e){this.stateChangeCallbacks.error.push(e)}},{key:"onMessage",value:function(e){this.stateChangeCallbacks.message.push(e)}},{key:"onConnOpen",value:function(){this.hasLogger()&&this.log("transport","connected to ".concat(this.endPointURL())),this.unloaded=!1,this.closeWasClean=!1,this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(function(e){return e()})}},{key:"resetHeartbeat",value:function(){var e=this;this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(function(){return e.sendHeartbeat()},this.heartbeatIntervalMs))}},{key:"teardown",value:function(e,t,n){this.conn&&(this.conn.onclose=function(){},t?this.conn.close(t,n||""):this.conn.close(),this.conn=null),e&&e()}},{key:"onConnClose",value:function(e){this.hasLogger()&&this.log("transport","close",e),this.triggerChanError(),clearInterval(this.heartbeatTimer),this.closeWasClean||this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(function(t){return t(e)})}},{key:"onConnError",value:function(e){this.hasLogger()&&this.log("transport",e),this.triggerChanError(),this.stateChangeCallbacks.error.forEach(function(t){return t(e)})}},{key:"triggerChanError",value:function(){this.channels.forEach(function(e){e.isErrored()||e.isLeaving()||e.isClosed()||e.trigger(v.error)})}},{key:"connectionState",value:function(){switch(this.conn&&this.conn.readyState){case f.connecting:return"connecting";case f.open:return"open";case f.closing:return"closing";default:return"closed"}}},{key:"isConnected",value:function(){return"open"===this.connectionState()}},{key:"remove",value:function(e){this.channels=this.channels.filter(function(t){return t.joinRef()!==e.joinRef()})}},{key:"channel",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new b(e,t,this);return this.channels.push(n),n}},{key:"push",value:function(e){var t=this;if(this.hasLogger()){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;this.log("push","".concat(n," ").concat(i," (").concat(s,", ").concat(r,")"),o)}this.isConnected()?this.encode(e,function(e){return t.conn.send(e)}):this.sendBuffer.push(function(){return t.encode(e,function(e){return t.conn.send(e)})})}},{key:"makeRef",value:function(){var e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}},{key:"sendHeartbeat",value:function(){if(this.isConnected()){if(this.pendingHeartbeatRef)return this.pendingHeartbeatRef=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection"),void this.abnormalClose("heartbeat timeout");this.pendingHeartbeatRef=this.makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef})}}},{key:"abnormalClose",value:function(e){this.closeWasClean=!1,this.conn.close(1e3,e)}},{key:"flushSendBuffer",value:function(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(function(e){return e()}),this.sendBuffer=[])}},{key:"onConnMessage",value:function(e){var t=this;this.decode(e.data,function(e){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;r&&r===t.pendingHeartbeatRef&&(t.pendingHeartbeatRef=null),t.hasLogger()&&t.log("receive","".concat(o.status||""," ").concat(n," ").concat(i," ").concat(r&&"("+r+")"||""),o);for(var a=0;a<t.channels.length;a++){var c=t.channels[a];c.isMember(n,i,o,s)&&c.trigger(i,o,r,s)}for(var u=0;u<t.stateChangeCallbacks.message.length;u++)t.stateChangeCallbacks.message[u](e)})}}]),e}(),C=function(){function e(t){s(this,e),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=f.connecting,this.poll()}return c(e,[{key:"normalizeEndpoint",value:function(e){return e.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+m.websocket),"$1/"+m.longpoll)}},{key:"endpointURL",value:function(){return T.appendParams(this.pollEndpoint,{token:this.token})}},{key:"closeAndRetry",value:function(){this.close(),this.readyState=f.connecting}},{key:"ontimeout",value:function(){this.onerror("timeout"),this.closeAndRetry()}},{key:"poll",value:function(){var e=this;this.readyState!==f.open&&this.readyState!==f.connecting||T.request("GET",this.endpointURL(),"application/json",null,this.timeout,this.ontimeout.bind(this),function(t){if(t){var n=t.status,i=t.token,o=t.messages;e.token=i}else n=0;switch(n){case 200:o.forEach(function(t){return e.onmessage({data:t})}),e.poll();break;case 204:e.poll();break;case 410:e.readyState=f.open,e.onopen(),e.poll();break;case 0:case 500:e.onerror(),e.closeAndRetry();break;default:throw new Error("unhandled poll status ".concat(n))}})}},{key:"send",value:function(e){var t=this;T.request("POST",this.endpointURL(),"application/json",e,this.timeout,this.onerror.bind(this,"timeout"),function(e){e&&200===e.status||(t.onerror(e&&e.status),t.closeAndRetry())})}},{key:"close",value:function(e,t){this.readyState=f.closed,this.onclose()}}]),e}(),T=function(){function e(){s(this,e)}return c(e,null,[{key:"request",value:function(e,t,n,i,o,r,s){if(l.XDomainRequest){var a=new XDomainRequest;this.xdomainRequest(a,e,t,i,o,r,s)}else{var c=l.XMLHttpRequest?new l.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");this.xhrRequest(c,e,t,n,i,o,r,s)}}},{key:"xdomainRequest",value:function(e,t,n,i,o,r,s){var a=this;e.timeout=o,e.open(t,n),e.onload=function(){var t=a.parseJSON(e.responseText);s&&s(t)},r&&(e.ontimeout=r),e.onprogress=function(){},e.send(i)}},{key:"xhrRequest",value:function(e,t,n,i,o,r,s,a){var c=this;e.open(t,n,!0),e.timeout=r,e.setRequestHeader("Content-Type",i),e.onerror=function(){a&&a(null)},e.onreadystatechange=function(){if(e.readyState===c.states.complete&&a){var t=c.parseJSON(e.responseText);a(t)}},s&&(e.ontimeout=s),e.send(o)}},{key:"parseJSON",value:function(e){if(!e||""===e)return null;try{return JSON.parse(e)}catch(t){return console&&console.log("failed to parse JSON response",e),null}}},{key:"serialize",value:function(e,t){var n=[];for(var i in e)if(e.hasOwnProperty(i)){var r=t?"".concat(t,"[").concat(i,"]"):i,s=e[i];"object"===o(s)?n.push(this.serialize(s,r)):n.push(encodeURIComponent(r)+"="+encodeURIComponent(s))}return n.join("&")}},{key:"appendParams",value:function(e,t){if(0===Object.keys(t).length)return e;var n=e.match(/\?/)?"&":"?";return"".concat(e).concat(n).concat(this.serialize(t))}}]),e}();T.states={complete:4};var w=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e);var o=i.events||{state:"presence_state",diff:"presence_diff"};this.state={},this.pendingDiffs=[],this.channel=t,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(o.state,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.joinRef=n.channel.joinRef(),n.state=e.syncState(n.state,t,o,r),n.pendingDiffs.forEach(function(t){n.state=e.syncDiff(n.state,t,o,r)}),n.pendingDiffs=[],s()}),this.channel.on(o.diff,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.inPendingSyncState()?n.pendingDiffs.push(t):(n.state=e.syncDiff(n.state,t,o,r),s())})}return c(e,[{key:"onJoin",value:function(e){this.caller.onJoin=e}},{key:"onLeave",value:function(e){this.caller.onLeave=e}},{key:"onSync",value:function(e){this.caller.onSync=e}},{key:"list",value:function(t){return e.list(this.state,t)}},{key:"inPendingSyncState",value:function(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}}],[{key:"syncState",value:function(e,t,n,i){var o=this,r=this.clone(e),s={},a={};return this.map(r,function(e,n){t[e]||(a[e]=n)}),this.map(t,function(e,t){var n=r[e];if(n){var i=t.metas.map(function(e){return e.phx_ref}),c=n.metas.map(function(e){return e.phx_ref}),u=t.metas.filter(function(e){return c.indexOf(e.phx_ref)<0}),h=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0});u.length>0&&(s[e]=t,s[e].metas=u),h.length>0&&(a[e]=o.clone(n),a[e].metas=h)}else s[e]=t}),this.syncDiff(r,{joins:s,leaves:a},n,i)}},{key:"syncDiff",value:function(e,t,n,o){var r=t.joins,s=t.leaves,a=this.clone(e);return n||(n=function(){}),o||(o=function(){}),this.map(r,function(e,t){var o=a[e];if(a[e]=t,o){var r,s=a[e].metas.map(function(e){return e.phx_ref}),c=o.metas.filter(function(e){return s.indexOf(e.phx_ref)<0});(r=a[e].metas).unshift.apply(r,i(c))}n(e,o,t)}),this.map(s,function(e,t){var n=a[e];if(n){var i=t.metas.map(function(e){return e.phx_ref});n.metas=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0}),o(e,n,t),0===n.metas.length&&delete a[e]}}),a}},{key:"list",value:function(e,t){return t||(t=function(e,t){return t}),this.map(e,function(e,n){return t(e,n)})}},{key:"map",value:function(e,t){return Object.getOwnPropertyNames(e).map(function(n){return t(n,e[n])})}},{key:"clone",value:function(e){return JSON.parse(JSON.stringify(e))}}]),e}(),E=function(){function e(t,n){s(this,e),this.callback=t,this.timerCalc=n,this.timer=null,this.tries=0}return c(e,[{key:"reset",value:function(){this.tries=0,clearTimeout(this.timer)}},{key:"scheduleTimeout",value:function(){var e=this;clearTimeout(this.timer),this.timer=setTimeout(function(){e.tries=e.tries+1,e.callback()},this.timerCalc(this.tries+1))}}]),e}()}])}); | |
\ No newline at end of file | |
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Phoenix=t():e.Phoenix=t()}(this,function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){(function(t){e.exports=t.Phoenix=n(2)}).call(this,n(1))},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],i=!0,o=!1,r=void 0;try{for(var s,a=e[Symbol.iterator]();!(i=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);i=!0);}catch(e){o=!0,r=e}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function c(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),e}n.r(t),n.d(t,"Channel",function(){return j}),n.d(t,"Serializer",function(){return R}),n.d(t,"Socket",function(){return C}),n.d(t,"LongPoll",function(){return T}),n.d(t,"Ajax",function(){return w}),n.d(t,"Presence",function(){return E});var u="undefined"!=typeof self?self:null,h="undefined"!=typeof window?window:null,l=u||h||void 0,f="2.0.0",d={connecting:0,open:1,closing:2,closed:3},p=1e4,v={closed:"closed",errored:"errored",joined:"joined",joining:"joining",leaving:"leaving"},y={close:"phx_close",error:"phx_error",join:"phx_join",reply:"phx_reply",leave:"phx_leave"},m=[y.close,y.error,y.join,y.reply,y.leave],g={longpoll:"longpoll",websocket:"websocket"},k=function(e){if("function"==typeof e)return e;return function(){return e}},b=function(){function e(t,n,i,o){s(this,e),this.channel=t,this.event=n,this.payload=i||function(){return{}},this.receivedResp=null,this.timeout=o,this.timeoutTimer=null,this.recHooks=[],this.sent=!1}return c(e,[{key:"resend",value:function(e){this.timeout=e,this.reset(),this.send()}},{key:"send",value:function(){this.hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload(),ref:this.ref,join_ref:this.channel.joinRef()}))}},{key:"receive",value:function(e,t){return this.hasReceived(e)&&t(this.receivedResp.response),this.recHooks.push({status:e,callback:t}),this}},{key:"reset",value:function(){this.cancelRefEvent(),this.ref=null,this.refEvent=null,this.receivedResp=null,this.sent=!1}},{key:"matchReceive",value:function(e){var t=e.status,n=e.response;e.ref;this.recHooks.filter(function(e){return e.status===t}).forEach(function(e){return e.callback(n)})}},{key:"cancelRefEvent",value:function(){this.refEvent&&this.channel.off(this.refEvent)}},{key:"cancelTimeout",value:function(){clearTimeout(this.timeoutTimer),this.timeoutTimer=null}},{key:"startTimeout",value:function(){var e=this;this.timeoutTimer&&this.cancelTimeout(),this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,function(t){e.cancelRefEvent(),e.cancelTimeout(),e.receivedResp=t,e.matchReceive(t)}),this.timeoutTimer=setTimeout(function(){e.trigger("timeout",{})},this.timeout)}},{key:"hasReceived",value:function(e){return this.receivedResp&&this.receivedResp.status===e}},{key:"trigger",value:function(e,t){this.channel.trigger(this.refEvent,{status:e,response:t})}}]),e}(),j=function(){function e(t,n,i){var o=this;s(this,e),this.state=v.closed,this.topic=t,this.params=k(n||{}),this.socket=i,this.bindings=[],this.bindingRef=0,this.timeout=this.socket.timeout,this.joinedOnce=!1,this.joinPush=new b(this,y.join,this.params,this.timeout),this.pushBuffer=[],this.rejoinTimer=new S(function(){o.socket.isConnected()&&o.rejoin()},this.socket.rejoinAfterMs),this.socket.onError(function(){return o.rejoinTimer.reset()}),this.socket.onOpen(function(){o.rejoinTimer.reset(),o.isErrored()&&o.rejoin()}),this.joinPush.receive("ok",function(){o.state=v.joined,o.rejoinTimer.reset(),o.pushBuffer.forEach(function(e){return e.send()}),o.pushBuffer=[]}),this.joinPush.receive("error",function(){o.state=v.errored,o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.onClose(function(){o.rejoinTimer.reset(),o.socket.hasLogger()&&o.socket.log("channel","close ".concat(o.topic," ").concat(o.joinRef())),o.state=v.closed,o.socket.remove(o)}),this.onError(function(e){o.socket.hasLogger()&&o.socket.log("channel","error ".concat(o.topic),e),o.isJoining()&&o.joinPush.reset(),o.state=v.errored,o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.joinPush.receive("timeout",function(){o.socket.hasLogger()&&o.socket.log("channel","timeout ".concat(o.topic," (").concat(o.joinRef(),")"),o.joinPush.timeout),new b(o,y.leave,k({}),o.timeout).send(),o.state=v.errored,o.joinPush.reset(),o.socket.isConnected()&&o.rejoinTimer.scheduleTimeout()}),this.on(y.reply,function(e,t){o.trigger(o.replyEventName(t),e)})}return c(e,[{key:"join",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;if(this.joinedOnce)throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");return this.timeout=e,this.joinedOnce=!0,this.rejoin(),this.joinPush}},{key:"onClose",value:function(e){this.on(y.close,e)}},{key:"onError",value:function(e){return this.on(y.error,function(t){return e(t)})}},{key:"on",value:function(e,t){var n=this.bindingRef++;return this.bindings.push({event:e,ref:n,callback:t}),n}},{key:"off",value:function(e,t){this.bindings=this.bindings.filter(function(n){return!(n.event===e&&(void 0===t||t===n.ref))})}},{key:"canPush",value:function(){return this.socket.isConnected()&&this.isJoined()}},{key:"push",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.timeout;if(!this.joinedOnce)throw new Error("tried to push '".concat(e,"' to '").concat(this.topic,"' before joining. Use channel.join() before pushing events"));var i=new b(this,e,function(){return t},n);return this.canPush()?i.send():(i.startTimeout(),this.pushBuffer.push(i)),i}},{key:"leave",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.rejoinTimer.reset(),this.joinPush.cancelTimeout(),this.state=v.leaving;var n=function(){e.socket.hasLogger()&&e.socket.log("channel","leave ".concat(e.topic)),e.trigger(y.close,"leave")},i=new b(this,y.leave,k({}),t);return i.receive("ok",function(){return n()}).receive("timeout",function(){return n()}),i.send(),this.canPush()||i.trigger("ok",{}),i}},{key:"onMessage",value:function(e,t,n){return t}},{key:"isLifecycleEvent",value:function(e){return m.indexOf(e)>=0}},{key:"isMember",value:function(e,t,n,i){return this.topic===e&&(!i||i===this.joinRef()||!this.isLifecycleEvent(t)||(this.socket.hasLogger()&&this.socket.log("channel","dropping outdated message",{topic:e,event:t,payload:n,joinRef:i}),!1))}},{key:"joinRef",value:function(){return this.joinPush.ref}},{key:"sendJoin",value:function(e){this.state=v.joining,this.joinPush.resend(e)}},{key:"rejoin",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.timeout;this.isLeaving()||this.sendJoin(e)}},{key:"trigger",value:function(e,t,n,i){var o=this.onMessage(e,t,n,i);if(t&&!o)throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");for(var r=0;r<this.bindings.length;r++){var s=this.bindings[r];s.event===e&&s.callback(o,n,i||this.joinRef())}}},{key:"replyEventName",value:function(e){return"chan_reply_".concat(e)}},{key:"isClosed",value:function(){return this.state===v.closed}},{key:"isErrored",value:function(){return this.state===v.errored}},{key:"isJoined",value:function(){return this.state===v.joined}},{key:"isJoining",value:function(){return this.state===v.joining}},{key:"isLeaving",value:function(){return this.state===v.leaving}}]),e}(),R={encode:function(e,t){var n=[e.join_ref,e.ref,e.topic,e.event,e.payload];return t(JSON.stringify(n))},decode:function(e,t){var n=r(JSON.parse(e),5);return t({join_ref:n[0],ref:n[1],topic:n[2],event:n[3],payload:n[4]})}},C=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e),this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.channels=[],this.sendBuffer=[],this.ref=0,this.timeout=i.timeout||p,this.transport=i.transport||l.WebSocket||T,this.defaultEncoder=R.encode,this.defaultDecoder=R.decode,this.closeWasClean=!1,this.unloaded=!1,this.binaryType=i.binaryType||"arraybuffer",this.transport!==T?(this.encode=i.encode||this.defaultEncoder,this.decode=i.decode||this.defaultDecoder):(this.encode=this.defaultEncoder,this.decode=this.defaultDecoder),h&&h.addEventListener&&h.addEventListener("beforeunload",function(e){n.conn&&(n.unloaded=!0,n.abnormalClose("unloaded"))}),this.heartbeatIntervalMs=i.heartbeatIntervalMs||3e4,this.rejoinAfterMs=function(e){return i.rejoinAfterMs?i.rejoinAfterMs(e):[1e3,2e3,5e3][e-1]||1e4},this.reconnectAfterMs=function(e){return n.unloaded?100:i.reconnectAfterMs?i.reconnectAfterMs(e):[10,50,100,150,200,250,500,1e3,2e3][e-1]||5e3},this.logger=i.logger||null,this.longpollerTimeout=i.longpollerTimeout||2e4,this.params=k(i.params||{}),this.endPoint="".concat(t,"/").concat(g.websocket),this.vsn=i.vsn||f,this.heartbeatTimer=null,this.pendingHeartbeatRef=null,this.reconnectTimer=new S(function(){n.teardown(function(){return n.connect()})},this.reconnectAfterMs)}return c(e,[{key:"protocol",value:function(){return location.protocol.match(/^https/)?"wss":"ws"}},{key:"endPointURL",value:function(){var e=w.appendParams(w.appendParams(this.endPoint,this.params()),{vsn:this.vsn});return"/"!==e.charAt(0)?e:"/"===e.charAt(1)?"".concat(this.protocol(),":").concat(e):"".concat(this.protocol(),"://").concat(location.host).concat(e)}},{key:"disconnect",value:function(e,t,n){this.closeWasClean=!0,this.reconnectTimer.reset(),this.teardown(e,t,n)}},{key:"connect",value:function(e){var t=this;e&&(console&&console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor"),this.params=k(e)),this.conn||(this.closeWasClean=!1,this.conn=new this.transport(this.endPointURL()),this.conn.binaryType=this.binaryType,this.conn.timeout=this.longpollerTimeout,this.conn.onopen=function(){return t.onConnOpen()},this.conn.onerror=function(e){return t.onConnError(e)},this.conn.onmessage=function(e){return t.onConnMessage(e)},this.conn.onclose=function(e){return t.onConnClose(e)})}},{key:"log",value:function(e,t,n){this.logger(e,t,n)}},{key:"hasLogger",value:function(){return null!==this.logger}},{key:"onOpen",value:function(e){this.stateChangeCallbacks.open.push(e)}},{key:"onClose",value:function(e){this.stateChangeCallbacks.close.push(e)}},{key:"onError",value:function(e){this.stateChangeCallbacks.error.push(e)}},{key:"onMessage",value:function(e){this.stateChangeCallbacks.message.push(e)}},{key:"onConnOpen",value:function(){this.hasLogger()&&this.log("transport","connected to ".concat(this.endPointURL())),this.unloaded=!1,this.closeWasClean=!1,this.flushSendBuffer(),this.reconnectTimer.reset(),this.resetHeartbeat(),this.stateChangeCallbacks.open.forEach(function(e){return e()})}},{key:"resetHeartbeat",value:function(){var e=this;this.conn&&this.conn.skipHeartbeat||(this.pendingHeartbeatRef=null,clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(function(){return e.sendHeartbeat()},this.heartbeatIntervalMs))}},{key:"teardown",value:function(e,t,n){this.conn&&(this.conn.onclose=function(){},t?this.conn.close(t,n||""):this.conn.close(),this.conn=null),e&&e()}},{key:"onConnClose",value:function(e){this.hasLogger()&&this.log("transport","close",e),this.triggerChanError(),clearInterval(this.heartbeatTimer),this.closeWasClean||this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(function(t){return t(e)})}},{key:"onConnError",value:function(e){this.hasLogger()&&this.log("transport",e),this.triggerChanError(),this.stateChangeCallbacks.error.forEach(function(t){return t(e)})}},{key:"triggerChanError",value:function(){this.channels.forEach(function(e){e.isErrored()||e.isLeaving()||e.isClosed()||e.trigger(y.error)})}},{key:"connectionState",value:function(){switch(this.conn&&this.conn.readyState){case d.connecting:return"connecting";case d.open:return"open";case d.closing:return"closing";default:return"closed"}}},{key:"isConnected",value:function(){return"open"===this.connectionState()}},{key:"remove",value:function(e){this.channels=this.channels.filter(function(t){return t.joinRef()!==e.joinRef()})}},{key:"channel",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new j(e,t,this);return this.channels.push(n),n}},{key:"push",value:function(e){var t=this;if(this.hasLogger()){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;this.log("push","".concat(n," ").concat(i," (").concat(s,", ").concat(r,")"),o)}this.isConnected()?this.encode(e,function(e){return t.conn.send(e)}):this.sendBuffer.push(function(){return t.encode(e,function(e){return t.conn.send(e)})})}},{key:"makeRef",value:function(){var e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}},{key:"sendHeartbeat",value:function(){if(this.isConnected()){if(this.pendingHeartbeatRef)return this.pendingHeartbeatRef=null,this.hasLogger()&&this.log("transport","heartbeat timeout. Attempting to re-establish connection"),void this.abnormalClose("heartbeat timeout");this.pendingHeartbeatRef=this.makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef})}}},{key:"abnormalClose",value:function(e){this.closeWasClean=!1,this.conn.close(1e3,e)}},{key:"flushSendBuffer",value:function(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(function(e){return e()}),this.sendBuffer=[])}},{key:"onConnMessage",value:function(e){var t=this;this.decode(e.data,function(e){var n=e.topic,i=e.event,o=e.payload,r=e.ref,s=e.join_ref;r&&r===t.pendingHeartbeatRef&&(t.pendingHeartbeatRef=null),t.hasLogger()&&t.log("receive","".concat(o.status||""," ").concat(n," ").concat(i," ").concat(r&&"("+r+")"||""),o);for(var a=0;a<t.channels.length;a++){var c=t.channels[a];c.isMember(n,i,o,s)&&c.trigger(i,o,r,s)}for(var u=0;u<t.stateChangeCallbacks.message.length;u++)t.stateChangeCallbacks.message[u](e)})}}]),e}(),T=function(){function e(t){s(this,e),this.endPoint=null,this.token=null,this.skipHeartbeat=!0,this.onopen=function(){},this.onerror=function(){},this.onmessage=function(){},this.onclose=function(){},this.pollEndpoint=this.normalizeEndpoint(t),this.readyState=d.connecting,this.poll()}return c(e,[{key:"normalizeEndpoint",value:function(e){return e.replace("ws://","http://").replace("wss://","https://").replace(new RegExp("(.*)/"+g.websocket),"$1/"+g.longpoll)}},{key:"endpointURL",value:function(){return w.appendParams(this.pollEndpoint,{token:this.token})}},{key:"closeAndRetry",value:function(){this.close(),this.readyState=d.connecting}},{key:"ontimeout",value:function(){this.onerror("timeout"),this.closeAndRetry()}},{key:"poll",value:function(){var e=this;this.readyState!==d.open&&this.readyState!==d.connecting||w.request("GET",this.endpointURL(),"application/json",null,this.timeout,this.ontimeout.bind(this),function(t){if(t){var n=t.status,i=t.token,o=t.messages;e.token=i}else n=0;switch(n){case 200:o.forEach(function(t){return e.onmessage({data:t})}),e.poll();break;case 204:e.poll();break;case 410:e.readyState=d.open,e.onopen(),e.poll();break;case 0:case 500:e.onerror(),e.closeAndRetry();break;default:throw new Error("unhandled poll status ".concat(n))}})}},{key:"send",value:function(e){var t=this;w.request("POST",this.endpointURL(),"application/json",e,this.timeout,this.onerror.bind(this,"timeout"),function(e){e&&200===e.status||(t.onerror(e&&e.status),t.closeAndRetry())})}},{key:"close",value:function(e,t){this.readyState=d.closed,this.onclose()}}]),e}(),w=function(){function e(){s(this,e)}return c(e,null,[{key:"request",value:function(e,t,n,i,o,r,s){if(l.XDomainRequest){var a=new XDomainRequest;this.xdomainRequest(a,e,t,i,o,r,s)}else{var c=l.XMLHttpRequest?new l.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");this.xhrRequest(c,e,t,n,i,o,r,s)}}},{key:"xdomainRequest",value:function(e,t,n,i,o,r,s){var a=this;e.timeout=o,e.open(t,n),e.onload=function(){var t=a.parseJSON(e.responseText);s&&s(t)},r&&(e.ontimeout=r),e.onprogress=function(){},e.send(i)}},{key:"xhrRequest",value:function(e,t,n,i,o,r,s,a){var c=this;e.open(t,n,!0),e.timeout=r,e.setRequestHeader("Content-Type",i),e.onerror=function(){a&&a(null)},e.onreadystatechange=function(){if(e.readyState===c.states.complete&&a){var t=c.parseJSON(e.responseText);a(t)}},s&&(e.ontimeout=s),e.send(o)}},{key:"parseJSON",value:function(e){if(!e||""===e)return null;try{return JSON.parse(e)}catch(t){return console&&console.log("failed to parse JSON response",e),null}}},{key:"serialize",value:function(e,t){var n=[];for(var i in e)if(e.hasOwnProperty(i)){var r=t?"".concat(t,"[").concat(i,"]"):i,s=e[i];"object"===o(s)?n.push(this.serialize(s,r)):n.push(encodeURIComponent(r)+"="+encodeURIComponent(s))}return n.join("&")}},{key:"appendParams",value:function(e,t){if(0===Object.keys(t).length)return e;var n=e.match(/\?/)?"&":"?";return"".concat(e).concat(n).concat(this.serialize(t))}}]),e}();w.states={complete:4};var E=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};s(this,e);var o=i.events||{state:"presence_state",diff:"presence_diff"};this.state={},this.pendingDiffs=[],this.channel=t,this.joinRef=null,this.caller={onJoin:function(){},onLeave:function(){},onSync:function(){}},this.channel.on(o.state,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.joinRef=n.channel.joinRef(),n.state=e.syncState(n.state,t,o,r),n.pendingDiffs.forEach(function(t){n.state=e.syncDiff(n.state,t,o,r)}),n.pendingDiffs=[],s()}),this.channel.on(o.diff,function(t){var i=n.caller,o=i.onJoin,r=i.onLeave,s=i.onSync;n.inPendingSyncState()?n.pendingDiffs.push(t):(n.state=e.syncDiff(n.state,t,o,r),s())})}return c(e,[{key:"onJoin",value:function(e){this.caller.onJoin=e}},{key:"onLeave",value:function(e){this.caller.onLeave=e}},{key:"onSync",value:function(e){this.caller.onSync=e}},{key:"list",value:function(t){return e.list(this.state,t)}},{key:"inPendingSyncState",value:function(){return!this.joinRef||this.joinRef!==this.channel.joinRef()}}],[{key:"syncState",value:function(e,t,n,i){var o=this,r=this.clone(e),s={},a={};return this.map(r,function(e,n){t[e]||(a[e]=n)}),this.map(t,function(e,t){var n=r[e];if(n){var i=t.metas.map(function(e){return e.phx_ref}),c=n.metas.map(function(e){return e.phx_ref}),u=t.metas.filter(function(e){return c.indexOf(e.phx_ref)<0}),h=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0});u.length>0&&(s[e]=t,s[e].metas=u),h.length>0&&(a[e]=o.clone(n),a[e].metas=h)}else s[e]=t}),this.syncDiff(r,{joins:s,leaves:a},n,i)}},{key:"syncDiff",value:function(e,t,n,o){var r=t.joins,s=t.leaves,a=this.clone(e);return n||(n=function(){}),o||(o=function(){}),this.map(r,function(e,t){var o=a[e];if(a[e]=t,o){var r,s=a[e].metas.map(function(e){return e.phx_ref}),c=o.metas.filter(function(e){return s.indexOf(e.phx_ref)<0});(r=a[e].metas).unshift.apply(r,i(c))}n(e,o,t)}),this.map(s,function(e,t){var n=a[e];if(n){var i=t.metas.map(function(e){return e.phx_ref});n.metas=n.metas.filter(function(e){return i.indexOf(e.phx_ref)<0}),o(e,n,t),0===n.metas.length&&delete a[e]}}),a}},{key:"list",value:function(e,t){return t||(t=function(e,t){return t}),this.map(e,function(e,n){return t(e,n)})}},{key:"map",value:function(e,t){return Object.getOwnPropertyNames(e).map(function(n){return t(n,e[n])})}},{key:"clone",value:function(e){return JSON.parse(JSON.stringify(e))}}]),e}(),S=function(){function e(t,n){s(this,e),this.callback=t,this.timerCalc=n,this.timer=null,this.tries=0}return c(e,[{key:"reset",value:function(){this.tries=0,clearTimeout(this.timer)}},{key:"scheduleTimeout",value:function(){var e=this;clearTimeout(this.timer),this.timer=setTimeout(function(){e.tries=e.tries+1,e.callback()},this.timerCalc(this.tries+1))}}]),e}()}])}); | |
\ No newline at end of file | |
diff --git a/priv/templates/phx.gen.html/index.html.eex b/priv/templates/phx.gen.html/index.html.eex | |
index 9541f23..b3d271a 100644 | |
--- a/priv/templates/phx.gen.html/index.html.eex | |
+++ b/priv/templates/phx.gen.html/index.html.eex | |
@@ -14,9 +14,9 @@ | |
<%= for {k, _} <- schema.attrs do %> <td><%%= <%= schema.singular %>.<%= k %> %></td> | |
<% end %> | |
<td> | |
- <%%= link "Show", to: Routes.<%= schema.route_helper %>_path(@conn, :show, <%= schema.singular %>) %> | |
- <%%= link "Edit", to: Routes.<%= schema.route_helper %>_path(@conn, :edit, <%= schema.singular %>) %> | |
- <%%= link "Delete", to: Routes.<%= schema.route_helper %>_path(@conn, :delete, <%= schema.singular %>), method: :delete, data: [confirm: "Are you sure?"] %> | |
+ <span><%%= link "Show", to: Routes.<%= schema.route_helper %>_path(@conn, :show, <%= schema.singular %>) %></span> | |
+ <span><%%= link "Edit", to: Routes.<%= schema.route_helper %>_path(@conn, :edit, <%= schema.singular %>) %></span> | |
+ <span><%%= link "Delete", to: Routes.<%= schema.route_helper %>_path(@conn, :delete, <%= schema.singular %>), method: :delete, data: [confirm: "Are you sure?"] %></span> | |
</td> | |
</tr> | |
<%% end %> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment