├── .dockerignore ├── .formatter.exs ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── assets ├── js │ └── app.js └── vendor │ └── topbar.js ├── config ├── .formatter.exs ├── config.exs ├── dev.exs ├── prod.exs ├── runtime.exs └── test.exs ├── deploy.sh ├── lib ├── .lexical │ └── lexical.log ├── elixir_pobeda.ex ├── elixir_pobeda │ └── application.ex ├── elixir_pobeda_web.ex └── elixir_pobeda_web │ ├── components │ ├── core_components.ex │ ├── layouts.ex │ └── layouts │ │ ├── app.html.heex │ │ └── root.html.heex │ ├── controllers │ ├── error_html.ex │ ├── error_json.ex │ ├── page_controller.ex │ ├── page_html.ex │ └── page_html │ │ └── home.html.heex │ ├── endpoint.ex │ ├── live │ ├── home_live.ex │ └── home_live.html.heex │ ├── router.ex │ └── telemetry.ex ├── mix.exs ├── mix.lock ├── priv └── static │ ├── favicon-91f37b602a111216f1eef3aa337ad763.ico │ ├── favicon.ico │ ├── images │ ├── bomb-c4fde33ff2b8d1657e88b7bd5b3bac15.jpg │ ├── bomb.jpg │ ├── durka-de791ce4731ef124273898b46fe78ed0.gif │ ├── durka.gif │ ├── elixir_no_support-073ac21369884bdeca7135f946ed00ed.png │ ├── elixir_no_support.png │ ├── hello_joe-5b6b1b51689ef61a6683c17c783803b0.gif │ ├── hello_joe.gif │ ├── logo-06a11be1f2cdde2c851763d00bdd2e80.svg │ ├── logo-06a11be1f2cdde2c851763d00bdd2e80.svg.gz │ ├── logo.svg │ ├── logo.svg.gz │ ├── lupasit-aee1ae5992661b30f22e6bad0b303761.gif │ ├── lupasit.gif │ ├── memory_usage-95fd66d0dd7cb5fc98638e3d65f36e7a.jpg │ ├── memory_usage.jpg │ ├── otp_bank-df9281907894596a21ef4a7347c67a99.svg │ ├── otp_bank-df9281907894596a21ef4a7347c67a99.svg.gz │ ├── otp_bank.svg │ └── otp_bank.svg.gz │ ├── robots-9e2c81b0855bbff2baa8371bc4a78186.txt │ ├── robots-9e2c81b0855bbff2baa8371bc4a78186.txt.gz │ ├── robots.txt │ ├── robots.txt.gz │ ├── styles │ ├── app-79901bdfc3609cad89e21a1689583bdc.css │ ├── app-79901bdfc3609cad89e21a1689583bdc.css.gz │ ├── app.css │ └── app.css.gz │ └── videos │ ├── hello_joe-ba9f51edf0aef3e919940862116a1463.mp4 │ └── hello_joe.mp4 ├── rel └── overlays │ └── bin │ ├── server │ └── server.bat └── test ├── elixir_pobeda_web └── controllers │ ├── error_html_test.exs │ ├── error_json_test.exs │ └── page_controller_test.exs ├── support └── conn_case.ex └── test_helper.exs /.dockerignore: -------------------------------------------------------------------------------- 1 | # This file excludes paths from the Docker build context. 2 | # 3 | # By default, Docker's build context includes all files (and folders) in the 4 | # current directory. Even if a file isn't copied into the container it is still sent to 5 | # the Docker daemon. 6 | # 7 | # There are multiple reasons to exclude files from the build context: 8 | # 9 | # 1. Prevent nested folders from being copied into the container (ex: exclude 10 | # /assets/node_modules when copying /assets) 11 | # 2. Reduce the size of the build context and improve build time (ex. /build, /deps, /doc) 12 | # 3. Avoid sending files containing sensitive information 13 | # 14 | # More information on using .dockerignore is available here: 15 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file 16 | 17 | .dockerignore 18 | 19 | # Ignore git, but keep git HEAD and refs to access current commit hash if needed: 20 | # 21 | # $ cat .git/HEAD | awk '{print ".git/"$2}' | xargs cat 22 | # d0b8727759e1e0e7aa3d41707d12376e373d5ecc 23 | .git 24 | !.git/HEAD 25 | !.git/refs 26 | 27 | # Common development/test artifacts 28 | /cover/ 29 | /doc/ 30 | /test/ 31 | /tmp/ 32 | .elixir_ls 33 | 34 | # Mix artifacts 35 | /_build/ 36 | /deps/ 37 | *.ez 38 | 39 | # Generated on crash by the VM 40 | erl_crash.dump 41 | 42 | # Static artifacts - These should be fetched and built inside the Docker image 43 | /assets/node_modules/ 44 | /priv/static/assets/ 45 | /priv/static/cache_manifest.json 46 | -------------------------------------------------------------------------------- /.formatter.exs: -------------------------------------------------------------------------------- 1 | [ 2 | import_deps: [:phoenix], 3 | plugins: [Phoenix.LiveView.HTMLFormatter, Styler], 4 | inputs: ["*.{heex,ex,exs}", "{lib,test}/**/*.{heex,ex,exs}"] 5 | ] 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # The directory Mix will write compiled artifacts to. 2 | /_build/ 3 | 4 | # If you run "mix test --cover", coverage assets end up here. 5 | /cover/ 6 | 7 | # The directory Mix downloads your dependencies sources to. 8 | /deps/ 9 | 10 | # Where 3rd-party dependencies like ExDoc output generated docs. 11 | /doc/ 12 | 13 | # Ignore .fetch files in case you like to edit your project deps locally. 14 | /.fetch 15 | 16 | # If the VM crashes, it generates a dump, let's ignore it too. 17 | erl_crash.dump 18 | 19 | # Also ignore archive artifacts (built via "mix archive.build"). 20 | *.ez 21 | 22 | # Temporary files, for example, from tests. 23 | /tmp/ 24 | 25 | # Ignore package tarball (built via "mix hex.build"). 26 | elixir_pobeda-*.tar 27 | 28 | # Ignore assets that are produced by build tools. 29 | /priv/static/assets/ 30 | 31 | # Ignore digested assets cache. 32 | /priv/static/cache_manifest.json 33 | 34 | # In case you use Node.js/npm, you want to ignore these. 35 | npm-debug.log 36 | /assets/node_modules/ 37 | 38 | # Docker image 39 | elixir_pobeda.tar* 40 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian 2 | # instead of Alpine to avoid DNS resolution issues in production. 3 | # 4 | # https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu 5 | # https://hub.docker.com/_/ubuntu?tab=tags 6 | # 7 | # This file is based on these images: 8 | # 9 | # - https://hub.docker.com/r/hexpm/elixir/tags - for the build image 10 | # - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20250203-slim - for the release image 11 | # - https://pkgs.org/ - resource for finding needed packages 12 | # - Ex: hexpm/elixir:1.18.2-erlang-27.2.2-debian-bullseye-20250203-slim 13 | # 14 | ARG ELIXIR_VERSION=1.18.2 15 | ARG OTP_VERSION=27.2.2 16 | ARG DEBIAN_VERSION=bullseye-20250203-slim 17 | 18 | ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}" 19 | ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}" 20 | 21 | FROM ${BUILDER_IMAGE} as builder 22 | 23 | # install build dependencies 24 | RUN apt-get update -y && apt-get install -y build-essential git \ 25 | && apt-get clean && rm -f /var/lib/apt/lists/*_* 26 | 27 | # prepare build dir 28 | WORKDIR /app 29 | 30 | # install hex + rebar 31 | RUN mix local.hex --force && \ 32 | mix local.rebar --force 33 | 34 | # set build ENV 35 | ENV MIX_ENV="prod" 36 | 37 | # install mix dependencies 38 | COPY mix.exs mix.lock ./ 39 | RUN mix deps.get --only $MIX_ENV 40 | RUN mkdir config 41 | 42 | # copy compile-time config files before we compile dependencies 43 | # to ensure any relevant config change will trigger the dependencies 44 | # to be re-compiled. 45 | COPY config/config.exs config/${MIX_ENV}.exs config/ 46 | RUN mix deps.compile 47 | 48 | COPY priv priv 49 | 50 | COPY lib lib 51 | 52 | COPY assets assets 53 | 54 | # compile assets 55 | RUN mix assets.deploy 56 | 57 | # Compile the release 58 | RUN mix compile 59 | 60 | # Changes to config/runtime.exs don't require recompiling the code 61 | COPY config/runtime.exs config/ 62 | 63 | COPY rel rel 64 | RUN mix release 65 | 66 | # start a new build stage so that the final image will only contain 67 | # the compiled release and other runtime necessities 68 | FROM ${RUNNER_IMAGE} 69 | 70 | RUN apt-get update -y && \ 71 | apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates \ 72 | && apt-get clean && rm -f /var/lib/apt/lists/*_* 73 | 74 | # Set the locale 75 | RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen 76 | 77 | ENV LANG en_US.UTF-8 78 | ENV LANGUAGE en_US:en 79 | ENV LC_ALL en_US.UTF-8 80 | 81 | WORKDIR "/app" 82 | RUN chown nobody /app 83 | 84 | # set runner ENV 85 | ENV MIX_ENV="prod" 86 | 87 | # Only copy the final release from the build stage 88 | COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/elixir_pobeda ./ 89 | 90 | USER nobody 91 | 92 | # If using an environment that doesn't automatically reap zombie processes, it is 93 | # advised to add an init process such as tini via `apt-get install` 94 | # above and adding an entrypoint. See https://github.com/krallin/tini for details 95 | # ENTRYPOINT ["/tini", "--"] 96 | 97 | CMD ["/app/bin/server"] 98 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ElixirPobeda 2 | 3 | To start your Phoenix server: 4 | 5 | * Run `mix setup` to install and setup dependencies 6 | * Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server` 7 | 8 | Now you can visit [`localhost:4000`](http://localhost:4000) from your browser. 9 | 10 | Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html). 11 | 12 | ## Learn more 13 | 14 | * Official website: https://www.phoenixframework.org/ 15 | * Guides: https://hexdocs.pm/phoenix/overview.html 16 | * Docs: https://hexdocs.pm/phoenix 17 | * Forum: https://elixirforum.com/c/phoenix-forum 18 | * Source: https://github.com/phoenixframework/phoenix 19 | -------------------------------------------------------------------------------- /assets/js/app.js: -------------------------------------------------------------------------------- 1 | // If you want to use Phoenix channels, run `mix help phx.gen.channel` 2 | // to get started and then uncomment the line below. 3 | // import "./user_socket.js" 4 | 5 | // You can include dependencies in two ways. 6 | // 7 | // The simplest option is to put them in assets/vendor and 8 | // import them using relative paths: 9 | // 10 | // import "../vendor/some-package.js" 11 | // 12 | // Alternatively, you can `npm install some-package --prefix assets` and import 13 | // them using a path starting with the package name: 14 | // 15 | // import "some-package" 16 | // 17 | 18 | // Include phoenix_html to handle method=PUT/DELETE in forms and buttons. 19 | import "phoenix_html" 20 | // Establish Phoenix Socket and LiveView configuration. 21 | import {Socket} from "phoenix" 22 | import {LiveSocket} from "phoenix_live_view" 23 | import topbar from "../vendor/topbar" 24 | 25 | let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") 26 | let liveSocket = new LiveSocket("/live", Socket, { 27 | transports: ["websocket", "longpoll"], 28 | params: {_csrf_token: csrfToken} 29 | }) 30 | 31 | // Show progress bar on live navigation and form submits 32 | topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"}) 33 | window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) 34 | window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) 35 | 36 | // connect if there are any LiveViews on the page 37 | liveSocket.connect() 38 | 39 | // expose liveSocket on window for web console debug logs and latency simulation: 40 | // >> liveSocket.enableDebug() 41 | // >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session 42 | // >> liveSocket.disableLatencySim() 43 | window.liveSocket = liveSocket 44 | 45 | -------------------------------------------------------------------------------- /assets/vendor/topbar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license MIT 3 | * topbar 2.0.0, 2023-02-04 4 | * https://buunguyen.github.io/topbar 5 | * Copyright (c) 2021 Buu Nguyen 6 | */ 7 | (function (window, document) { 8 | "use strict"; 9 | 10 | // https://gist.github.com/paulirish/1579671 11 | (function () { 12 | var lastTime = 0; 13 | var vendors = ["ms", "moz", "webkit", "o"]; 14 | for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 15 | window.requestAnimationFrame = 16 | window[vendors[x] + "RequestAnimationFrame"]; 17 | window.cancelAnimationFrame = 18 | window[vendors[x] + "CancelAnimationFrame"] || 19 | window[vendors[x] + "CancelRequestAnimationFrame"]; 20 | } 21 | if (!window.requestAnimationFrame) 22 | window.requestAnimationFrame = function (callback, element) { 23 | var currTime = new Date().getTime(); 24 | var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 25 | var id = window.setTimeout(function () { 26 | callback(currTime + timeToCall); 27 | }, timeToCall); 28 | lastTime = currTime + timeToCall; 29 | return id; 30 | }; 31 | if (!window.cancelAnimationFrame) 32 | window.cancelAnimationFrame = function (id) { 33 | clearTimeout(id); 34 | }; 35 | })(); 36 | 37 | var canvas, 38 | currentProgress, 39 | showing, 40 | progressTimerId = null, 41 | fadeTimerId = null, 42 | delayTimerId = null, 43 | addEvent = function (elem, type, handler) { 44 | if (elem.addEventListener) elem.addEventListener(type, handler, false); 45 | else if (elem.attachEvent) elem.attachEvent("on" + type, handler); 46 | else elem["on" + type] = handler; 47 | }, 48 | options = { 49 | autoRun: true, 50 | barThickness: 3, 51 | barColors: { 52 | 0: "rgba(26, 188, 156, .9)", 53 | ".25": "rgba(52, 152, 219, .9)", 54 | ".50": "rgba(241, 196, 15, .9)", 55 | ".75": "rgba(230, 126, 34, .9)", 56 | "1.0": "rgba(211, 84, 0, .9)", 57 | }, 58 | shadowBlur: 10, 59 | shadowColor: "rgba(0, 0, 0, .6)", 60 | className: null, 61 | }, 62 | repaint = function () { 63 | canvas.width = window.innerWidth; 64 | canvas.height = options.barThickness * 5; // need space for shadow 65 | 66 | var ctx = canvas.getContext("2d"); 67 | ctx.shadowBlur = options.shadowBlur; 68 | ctx.shadowColor = options.shadowColor; 69 | 70 | var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); 71 | for (var stop in options.barColors) 72 | lineGradient.addColorStop(stop, options.barColors[stop]); 73 | ctx.lineWidth = options.barThickness; 74 | ctx.beginPath(); 75 | ctx.moveTo(0, options.barThickness / 2); 76 | ctx.lineTo( 77 | Math.ceil(currentProgress * canvas.width), 78 | options.barThickness / 2 79 | ); 80 | ctx.strokeStyle = lineGradient; 81 | ctx.stroke(); 82 | }, 83 | createCanvas = function () { 84 | canvas = document.createElement("canvas"); 85 | var style = canvas.style; 86 | style.position = "fixed"; 87 | style.top = style.left = style.right = style.margin = style.padding = 0; 88 | style.zIndex = 100001; 89 | style.display = "none"; 90 | if (options.className) canvas.classList.add(options.className); 91 | document.body.appendChild(canvas); 92 | addEvent(window, "resize", repaint); 93 | }, 94 | topbar = { 95 | config: function (opts) { 96 | for (var key in opts) 97 | if (options.hasOwnProperty(key)) options[key] = opts[key]; 98 | }, 99 | show: function (delay) { 100 | if (showing) return; 101 | if (delay) { 102 | if (delayTimerId) return; 103 | delayTimerId = setTimeout(() => topbar.show(), delay); 104 | } else { 105 | showing = true; 106 | if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); 107 | if (!canvas) createCanvas(); 108 | canvas.style.opacity = 1; 109 | canvas.style.display = "block"; 110 | topbar.progress(0); 111 | if (options.autoRun) { 112 | (function loop() { 113 | progressTimerId = window.requestAnimationFrame(loop); 114 | topbar.progress( 115 | "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) 116 | ); 117 | })(); 118 | } 119 | } 120 | }, 121 | progress: function (to) { 122 | if (typeof to === "undefined") return currentProgress; 123 | if (typeof to === "string") { 124 | to = 125 | (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 126 | ? currentProgress 127 | : 0) + parseFloat(to); 128 | } 129 | currentProgress = to > 1 ? 1 : to; 130 | repaint(); 131 | return currentProgress; 132 | }, 133 | hide: function () { 134 | clearTimeout(delayTimerId); 135 | delayTimerId = null; 136 | if (!showing) return; 137 | showing = false; 138 | if (progressTimerId != null) { 139 | window.cancelAnimationFrame(progressTimerId); 140 | progressTimerId = null; 141 | } 142 | (function loop() { 143 | if (topbar.progress("+.1") >= 1) { 144 | canvas.style.opacity -= 0.05; 145 | if (canvas.style.opacity <= 0.05) { 146 | canvas.style.display = "none"; 147 | fadeTimerId = null; 148 | return; 149 | } 150 | } 151 | fadeTimerId = window.requestAnimationFrame(loop); 152 | })(); 153 | }, 154 | }; 155 | 156 | if (typeof module === "object" && typeof module.exports === "object") { 157 | module.exports = topbar; 158 | } else if (typeof define === "function" && define.amd) { 159 | define(function () { 160 | return topbar; 161 | }); 162 | } else { 163 | this.topbar = topbar; 164 | } 165 | }.call(this, window, document)); 166 | -------------------------------------------------------------------------------- /config/.formatter.exs: -------------------------------------------------------------------------------- 1 | [ 2 | # ignore styler not to mess up any comments 3 | inputs: ["*.exs"] 4 | ] 5 | -------------------------------------------------------------------------------- /config/config.exs: -------------------------------------------------------------------------------- 1 | # This file is responsible for configuring your application 2 | # and its dependencies with the aid of the Config module. 3 | # 4 | # This configuration file is loaded before any dependency and 5 | # is restricted to this project. 6 | 7 | # General application configuration 8 | import Config 9 | 10 | config :elixir_pobeda, 11 | generators: [timestamp_type: :utc_datetime] 12 | 13 | # Configures the endpoint 14 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 15 | url: [host: "localhost"], 16 | check_origin: ["//localhost", "//xn--80abjdnang4ajkk6m.xn--p1ai"], 17 | adapter: Bandit.PhoenixAdapter, 18 | render_errors: [ 19 | formats: [html: ElixirPobedaWeb.ErrorHTML, json: ElixirPobedaWeb.ErrorJSON], 20 | layout: false 21 | ], 22 | pubsub_server: ElixirPobeda.PubSub, 23 | live_view: [signing_salt: "grs6zUAE"] 24 | 25 | # Configure esbuild (the version is required) 26 | config :esbuild, 27 | version: "0.17.11", 28 | elixir_pobeda: [ 29 | args: 30 | ~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/*), 31 | cd: Path.expand("../assets", __DIR__), 32 | env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)} 33 | ] 34 | 35 | # Configures Elixir's Logger 36 | config :logger, :console, 37 | format: "$time $metadata[$level] $message\n", 38 | metadata: [:request_id] 39 | 40 | # Use Jason for JSON parsing in Phoenix 41 | config :phoenix, :json_library, Jason 42 | 43 | # Import environment specific config. This must remain at the bottom 44 | # of this file so it overrides the configuration defined above. 45 | import_config "#{config_env()}.exs" 46 | -------------------------------------------------------------------------------- /config/dev.exs: -------------------------------------------------------------------------------- 1 | import Config 2 | 3 | # For development, we disable any cache and enable 4 | # debugging and code reloading. 5 | # 6 | # The watchers configuration can be used to run external 7 | # watchers to your application. For example, we can use it 8 | # to bundle .js and .css sources. 9 | # Binding to loopback ipv4 address prevents access from other machines. 10 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 11 | # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. 12 | http: [ip: {127, 0, 0, 1}, port: 4000], 13 | check_origin: false, 14 | code_reloader: true, 15 | debug_errors: true, 16 | secret_key_base: "Q3ExwcuQdt8oEArqgoHuNqUkeDu6+LRiR8qddcJ8shl3RibaZ4TuHEB9stqNvs9B", 17 | watchers: [ 18 | esbuild: {Esbuild, :install_and_run, [:elixir_pobeda, ~w(--sourcemap=inline --watch)]} 19 | ] 20 | 21 | # ## SSL Support 22 | # 23 | # In order to use HTTPS in development, a self-signed 24 | # certificate can be generated by running the following 25 | # Mix task: 26 | # 27 | # mix phx.gen.cert 28 | # 29 | # Run `mix help phx.gen.cert` for more information. 30 | # 31 | # The `http:` config above can be replaced with: 32 | # 33 | # https: [ 34 | # port: 4001, 35 | # cipher_suite: :strong, 36 | # keyfile: "priv/cert/selfsigned_key.pem", 37 | # certfile: "priv/cert/selfsigned.pem" 38 | # ], 39 | # 40 | # If desired, both `http:` and `https:` keys can be 41 | # configured to run both http and https servers on 42 | # different ports. 43 | 44 | # Watch static and templates for browser reloading. 45 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 46 | live_reload: [ 47 | patterns: [ 48 | ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$", 49 | ~r"lib/elixir_pobeda_web/(controllers|live|components)/.*(ex|heex)$" 50 | ] 51 | ] 52 | 53 | # Enable dev routes for dashboard and mailbox 54 | config :elixir_pobeda, dev_routes: true 55 | 56 | # Do not include metadata nor timestamps in development logs 57 | config :logger, :console, format: "[$level] $message\n" 58 | 59 | # Set a higher stacktrace during development. Avoid configuring such 60 | # in production as building large stacktraces may be expensive. 61 | config :phoenix, :stacktrace_depth, 20 62 | 63 | # Initialize plugs at runtime for faster development compilation 64 | config :phoenix, :plug_init_mode, :runtime 65 | 66 | config :phoenix_live_view, 67 | # Include HEEx debug annotations as HTML comments in rendered markup 68 | debug_heex_annotations: true, 69 | # Enable helpful, but potentially expensive runtime checks 70 | enable_expensive_runtime_checks: true 71 | -------------------------------------------------------------------------------- /config/prod.exs: -------------------------------------------------------------------------------- 1 | import Config 2 | 3 | # Note we also include the path to a cache manifest 4 | # containing the digested version of static files. This 5 | # manifest is generated by the `mix assets.deploy` task, 6 | # which you should run after static files are built and 7 | # before starting your production server. 8 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 9 | cache_static_manifest: "priv/static/cache_manifest.json" 10 | 11 | # Do not print debug messages in production 12 | config :logger, level: :info 13 | 14 | # Runtime production configuration, including reading 15 | # of environment variables, is done on config/runtime.exs. 16 | -------------------------------------------------------------------------------- /config/runtime.exs: -------------------------------------------------------------------------------- 1 | import Config 2 | 3 | # config/runtime.exs is executed for all environments, including 4 | # during releases. It is executed after compilation and before the 5 | # system starts, so it is typically used to load production configuration 6 | # and secrets from environment variables or elsewhere. Do not define 7 | # any compile-time configuration in here, as it won't be applied. 8 | # The block below contains prod specific runtime configuration. 9 | 10 | # ## Using releases 11 | # 12 | # If you use `mix release`, you need to explicitly enable the server 13 | # by passing the PHX_SERVER=true when you start it: 14 | # 15 | # PHX_SERVER=true bin/elixir_pobeda start 16 | # 17 | # Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` 18 | # script that automatically sets the env var above. 19 | if System.get_env("PHX_SERVER") do 20 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, server: true 21 | end 22 | 23 | if config_env() == :prod do 24 | # The secret key base is used to sign/encrypt cookies and other secrets. 25 | # A default value is used in config/dev.exs and config/test.exs but you 26 | # want to use a different value for prod and you most likely don't want 27 | # to check this value into version control, so we use an environment 28 | # variable instead. 29 | secret_key_base = 30 | System.get_env("SECRET_KEY_BASE") || 31 | raise """ 32 | environment variable SECRET_KEY_BASE is missing. 33 | You can generate one by calling: mix phx.gen.secret 34 | """ 35 | 36 | host = System.get_env("PHX_HOST") || "example.com" 37 | port = String.to_integer(System.get_env("PORT") || "4000") 38 | 39 | config :elixir_pobeda, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") 40 | 41 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 42 | url: [host: host, port: 443, scheme: "https"], 43 | http: [ 44 | # Enable IPv6 and bind on all interfaces. 45 | # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. 46 | # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0 47 | # for details about using IPv6 vs IPv4 and loopback vs public addresses. 48 | ip: {0, 0, 0, 0, 0, 0, 0, 0}, 49 | port: port 50 | ], 51 | secret_key_base: secret_key_base 52 | 53 | # ## SSL Support 54 | # 55 | # To get SSL working, you will need to add the `https` key 56 | # to your endpoint configuration: 57 | # 58 | # config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 59 | # https: [ 60 | # ..., 61 | # port: 443, 62 | # cipher_suite: :strong, 63 | # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), 64 | # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") 65 | # ] 66 | # 67 | # The `cipher_suite` is set to `:strong` to support only the 68 | # latest and more secure SSL ciphers. This means old browsers 69 | # and clients may not be supported. You can set it to 70 | # `:compatible` for wider support. 71 | # 72 | # `:keyfile` and `:certfile` expect an absolute path to the key 73 | # and cert in disk or a relative path inside priv, for example 74 | # "priv/ssl/server.key". For all supported SSL configuration 75 | # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 76 | # 77 | # We also recommend setting `force_ssl` in your config/prod.exs, 78 | # ensuring no data is ever sent via http, always redirecting to https: 79 | # 80 | # config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 81 | # force_ssl: [hsts: true] 82 | # 83 | # Check `Plug.SSL` for all available options in `force_ssl`. 84 | end 85 | -------------------------------------------------------------------------------- /config/test.exs: -------------------------------------------------------------------------------- 1 | import Config 2 | 3 | # We don't run a server during test. If one is required, 4 | # you can enable the server option below. 5 | config :elixir_pobeda, ElixirPobedaWeb.Endpoint, 6 | http: [ip: {127, 0, 0, 1}, port: 4002], 7 | secret_key_base: "q58X3Cjdcsv62hUhxIQCQMn0Em4Jk2Cn5J5oIkK/FXwe9I9QuAsdh2swwN1W4o74", 8 | server: false 9 | 10 | # Print only warnings and errors during test 11 | config :logger, level: :warning 12 | 13 | # Initialize plugs at runtime for faster test compilation 14 | config :phoenix, :plug_init_mode, :runtime 15 | 16 | # Enable helpful, but potentially expensive runtime checks 17 | config :phoenix_live_view, 18 | enable_expensive_runtime_checks: true 19 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | docker build -t elixir_pobeda . 2 | docker save -o elixir_pobeda.tar elixir_pobeda 3 | gzip -f elixir_pobeda.tar 4 | scp elixir_pobeda.tar.gz ep:~ 5 | -------------------------------------------------------------------------------- /lib/.lexical/lexical.log: -------------------------------------------------------------------------------- 1 | 10:43:32.963 [error] stdio received :eof, server will stop. 2 | 10:43:32.965 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 3 | ** (exit) normal 4 | Pid: #PID<0.1493.0> 5 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 6 | Restart: :permanent 7 | Shutdown: 5000 8 | Type: :worker 9 | 10:43:32.967 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 10 | Pid: #PID<0.1495.0> 11 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 12 | Restart: :permanent 13 | Shutdown: 5000 14 | Type: :worker 15 | 10:43:42.049 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 16 | Pid: #PID<0.114.0> 17 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 18 | Restart: :transient 19 | Shutdown: 5000 20 | Type: :worker 21 | 10:43:42.049 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 22 | Pid: #PID<0.113.0> 23 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 24 | Restart: :permanent 25 | Shutdown: :infinity 26 | Type: :supervisor 27 | 10:43:42.049 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 28 | Pid: #PID<0.109.0> 29 | Start Call: Logger.Backends.Internal.start_link([]) 30 | Restart: :permanent 31 | Shutdown: :infinity 32 | Type: :supervisor 33 | 10:43:42.049 [info] Application logger started at :nonode@nohost 34 | 10:43:42.681 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 35 | Pid: #PID<0.1480.0> 36 | Start Call: :ttb_autostart.start_link() 37 | Restart: :temporary 38 | Shutdown: 3000 39 | Type: :worker 40 | 10:43:42.681 [info] Application runtime_tools started at :nonode@nohost 41 | 10:43:42.682 [info] Application erts started at :nonode@nohost 42 | 10:43:42.682 [info] Application lx_lexical_shared started at :nonode@nohost 43 | 10:43:42.682 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 44 | Pid: #PID<0.1484.0> 45 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 46 | Restart: :permanent 47 | Shutdown: 5000 48 | Type: :worker 49 | 10:43:42.682 [info] Application lx_snowflake started at :nonode@nohost 50 | 10:43:42.683 [info] Application lx_sourceror started at :nonode@nohost 51 | 10:43:42.683 [info] Application lx_common started at :nonode@nohost 52 | 10:43:42.683 [info] Application lx_elixir_sense started at :nonode@nohost 53 | 10:43:42.684 [info] Application jason started at :nonode@nohost 54 | 10:43:42.684 [info] Application logger_file_backend started at :nonode@nohost 55 | 10:43:42.684 [info] Application lx_path_glob started at :nonode@nohost 56 | 10:43:42.684 [info] Application lx_proto started at :nonode@nohost 57 | 10:43:42.684 [info] Application lx_protocol started at :nonode@nohost 58 | 10:43:42.694 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 59 | Pid: #PID<0.1488.0> 60 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 61 | Restart: :permanent 62 | Shutdown: 5000 63 | Type: :worker 64 | 10:43:42.696 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 65 | Pid: #PID<0.1489.0> 66 | Start Call: LXical.Server.start_link([]) 67 | Restart: :permanent 68 | Shutdown: 5000 69 | Type: :worker 70 | 10:43:42.696 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 71 | Pid: #PID<0.1490.0> 72 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 73 | Restart: :permanent 74 | Shutdown: :infinity 75 | Type: :supervisor 76 | 10:43:42.696 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 77 | Pid: #PID<0.1491.0> 78 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 79 | Restart: :permanent 80 | Shutdown: :infinity 81 | Type: :supervisor 82 | 10:43:42.696 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 83 | Pid: #PID<0.1492.0> 84 | Start Call: LXical.Server.TaskQueue.start_link([]) 85 | Restart: :permanent 86 | Shutdown: 5000 87 | Type: :worker 88 | 10:43:42.696 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 89 | Pid: #PID<0.1493.0> 90 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 91 | Restart: :permanent 92 | Shutdown: 5000 93 | Type: :worker 94 | 10:43:42.696 [info] Application lx_server started at :nonode@nohost 95 | 10:43:42.710 [error] read protocol message: {:no_translation, :unicode, :latin1} 96 | 10:43:46.955 [error] stdio received :eof, server will stop. 97 | 10:43:46.956 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 98 | ** (exit) normal 99 | Pid: #PID<0.1493.0> 100 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 101 | Restart: :permanent 102 | Shutdown: 5000 103 | Type: :worker 104 | 10:43:46.956 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 105 | Pid: #PID<0.1494.0> 106 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 107 | Restart: :permanent 108 | Shutdown: 5000 109 | Type: :worker 110 | 10:43:46.956 [error] stdio received :eof, server will stop. 111 | 10:43:47.253 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 112 | Pid: #PID<0.114.0> 113 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 114 | Restart: :transient 115 | Shutdown: 5000 116 | Type: :worker 117 | 10:43:47.253 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 118 | Pid: #PID<0.113.0> 119 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 120 | Restart: :permanent 121 | Shutdown: :infinity 122 | Type: :supervisor 123 | 10:43:47.253 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 124 | Pid: #PID<0.109.0> 125 | Start Call: Logger.Backends.Internal.start_link([]) 126 | Restart: :permanent 127 | Shutdown: :infinity 128 | Type: :supervisor 129 | 10:43:47.253 [info] Application logger started at :nonode@nohost 130 | 10:43:47.896 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 131 | Pid: #PID<0.1480.0> 132 | Start Call: :ttb_autostart.start_link() 133 | Restart: :temporary 134 | Shutdown: 3000 135 | Type: :worker 136 | 10:43:47.896 [info] Application runtime_tools started at :nonode@nohost 137 | 10:43:47.896 [info] Application erts started at :nonode@nohost 138 | 10:43:47.896 [info] Application lx_lexical_shared started at :nonode@nohost 139 | 10:43:47.897 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 140 | Pid: #PID<0.1484.0> 141 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 142 | Restart: :permanent 143 | Shutdown: 5000 144 | Type: :worker 145 | 10:43:47.897 [info] Application lx_snowflake started at :nonode@nohost 146 | 10:43:47.897 [info] Application lx_sourceror started at :nonode@nohost 147 | 10:43:47.897 [info] Application lx_common started at :nonode@nohost 148 | 10:43:47.897 [info] Application lx_elixir_sense started at :nonode@nohost 149 | 10:43:47.899 [info] Application jason started at :nonode@nohost 150 | 10:43:47.899 [info] Application logger_file_backend started at :nonode@nohost 151 | 10:43:47.899 [info] Application lx_path_glob started at :nonode@nohost 152 | 10:43:47.899 [info] Application lx_proto started at :nonode@nohost 153 | 10:43:47.899 [info] Application lx_protocol started at :nonode@nohost 154 | 10:43:47.908 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 155 | Pid: #PID<0.1488.0> 156 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 157 | Restart: :permanent 158 | Shutdown: 5000 159 | Type: :worker 160 | 10:43:47.910 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 161 | Pid: #PID<0.1489.0> 162 | Start Call: LXical.Server.start_link([]) 163 | Restart: :permanent 164 | Shutdown: 5000 165 | Type: :worker 166 | 10:43:47.910 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 167 | Pid: #PID<0.1490.0> 168 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 169 | Restart: :permanent 170 | Shutdown: :infinity 171 | Type: :supervisor 172 | 10:43:47.911 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 173 | Pid: #PID<0.1491.0> 174 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 175 | Restart: :permanent 176 | Shutdown: :infinity 177 | Type: :supervisor 178 | 10:43:47.911 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 179 | Pid: #PID<0.1492.0> 180 | Start Call: LXical.Server.TaskQueue.start_link([]) 181 | Restart: :permanent 182 | Shutdown: 5000 183 | Type: :worker 184 | 10:43:47.911 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 185 | Pid: #PID<0.1493.0> 186 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 187 | Restart: :permanent 188 | Shutdown: 5000 189 | Type: :worker 190 | 10:43:47.911 [info] Application lx_server started at :nonode@nohost 191 | 10:43:47.916 [error] read protocol message: {:no_translation, :unicode, :latin1} 192 | 10:44:36.288 [error] stdio received :eof, server will stop. 193 | 10:44:36.288 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 194 | ** (exit) normal 195 | Pid: #PID<0.1493.0> 196 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 197 | Restart: :permanent 198 | Shutdown: 5000 199 | Type: :worker 200 | 10:44:36.288 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 201 | Pid: #PID<0.1494.0> 202 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 203 | Restart: :permanent 204 | Shutdown: 5000 205 | Type: :worker 206 | 10:44:40.999 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 207 | Pid: #PID<0.114.0> 208 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 209 | Restart: :transient 210 | Shutdown: 5000 211 | Type: :worker 212 | 10:44:40.999 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 213 | Pid: #PID<0.113.0> 214 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 215 | Restart: :permanent 216 | Shutdown: :infinity 217 | Type: :supervisor 218 | 10:44:40.999 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 219 | Pid: #PID<0.109.0> 220 | Start Call: Logger.Backends.Internal.start_link([]) 221 | Restart: :permanent 222 | Shutdown: :infinity 223 | Type: :supervisor 224 | 10:44:40.999 [info] Application logger started at :nonode@nohost 225 | 10:44:41.633 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 226 | Pid: #PID<0.1480.0> 227 | Start Call: :ttb_autostart.start_link() 228 | Restart: :temporary 229 | Shutdown: 3000 230 | Type: :worker 231 | 10:44:41.633 [info] Application runtime_tools started at :nonode@nohost 232 | 10:44:41.634 [info] Application erts started at :nonode@nohost 233 | 10:44:41.634 [info] Application lx_lexical_shared started at :nonode@nohost 234 | 10:44:41.635 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 235 | Pid: #PID<0.1484.0> 236 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 237 | Restart: :permanent 238 | Shutdown: 5000 239 | Type: :worker 240 | 10:44:41.635 [info] Application lx_snowflake started at :nonode@nohost 241 | 10:44:41.635 [info] Application lx_sourceror started at :nonode@nohost 242 | 10:44:41.635 [info] Application lx_common started at :nonode@nohost 243 | 10:44:41.635 [info] Application lx_elixir_sense started at :nonode@nohost 244 | 10:44:41.636 [info] Application jason started at :nonode@nohost 245 | 10:44:41.637 [info] Application logger_file_backend started at :nonode@nohost 246 | 10:44:41.637 [info] Application lx_path_glob started at :nonode@nohost 247 | 10:44:41.637 [info] Application lx_proto started at :nonode@nohost 248 | 10:44:41.637 [info] Application lx_protocol started at :nonode@nohost 249 | 10:44:41.646 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 250 | Pid: #PID<0.1488.0> 251 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 252 | Restart: :permanent 253 | Shutdown: 5000 254 | Type: :worker 255 | 10:44:41.648 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 256 | Pid: #PID<0.1489.0> 257 | Start Call: LXical.Server.start_link([]) 258 | Restart: :permanent 259 | Shutdown: 5000 260 | Type: :worker 261 | 10:44:41.648 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 262 | Pid: #PID<0.1490.0> 263 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 264 | Restart: :permanent 265 | Shutdown: :infinity 266 | Type: :supervisor 267 | 10:44:41.649 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 268 | Pid: #PID<0.1491.0> 269 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 270 | Restart: :permanent 271 | Shutdown: :infinity 272 | Type: :supervisor 273 | 10:44:41.649 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 274 | Pid: #PID<0.1492.0> 275 | Start Call: LXical.Server.TaskQueue.start_link([]) 276 | Restart: :permanent 277 | Shutdown: 5000 278 | Type: :worker 279 | 10:44:41.649 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 280 | Pid: #PID<0.1493.0> 281 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 282 | Restart: :permanent 283 | Shutdown: 5000 284 | Type: :worker 285 | 10:44:41.649 [info] Application lx_server started at :nonode@nohost 286 | 10:44:41.654 [error] read protocol message: {:no_translation, :unicode, :latin1} 287 | 10:46:50.798 [error] stdio received :eof, server will stop. 288 | 10:46:50.798 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 289 | ** (exit) normal 290 | Pid: #PID<0.1493.0> 291 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 292 | Restart: :permanent 293 | Shutdown: 5000 294 | Type: :worker 295 | 10:46:50.798 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 296 | Pid: #PID<0.1494.0> 297 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 298 | Restart: :permanent 299 | Shutdown: 5000 300 | Type: :worker 301 | 10:58:05.930 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 302 | Pid: #PID<0.114.0> 303 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 304 | Restart: :transient 305 | Shutdown: 5000 306 | Type: :worker 307 | 10:58:05.930 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 308 | Pid: #PID<0.113.0> 309 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 310 | Restart: :permanent 311 | Shutdown: :infinity 312 | Type: :supervisor 313 | 10:58:05.930 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 314 | Pid: #PID<0.109.0> 315 | Start Call: Logger.Backends.Internal.start_link([]) 316 | Restart: :permanent 317 | Shutdown: :infinity 318 | Type: :supervisor 319 | 10:58:05.930 [info] Application logger started at :nonode@nohost 320 | 10:58:06.636 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 321 | Pid: #PID<0.1480.0> 322 | Start Call: :ttb_autostart.start_link() 323 | Restart: :temporary 324 | Shutdown: 3000 325 | Type: :worker 326 | 10:58:06.636 [info] Application runtime_tools started at :nonode@nohost 327 | 10:58:06.637 [info] Application erts started at :nonode@nohost 328 | 10:58:06.637 [info] Application lx_lexical_shared started at :nonode@nohost 329 | 10:58:06.638 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 330 | Pid: #PID<0.1484.0> 331 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 332 | Restart: :permanent 333 | Shutdown: 5000 334 | Type: :worker 335 | 10:58:06.638 [info] Application lx_snowflake started at :nonode@nohost 336 | 10:58:06.638 [info] Application lx_sourceror started at :nonode@nohost 337 | 10:58:06.638 [info] Application lx_common started at :nonode@nohost 338 | 10:58:06.638 [info] Application lx_elixir_sense started at :nonode@nohost 339 | 10:58:06.640 [info] Application jason started at :nonode@nohost 340 | 10:58:06.640 [info] Application logger_file_backend started at :nonode@nohost 341 | 10:58:06.640 [info] Application lx_path_glob started at :nonode@nohost 342 | 10:58:06.640 [info] Application lx_proto started at :nonode@nohost 343 | 10:58:06.640 [info] Application lx_protocol started at :nonode@nohost 344 | 10:58:06.650 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 345 | Pid: #PID<0.1488.0> 346 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 347 | Restart: :permanent 348 | Shutdown: 5000 349 | Type: :worker 350 | 10:58:06.653 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 351 | Pid: #PID<0.1489.0> 352 | Start Call: LXical.Server.start_link([]) 353 | Restart: :permanent 354 | Shutdown: 5000 355 | Type: :worker 356 | 10:58:06.653 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 357 | Pid: #PID<0.1490.0> 358 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 359 | Restart: :permanent 360 | Shutdown: :infinity 361 | Type: :supervisor 362 | 10:58:06.653 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 363 | Pid: #PID<0.1491.0> 364 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 365 | Restart: :permanent 366 | Shutdown: :infinity 367 | Type: :supervisor 368 | 10:58:06.653 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 369 | Pid: #PID<0.1492.0> 370 | Start Call: LXical.Server.TaskQueue.start_link([]) 371 | Restart: :permanent 372 | Shutdown: 5000 373 | Type: :worker 374 | 10:58:06.653 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 375 | Pid: #PID<0.1493.0> 376 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 377 | Restart: :permanent 378 | Shutdown: 5000 379 | Type: :worker 380 | 10:58:06.653 [info] Application lx_server started at :nonode@nohost 381 | 10:58:06.659 [error] read protocol message: {:no_translation, :unicode, :latin1} 382 | 11:01:53.183 [error] stdio received :eof, server will stop. 383 | 11:01:53.183 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 384 | ** (exit) normal 385 | Pid: #PID<0.1493.0> 386 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 387 | Restart: :permanent 388 | Shutdown: 5000 389 | Type: :worker 390 | 11:01:53.183 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 391 | Pid: #PID<0.1494.0> 392 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 393 | Restart: :permanent 394 | Shutdown: 5000 395 | Type: :worker 396 | 11:13:59.191 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 397 | Pid: #PID<0.114.0> 398 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 399 | Restart: :transient 400 | Shutdown: 5000 401 | Type: :worker 402 | 11:13:59.192 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 403 | Pid: #PID<0.113.0> 404 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 405 | Restart: :permanent 406 | Shutdown: :infinity 407 | Type: :supervisor 408 | 11:13:59.192 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 409 | Pid: #PID<0.109.0> 410 | Start Call: Logger.Backends.Internal.start_link([]) 411 | Restart: :permanent 412 | Shutdown: :infinity 413 | Type: :supervisor 414 | 11:13:59.192 [info] Application logger started at :nonode@nohost 415 | 11:13:59.837 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 416 | Pid: #PID<0.1480.0> 417 | Start Call: :ttb_autostart.start_link() 418 | Restart: :temporary 419 | Shutdown: 3000 420 | Type: :worker 421 | 11:13:59.837 [info] Application runtime_tools started at :nonode@nohost 422 | 11:13:59.838 [info] Application erts started at :nonode@nohost 423 | 11:13:59.838 [info] Application lx_lexical_shared started at :nonode@nohost 424 | 11:13:59.838 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 425 | Pid: #PID<0.1484.0> 426 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 427 | Restart: :permanent 428 | Shutdown: 5000 429 | Type: :worker 430 | 11:13:59.839 [info] Application lx_snowflake started at :nonode@nohost 431 | 11:13:59.839 [info] Application lx_sourceror started at :nonode@nohost 432 | 11:13:59.839 [info] Application lx_common started at :nonode@nohost 433 | 11:13:59.839 [info] Application lx_elixir_sense started at :nonode@nohost 434 | 11:13:59.840 [info] Application jason started at :nonode@nohost 435 | 11:13:59.840 [info] Application logger_file_backend started at :nonode@nohost 436 | 11:13:59.840 [info] Application lx_path_glob started at :nonode@nohost 437 | 11:13:59.840 [info] Application lx_proto started at :nonode@nohost 438 | 11:13:59.840 [info] Application lx_protocol started at :nonode@nohost 439 | 11:13:59.850 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 440 | Pid: #PID<0.1488.0> 441 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 442 | Restart: :permanent 443 | Shutdown: 5000 444 | Type: :worker 445 | 11:13:59.852 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 446 | Pid: #PID<0.1489.0> 447 | Start Call: LXical.Server.start_link([]) 448 | Restart: :permanent 449 | Shutdown: 5000 450 | Type: :worker 451 | 11:13:59.852 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 452 | Pid: #PID<0.1490.0> 453 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 454 | Restart: :permanent 455 | Shutdown: :infinity 456 | Type: :supervisor 457 | 11:13:59.852 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 458 | Pid: #PID<0.1491.0> 459 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 460 | Restart: :permanent 461 | Shutdown: :infinity 462 | Type: :supervisor 463 | 11:13:59.852 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 464 | Pid: #PID<0.1492.0> 465 | Start Call: LXical.Server.TaskQueue.start_link([]) 466 | Restart: :permanent 467 | Shutdown: 5000 468 | Type: :worker 469 | 11:13:59.852 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 470 | Pid: #PID<0.1493.0> 471 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 472 | Restart: :permanent 473 | Shutdown: 5000 474 | Type: :worker 475 | 11:13:59.852 [info] Application lx_server started at :nonode@nohost 476 | 11:13:59.865 [error] read protocol message: {:no_translation, :unicode, :latin1} 477 | 11:14:36.882 [error] stdio received :eof, server will stop. 478 | 11:14:36.882 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 479 | ** (exit) normal 480 | Pid: #PID<0.1493.0> 481 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 482 | Restart: :permanent 483 | Shutdown: 5000 484 | Type: :worker 485 | 11:14:36.882 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 486 | Pid: #PID<0.1494.0> 487 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 488 | Restart: :permanent 489 | Shutdown: 5000 490 | Type: :worker 491 | 11:14:37.176 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 492 | Pid: #PID<0.114.0> 493 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 494 | Restart: :transient 495 | Shutdown: 5000 496 | Type: :worker 497 | 11:14:37.176 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 498 | Pid: #PID<0.113.0> 499 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 500 | Restart: :permanent 501 | Shutdown: :infinity 502 | Type: :supervisor 503 | 11:14:37.176 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 504 | Pid: #PID<0.109.0> 505 | Start Call: Logger.Backends.Internal.start_link([]) 506 | Restart: :permanent 507 | Shutdown: :infinity 508 | Type: :supervisor 509 | 11:14:37.176 [info] Application logger started at :nonode@nohost 510 | 11:14:37.801 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 511 | Pid: #PID<0.1480.0> 512 | Start Call: :ttb_autostart.start_link() 513 | Restart: :temporary 514 | Shutdown: 3000 515 | Type: :worker 516 | 11:14:37.801 [info] Application runtime_tools started at :nonode@nohost 517 | 11:14:37.801 [info] Application erts started at :nonode@nohost 518 | 11:14:37.801 [info] Application lx_lexical_shared started at :nonode@nohost 519 | 11:14:37.802 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 520 | Pid: #PID<0.1484.0> 521 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 522 | Restart: :permanent 523 | Shutdown: 5000 524 | Type: :worker 525 | 11:14:37.802 [info] Application lx_snowflake started at :nonode@nohost 526 | 11:14:37.802 [info] Application lx_sourceror started at :nonode@nohost 527 | 11:14:37.802 [info] Application lx_common started at :nonode@nohost 528 | 11:14:37.802 [info] Application lx_elixir_sense started at :nonode@nohost 529 | 11:14:37.804 [info] Application jason started at :nonode@nohost 530 | 11:14:37.804 [info] Application logger_file_backend started at :nonode@nohost 531 | 11:14:37.804 [info] Application lx_path_glob started at :nonode@nohost 532 | 11:14:37.804 [info] Application lx_proto started at :nonode@nohost 533 | 11:14:37.804 [info] Application lx_protocol started at :nonode@nohost 534 | 11:14:37.813 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 535 | Pid: #PID<0.1488.0> 536 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 537 | Restart: :permanent 538 | Shutdown: 5000 539 | Type: :worker 540 | 11:14:37.816 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 541 | Pid: #PID<0.1489.0> 542 | Start Call: LXical.Server.start_link([]) 543 | Restart: :permanent 544 | Shutdown: 5000 545 | Type: :worker 546 | 11:14:37.816 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 547 | Pid: #PID<0.1490.0> 548 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 549 | Restart: :permanent 550 | Shutdown: :infinity 551 | Type: :supervisor 552 | 11:14:37.816 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 553 | Pid: #PID<0.1491.0> 554 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 555 | Restart: :permanent 556 | Shutdown: :infinity 557 | Type: :supervisor 558 | 11:14:37.816 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 559 | Pid: #PID<0.1492.0> 560 | Start Call: LXical.Server.TaskQueue.start_link([]) 561 | Restart: :permanent 562 | Shutdown: 5000 563 | Type: :worker 564 | 11:14:37.816 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 565 | Pid: #PID<0.1493.0> 566 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 567 | Restart: :permanent 568 | Shutdown: 5000 569 | Type: :worker 570 | 11:14:37.816 [info] Application lx_server started at :nonode@nohost 571 | 11:14:37.821 [error] read protocol message: {:no_translation, :unicode, :latin1} 572 | 11:15:08.782 [error] stdio received :eof, server will stop. 573 | 11:15:08.782 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 574 | ** (exit) normal 575 | Pid: #PID<0.1493.0> 576 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 577 | Restart: :permanent 578 | Shutdown: 5000 579 | Type: :worker 580 | 11:15:08.782 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 581 | Pid: #PID<0.1494.0> 582 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 583 | Restart: :permanent 584 | Shutdown: 5000 585 | Type: :worker 586 | 11:17:08.870 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 587 | Pid: #PID<0.114.0> 588 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 589 | Restart: :transient 590 | Shutdown: 5000 591 | Type: :worker 592 | 11:17:08.870 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 593 | Pid: #PID<0.113.0> 594 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 595 | Restart: :permanent 596 | Shutdown: :infinity 597 | Type: :supervisor 598 | 11:17:08.870 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 599 | Pid: #PID<0.109.0> 600 | Start Call: Logger.Backends.Internal.start_link([]) 601 | Restart: :permanent 602 | Shutdown: :infinity 603 | Type: :supervisor 604 | 11:17:08.870 [info] Application logger started at :nonode@nohost 605 | 11:17:09.518 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 606 | Pid: #PID<0.1480.0> 607 | Start Call: :ttb_autostart.start_link() 608 | Restart: :temporary 609 | Shutdown: 3000 610 | Type: :worker 611 | 11:17:09.518 [info] Application runtime_tools started at :nonode@nohost 612 | 11:17:09.519 [info] Application erts started at :nonode@nohost 613 | 11:17:09.519 [info] Application lx_lexical_shared started at :nonode@nohost 614 | 11:17:09.519 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 615 | Pid: #PID<0.1484.0> 616 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 617 | Restart: :permanent 618 | Shutdown: 5000 619 | Type: :worker 620 | 11:17:09.519 [info] Application lx_snowflake started at :nonode@nohost 621 | 11:17:09.520 [info] Application lx_sourceror started at :nonode@nohost 622 | 11:17:09.520 [info] Application lx_common started at :nonode@nohost 623 | 11:17:09.520 [info] Application lx_elixir_sense started at :nonode@nohost 624 | 11:17:09.521 [info] Application jason started at :nonode@nohost 625 | 11:17:09.521 [info] Application logger_file_backend started at :nonode@nohost 626 | 11:17:09.521 [info] Application lx_path_glob started at :nonode@nohost 627 | 11:17:09.521 [info] Application lx_proto started at :nonode@nohost 628 | 11:17:09.521 [info] Application lx_protocol started at :nonode@nohost 629 | 11:17:09.531 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 630 | Pid: #PID<0.1488.0> 631 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 632 | Restart: :permanent 633 | Shutdown: 5000 634 | Type: :worker 635 | 11:17:09.533 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 636 | Pid: #PID<0.1489.0> 637 | Start Call: LXical.Server.start_link([]) 638 | Restart: :permanent 639 | Shutdown: 5000 640 | Type: :worker 641 | 11:17:09.534 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 642 | Pid: #PID<0.1490.0> 643 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 644 | Restart: :permanent 645 | Shutdown: :infinity 646 | Type: :supervisor 647 | 11:17:09.534 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 648 | Pid: #PID<0.1491.0> 649 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 650 | Restart: :permanent 651 | Shutdown: :infinity 652 | Type: :supervisor 653 | 11:17:09.534 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 654 | Pid: #PID<0.1492.0> 655 | Start Call: LXical.Server.TaskQueue.start_link([]) 656 | Restart: :permanent 657 | Shutdown: 5000 658 | Type: :worker 659 | 11:17:09.534 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 660 | Pid: #PID<0.1493.0> 661 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 662 | Restart: :permanent 663 | Shutdown: 5000 664 | Type: :worker 665 | 11:17:09.534 [info] Application lx_server started at :nonode@nohost 666 | 11:17:09.540 [error] read protocol message: {:no_translation, :unicode, :latin1} 667 | 11:23:55.681 [error] stdio received :eof, server will stop. 668 | 11:23:55.681 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 669 | ** (exit) normal 670 | Pid: #PID<0.1493.0> 671 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 672 | Restart: :permanent 673 | Shutdown: 5000 674 | Type: :worker 675 | 11:23:55.681 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 676 | Pid: #PID<0.1494.0> 677 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 678 | Restart: :permanent 679 | Shutdown: 5000 680 | Type: :worker 681 | 11:24:01.921 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 682 | Pid: #PID<0.114.0> 683 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 684 | Restart: :transient 685 | Shutdown: 5000 686 | Type: :worker 687 | 11:24:01.921 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 688 | Pid: #PID<0.113.0> 689 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 690 | Restart: :permanent 691 | Shutdown: :infinity 692 | Type: :supervisor 693 | 11:24:01.921 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 694 | Pid: #PID<0.109.0> 695 | Start Call: Logger.Backends.Internal.start_link([]) 696 | Restart: :permanent 697 | Shutdown: :infinity 698 | Type: :supervisor 699 | 11:24:01.921 [info] Application logger started at :nonode@nohost 700 | 11:24:02.543 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 701 | Pid: #PID<0.1480.0> 702 | Start Call: :ttb_autostart.start_link() 703 | Restart: :temporary 704 | Shutdown: 3000 705 | Type: :worker 706 | 11:24:02.544 [info] Application runtime_tools started at :nonode@nohost 707 | 11:24:02.544 [info] Application erts started at :nonode@nohost 708 | 11:24:02.544 [info] Application lx_lexical_shared started at :nonode@nohost 709 | 11:24:02.545 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 710 | Pid: #PID<0.1484.0> 711 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 712 | Restart: :permanent 713 | Shutdown: 5000 714 | Type: :worker 715 | 11:24:02.545 [info] Application lx_snowflake started at :nonode@nohost 716 | 11:24:02.545 [info] Application lx_sourceror started at :nonode@nohost 717 | 11:24:02.545 [info] Application lx_common started at :nonode@nohost 718 | 11:24:02.545 [info] Application lx_elixir_sense started at :nonode@nohost 719 | 11:24:02.547 [info] Application jason started at :nonode@nohost 720 | 11:24:02.547 [info] Application logger_file_backend started at :nonode@nohost 721 | 11:24:02.547 [info] Application lx_path_glob started at :nonode@nohost 722 | 11:24:02.547 [info] Application lx_proto started at :nonode@nohost 723 | 11:24:02.547 [info] Application lx_protocol started at :nonode@nohost 724 | 11:24:02.557 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 725 | Pid: #PID<0.1488.0> 726 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 727 | Restart: :permanent 728 | Shutdown: 5000 729 | Type: :worker 730 | 11:24:02.559 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 731 | Pid: #PID<0.1489.0> 732 | Start Call: LXical.Server.start_link([]) 733 | Restart: :permanent 734 | Shutdown: 5000 735 | Type: :worker 736 | 11:24:02.559 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 737 | Pid: #PID<0.1490.0> 738 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 739 | Restart: :permanent 740 | Shutdown: :infinity 741 | Type: :supervisor 742 | 11:24:02.559 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 743 | Pid: #PID<0.1491.0> 744 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 745 | Restart: :permanent 746 | Shutdown: :infinity 747 | Type: :supervisor 748 | 11:24:02.559 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 749 | Pid: #PID<0.1492.0> 750 | Start Call: LXical.Server.TaskQueue.start_link([]) 751 | Restart: :permanent 752 | Shutdown: 5000 753 | Type: :worker 754 | 11:24:02.559 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 755 | Pid: #PID<0.1493.0> 756 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 757 | Restart: :permanent 758 | Shutdown: 5000 759 | Type: :worker 760 | 11:24:02.559 [info] Application lx_server started at :nonode@nohost 761 | 11:24:02.565 [error] read protocol message: {:no_translation, :unicode, :latin1} 762 | 11:35:30.972 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 763 | Pid: #PID<0.114.0> 764 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 765 | Restart: :transient 766 | Shutdown: 5000 767 | Type: :worker 768 | 11:35:30.972 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 769 | Pid: #PID<0.113.0> 770 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 771 | Restart: :permanent 772 | Shutdown: :infinity 773 | Type: :supervisor 774 | 11:35:30.972 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 775 | Pid: #PID<0.109.0> 776 | Start Call: Logger.Backends.Internal.start_link([]) 777 | Restart: :permanent 778 | Shutdown: :infinity 779 | Type: :supervisor 780 | 11:35:30.972 [info] Application logger started at :nonode@nohost 781 | 11:35:31.582 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 782 | Pid: #PID<0.1480.0> 783 | Start Call: :ttb_autostart.start_link() 784 | Restart: :temporary 785 | Shutdown: 3000 786 | Type: :worker 787 | 11:35:31.582 [info] Application runtime_tools started at :nonode@nohost 788 | 11:35:31.582 [info] Application erts started at :nonode@nohost 789 | 11:35:31.582 [info] Application lx_lexical_shared started at :nonode@nohost 790 | 11:35:31.583 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 791 | Pid: #PID<0.1484.0> 792 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 793 | Restart: :permanent 794 | Shutdown: 5000 795 | Type: :worker 796 | 11:35:31.583 [info] Application lx_snowflake started at :nonode@nohost 797 | 11:35:31.583 [info] Application lx_sourceror started at :nonode@nohost 798 | 11:35:31.583 [info] Application lx_common started at :nonode@nohost 799 | 11:35:31.583 [info] Application lx_elixir_sense started at :nonode@nohost 800 | 11:35:31.585 [info] Application jason started at :nonode@nohost 801 | 11:35:31.585 [info] Application logger_file_backend started at :nonode@nohost 802 | 11:35:31.585 [info] Application lx_path_glob started at :nonode@nohost 803 | 11:35:31.585 [info] Application lx_proto started at :nonode@nohost 804 | 11:35:31.585 [info] Application lx_protocol started at :nonode@nohost 805 | 11:35:31.594 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 806 | Pid: #PID<0.1488.0> 807 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 808 | Restart: :permanent 809 | Shutdown: 5000 810 | Type: :worker 811 | 11:35:31.597 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 812 | Pid: #PID<0.1489.0> 813 | Start Call: LXical.Server.start_link([]) 814 | Restart: :permanent 815 | Shutdown: 5000 816 | Type: :worker 817 | 11:35:31.597 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 818 | Pid: #PID<0.1490.0> 819 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 820 | Restart: :permanent 821 | Shutdown: :infinity 822 | Type: :supervisor 823 | 11:35:31.597 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 824 | Pid: #PID<0.1491.0> 825 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 826 | Restart: :permanent 827 | Shutdown: :infinity 828 | Type: :supervisor 829 | 11:35:31.597 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 830 | Pid: #PID<0.1492.0> 831 | Start Call: LXical.Server.TaskQueue.start_link([]) 832 | Restart: :permanent 833 | Shutdown: 5000 834 | Type: :worker 835 | 11:35:31.597 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 836 | Pid: #PID<0.1493.0> 837 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 838 | Restart: :permanent 839 | Shutdown: 5000 840 | Type: :worker 841 | 11:35:31.597 [info] Application lx_server started at :nonode@nohost 842 | 11:35:31.602 [error] read protocol message: {:no_translation, :unicode, :latin1} 843 | 11:37:02.426 [error] stdio received :eof, server will stop. 844 | 11:37:02.426 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 845 | ** (exit) normal 846 | Pid: #PID<0.1493.0> 847 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 848 | Restart: :permanent 849 | Shutdown: 5000 850 | Type: :worker 851 | 11:37:02.426 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 852 | Pid: #PID<0.1494.0> 853 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 854 | Restart: :permanent 855 | Shutdown: 5000 856 | Type: :worker 857 | 11:39:37.935 [error] stdio received :eof, server will stop. 858 | 11:39:37.935 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 859 | ** (exit) normal 860 | Pid: #PID<0.1493.0> 861 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 862 | Restart: :permanent 863 | Shutdown: 5000 864 | Type: :worker 865 | 11:39:37.935 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 866 | Pid: #PID<0.1494.0> 867 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 868 | Restart: :permanent 869 | Shutdown: 5000 870 | Type: :worker 871 | 11:40:11.799 [debug] Child {LoggerFileBackend, :general_log} of Supervisor Logger.Backends.Supervisor started 872 | Pid: #PID<0.114.0> 873 | Start Call: Logger.Backends.Watcher.start_link({{LoggerFileBackend, :general_log}, {LoggerFileBackend, :general_log}}) 874 | Restart: :transient 875 | Shutdown: 5000 876 | Type: :worker 877 | 11:40:11.799 [info] Child Logger.Backends.Supervisor of Supervisor Logger.Backends.Internal started 878 | Pid: #PID<0.113.0> 879 | Start Call: Logger.Backends.Supervisor.start_link([{LoggerFileBackend, :general_log}]) 880 | Restart: :permanent 881 | Shutdown: :infinity 882 | Type: :supervisor 883 | 11:40:11.799 [info] Child Logger.Backends.Internal of Supervisor Logger.Supervisor started 884 | Pid: #PID<0.109.0> 885 | Start Call: Logger.Backends.Internal.start_link([]) 886 | Restart: :permanent 887 | Shutdown: :infinity 888 | Type: :supervisor 889 | 11:40:11.799 [info] Application logger started at :nonode@nohost 890 | 11:40:12.418 [info] Child :ttb_autostart of Supervisor :runtime_tools_sup started 891 | Pid: #PID<0.1480.0> 892 | Start Call: :ttb_autostart.start_link() 893 | Restart: :temporary 894 | Shutdown: 3000 895 | Type: :worker 896 | 11:40:12.418 [info] Application runtime_tools started at :nonode@nohost 897 | 11:40:12.418 [info] Application erts started at :nonode@nohost 898 | 11:40:12.418 [info] Application lx_lexical_shared started at :nonode@nohost 899 | 11:40:12.419 [info] Child LXSnowflake.Generator of Supervisor #PID<0.1483.0> (Supervisor.Default) started 900 | Pid: #PID<0.1484.0> 901 | Start Call: LXSnowflake.Generator.start_link(1704070800000, 1) 902 | Restart: :permanent 903 | Shutdown: 5000 904 | Type: :worker 905 | 11:40:12.419 [info] Application lx_snowflake started at :nonode@nohost 906 | 11:40:12.419 [info] Application lx_sourceror started at :nonode@nohost 907 | 11:40:12.419 [info] Application lx_common started at :nonode@nohost 908 | 11:40:12.419 [info] Application lx_elixir_sense started at :nonode@nohost 909 | 11:40:12.421 [info] Application jason started at :nonode@nohost 910 | 11:40:12.421 [info] Application logger_file_backend started at :nonode@nohost 911 | 11:40:12.421 [info] Application lx_path_glob started at :nonode@nohost 912 | 11:40:12.421 [info] Application lx_proto started at :nonode@nohost 913 | 11:40:12.421 [info] Application lx_protocol started at :nonode@nohost 914 | 11:40:12.430 [info] Child LXical.Document.Store of Supervisor LXical.Server.Supervisor started 915 | Pid: #PID<0.1488.0> 916 | Start Call: LXical.Document.Store.start_link([derive: [analysis: &LXical.Ast.analyze/1]]) 917 | Restart: :permanent 918 | Shutdown: 5000 919 | Type: :worker 920 | 11:40:12.433 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 921 | Pid: #PID<0.1489.0> 922 | Start Call: LXical.Server.start_link([]) 923 | Restart: :permanent 924 | Shutdown: 5000 925 | Type: :worker 926 | 11:40:12.433 [info] Child LXical.Server.ProjectSupervisor of Supervisor LXical.Server.Supervisor started 927 | Pid: #PID<0.1490.0> 928 | Start Call: DynamicSupervisor.start_link([name: LXical.Server.ProjectSupervisor, strategy: :one_for_one]) 929 | Restart: :permanent 930 | Shutdown: :infinity 931 | Type: :supervisor 932 | 11:40:12.433 [info] Child LXical.Server.TaskQueue.State.TaskSupervisor of Supervisor LXical.Server.Supervisor started 933 | Pid: #PID<0.1491.0> 934 | Start Call: Task.Supervisor.start_link([name: LXical.Server.TaskQueue.State.TaskSupervisor]) 935 | Restart: :permanent 936 | Shutdown: :infinity 937 | Type: :supervisor 938 | 11:40:12.433 [info] Child LXical.Server.TaskQueue of Supervisor LXical.Server.Supervisor started 939 | Pid: #PID<0.1492.0> 940 | Start Call: LXical.Server.TaskQueue.start_link([]) 941 | Restart: :permanent 942 | Shutdown: 5000 943 | Type: :worker 944 | 11:40:12.433 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 945 | Pid: #PID<0.1493.0> 946 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 947 | Restart: :permanent 948 | Shutdown: 5000 949 | Type: :worker 950 | 11:40:12.433 [info] Application lx_server started at :nonode@nohost 951 | 11:40:12.444 [info] Starting project at uri 952 | 11:40:12.449 [info] Lexical Initialized 953 | 11:40:12.450 [info] opened file:///home/kira/Documents/elixir_pobeda/lib/elixir_pobeda_web/live/home_live.ex 954 | 11:40:13.246 [error] GenServer LXical.Server terminating 955 | ** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1 956 | (elixir 1.18.2) lib/io.ex:710: IO.chardata_to_string(nil) 957 | (elixir 1.18.2) lib/path.ex:507: Path.basename/1 958 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:60: LXical.Project.name/1 959 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:80: LXical.Project.node_name/1 960 | (lx_remote_control 0.7.2) lib/lexical/remote_control.ex:115: LXical.RemoteControl.call/4 961 | (lx_server 0.7.2) lib/lexical/server/state.ex:164: LXical.Server.State.apply/2 962 | (lx_server 0.7.2) lib/lexical/server.ex:154: LXical.Server.apply_to_state/2 963 | (lx_server 0.7.2) lib/lexical/server.ex:117: LXical.Server.handle_message/2 964 | Last message: {:"$gen_cast", {:protocol_message, %LXical.Protocol.Notifications.DidChange{lsp: %LXical.Protocol.Notifications.DidChange.LSP{jsonrpc: "2.0", method: "textDocument/didChange", content_changes: [#Protocol.Types.TextDocument.ContentChangeEvent.TextDocumentContentChangeEvent<[text: "\n ", range: #Protocol.Types.Range<[start: #Protocol.Types.Position<[line: 2, character: 39]>, end: #Protocol.Types.Position<[line: 2, character: 39]>]>]>], text_document: #Protocol.Types.TextDocument.Versioned.Identifier<[version: 1, uri: "file:///home/kira/Documents/elixir_pobeda/lib/elixir_pobeda_web/live/home_live.ex"]>}, document: nil, jsonrpc: "2.0", method: "textDocument/didChange", content_changes: nil, text_document: nil}}} 965 | State: %LXical.Server.State{configuration: %LXical.Server.Configuration{project: %LXical.Project{root_uri: nil, mix_exs_uri: nil, mix_project?: false, mix_env: nil, mix_target: nil, env_variables: %{}, project_module: nil, entropy: 42799}, support: %LXical.Server.Configuration.Support{code_action_dynamic_registration: false, hierarchical_symbols: false, snippet: true, deprecated: true, tags: #Protocol.Types.Completion.ClientCapabilities.TagSupport<[value_set: [:deprecated]]>, signature_help: #Protocol.Types.SignatureHelp.ClientCapabilities<[signature_information: #Protocol.Types.SignatureHelp.ClientCapabilities.SignatureInformation<[documentation_format: [:markdown], active_parameter_support: true, parameter_information: #Protocol.Types.SignatureHelp.ClientCapabilities.ParameterInformation<[label_offset_support: true]>]>]>, work_done_progress: true}, client_name: "helix", additional_watched_extensions: nil, dialyzer_enabled?: false}, initialized?: true, shutdown_received?: false, in_flight_requests: %{}} 966 | 11:40:13.254 [error] Process LXical.Server (#PID<0.1489.0>) terminating 967 | ** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1 968 | (elixir 1.18.2) lib/io.ex:710: IO.chardata_to_string(nil) 969 | (elixir 1.18.2) lib/path.ex:507: Path.basename/1 970 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:60: LXical.Project.name/1 971 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:80: LXical.Project.node_name/1 972 | (lx_remote_control 0.7.2) lib/lexical/remote_control.ex:115: LXical.RemoteControl.call/4 973 | (lx_server 0.7.2) lib/lexical/server/state.ex:164: LXical.Server.State.apply/2 974 | (lx_server 0.7.2) lib/lexical/server.ex:154: LXical.Server.apply_to_state/2 975 | (lx_server 0.7.2) lib/lexical/server.ex:117: LXical.Server.handle_message/2 976 | Initial Call: LXical.Server.init/1 977 | Ancestors: [LXical.Server.Supervisor, #PID<0.1486.0>] 978 | Message Queue Length: 0 979 | Messages: [] 980 | Links: [#PID<0.1487.0>] 981 | Dictionary: [rand_seed: {%{type: :exsss, next: #Function<0.40079776/1 in :rand.exsss_next>, bits: 58, uniform: #Function<1.40079776/1 in :rand.exsss_uniform>, uniform_n: #Function<2.40079776/2 in :rand.exsss_uniform>, jump: #Function<3.40079776/1 in :rand.exsplus_jump>}, [143383736680013490 | 263887494573675578]}] 982 | Trapping Exits: false 983 | Status: :running 984 | Heap Size: 6772 985 | Stack Size: 29 986 | Reductions: 24477 987 | 11:40:13.254 [error] Child LXical.Server of Supervisor LXical.Server.Supervisor terminated 988 | ** (exit) an exception was raised: 989 | ** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1 990 | (elixir 1.18.2) lib/io.ex:710: IO.chardata_to_string(nil) 991 | (elixir 1.18.2) lib/path.ex:507: Path.basename/1 992 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:60: LXical.Project.name/1 993 | (lx_lexical_shared 0.5.0) lib/lexical/project.ex:80: LXical.Project.node_name/1 994 | (lx_remote_control 0.7.2) lib/lexical/remote_control.ex:115: LXical.RemoteControl.call/4 995 | (lx_server 0.7.2) lib/lexical/server/state.ex:164: LXical.Server.State.apply/2 996 | (lx_server 0.7.2) lib/lexical/server.ex:154: LXical.Server.apply_to_state/2 997 | (lx_server 0.7.2) lib/lexical/server.ex:117: LXical.Server.handle_message/2 998 | Pid: #PID<0.1489.0> 999 | Start Call: LXical.Server.start_link([]) 1000 | Restart: :permanent 1001 | Shutdown: 5000 1002 | Type: :worker 1003 | 11:40:13.254 [info] Child LXical.Server of Supervisor LXical.Server.Supervisor started 1004 | Pid: #PID<0.1494.0> 1005 | Start Call: LXical.Server.start_link([]) 1006 | Restart: :permanent 1007 | Shutdown: 5000 1008 | Type: :worker 1009 | 11:40:13.595 [error] Received textDocument/didChange before server was initialized 1010 | 11:40:13.596 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1011 | 11:40:13.596 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1012 | 11:40:13.675 [error] Received textDocument/didChange before server was initialized 1013 | 11:40:13.676 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1014 | 11:40:13.676 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1015 | 11:40:13.846 [error] Received textDocument/didChange before server was initialized 1016 | 11:40:13.847 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1017 | 11:40:13.847 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1018 | 11:40:14.103 [error] ** (FunctionClauseError) no function clause matching in LXical.Server.Provider.Handlers.Completion.handle/2 1019 | (lx_server 0.7.2) lib/lexical/server/provider/handlers/completion.ex:13: LXical.Server.Provider.Handlers.Completion.handle(%LXical.Protocol.Requests.Completion{lsp: %LXical.Protocol.Requests.Completion.LSP{id: 1, jsonrpc: "2.0", method: "textDocument/completion", context: #Protocol.Types.Completion.Context<[trigger_kind: :invoked]>, partial_result_token: nil, position: #Protocol.Types.Position<[line: 3, character: 5]>, text_document: #Protocol.Types.TextDocument.Identifier<[uri: "file:///home/kira/Documents/elixir_pobeda/lib/elixir_pobeda_web/live/home_live.ex"]>, work_done_token: nil}, document: #LXical.Document, ...>, position: LxPos<<4, 3>>, id: 1, jsonrpc: "2.0", method: "textDocument/completion", context: #Protocol.Types.Completion.Context<[trigger_kind: :invoked]>, partial_result_token: nil, text_document: #Protocol.Types.TextDocument.Identifier<[uri: "file:///home/kira/Documents/elixir_pobeda/lib/elixir_pobeda_web/live/home_live.ex"]>, work_done_token: nil}, nil) 1020 | (lx_server 0.7.2) lib/lexical/server/task_queue.ex:79: anonymous fn/4 in LXical.Server.TaskQueue.State.as_task/2 1021 | (elixir 1.18.2) lib/task/supervised.ex:101: Task.Supervised.invoke_mfa/2 1022 | (elixir 1.18.2) lib/task/supervised.ex:36: Task.Supervised.reply/4 1023 | 1024 | 11:40:14.103 [warning] Task Elixir.LXical.Server.Provider.Handlers.Completion.handle/2 ran for 2 ms. Result :success 1025 | 11:40:17.042 [error] Received textDocument/didChange before server was initialized 1026 | 11:40:17.043 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1027 | 11:40:17.043 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1028 | 11:40:17.251 [error] Received textDocument/didChange before server was initialized 1029 | 11:40:17.252 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1030 | 11:40:17.252 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1031 | 11:40:17.799 [error] Received textDocument/didChange before server was initialized 1032 | 11:40:17.800 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1033 | 11:40:17.800 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1034 | 11:40:18.090 [error] Received textDocument/didChange before server was initialized 1035 | 11:40:18.091 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1036 | 11:40:18.091 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1037 | 11:40:18.404 [error] Received textDocument/didChange before server was initialized 1038 | 11:40:18.404 [error] Failed to handle Elixir.LXical.Protocol.Notifications.DidChange, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1039 | 11:40:18.404 [error] Could not handle message LXical.Protocol.Notifications.DidChange :ok 1040 | 11:40:31.413 [error] Received shutdown before server was initialized 1041 | 11:40:31.414 [error] Failed to handle Elixir.LXical.Protocol.Requests.Shutdown, {{:error, :not_initialized}, %LXical.Server.State{configuration: nil, initialized?: false, shutdown_received?: false, in_flight_requests: %{}}} 1042 | 11:40:31.414 [error] Could not handle message LXical.Protocol.Requests.Shutdown :ok 1043 | 11:40:34.414 [error] stdio received :eof, server will stop. 1044 | 11:40:34.414 [error] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor terminated 1045 | ** (exit) normal 1046 | Pid: #PID<0.1493.0> 1047 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 1048 | Restart: :permanent 1049 | Shutdown: 5000 1050 | Type: :worker 1051 | 11:40:34.414 [info] Child LXical.Server.Transport.StdIO of Supervisor LXical.Server.Supervisor started 1052 | Pid: #PID<0.1496.0> 1053 | Start Call: LXical.Server.Transport.StdIO.start_link(:standard_io, &LXical.Server.protocol_message/1) 1054 | Restart: :permanent 1055 | Shutdown: 5000 1056 | Type: :worker 1057 | -------------------------------------------------------------------------------- /lib/elixir_pobeda.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobeda do 2 | @moduledoc """ 3 | ElixirPobeda keeps the contexts that define your domain 4 | and business logic. 5 | 6 | Contexts are also responsible for managing your data, regardless 7 | if it comes from the database, an external API or others. 8 | """ 9 | end 10 | -------------------------------------------------------------------------------- /lib/elixir_pobeda/application.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobeda.Application do 2 | # See https://hexdocs.pm/elixir/Application.html 3 | # for more information on OTP Applications 4 | @moduledoc false 5 | 6 | use Application 7 | 8 | @impl true 9 | def start(_type, _args) do 10 | children = [ 11 | ElixirPobedaWeb.Telemetry, 12 | {DNSCluster, query: Application.get_env(:elixir_pobeda, :dns_cluster_query) || :ignore}, 13 | {Phoenix.PubSub, name: ElixirPobeda.PubSub}, 14 | # Start a worker by calling: ElixirPobeda.Worker.start_link(arg) 15 | # {ElixirPobeda.Worker, arg}, 16 | # Start to serve requests, typically the last entry 17 | ElixirPobedaWeb.Endpoint 18 | ] 19 | 20 | # See https://hexdocs.pm/elixir/Supervisor.html 21 | # for other strategies and supported options 22 | opts = [strategy: :one_for_one, name: ElixirPobeda.Supervisor] 23 | Supervisor.start_link(children, opts) 24 | end 25 | 26 | # Tell Phoenix to update the endpoint configuration 27 | # whenever the application is updated. 28 | @impl true 29 | def config_change(changed, _new, removed) do 30 | ElixirPobedaWeb.Endpoint.config_change(changed, removed) 31 | :ok 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb do 2 | @moduledoc """ 3 | The entrypoint for defining your web interface, such 4 | as controllers, components, channels, and so on. 5 | 6 | This can be used in your application as: 7 | 8 | use ElixirPobedaWeb, :controller 9 | use ElixirPobedaWeb, :html 10 | 11 | The definitions below will be executed for every controller, 12 | component, etc, so keep them short and clean, focused 13 | on imports, uses and aliases. 14 | 15 | Do NOT define functions inside the quoted expressions 16 | below. Instead, define additional modules and import 17 | those modules here. 18 | """ 19 | 20 | def static_paths, do: ~w(assets styles fonts images videos favicon.ico robots.txt) 21 | 22 | def router do 23 | quote do 24 | use Phoenix.Router, helpers: false 25 | 26 | import Phoenix.Controller 27 | import Phoenix.LiveView.Router 28 | 29 | # Import common connection and controller functions to use in pipelines 30 | import Plug.Conn 31 | end 32 | end 33 | 34 | def channel do 35 | quote do 36 | use Phoenix.Channel 37 | end 38 | end 39 | 40 | def controller do 41 | quote do 42 | use Phoenix.Controller, 43 | formats: [:html, :json], 44 | layouts: [html: ElixirPobedaWeb.Layouts] 45 | 46 | import Plug.Conn 47 | 48 | unquote(verified_routes()) 49 | end 50 | end 51 | 52 | def live_view do 53 | quote do 54 | use Phoenix.LiveView, 55 | layout: {ElixirPobedaWeb.Layouts, :app} 56 | 57 | unquote(html_helpers()) 58 | end 59 | end 60 | 61 | def live_component do 62 | quote do 63 | use Phoenix.LiveComponent 64 | 65 | unquote(html_helpers()) 66 | end 67 | end 68 | 69 | def html do 70 | quote do 71 | use Phoenix.Component 72 | 73 | # Import convenience functions from controllers 74 | import Phoenix.Controller, 75 | only: [get_csrf_token: 0, view_module: 1, view_template: 1] 76 | 77 | # Include general helpers for rendering HTML 78 | unquote(html_helpers()) 79 | end 80 | end 81 | 82 | defp html_helpers do 83 | quote do 84 | import ElixirPobedaWeb.CoreComponents 85 | # HTML escaping functionality 86 | import Phoenix.HTML 87 | # Core UI components 88 | 89 | # Shortcut for generating JS commands 90 | alias Phoenix.LiveView.JS 91 | 92 | # Routes generation with the ~p sigil 93 | unquote(verified_routes()) 94 | end 95 | end 96 | 97 | def verified_routes do 98 | quote do 99 | use Phoenix.VerifiedRoutes, 100 | endpoint: ElixirPobedaWeb.Endpoint, 101 | router: ElixirPobedaWeb.Router, 102 | statics: ElixirPobedaWeb.static_paths() 103 | end 104 | end 105 | 106 | @doc """ 107 | When used, dispatch to the appropriate controller/live_view/etc. 108 | """ 109 | defmacro __using__(which) when is_atom(which) do 110 | apply(__MODULE__, which, []) 111 | end 112 | end 113 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/components/core_components.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.CoreComponents do 2 | @moduledoc """ 3 | Provides core UI components. 4 | 5 | At first glance, this module may seem daunting, but its goal is to provide 6 | core building blocks for your application, such as modals, tables, and 7 | forms. The components consist mostly of markup and are well-documented 8 | with doc strings and declarative assigns. You may customize and style 9 | them in any way you want, based on your application growth and needs. 10 | 11 | The default components use Tailwind CSS, a utility-first CSS framework. 12 | See the [Tailwind CSS documentation](https://tailwindcss.com) to learn 13 | how to customize them or feel free to swap in another framework altogether. 14 | 15 | Icons are provided by [heroicons](https://heroicons.com). See `icon/1` for usage. 16 | """ 17 | use Phoenix.Component 18 | 19 | alias Phoenix.HTML.FormField 20 | alias Phoenix.LiveView.JS 21 | 22 | @doc """ 23 | Renders a modal. 24 | 25 | ## Examples 26 | 27 | <.modal id="confirm-modal"> 28 | This is a modal. 29 | 30 | 31 | JS commands may be passed to the `:on_cancel` to configure 32 | the closing/cancel event, for example: 33 | 34 | <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> 35 | This is another modal. 36 | 37 | 38 | """ 39 | attr :id, :string, required: true 40 | attr :show, :boolean, default: false 41 | attr :on_cancel, JS, default: %JS{} 42 | slot :inner_block, required: true 43 | 44 | def modal(assigns) do 45 | ~H""" 46 | 325 | """ 326 | end 327 | 328 | def input(%{type: "select"} = assigns) do 329 | ~H""" 330 |
331 | <.label for={@id}>{@label} 332 | 342 | <.error :for={msg <- @errors}>{msg} 343 |
344 | """ 345 | end 346 | 347 | def input(%{type: "textarea"} = assigns) do 348 | ~H""" 349 |
350 | <.label for={@id}>{@label} 351 | 361 | <.error :for={msg <- @errors}>{msg} 362 |
363 | """ 364 | end 365 | 366 | # All other inputs text, datetime-local, url, password, etc. are handled here... 367 | def input(assigns) do 368 | ~H""" 369 |
370 | <.label for={@id}>{@label} 371 | 383 | <.error :for={msg <- @errors}>{msg} 384 |
385 | """ 386 | end 387 | 388 | @doc """ 389 | Renders a label. 390 | """ 391 | attr :for, :string, default: nil 392 | slot :inner_block, required: true 393 | 394 | def label(assigns) do 395 | ~H""" 396 | 399 | """ 400 | end 401 | 402 | @doc """ 403 | Generates a generic error message. 404 | """ 405 | slot :inner_block, required: true 406 | 407 | def error(assigns) do 408 | ~H""" 409 |

