Packages
absinthe
1.10.1
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/subscription/supervisor.ex
defmodule Absinthe.Subscription.Supervisor do
@moduledoc false
use Supervisor
@spec start_link(atom() | [Absinthe.Subscription.opt()]) :: Supervisor.on_start()
def start_link(pubsub) when is_atom(pubsub) do
# start_link/1 used to take a single argument - the pub-sub - so in order
# to maintain compatibility for existing users of the library we still
# accept this argument and transform it into a keyword list.
start_link(pubsub: pubsub)
end
def start_link(opts) when is_list(opts) do
pubsub =
case Keyword.fetch!(opts, :pubsub) do
[module] when is_atom(module) ->
module
module ->
module
end
pool_size = Keyword.get(opts, :pool_size, System.schedulers_online() * 2)
compress_registry? = Keyword.get(opts, :compress_registry?, true)
# Absinthe.Subscription.Proxy listens for subscription messages
# from other nodes and then runs Subscription.Local.publish_mutation to process
# the mutation on the local node. By default it runs in a task superivsor so that
# requests are handled concurrently. However, this may not work for some
# systems. Setting `async` to false makes it so that the requests are processed one at a time.
async? = Keyword.get(opts, :async, true)
# Determines how keys in the registry are partitioned.
# Absinthe expects duplicate keys and by default used the :duplicate option.
# In Elixir 1.19 there are more options to determine how the duplicate keys
# are partitioned. {:duplicate, :pid} which is the same as :duplicate and
# {:duplicate, :keys} which partitioned by key.
registry_partition_strategy = Keyword.get(opts, :registry_partition_strategy, :pid)
Supervisor.start_link(
__MODULE__,
{pubsub, pool_size, compress_registry?, async?, registry_partition_strategy}
)
end
def init({pubsub, pool_size, compress_registry?, async?, registry_partition_strategy}) do
registry_name = Absinthe.Subscription.registry_name(pubsub)
meta = [pool_size: pool_size]
keys =
case registry_partition_strategy do
# to support Elixir versions before 1.19
:pid -> :duplicate
_ -> {:duplicate, :key}
end
children = [
{Registry,
[
keys: keys,
name: registry_name,
partitions: System.schedulers_online(),
meta: meta,
compressed: compress_registry?
]},
{Absinthe.Subscription.ProxySupervisor, [pubsub, registry_name, pool_size, async?]}
]
Supervisor.init(children, strategy: :one_for_one)
end
end