신경 - Cloud-native messaging/pubsub with powerful routing

Overview

신경

Build status codecov Docker Hub Dependabot Status

신경

/ɕʰinɡjʌ̹ŋ/ • sin-gyeong (try it with IPA Reader)

  1. nerve

Nerve

/nərv/ • noun

  1. (in the body) a whitish fiber or bundle of fibers that transmits impulses of sensation to the brain or spinal cord, and impulses from these to the muscles and organs.

"the optic nerve"

신경 is the nerve-center of your microservices, providing a message bus + message queue with powerful routing, automatic load-balancing + failover, powerful HTTP request proxying + routing, and more. 신경 aims to be simple to get started with while still providing the features for a variety of use-cases.

신경 is a part of the amyware Discord server.

If you like what I make, consider supporting me on Patreon:

Clients:

Language Author Link Maintained?
Elixir @queer https://github.com/queer/singyeong-client-elixir yes
.NET @FiniteReality https://github.com/finitereality/singyeong.net yes
Python @PanKlipcio https://github.com/StartITBot/singyeong.py yes
Typescript @cyyynthia https://github.com/borkenware/singyeongjs looks like yes (used in squirrelchat?)

Unmaintained clients

Language Author Link Notes
Python @PendragonLore https://github.com/PendragonLore/shinkei Owner said it's unmaintained
Java @queer https://github.com/queer/singyeong-java-client I don't write much Java anymore S:
Typescript @alula https://github.com/KyokoBot/node-singyeong-client Repo gone

Credit