410 | <.icon name="hero-exclamation-circle-mini" class="mt-0.5 h-5 w-5 flex-none" /> 411 | {render_slot(@inner_block)} 412 |

413 | """ 414 | end 415 | 416 | @doc """ 417 | Renders a header with title. 418 | """ 419 | attr :class, :string, default: nil 420 | 421 | slot :inner_block, required: true 422 | slot :subtitle 423 | slot :actions 424 | 425 | def header(assigns) do 426 | ~H""" 427 |
428 |
429 |

430 | {render_slot(@inner_block)} 431 |

432 |

433 | {render_slot(@subtitle)} 434 |

435 |
436 |
{render_slot(@actions)}
437 |
438 | """ 439 | end 440 | 441 | @doc ~S""" 442 | Renders a table with generic styling. 443 | 444 | ## Examples 445 | 446 | <.table id="users" rows={@users}> 447 | <:col :let={user} label="id">{user.id} 448 | <:col :let={user} label="username">{user.username} 449 | 450 | """ 451 | attr :id, :string, required: true 452 | attr :rows, :list, required: true 453 | attr :row_id, :any, default: nil, doc: "the function for generating the row id" 454 | attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" 455 | 456 | attr :row_item, :any, 457 | default: &Function.identity/1, 458 | doc: "the function for mapping each row before calling the :col and :action slots" 459 | 460 | slot :col, required: true do 461 | attr :label, :string 462 | end 463 | 464 | slot :action, doc: "the slot for showing user actions in the last table column" 465 | 466 | def table(assigns) do 467 | assigns = 468 | with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do 469 | assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) 470 | end 471 | 472 | ~H""" 473 |
474 | 475 | 476 | 477 | 478 | 481 | 482 | 483 | 488 | 489 | 501 | 512 | 513 | 514 |
{col[:label]} 479 | Actions 480 |
494 |
495 | 496 | 497 | {render_slot(col, @row_item.(row))} 498 | 499 |
500 |
502 |
503 | 504 | 508 | {render_slot(action, @row_item.(row))} 509 | 510 |
511 |
515 |
516 | """ 517 | end 518 | 519 | @doc """ 520 | Renders a data list. 521 | 522 | ## Examples 523 | 524 | <.list> 525 | <:item title="Title">{@post.title} 526 | <:item title="Views">{@post.views} 527 | 528 | """ 529 | slot :item, required: true do 530 | attr :title, :string, required: true 531 | end 532 | 533 | def list(assigns) do 534 | ~H""" 535 |
536 |
537 |
538 |
{item.title}
539 |
{render_slot(item)}
540 |
541 |
542 |
543 | """ 544 | end 545 | 546 | @doc """ 547 | Renders a back navigation link. 548 | 549 | ## Examples 550 | 551 | <.back navigate={~p"/posts"}>Back to posts 552 | """ 553 | attr :navigate, :any, required: true 554 | slot :inner_block, required: true 555 | 556 | def back(assigns) do 557 | ~H""" 558 |
559 | <.link 560 | navigate={@navigate} 561 | class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700" 562 | > 563 | <.icon name="hero-arrow-left-solid" class="h-3 w-3" /> 564 | {render_slot(@inner_block)} 565 | 566 |
567 | """ 568 | end 569 | 570 | @doc """ 571 | Renders a [Heroicon](https://heroicons.com). 572 | 573 | Heroicons come in three styles – outline, solid, and mini. 574 | By default, the outline style is used, but solid and mini may 575 | be applied by using the `-solid` and `-mini` suffix. 576 | 577 | You can customize the size and colors of the icons by setting 578 | width, height, and background color classes. 579 | 580 | Icons are extracted from the `deps/heroicons` directory and bundled within 581 | your compiled app.css by the plugin in your `assets/tailwind.config.js`. 582 | 583 | ## Examples 584 | 585 | <.icon name="hero-x-mark-solid" /> 586 | <.icon name="hero-arrow-path" class="ml-1 w-3 h-3 animate-spin" /> 587 | """ 588 | attr :name, :string, required: true 589 | attr :class, :string, default: nil 590 | 591 | def icon(%{name: "hero-" <> _} = assigns) do 592 | ~H""" 593 | 594 | """ 595 | end 596 | 597 | ## JS Commands 598 | 599 | def show(js \\ %JS{}, selector) do 600 | JS.show(js, 601 | to: selector, 602 | time: 300, 603 | transition: 604 | {"transition-all transform ease-out duration-300", "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", 605 | "opacity-100 translate-y-0 sm:scale-100"} 606 | ) 607 | end 608 | 609 | def hide(js \\ %JS{}, selector) do 610 | JS.hide(js, 611 | to: selector, 612 | time: 200, 613 | transition: 614 | {"transition-all transform ease-in duration-200", "opacity-100 translate-y-0 sm:scale-100", 615 | "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} 616 | ) 617 | end 618 | 619 | def show_modal(js \\ %JS{}, id) when is_binary(id) do 620 | js 621 | |> JS.show(to: "##{id}") 622 | |> JS.show( 623 | to: "##{id}-bg", 624 | time: 300, 625 | transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"} 626 | ) 627 | |> show("##{id}-container") 628 | |> JS.add_class("overflow-hidden", to: "body") 629 | |> JS.focus_first(to: "##{id}-content") 630 | end 631 | 632 | def hide_modal(js \\ %JS{}, id) do 633 | js 634 | |> JS.hide( 635 | to: "##{id}-bg", 636 | transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"} 637 | ) 638 | |> hide("##{id}-container") 639 | |> JS.hide(to: "##{id}", transition: {"block", "block", "hidden"}) 640 | |> JS.remove_class("overflow-hidden", to: "body") 641 | |> JS.pop_focus() 642 | end 643 | 644 | @doc """ 645 | Translates an error message using gettext. 646 | """ 647 | def translate_error({msg, opts}) do 648 | # You can make use of gettext to translate error messages by 649 | # uncommenting and adjusting the following code: 650 | 651 | # if count = opts[:count] do 652 | # Gettext.dngettext(ElixirPobedaWeb.Gettext, "errors", msg, msg, count, opts) 653 | # else 654 | # Gettext.dgettext(ElixirPobedaWeb.Gettext, "errors", msg, opts) 655 | # end 656 | 657 | Enum.reduce(opts, msg, fn {key, value}, acc -> 658 | String.replace(acc, "%{#{key}}", fn _ -> to_string(value) end) 659 | end) 660 | end 661 | 662 | @doc """ 663 | Translates the errors for a field from a keyword list of errors. 664 | """ 665 | def translate_errors(errors, field) when is_list(errors) do 666 | for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) 667 | end 668 | end 669 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/components/layouts.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.Layouts do 2 | @moduledoc """ 3 | This module holds different layouts used by your application. 4 | 5 | See the `layouts` directory for all templates available. 6 | The "root" layout is a skeleton rendered as part of the 7 | application router. The "app" layout is set as the default 8 | layout on both `use ElixirPobedaWeb, :controller` and 9 | `use ElixirPobedaWeb, :live_view`. 10 | """ 11 | use ElixirPobedaWeb, :html 12 | 13 | embed_templates "layouts/*" 14 | end 15 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/components/layouts/app.html.heex: -------------------------------------------------------------------------------- 1 |
2 |
3 | {@inner_content} 4 |
5 |
6 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/components/layouts/root.html.heex: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | ЭЛИКСИРПОБЕДА 11 | 12 | 13 | {@inner_content} 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/controllers/error_html.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.ErrorHTML do 2 | @moduledoc """ 3 | This module is invoked by your endpoint in case of errors on HTML requests. 4 | 5 | See config/config.exs. 6 | """ 7 | use ElixirPobedaWeb, :html 8 | 9 | # If you want to customize your error pages, 10 | # uncomment the embed_templates/1 call below 11 | # and add pages to the error directory: 12 | # 13 | # * lib/elixir_pobeda_web/controllers/error_html/404.html.heex 14 | # * lib/elixir_pobeda_web/controllers/error_html/500.html.heex 15 | # 16 | # embed_templates "error_html/*" 17 | 18 | # The default is to render a plain text page based on 19 | # the template name. For example, "404.html" becomes 20 | # "Not Found". 21 | def render(template, _assigns) do 22 | Phoenix.Controller.status_message_from_template(template) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/controllers/error_json.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.ErrorJSON do 2 | @moduledoc """ 3 | This module is invoked by your endpoint in case of errors on JSON requests. 4 | 5 | See config/config.exs. 6 | """ 7 | 8 | # If you want to customize a particular status code, 9 | # you may add your own clauses, such as: 10 | # 11 | # def render("500.json", _assigns) do 12 | # %{errors: %{detail: "Internal Server Error"}} 13 | # end 14 | 15 | # By default, Phoenix returns the status message from 16 | # the template name. For example, "404.json" becomes 17 | # "Not Found". 18 | def render(template, _assigns) do 19 | %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/controllers/page_controller.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.PageController do 2 | use ElixirPobedaWeb, :controller 3 | 4 | def home(conn, _params) do 5 | # The home page is often custom made, 6 | # so skip the default app layout. 7 | render(conn, :home, layout: false) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/controllers/page_html.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.PageHTML do 2 | @moduledoc """ 3 | This module contains pages rendered by PageController. 4 | 5 | See the `page_html` directory for all templates available. 6 | """ 7 | use ElixirPobedaWeb, :html 8 | 9 | embed_templates "page_html/*" 10 | end 11 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/controllers/page_html/home.html.heex: -------------------------------------------------------------------------------- 1 | <.flash_group flash={@flash} /> 2 | 41 |
42 |
43 | 49 |

50 | Phoenix Framework 51 | 52 | v{Application.spec(:phoenix, :vsn)} 53 | 54 |

55 |

56 | Peace of mind from prototype to production. 57 |

58 |

59 | Build rich, interactive web applications quickly, with less code and fewer moving parts. Join our growing community of developers using Phoenix to craft APIs, HTML5 apps and more, for fun or at scale. 60 |

61 | 221 |
222 |
223 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/endpoint.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.Endpoint do 2 | use Phoenix.Endpoint, otp_app: :elixir_pobeda 3 | 4 | # The session will be stored in the cookie and signed, 5 | # this means its contents can be read but not tampered with. 6 | # Set :encryption_salt if you would also like to encrypt it. 7 | @session_options [ 8 | store: :cookie, 9 | key: "_elixir_pobeda_key", 10 | signing_salt: "UtQpC5F3", 11 | same_site: "Lax" 12 | ] 13 | 14 | socket "/live", Phoenix.LiveView.Socket, 15 | websocket: [connect_info: [session: @session_options]], 16 | longpoll: [connect_info: [session: @session_options]] 17 | 18 | # Serve at "/" the static files from "priv/static" directory. 19 | # 20 | # You should set gzip to true if you are running phx.digest 21 | # when deploying your static files in production. 22 | plug Plug.Static, 23 | at: "/", 24 | from: :elixir_pobeda, 25 | gzip: false, 26 | only: ElixirPobedaWeb.static_paths() 27 | 28 | # Code reloading can be explicitly enabled under the 29 | # :code_reloader configuration of your endpoint. 30 | if code_reloading? do 31 | socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket 32 | plug Phoenix.LiveReloader 33 | plug Phoenix.CodeReloader 34 | end 35 | 36 | plug Phoenix.LiveDashboard.RequestLogger, 37 | param_key: "request_logger", 38 | cookie_key: "request_logger" 39 | 40 | plug Plug.RequestId 41 | plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] 42 | 43 | plug Plug.Parsers, 44 | parsers: [:urlencoded, :multipart, :json], 45 | pass: ["*/*"], 46 | json_decoder: Phoenix.json_library() 47 | 48 | plug Plug.MethodOverride 49 | plug Plug.Head 50 | plug Plug.Session, @session_options 51 | plug ElixirPobedaWeb.Router 52 | end 53 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/live/home_live.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.HomeLive do 2 | @moduledoc false 3 | use ElixirPobedaWeb, :live_view 4 | 5 | @elixir_date ~U[2012-05-25 19:39:00Z] 6 | 7 | def years do 8 | nanoseconds = DateTime.diff(DateTime.utc_now(), @elixir_date, :nanosecond) 9 | 10 | nanoseconds / 1_000_000_000 / 3600 / 24 / 365 11 | end 12 | 13 | def mount(_params, _session, socket) do 14 | if connected?(socket), do: :timer.send_interval(100, :tick) 15 | 16 | {:ok, assign(socket, %{years_since: years()})} 17 | end 18 | 19 | def handle_info(:tick, socket) do 20 | {:noreply, update(socket, :years_since, fn _ -> years() end)} 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/live/home_live.html.heex: -------------------------------------------------------------------------------- 1 |
2 |

2025 ЭТО ОЧЕРЕДНОЙ ГОД ЭЛИКСИР ПОБЕДЫ

3 |

почему 2025 это очередной год эликсир победы?

4 |
    5 |
  1. эликсир победа
  2. 6 |
  3. FUNCTIONAL DISTRIBUTED FAULT-TOLERANT CONCURRENT PROCESS-ORIENTED ACTOR MODEL
  4. 7 |
  5. BEAM goes BRRRRRRRRRR
  6. 8 |
  7. spawn(:your_mom@her_house, &me/0)
  8. 9 |
  9. 10 | 11 | BREAK: (a)bort (A)bort with dump (c)ontinue (p)roc info (i)nfo (l)oaded (v)ersion (k)ill (D)b-tables (d)istribution 12 | 13 |
  10. 14 |
  11. 15 | 16 | {"[error] ** (Protocol.UndefinedError) protocol Phoenix.HTML.Safe not implemented for type Function. This protocol is implemented for the following type(s): Atom, BitString, Date, DateTime, Float, Integer, List, NaiveDateTime, Phoenix.LiveComponent.CID, Phoenix.LiveView.Component, Phoenix.LiveView.Comprehension, Phoenix.LiveView.JS, Phoenix.LiveView.Rendered, Time, Tuple, URI"} 17 | 18 |
  12. 19 |
20 | 21 |

на эликсире написаны:

22 |
    23 |
  1. discord[1]
  2. 24 |
25 |

[1]: половина бекэнда

26 |

ЭЛИКСИР ПОБЕДА УЖЕ {@years_since} ГОД

27 |

ГОНЯТЬ HTML ПО ВЕБСОКЕТАМ ОХУЕННО

28 | <%= for img <- ~w(hello_joe.gif logo.svg elixir_no_support.png memory_usage.jpg otp_bank.svg) do %> 29 | 30 | <% end %> 31 | 34 |
35 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/router.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.Router do 2 | use ElixirPobedaWeb, :router 3 | 4 | pipeline :browser do 5 | plug :accepts, ["html"] 6 | plug :fetch_session 7 | plug :fetch_live_flash 8 | plug :put_root_layout, html: {ElixirPobedaWeb.Layouts, :root} 9 | plug :protect_from_forgery 10 | plug :put_secure_browser_headers 11 | end 12 | 13 | pipeline :api do 14 | plug :accepts, ["json"] 15 | end 16 | 17 | scope "/", ElixirPobedaWeb do 18 | pipe_through :browser 19 | 20 | live "/", HomeLive 21 | end 22 | 23 | # Other scopes may use custom stacks. 24 | # scope "/api", ElixirPobedaWeb do 25 | # pipe_through :api 26 | # end 27 | 28 | # Enable LiveDashboard in development 29 | if Application.compile_env(:elixir_pobeda, :dev_routes) do 30 | # If you want to use the LiveDashboard in production, you should put 31 | # it behind authentication and allow only admins to access it. 32 | # If your application does not have an admins-only section yet, 33 | # you can use Plug.BasicAuth to set up some basic authentication 34 | # as long as you are also using SSL (which you should anyway). 35 | import Phoenix.LiveDashboard.Router 36 | 37 | scope "/dev" do 38 | pipe_through :browser 39 | 40 | live_dashboard "/dashboard", metrics: ElixirPobedaWeb.Telemetry 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /lib/elixir_pobeda_web/telemetry.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.Telemetry do 2 | @moduledoc false 3 | use Supervisor 4 | 5 | import Telemetry.Metrics 6 | 7 | def start_link(arg) do 8 | Supervisor.start_link(__MODULE__, arg, name: __MODULE__) 9 | end 10 | 11 | @impl true 12 | def init(_arg) do 13 | children = [ 14 | # Telemetry poller will execute the given period measurements 15 | # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics 16 | {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} 17 | # Add reporters as children of your supervision tree. 18 | # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} 19 | ] 20 | 21 | Supervisor.init(children, strategy: :one_for_one) 22 | end 23 | 24 | def metrics do 25 | [ 26 | # Phoenix Metrics 27 | summary("phoenix.endpoint.start.system_time", 28 | unit: {:native, :millisecond} 29 | ), 30 | summary("phoenix.endpoint.stop.duration", 31 | unit: {:native, :millisecond} 32 | ), 33 | summary("phoenix.router_dispatch.start.system_time", 34 | tags: [:route], 35 | unit: {:native, :millisecond} 36 | ), 37 | summary("phoenix.router_dispatch.exception.duration", 38 | tags: [:route], 39 | unit: {:native, :millisecond} 40 | ), 41 | summary("phoenix.router_dispatch.stop.duration", 42 | tags: [:route], 43 | unit: {:native, :millisecond} 44 | ), 45 | summary("phoenix.socket_connected.duration", 46 | unit: {:native, :millisecond} 47 | ), 48 | sum("phoenix.socket_drain.count"), 49 | summary("phoenix.channel_joined.duration", 50 | unit: {:native, :millisecond} 51 | ), 52 | summary("phoenix.channel_handled_in.duration", 53 | tags: [:event], 54 | unit: {:native, :millisecond} 55 | ), 56 | 57 | # VM Metrics 58 | summary("vm.memory.total", unit: {:byte, :kilobyte}), 59 | summary("vm.total_run_queue_lengths.total"), 60 | summary("vm.total_run_queue_lengths.cpu"), 61 | summary("vm.total_run_queue_lengths.io") 62 | ] 63 | end 64 | 65 | defp periodic_measurements do 66 | [ 67 | # A module, function and arguments to be invoked periodically. 68 | # This function must call :telemetry.execute/3 and a metric must be added above. 69 | # {ElixirPobedaWeb, :count_users, []} 70 | ] 71 | end 72 | end 73 | -------------------------------------------------------------------------------- /mix.exs: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobeda.MixProject do 2 | use Mix.Project 3 | 4 | def project do 5 | [ 6 | app: :elixir_pobeda, 7 | version: "0.1.0", 8 | elixir: "~> 1.14", 9 | elixirc_paths: elixirc_paths(Mix.env()), 10 | start_permanent: Mix.env() == :prod, 11 | aliases: aliases(), 12 | deps: deps() 13 | ] 14 | end 15 | 16 | # Configuration for the OTP application. 17 | # 18 | # Type `mix help compile.app` for more information. 19 | def application do 20 | [ 21 | mod: {ElixirPobeda.Application, []}, 22 | extra_applications: [:logger, :runtime_tools] 23 | ] 24 | end 25 | 26 | # Specifies which paths to compile per environment. 27 | defp elixirc_paths(:test), do: ["lib", "test/support"] 28 | defp elixirc_paths(_), do: ["lib"] 29 | 30 | # Specifies your project dependencies. 31 | # 32 | # Type `mix help deps` for examples and options. 33 | defp deps do 34 | [ 35 | {:phoenix, "~> 1.7.20"}, 36 | {:phoenix_html, "~> 4.1"}, 37 | {:phoenix_live_reload, "~> 1.2", only: :dev}, 38 | {:phoenix_live_view, "~> 1.0.0"}, 39 | {:floki, ">= 0.30.0", only: :test}, 40 | {:phoenix_live_dashboard, "~> 0.8.3"}, 41 | {:esbuild, "~> 0.8", runtime: Mix.env() == :dev}, 42 | {:telemetry_metrics, "~> 1.0"}, 43 | {:telemetry_poller, "~> 1.0"}, 44 | {:jason, "~> 1.2"}, 45 | {:dns_cluster, "~> 0.1.1"}, 46 | {:bandit, "~> 1.5"}, 47 | {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, 48 | {:styler, "~> 1.4", only: [:dev, :test], runtime: false} 49 | ] 50 | end 51 | 52 | # Aliases are shortcuts or tasks specific to the current project. 53 | # For example, to install project dependencies and perform other setup tasks, run: 54 | # 55 | # $ mix setup 56 | # 57 | # See the documentation for `Mix` for more info on aliases. 58 | defp aliases do 59 | [ 60 | setup: ["deps.get", "assets.setup", "assets.build"], 61 | "assets.setup": ["esbuild.install --if-missing"], 62 | "assets.build": ["esbuild elixir_pobeda"], 63 | "assets.deploy": [ 64 | "esbuild elixir_pobeda --minify", 65 | "phx.digest" 66 | ] 67 | ] 68 | end 69 | end 70 | -------------------------------------------------------------------------------- /mix.lock: -------------------------------------------------------------------------------- 1 | %{ 2 | "bandit": {:hex, :bandit, "1.6.7", "42f30e37a1c89a2a12943c5dca76f731a2313e8a2e21c1a95dc8241893e922d1", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "551ba8ff5e4fc908cbeb8c9f0697775fb6813a96d9de5f7fe02e34e76fd7d184"}, 3 | "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, 4 | "castore": {:hex, :castore, "1.0.12", "053f0e32700cbec356280c0e835df425a3be4bc1e0627b714330ad9d0f05497f", [:mix], [], "hexpm", "3dca286b2186055ba0c9449b4e95b97bf1b57b47c1f2644555879e659960c224"}, 5 | "credo": {:hex, :credo, "1.7.11", "d3e805f7ddf6c9c854fd36f089649d7cf6ba74c42bc3795d587814e3c9847102", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "56826b4306843253a66e47ae45e98e7d284ee1f95d53d1612bb483f88a8cf219"}, 6 | "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, 7 | "esbuild": {:hex, :esbuild, "0.9.0", "f043eeaca4932ca8e16e5429aebd90f7766f31ac160a25cbd9befe84f2bc068f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b415027f71d5ab57ef2be844b2a10d0c1b5a492d431727f43937adce22ba45ae"}, 8 | "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, 9 | "floki": {:hex, :floki, "0.37.0", "b83e0280bbc6372f2a403b2848013650b16640cd2470aea6701f0632223d719e", [:mix], [], "hexpm", "516a0c15a69f78c47dc8e0b9b3724b29608aa6619379f91b1ffa47109b5d0dd3"}, 10 | "hpax": {:hex, :hpax, "1.0.2", "762df951b0c399ff67cc57c3995ec3cf46d696e41f0bba17da0518d94acd4aac", [:mix], [], "hexpm", "2f09b4c1074e0abd846747329eaa26d535be0eb3d189fa69d812bfb8bfefd32f"}, 11 | "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, 12 | "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, 13 | "phoenix": {:hex, :phoenix, "1.7.20", "6bababaf27d59f5628f9b608de902a021be2cecefb8231e1dbdc0a2e2e480e9b", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "6be2ab98302e8784a31829e0d50d8bdfa81a23cd912c395bafd8b8bfb5a086c2"}, 14 | "phoenix_html": {:hex, :phoenix_html, "4.2.1", "35279e2a39140068fc03f8874408d58eef734e488fc142153f055c5454fd1c08", [:mix], [], "hexpm", "cff108100ae2715dd959ae8f2a8cef8e20b593f8dfd031c9cba92702cf23e053"}, 15 | "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.6", "7b1f0327f54c9eb69845fd09a77accf922f488c549a7e7b8618775eb603a62c7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "1681ab813ec26ca6915beb3414aa138f298e17721dc6a2bde9e6eb8a62360ff6"}, 16 | "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, 17 | "phoenix_live_view": {:hex, :phoenix_live_view, "1.0.5", "f072166f87c44ffaf2b47b65c5ced8c375797830e517bfcf0a006fe7eb113911", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "94abbc84df8a93a64514fc41528695d7326b6f3095e906b32f264ec4280811f3"}, 18 | "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, 19 | "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, 20 | "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, 21 | "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, 22 | "styler": {:hex, :styler, "1.4.0", "5944723d08afe4d38210b674d7e97dd1137a75968a85a633983cc308e86dc5f2", [:mix], [], "hexpm", "07de0e89c27490c8e469bb814d77ddaaa3283d7d8038501021d80a7705cf13e9"}, 23 | "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, 24 | "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, 25 | "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, 26 | "thousand_island": {:hex, :thousand_island, "1.3.11", "b68f3e91f74d564ae20b70d981bbf7097dde084343c14ae8a33e5b5fbb3d6f37", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "555c18c62027f45d9c80df389c3d01d86ba11014652c00be26e33b1b64e98d29"}, 27 | "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, 28 | "websock_adapter": {:hex, :websock_adapter, "0.5.8", "3b97dc94e407e2d1fc666b2fb9acf6be81a1798a2602294aac000260a7c4a47d", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "315b9a1865552212b5f35140ad194e67ce31af45bcee443d4ecb96b5fd3f3782"}, 29 | } 30 | -------------------------------------------------------------------------------- /priv/static/favicon-91f37b602a111216f1eef3aa337ad763.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/favicon-91f37b602a111216f1eef3aa337ad763.ico -------------------------------------------------------------------------------- /priv/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/favicon.ico -------------------------------------------------------------------------------- /priv/static/images/bomb-c4fde33ff2b8d1657e88b7bd5b3bac15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/bomb-c4fde33ff2b8d1657e88b7bd5b3bac15.jpg -------------------------------------------------------------------------------- /priv/static/images/bomb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/bomb.jpg -------------------------------------------------------------------------------- /priv/static/images/durka-de791ce4731ef124273898b46fe78ed0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/durka-de791ce4731ef124273898b46fe78ed0.gif -------------------------------------------------------------------------------- /priv/static/images/durka.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/durka.gif -------------------------------------------------------------------------------- /priv/static/images/elixir_no_support-073ac21369884bdeca7135f946ed00ed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/elixir_no_support-073ac21369884bdeca7135f946ed00ed.png -------------------------------------------------------------------------------- /priv/static/images/elixir_no_support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/elixir_no_support.png -------------------------------------------------------------------------------- /priv/static/images/hello_joe-5b6b1b51689ef61a6683c17c783803b0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/hello_joe-5b6b1b51689ef61a6683c17c783803b0.gif -------------------------------------------------------------------------------- /priv/static/images/hello_joe.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/hello_joe.gif -------------------------------------------------------------------------------- /priv/static/images/logo-06a11be1f2cdde2c851763d00bdd2e80.svg: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /priv/static/images/logo-06a11be1f2cdde2c851763d00bdd2e80.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/logo-06a11be1f2cdde2c851763d00bdd2e80.svg.gz -------------------------------------------------------------------------------- /priv/static/images/logo.svg: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /priv/static/images/logo.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/logo.svg.gz -------------------------------------------------------------------------------- /priv/static/images/lupasit-aee1ae5992661b30f22e6bad0b303761.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/lupasit-aee1ae5992661b30f22e6bad0b303761.gif -------------------------------------------------------------------------------- /priv/static/images/lupasit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/lupasit.gif -------------------------------------------------------------------------------- /priv/static/images/memory_usage-95fd66d0dd7cb5fc98638e3d65f36e7a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/memory_usage-95fd66d0dd7cb5fc98638e3d65f36e7a.jpg -------------------------------------------------------------------------------- /priv/static/images/memory_usage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/memory_usage.jpg -------------------------------------------------------------------------------- /priv/static/images/otp_bank-df9281907894596a21ef4a7347c67a99.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 13 | 17 | 21 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /priv/static/images/otp_bank-df9281907894596a21ef4a7347c67a99.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/otp_bank-df9281907894596a21ef4a7347c67a99.svg.gz -------------------------------------------------------------------------------- /priv/static/images/otp_bank.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 13 | 17 | 21 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /priv/static/images/otp_bank.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/images/otp_bank.svg.gz -------------------------------------------------------------------------------- /priv/static/robots-9e2c81b0855bbff2baa8371bc4a78186.txt: -------------------------------------------------------------------------------- 1 | # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /priv/static/robots-9e2c81b0855bbff2baa8371bc4a78186.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/robots-9e2c81b0855bbff2baa8371bc4a78186.txt.gz -------------------------------------------------------------------------------- /priv/static/robots.txt: -------------------------------------------------------------------------------- 1 | # See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /priv/static/robots.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/robots.txt.gz -------------------------------------------------------------------------------- /priv/static/styles/app-79901bdfc3609cad89e21a1689583bdc.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&family=IBM+Plex+Sans:ital@0;1&family=IBM+Plex+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap'); 2 | 3 | #years { 4 | color: #82c4f2; 5 | } 6 | code { 7 | font-family: "IBM Plex Mono", monospace; 8 | } 9 | 10 | .gif { 11 | margin: 1vh; 12 | } 13 | 14 | @media (width> 770px) { 15 | .gif { 16 | width: 40%; 17 | } 18 | } 19 | 20 | @media (width > 600px) and (width <= 770px) { 21 | .gif { 22 | width: 80%; 23 | } 24 | } 25 | 26 | @media (width <= 600px) { 27 | .gif { 28 | width: 90%; 29 | } 30 | } 31 | 32 | #container { 33 | margin-left: auto; 34 | margin-right: auto; 35 | padding: 20px 10px 10px 10px; 36 | display: flex; 37 | justify-content: center; 38 | flex-direction: column; 39 | align-items: center; 40 | 41 | color: aliceblue; 42 | text-align: center; 43 | } 44 | 45 | :root { 46 | overflow-y: scroll; 47 | scrollbar-width: none; 48 | -ms-overflow-style: none; 49 | } 50 | :root::-webkit-scrollbar { 51 | width: 0; 52 | height: 0; 53 | } 54 | 55 | body { 56 | background: linear-gradient(-60deg, #522C62, #522C62, #FD4F00, #72587C) no-repeat; 57 | background-size: 300%; 58 | animation: gradient 10s ease infinite; 59 | width: 100%; 60 | margin: 0; 61 | font-family: "IBM Plex Sans", sans-serif; 62 | font-size: 18px; 63 | } 64 | 65 | h1, h2, h3, h4 { 66 | font-family: "IBM Plex Serif", serif; 67 | font-weight: 700; 68 | } 69 | 70 | h3 { 71 | font-size: 20px; 72 | } 73 | 74 | h2 { 75 | font-size: 24px; 76 | } 77 | 78 | h1 { 79 | font-size: 32px; 80 | } 81 | 82 | @keyframes gradient { 83 | 0% { 84 | background-position: 0% 50%; 85 | } 86 | 50% { 87 | background-position: 100% 50%; 88 | } 89 | 100% { 90 | background-position: 0% 50%; 91 | } 92 | } 93 | 94 | .list { 95 | margin: 0.5vh; 96 | } 97 | -------------------------------------------------------------------------------- /priv/static/styles/app-79901bdfc3609cad89e21a1689583bdc.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/styles/app-79901bdfc3609cad89e21a1689583bdc.css.gz -------------------------------------------------------------------------------- /priv/static/styles/app.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&family=IBM+Plex+Sans:ital@0;1&family=IBM+Plex+Serif:ital,wght@0,400;0,700;1,400;1,700&display=swap'); 2 | 3 | #years { 4 | color: #82c4f2; 5 | } 6 | 7 | code { 8 | font-family: "IBM Plex Mono", monospace; 9 | } 10 | 11 | .gif { 12 | margin: 1vh; 13 | } 14 | 15 | @media (width> 770px) { 16 | .gif { 17 | width: 40%; 18 | } 19 | } 20 | 21 | @media (width > 600px) and (width <= 770px) { 22 | .gif { 23 | width: 80%; 24 | } 25 | } 26 | 27 | @media (width <= 600px) { 28 | .gif { 29 | width: 90%; 30 | } 31 | } 32 | 33 | #container { 34 | margin-left: auto; 35 | margin-right: auto; 36 | padding: 20px 10px 10px 10px; 37 | display: flex; 38 | justify-content: center; 39 | flex-direction: column; 40 | align-items: center; 41 | 42 | color: aliceblue; 43 | text-align: center; 44 | } 45 | 46 | :root { 47 | overflow-y: scroll; 48 | scrollbar-width: none; 49 | -ms-overflow-style: none; 50 | } 51 | :root::-webkit-scrollbar { 52 | width: 0; 53 | height: 0; 54 | } 55 | 56 | body { 57 | background: linear-gradient(-60deg, #522C62, #522C62, #FD4F00, #72587C) no-repeat; 58 | background-size: 300%; 59 | animation: gradient 10s ease infinite; 60 | width: 100%; 61 | margin: 0; 62 | font-family: "IBM Plex Sans", sans-serif; 63 | font-size: 18px; 64 | } 65 | 66 | h1, h2, h3, h4 { 67 | font-family: "IBM Plex Serif", serif; 68 | font-weight: 700; 69 | } 70 | 71 | h3 { 72 | font-size: 20px; 73 | } 74 | 75 | h2 { 76 | font-size: 24px; 77 | } 78 | 79 | h1 { 80 | font-size: 32px; 81 | } 82 | 83 | @keyframes gradient { 84 | 0% { 85 | background-position: 0% 50%; 86 | } 87 | 50% { 88 | background-position: 100% 50%; 89 | } 90 | 100% { 91 | background-position: 0% 50%; 92 | } 93 | } 94 | 95 | .list { 96 | margin: 0.5vh; 97 | } 98 | 99 | footer { 100 | text-align: center; 101 | margin: auto; 102 | 103 | h3 a { 104 | text-decoration: underline; 105 | color: #FFFFFF; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /priv/static/styles/app.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/styles/app.css.gz -------------------------------------------------------------------------------- /priv/static/videos/hello_joe-ba9f51edf0aef3e919940862116a1463.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/videos/hello_joe-ba9f51edf0aef3e919940862116a1463.mp4 -------------------------------------------------------------------------------- /priv/static/videos/hello_joe.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/q60/elixir_pobeda/df19ecc721240a45b0f8fbfcdb68dea191394e8e/priv/static/videos/hello_joe.mp4 -------------------------------------------------------------------------------- /rel/overlays/bin/server: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -eu 3 | 4 | cd -P -- "$(dirname -- "$0")" 5 | PHX_SERVER=true exec ./elixir_pobeda start 6 | -------------------------------------------------------------------------------- /rel/overlays/bin/server.bat: -------------------------------------------------------------------------------- 1 | set PHX_SERVER=true 2 | call "%~dp0\elixir_pobeda" start 3 | -------------------------------------------------------------------------------- /test/elixir_pobeda_web/controllers/error_html_test.exs: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.ErrorHTMLTest do 2 | use ElixirPobedaWeb.ConnCase, async: true 3 | 4 | # Bring render_to_string/4 for testing custom views 5 | import Phoenix.Template 6 | 7 | test "renders 404.html" do 8 | assert render_to_string(ElixirPobedaWeb.ErrorHTML, "404", "html", []) == "Not Found" 9 | end 10 | 11 | test "renders 500.html" do 12 | assert render_to_string(ElixirPobedaWeb.ErrorHTML, "500", "html", []) == 13 | "Internal Server Error" 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /test/elixir_pobeda_web/controllers/error_json_test.exs: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.ErrorJSONTest do 2 | use ElixirPobedaWeb.ConnCase, async: true 3 | 4 | test "renders 404" do 5 | assert ElixirPobedaWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} 6 | end 7 | 8 | test "renders 500" do 9 | assert ElixirPobedaWeb.ErrorJSON.render("500.json", %{}) == 10 | %{errors: %{detail: "Internal Server Error"}} 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /test/elixir_pobeda_web/controllers/page_controller_test.exs: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.PageControllerTest do 2 | use ElixirPobedaWeb.ConnCase 3 | 4 | test "GET /", %{conn: conn} do 5 | conn = get(conn, ~p"/") 6 | assert html_response(conn, 200) =~ "Peace of mind from prototype to production" 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/support/conn_case.ex: -------------------------------------------------------------------------------- 1 | defmodule ElixirPobedaWeb.ConnCase do 2 | @moduledoc """ 3 | This module defines the test case to be used by 4 | tests that require setting up a connection. 5 | 6 | Such tests rely on `Phoenix.ConnTest` and also 7 | import other functionality to make it easier 8 | to build common data structures and query the data layer. 9 | 10 | Finally, if the test case interacts with the database, 11 | we enable the SQL sandbox, so changes done to the database 12 | are reverted at the end of every test. If you are using 13 | PostgreSQL, you can even run database tests asynchronously 14 | by setting `use ElixirPobedaWeb.ConnCase, async: true`, although 15 | this option is not recommended for other databases. 16 | """ 17 | 18 | use ExUnit.CaseTemplate 19 | 20 | using do 21 | quote do 22 | use ElixirPobedaWeb, :verified_routes 23 | 24 | import ElixirPobedaWeb.ConnCase 25 | import Phoenix.ConnTest 26 | import Plug.Conn 27 | # The default endpoint for testing 28 | @endpoint ElixirPobedaWeb.Endpoint 29 | 30 | # Import conveniences for testing with connections 31 | end 32 | end 33 | 34 | setup _tags do 35 | {:ok, conn: Phoenix.ConnTest.build_conn()} 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start() 2 | --------------------------------------------------------------------------------