신경 was inspired by sekitsui, a project by the Ayana developers. 신경 was developed due to sekitsui seemingly having halted development (no release as far as I'm aware, no repo activity in the last 1-2 years).

WARNING

신경 is ALPHA-QUALITY software. The core functionality works, but there's no guarantee that it won't break, eat your cat, ... Use at your own risk!

Configuration

Configuration is done via environment variables, or via a custom configuration file. See config.exs for more information about config options.

Custom config files

Sometimes, it's necessary to include custom configuration files - such as for something that the environment variables don't cover. In such a case, you can add a custom.exs file to config/ that includes the custom configuration you want / need.

Example: Prove that custom config works:

use Mix.Config

IO.puts "Loading some cool custom config :blobcatcooljazz:"

Example: Always have debug-level logging, even in prod mode:

use Mix.Config

config :logger, level: :debug

Plugins

Plugins belong in a directory named plugins at the root directory. See the plugin API and the example plugin for more info.

Clustering

신경 is capable of discovering cluster members automatically, using libcluster and the gossip strategy by default.

What exactly is it?

신경 is a metadata-oriented message bus + message queue + HTTP proxy. Clients connect over a websocket, and can send messages, queue messages, and send HTTP requests that can be routed to clients based on client metadata.

Metadata-oriented?

신경 clients are identified by three factors:

  1. Application id.
  2. Client id.
  3. Client metadata.

When sending messages or HTTP requests over 신경, you do not choose a target service instance directly, nor does 신경 choose for you. Rather, you specify a target application and a metadata query. 신경 will then run this query on all clients under the given application, and choose one that matches to receive the message or request.

For example, suppose you wanted to let users who had opted-in to a beta program use beta features, but not all users. You could express this as a 신경 query, and say something like "send this message to some service in the backend application where version_number >= 2.0.0."

Of course, something like that is easy, but 신경 lets you do all sorts of things easily. For example, suppose you had a cluster of websocket gateways that users connected to and received events over. Instead of having to know which gateway a user is connected to, you could trivially express this as a 신경 query - "send this message to a gateway node that has 123 in its connected_users metadata." Importantly, sending messages like this is done in exactly the same way as sending any other message. 신경 tries to make it very easy to express potentially-complicated routing with the same syntax as a simple "send to any one service in this application group."

Do I need to know exact client IDs to send messages?

No. You should not try to route to a specific 신경 client by id; instead you should be expressing a metadata query that will send to the client you want. Generally speaking, clients should be capable of running statelessly, or you should use metadata to route messages effectively.

Do I need sidecar containers if I'm running in Kubernetes?

Nope.

Does it support clustering / multi-master / ...?

신경 has masterless clustering support.

Why should I use this?

  • No need for Kubernetes or something similar - anything that can speak websockets is a valid 신경 client.
  • No configuration. 신경 is meant to be "drop in and get started" - a few options exist for things like authentication, but beyond that, no configuration should be needed (at least to start out).
  • Fully dynamic. 신경 is meant to work well with clients randomly appearing and disappearing (ex. browser clients when using 신경 as a websocket gateway).
  • No sidecars.
  • Choose where messages / requests are routed at runtime; no need to bake exact targets into your application.
  • Service discovery without DNS.
  • Service discovery integrated into HTTP proxying / message sending.

Why should I NOT use this?

  • Query performance might be unacceptable.
  • Websockets might not be acceptable.
  • Development is still fairly early-stage; the alpha-ish quality of it may be nonviable.

Why make this?

Metadata-based routing is useful for all sorts of things:

  • Storing documentation about what messages your services send/recv, what REST endpoints they expose, ... and querying on it to route to a service that accepts a specific format of a specific message.
  • Sending a message to a subset of clients without doing a full pubsub and relying on clients to drop them properly.
  • Discord bot message-passing between services. No more pubsub or whatever, just "send this message to the service where 123 in guild_ids."
  • Websocket gateway. "Send this message to the client where user_id = 123."
  • Container scheduling.
  • Monitoring host stats.
  • Routing messages to an audit-logging service and a handler service at the same time.
  • Message queues that can only dispatch messages when a client is capable (ex. "dispatch this message from the queue to a client where latency < 10")
  • Anything you can think of!

In general, 신경 can get messages to the right place with some very complicated conditions very easily.

Why Elixir? Why not Go, Rust, Java, ...?

I like Elixir 👍 Elixir is well-suited to the use-case of message-queuing, and imo is a lot friendlier to write scalable messaging code in with little effort relative to any of the above-mentioned languages.

Why using Phoenix? Why not just use Cowboy directly?

Phoenix's socket abstraction is really really useful. Also I didn't want to have to build eg. HTTP routing from scratch; Phoenix does a great job of it already so no need to reinvent the wheel. While it is possible to use Plug or a similar library on top of Cowboy or another HTTP server, I just liked the convenience of getting it all out-of-the-box with Phoenix and being able to focus on writing my application-level code instead of setting up a ton of weird plumbing.

How do I write my own client for it?

Check out PROTOCOL.md.

How does it work internally?

The code is intended to be pretty easy to read. The general direction that data flows is something like:

client -> decoder -> gateway -> dispatch         -> process and dispatch response
                             -> identifier       -> allow or reject connection
                             -> metadata updater -> apply or reject metadata updates

In terms of module structure, the way things go is something like:

|-> <phx/cowboy code>
|           |
|           V
|   SingyeongWeb.Transport.Raw
|           |
|           V
|   Singyeong.Gateway
|           |
|           |------------------------------------|-----------------------------------------|
|           V                                    V                                         V
|   Singyeong.Gateway.Handler.Identify   Singyeong.Gateway.Handler.DispatchEvent   Singyeong.Gateway.Handler.Heartbeat
|           |                                    |                                         |
|           V                                    V                                         V
|   Singyeong.Gateway                    Singyeong.Gateway.Dispatch                Singyeong.Store ---------|
|           |                                    |                                                          |
|           V                     |--------------|-----------------|-----------------------------|          |
|-- SingyeongWeb.Transport.Raw    |              V                 |                             |          |
            ^                     V      (METADATA_UPDATE)         V                             V          |
            |        Singyeong.Gateway   Singyeong.Store   Singyeong.MessageDispatcher   Singyeong.Queue    |
            |----------------|                                     |                             |          |
            |                                                      |                             |          |
            |------------------------------------------------------|-----------------------------|----------|

Additionally, I aim to keep the server fairly small, ideally <5k LoC, but absolutely <10kLoC no matter what.. At the time of writing, the server is ~3.600 LoC:

git:(master) X | ->  tokei lib/
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 Elixir                 48         4558         3621          267          670
===============================================================================
 Total                  48         4558         3621          267          670
===============================================================================
git:(master) X | ->

How does querying / messaging work?

When you send a message, the server inspects its target (ie. its metadata query) and queries its own internal metadata store to find clients that can be routed to that match said query. In the case of a multi-node setup, each node is only aware of its own clients, and thus metadata queries are a parallel RPC across the cluster.

A very basic query looks like this:

{
  "application": "api",
  "ops": [],
}

That is, "route this message to any client that's a member of the api application." More-complex queries may do things like specifying constraints based on latency:

{
  "application": "api",
  "ops": [
    {
      "path": "/latency/http",
      "op": "$lte",
      "to": {"value": 100},
    }
  ],
}

That is, "route this message to any client that's a member of the api application, where the value at that application's /latency/http key is less than or equal to 100."

As metadata is arbitrary JSON -- the only restriction being that the top-level JSON is an object -- you can query effectively-infinitely-nested structures. You can query paths with a syntax inspired by JSON Patch.

For more about how the query language works, see the relevant docs

Delivery guarantees

Messages are delivered at-least-zero times. That is, speaking broadly, your messages will be delivered exactly once, but there are cases (network issues etc.) that can lead to either no delivery, or more than one delivery, of the same message.

What about test coverage and the like?

You can run tests with mix test. Note that the plugin tests WILL FAIL unless you set up the test plugin in priv/test/plugin/. If you don't want to deal with the plugin-related code when running tests (tho you REALLY should care...), you can skip those tests by running mix test --exclude plugin.

Note that the HTTP proxying tests use an echo server I wrote (echo.amy.gg), rather than using a locally-hosted one. If you don't want to run these tests, set the DISABLE_PROXY_TESTS env var.

Security

Note that there is no ratelimit on authentication attempts. This means that a malicious client can constantly open connections and attempt passwords until it gets the correct one. It is highly recommended that you use a very long, probably-very-complicated password in order to help protect against this sort of attack.

What is that name?

신경 means nerve, and since the nervous system is how the entire body communicates, it seemed like a fitting name for a messaging system. I considered naming this something like 등뼈 (deungppyeo, "spine"/"backbone") or 회로망 (hoelomang, "network") or even 별자리 (byeoljali, "constellation), but I figured that 신경 would be easier for people who don't know Korean to pronounce, as well as being easier to find from GitHub search.

Comments
  • Bump phoenix from 1.3.4 to 1.4.1

    Bump phoenix from 1.3.4 to 1.4.1

    Bumps phoenix from 1.3.4 to 1.4.1.

    Changelog

    Sourced from phoenix's changelog.

    1.4.1 (2019-02-12)

    Enhancements

    • Optimize router helper generation for faster compilation
    • Drop special convention for context locations

    Bug Fixes

    • Add missing :jason to generated umbrella application

    JavaScript client bug fixes

    • Fix reconnect regression experienced with spotty connections

    1.4.0 (2018-11-07)

    Enhancements

    • [phx.new] Update Ecto deps with the release of Ecto 3.0 including phoenix_ecto 4.0
    • [phx.new] Import Ecto's .formatter.exs in new projects
    • [phx.new] Use Ecto 3.0RC, with ecto_sql in new project deps
    • [phx.new] Use Plug 1.7 with new :plug_cowboy dependency for cowboy adapter
    • [phx.gen.html|json|schema|context] Support new Ecto 3.0 usec datetime types
    • [Phoenix] Add Phoenix.json_library/0 and replace Poison with Jason for JSON encoding in new projects
    • [Endpoint] Add Cowboy2Adapter for HTTP2 support with cowboy2
    • [Endpoint] The socket/3 macro now accepts direct configuration about websockets and longpoll
    • [Endpoint] Support MFA function in :check_origin config for custom origin checking
    • [Endpoint] Add new :phoenix_error_render instrumentation callback
    • [Endpoint] Log the configured url instead of raw IP when booting endpoint webserver
    • [Endpoint] Allow custom keyword pairs to be passed to the socket :connect_info options.
    • [Router] Display list of available routes on debugger 404 error page
    • [Router] Raise on duplicate plugs in pipe_through scopes
    • [Controller] Support partial file downloads with :offset and :length options to send_download/3
    • [Controller] Add additional security headers to put_secure_browser_headers (x-content-type-options, x-download-options, and x-permitted-cross-domain-policies)
    • [Controller] Add put_router_url/2 to override the default URL generation pulled from endpoint configuration
    • [Logger] Add whitelist support to filter_parameters logger configuration, via new :keep tuple format
    • [Socket] Add new phoenix_socket_connect instrumentation
    • [Socket] Improve error message when missing socket mount in endpoint
    • [Logger] Log calls to user socket connect
    • [Presence] Add Presence.get_by_key to fetch presences for specific user
    • [CodeReloader] Add :reloadable_apps endpoint configuration option to allow recompiling local dependencies
    • [ChannelTest] Respect user's configured ExUnit :assert_receive_timeout for macro assertions

    Bug Fixes

    • Add missing .formatter.exs to Hex package for proper elixir formatter integration
    • [phx.gen.cert] Fix usage inside umbrella applications
    • [phx.new] Revert Routes.static_url in app layout in favor of original Routes.static_path
    • [phx.new] Use phoenix_live_reload 1.2 to fix Hex version errors
    • [phx.gen.json|html] Fix generator tests incorrectly encoding datetimes
    • [phx.gen.cert] Fix generation of cert inside umbrella projects
    • [Channel] Fix issue with WebSocket transport sending wrong ContentLength header with 403 response
    • [Router] Fix forward aliases failing to expand within scope block
    ... (truncated)
    Commits
    • 05f288f Release 1.4.1
    • ee839b9 Throw errors instead of strings (#3211)
    • bdc0137 Revert reconnect optimizations which introduced regressions. Fixes #3161 (#3272)
    • 48df04c Add jason to umbrella ecto deps. Fixes #3263
    • eb3eb71 Fix references in guides (#3251)
    • 5075f09 Add $PORT bind step in Heroku deployment guide (#3235)
    • c572d2e Drop special convention for context locations
    • 4c69b5f Improve code formatting consistency in guides (and additional guides fixes) (...
    • 3051963 Use Elixir v1.5's streamlined child specs in docs (#3233)
    • 1f3f66d Fix Controller.put_flash and Presence.list arities in docs (#3232)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 7
  • Bump plug_cowboy from 2.4.1 to 2.5.0

    Bump plug_cowboy from 2.4.1 to 2.5.0

    Bumps plug_cowboy from 2.4.1 to 2.5.0.

    Changelog

    Sourced from plug_cowboy's changelog.

    v2.5.0

    Enhancements

    • Return :conn as Logger metadata on translator
    • Support Ranch 2.0
    • Support the :net option so developers can work with keyword lists
    • Remove previously deprecated options
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    dependencies 
    opened by dependabot-preview[bot] 6
  • Support initial queues in identify payload

    Support initial queues in identify payload

    Automatically performs QUEUE_REQUEST for the specified queues.

    Example payload:

    {
      "client_id": "19274eyuholdis3vhynurtlofkbhndvhvqkl34wjgyhnewri",
      "application_id": "my-cool-application",
      "queues": [
        "my-queue-name"
      ]
    }
    
    enhancement question 
    opened by PanKlipcio 4
  • Bump httpoison from 1.6.0 to 1.6.1

    Bump httpoison from 1.6.0 to 1.6.1

    Bumps httpoison from 1.6.0 to 1.6.1.

    Release notes

    Sourced from httpoison's releases.

    HTTPoison 1.6.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 4
  • Support request/response messaging

    Support request/response messaging

    Use case: I'd like to be able to say, for example, get me the latency of all servers in the eu region, and have singyeong figure out everything for me. This would be extremely useful for real-time monitoring or metrics for example, or even just service discovery for users. (E.g. a realm list in a MMORPG.)

    As a workaround, you could configure some session ID (e.g. a GUID) as metadata and then say respond to [guid] with the latency for servers in the eu region. The latency would be returned as another query, e.g. send [x]ms to the server marked with session id [guid].

    enhancement 
    opened by FiniteReality 3
  • Bump phoenix_pubsub from 1.1.1 to 1.1.2

    Bump phoenix_pubsub from 1.1.1 to 1.1.2

    Bumps phoenix_pubsub from 1.1.1 to 1.1.2.

    Changelog

    Sourced from phoenix_pubsub's changelog.

    v1.1.2 (2019-02-23)

    • Bug fixes
      • Avoid warnings when running on Elixir v1.8
    Commits
    • 49ec831 Release v1.1.2 with proper config
    • 795887f Release v1.1.2
    • 316fdd8 Don't use into with a non-empty list as this is deprecated in 1.8.0 (#121)
    • 50c1da2 Fix documentation (DocTest) for Phoenix.PubSub (#119)
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 3
  • Proper message queueing

    Proper message queueing

    Properly queue messages, ie don't fire-and-forget in the case of ex. waiting on a service to reconnect

    Things to consider:

    1. Do we have timeouts? How do we communicate them to the sender?
    2. We can't just naively queue, as we have ex. metadata queries to think about. Do we just pop it from the queue immediately?
    3. Queue persistence
    4. Clustering support
    enhancement question 
    opened by queer 3
  • chore(deps): Bump gettext from 0.19.1 to 0.20.0

    chore(deps): Bump gettext from 0.19.1 to 0.20.0

    Bumps gettext from 0.19.1 to 0.20.0.

    Changelog

    Sourced from gettext's changelog.

    v0.20.0

    • Allow gettext_comment to be invoked multiple times
    • Dump flags after references in PO files
    • Deprecate compile.gettext in favor of __mix_recompile__?

    Backwards incompatible changes

    • handle_missing_translation(locale, domain, msgid, bindings) callback signature was changed to handle_missing_translation(locale, domain, msgctxt, msgid, bindings) (it receives a new argument called msgctxt)

    • handle_missing_plural_translation(locale, domain, msgid, msgid_plural, n, bindings) callback signature was changed to handle_missing_plural_translation(locale, domain, msgctxt, msgid, msgid_plural, n, bindings) (it receives a new argument called msgctxt)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Bump excoveralls from 0.14.0 to 0.14.1

    Bump excoveralls from 0.14.0 to 0.14.1

    Bumps excoveralls from 0.14.0 to 0.14.1.

    Release notes

    Sourced from excoveralls's releases.

    v0.14.1

    Changes

    • Fix HTML tag typo (#259).
    Changelog

    Sourced from excoveralls's changelog.

    0.14.1

    Changes

    • Fix HTML tag typo (#259).
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Bump credo from 1.5.5 to 1.5.6

    Bump credo from 1.5.5 to 1.5.6

    Bumps credo from 1.5.5 to 1.5.6.

    Changelog

    Sourced from credo's changelog.

    1.5.6

    • Ensure compatibility with Elixir 1.12
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • Query engine v2

    Query engine v2

    The current query engine is... problematic, to say the least. It’s pretty incomprehensible, can be quite slow (O(N) client scans...), and is difficult to add new features onto. Query engine v2 aims to solve all of these and more:

    • Rewrite it to be cleaner and better-tested.
    • Implement proper indexing over client metadata for faster lookups (should be able to get O(log2(N)) or even O(1) in some cases).
    • Implement selectors (ex. Ie “select from clients where x = true by min(latency)” sort of support for routing).
    • Clean up some issues that exist, such as only being able to have one key / operator per-op. (See #117)
    enhancement question 
    opened by queer 2
  • fix: remove some deprecated stuff

    fix: remove some deprecated stuff

    I hate it when software yells at me with yellow stuff >:D

    MessageDispatcher.send_message and Dispatch.send_to_clients no longer take the sender as an arg as it's gone unused; removed redundant signature for queries that cannot be routed. (it seems it was a hacky thing anyways, as it was nil more often than a socket 🙄)

    ~~hopefully I didn't screw up this time and the build will work ugh~~

    opened by cyyynthia 0
  • chore(deps-dev): Bump excoveralls from 0.14.6 to 0.15.1

    chore(deps-dev): Bump excoveralls from 0.14.6 to 0.15.1

    Bumps excoveralls from 0.14.6 to 0.15.1.

    Release notes

    Sourced from excoveralls's releases.

    v0.15.1

    Changes

    • Improve logging for a case with the missing source file (#295).

    v0.15.0

    Enhancements

    • Allows flag_name to pass thru to the coveralls.io API (#290).

    Changes

    • Allow subdir and rootdir to be applied to all tasks and always apply to paths (#289).
    Changelog

    Sourced from excoveralls's changelog.

    0.15.1

    Changes

    • Improve logging for a case with the missing source file (#295).

    0.15.0

    Enhancements

    • Allows flag_name to pass thru to the coveralls.io API (#290).

    Changes

    • Allow subdir and rootdir to be applied to all tasks and always apply to paths (#289).
    Commits
    • 4ab3cec Bump version and update CHANGELOG
    • 09c93ad Improve logging for a case with the missing source file (#295)
    • 6eee044 Fix actions workflow (apply ubuntu-20.04 for version compatibility) (#296)
    • d1b6b35 Update CHANGELOG
    • b706b5d Merge pull request #290 from duffelhq/feature/flag_name_to_api
    • b07c6f5 Allows flag_name to pass thru
    • 413b048 Bump version
    • f8b4d0e Merge pull request #289 from duffelhq/always-allow-subdir-rootdir
    • 7665099 allow subdir and rootdir to be applied to all tasks and apply even if umbrell...
    • d715fb2 Merge pull request #287 from RomanKotov/fix/changelog-typo
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): Bump msgpax from 2.3.0 to 2.3.1

    chore(deps): Bump msgpax from 2.3.0 to 2.3.1

    Bumps msgpax from 2.3.0 to 2.3.1.

    Changelog

    Sourced from msgpax's changelog.

    v2.3.1 – 2022-11-16

    • Added support for iolists in Msgpax.Ext.
    • Fixed iolist Msgpax.Fragment inspecting.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): Bump plug_cowboy from 2.5.2 to 2.6.0

    chore(deps): Bump plug_cowboy from 2.5.2 to 2.6.0

    Bumps plug_cowboy from 2.5.2 to 2.6.0.

    Changelog

    Sourced from plug_cowboy's changelog.

    v2.6.0

    Enhancements

    • Support websocket upgrades
    • Require Plug v1.14+ and Elixir v1.10+
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): Bump phoenix from 1.6.12 to 1.6.15

    chore(deps): Bump phoenix from 1.6.12 to 1.6.15

    Bumps phoenix from 1.6.12 to 1.6.15.

    Changelog

    Sourced from phoenix's changelog.

    1.6.15 (2022-10-26)

    Enhancements

    • Support for Phoenix.View 2.0

    JavaScript Client Bug Fixes

    • Fix heartbeat reconnect

    1.6.14 (2022-10-10)

    • Fix security vulnerability in wildcard check_origin configurations

    1.6.13 (2022-09-29)

    Enhancements

    • [phx.gen.release] Fetch compatible docker image from API when passing --docker flag
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Owner
amy null
i write software. when i'm lucky, it even works! why are you reading this???? @wonderschool | ex @get-wrecked @railwayapp @GetThru
amy null
A simple, secure and instant messaging app. It's cloudbased and free.

Hasten A simple, secure and instant messaging application. It's cloudbased and free. Notice I'm probably at school right now and can't do much ?? . I'

Sliver Hywel 2 Sep 2, 2022
A messaging social platform based on Discord for Desktop and Android.

AP-FinalProject A secure messaging social platform based on Discord for Desktop and Android. This is my final project for Advanced-Programming (AP) in

AmirHosseinAghajari 10 Oct 1, 2022
Firebase Cloud Firestore Android

Firebase Cloud Firestore Android ?? Description Android app built to demonstrate on how to build RecyclerView using Cloud Firestore with Collections,

null 0 Dec 13, 2021
MEGA Android Client - A fully-featured client to access your Cloud Storage provided by MEGA

A fully-featured client to access your Cloud Storage provided by MEGA. This document will guide you to build the application on a Linux machine with Android Studio.

Mega Limited 1.1k Jan 3, 2023
📲💬 react-native-fontext is a lightweight library to integrate fonts in your React Native application that works seamlessly in android and iOS devices.

React Native Fontext react-native-fontext is a lightweight library to integrate fonts in your React Native application that works seamlessly in androi

mroads 9 Dec 3, 2021
A Python native extension written in Kotlin Native

Kotlin Python Ext This is a proof of concept for a Python extension in Kotlin. It is recommended to read the Official Python C API Documentation befor

Martmists 20 Jun 22, 2022
Native-loader - Safely load native libraries in Java

Native Loader ??️ Safe native loading in Java based off of the native-loader use

Mixtape 1 Oct 19, 2022
React-native-user-interface - Change React Native userinterface at runtime

react-native-user-interface change RN userinterface at runtime. Installation npm

Ahmed Eid 0 Jan 11, 2022
Matomo wrapper for React-Native. Supports Android and iOS. Fixed issues for native platforms build that are present in the official package.

@mccsoft/react-native-matomo Matomo wrapper for React-Native. Supports Android and iOS. Fixed issues for native platforms build that are present in th

MCC Soft 4 Dec 29, 2022
Twidere-Android Twidere is a powerful twitter client for Android 1.6+ 1 , which gives you a full Holo experience and nearly full Twitter's feature.

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Jan 2, 2023
🚀A powerful android clean architecture that helps you build your apps faster.

IMStudio ?? Table of Contents Project Structure Convention RxJava Common Scripts Technical Stack Dependencies Library Architecture Case Study Authors

Hau NGUYEN (Leo) 0 Nov 20, 2022
ANTLR is a powerful parser generator for reading, processing, executing, or translating structured text or binary files.

ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files.

Tunnel Vision Laboratories, LLC 53 Dec 18, 2022
NamelessnessR is a vpn hub that combines a number of vpn protocols to provide a hub to a single vpn powerful to protect your privacy only.

NamelessnessR Design concept The Design concept is designed using adobe xd basing of different ideas but mainly Anxray, V2rayNG and NamelessnetX with

mxbhaee 2 Jan 13, 2022
NamelessnessR is a vpn hub that combines a number of vpn protocols to provide a hub to a single vpn powerful to protect your privacy only.

namelessnexR Design concept The Design concept is designed using adobe xd basing of different ideas but mainly Anxray, V2rayNG and NamelessnetX with N

mxbhaee 2 Jan 13, 2022
A minimalist but powerful productivity timer designed to keep you focused and free of distractions.

Goodtime A minimalist but powerful productivity timer designed to keep you focused and free of distractions. Alternate between focused work sessions a

Adrian Cotfas 692 Dec 27, 2022
A powerful library for easy implementation of HMS Location Kit.

AdvancedLocation A powerful library for easy implementation of HMS Location Kit. ?? Request location with couple lines of code (no more boilerplate) C

null 2 Aug 4, 2022
Powerful, comprehensice application performance management platform of Android

OutSiderAPM移动性能监控平台(持续开发中) 项目优势 实时掌控应用性能 降低性能定位成本 有效提升用户体验 监控模块 OutSiderAPM目前支持如下性能指标: 交互分析:分析Activity生命周期耗时,帮助提升页面打开速度,优化用户UI体验 网络请求分析:监控流量使用情况,发现并定位

jinx 336 Jan 3, 2023
Initiate immediate phone call for React Native on iOS and Android.

react-native-immediate-call-library Initiate immediate phone call for React Native on iOS and Android. Getting started Using npm: npm install react-na

null 7 Sep 7, 2022
Simple library to decompress files .zip, .rar, .cbz, .cbr in React Native.

Uncompress React Native Simple library to decompress files .zip, .rar, .cbz and .cbr in React Native. Installation yarn add uncompress-react-native o

Adriano Souza Costa 40 Nov 24, 2022