diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | default.nix | 80 | ||||
-rw-r--r-- | example.nix | 15 | ||||
-rw-r--r-- | picarones-elm/cover.html | 19 | ||||
-rw-r--r-- | picarones-elm/default.nix | 24 | ||||
-rw-r--r-- | picarones-elm/index.html | 21 | ||||
-rw-r--r-- | picarones-elm/slide.html | 34 | ||||
-rw-r--r-- | picarones-elm/src/Cover.elm | 2 | ||||
-rw-r--r-- | picarones-hs/build.nix | 15 | ||||
-rw-r--r-- | picarones-hs/default.nix | 48 | ||||
-rw-r--r-- | pkgs.nix | 6 |
11 files changed, 186 insertions, 80 deletions
@@ -1,4 +1,4 @@ */dist-newstyle/* -*/result +*result */elm-stuff/* *js diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..d739a4c --- /dev/null +++ b/default.nix @@ -0,0 +1,80 @@ +{config, lib, pkgs, ...}: +let + picarones = import ./pkgs.nix { inherit pkgs; }; +in +with lib; +{ + options.services.picarones = { + enable = mkOption { + default = false; + example = true; + type = types.bool; + description = "'next slide please' as a service"; + }; + package = mkOption { + description = "the server package to use"; + default = picarones.picarones-hs; + type = types.package; + }; + port = mkOption { + description = "port at which the backend server should listen."; + default = 9000; + type = types.int; + }; + frontend = { + enable = mkOption { + description = "Whether to setup nginx to deliver the picarones frontend"; + default = true; + type = types.bool; + }; + package = mkOption { + description = "Which package provides the frontend app."; + default = picarones.picarones-elm; + type = types.package; + }; + domain = mkOption { + description = "Which domain nginx should listen on."; + default = ""; + type = types.str; + }; + proxyBackend = mkOption { + description = "whether to set up a proxy for the backend using nginx (on the same domain)."; + default = false; + type = types.bool; + }; + config = mkOption { + description = "extra options for nginx."; + default = {}; + type = types.attrs; + }; + }; + }; + + config = let cfg = config.services.picarones; in { + systemd.services.picarones-hs = { + description = "picarones backend server"; + path = [ cfg.package ]; + wantedBy = [ "multi-user.target" ]; + script = '' + ${cfg.package}/bin/picarones-hs + ''; + }; + + services.nginx = mkIf cfg.frontend.enable { + enable = true; + virtualHosts.${cfg.frontend.domain} = cfg.frontend.config // { + root = + # need to do it this (long) way since a user may change this value outside of this module + let ssl = config.services.nginx.virtualHosts.${cfg.frontend.domain}.enableSSL; + in (cfg.frontend.package.override { + baseurl = (if ssl then "https://" else "http://") + cfg.frontend.domain; + serverurl = (if ssl then "wss" else "ws") + "://${cfg.frontend.domain}/websocket"; + }).outPath; + locations."/websocket" = { + proxyPass = "http://localhost:9160"; + proxyWebsockets = true; + }; + }; + }; + }; +} diff --git a/example.nix b/example.nix new file mode 100644 index 0000000..4c66bc9 --- /dev/null +++ b/example.nix @@ -0,0 +1,15 @@ +{config, pkgs, ...}: + +{ + imports = [ ./default.nix ]; + + services.picarones = { + enable = true; + frontend = { + enable = true; + domain = "10.233.4.2"; + }; + }; + + networking.firewall.allowedTCPPorts = [ 80 ]; +} diff --git a/picarones-elm/cover.html b/picarones-elm/cover.html deleted file mode 100644 index d92eba9..0000000 --- a/picarones-elm/cover.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <meta charset="UTF-8"> - <title>Main</title> - <script src="Cover.js"></script> - <link rel="stylesheet" type="text/css" href="document.css" /> -</head> - -<body> - <div id="elm"></div> - <script> - var app = Elm.Cover.init({ - node: document.getElementById('elm'), - flags: "https://picarones.stuebinm.eu" - }); - </script> -</body> -</html> diff --git a/picarones-elm/default.nix b/picarones-elm/default.nix index ed71959..b5e9d9d 100644 --- a/picarones-elm/default.nix +++ b/picarones-elm/default.nix @@ -1,9 +1,10 @@ -{ nixpkgs ? <nixpkgs> -, config ? {} +{ stdenv +, elmPackages +, lib +, baseurl ? "example.org" +, serverurl ? "wss://example.org" }: -with (import nixpkgs config); - let mkDerivation = { srcs ? ./elm-srcs.nix @@ -13,13 +14,15 @@ let , targets ? [] , registryDat ? ./registry.dat , outputJavaScript ? true + , patchPhase ? "" + , ... }: stdenv.mkDerivation { - inherit name src; + inherit name src patchPhase; buildInputs = [ elmPackages.elm ]; - buildPhase = pkgs.elmPackages.fetchElmDeps { + buildPhase = elmPackages.fetchElmDeps { elmPackages = import srcs; elmVersion = "0.19.1"; inherit registryDat; @@ -32,7 +35,7 @@ let mkdir -p $out/share/doc ${lib.concatStrings (map (module: '' echo "compiling ${elmfile module}" - elm make ${elmfile module} --output $out/${module}.${extension} + elm make ${elmfile module} --optimize --output $out/${module}.${extension} '') targets)} cp *.html $out cp *.css $out @@ -41,7 +44,12 @@ let }; in mkDerivation { name = "picarones"; - + + patchPhase = '' + substituteInPlace index.html --replace "{{ baseurl }}" ${lib.escapeShellArg baseurl} + substituteInPlace slide.html --replace "{{ serverurl }}" ${lib.escapeShellArg serverurl} + ''; + srcs = ./elm-srcs.nix; src = ./.; targets = ["Main" "Cover"]; diff --git a/picarones-elm/index.html b/picarones-elm/index.html index 4fe72c7..156eb9c 100644 --- a/picarones-elm/index.html +++ b/picarones-elm/index.html @@ -3,32 +3,17 @@ <head> <meta charset="UTF-8"> <title>Main</title> - <script src="Main.js"></script> + <script src="Cover.js"></script> <link rel="stylesheet" type="text/css" href="document.css" /> </head> <body> <div id="elm"></div> <script> - let args = location.hash.split("#").slice(1); - - var app = Elm.Main.init({ + var app = Elm.Cover.init({ node: document.getElementById('elm'), - flags: [args[0], parseInt(args[1])] + flags: "{{ baseurl }}" }); - - let ws = new WebSocket("ws://localhost:9160") - - ws.onopen = () => ws.send ("{\"room\":\"testroom\"}"); - - ws.onmessage = function(msg) { - console.log(msg.data) - app.ports.recvPort.send(msg.data) - } - - app.ports.sendPort.subscribe(function(msg) { - ws.send(msg) - }) </script> </body> </html> diff --git a/picarones-elm/slide.html b/picarones-elm/slide.html new file mode 100644 index 0000000..a72fb3c --- /dev/null +++ b/picarones-elm/slide.html @@ -0,0 +1,34 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="UTF-8"> + <title>Main</title> + <script src="Main.js"></script> + <link rel="stylesheet" type="text/css" href="document.css" /> +</head> + +<body> + <div id="elm"></div> + <script> + let args = location.hash.split("#").slice(1); + + var app = Elm.Main.init({ + node: document.getElementById('elm'), + flags: [args[0], parseInt(args[1])] + }); + + let ws = new WebSocket("{{ serverurl }}") + + ws.onopen = () => ws.send (JSON.stringify ({room:args[0]})); + + ws.onmessage = function(msg) { + console.log(msg.data) + app.ports.recvPort.send(msg.data) + } + + app.ports.sendPort.subscribe(function(msg) { + ws.send(msg) + }) + </script> +</body> +</html> diff --git a/picarones-elm/src/Cover.elm b/picarones-elm/src/Cover.elm index 5c9d040..fee40c0 100644 --- a/picarones-elm/src/Cover.elm +++ b/picarones-elm/src/Cover.elm @@ -56,7 +56,7 @@ mkNumberInput i = mkLink : Model -> Html Msg mkLink (p, max, baseurl) = case p of "" -> text "(none yet)" - prefix -> let link = baseurl ++ "/slide#" ++ prefix ++ "#" ++ (String.fromInt max) + prefix -> let link = baseurl ++ "/slide.html#" ++ prefix ++ "#" ++ (String.fromInt max) in a [ href link ] [ text link ] diff --git a/picarones-hs/build.nix b/picarones-hs/build.nix new file mode 100644 index 0000000..c61d763 --- /dev/null +++ b/picarones-hs/build.nix @@ -0,0 +1,15 @@ +{ mkDerivation, aeson, base, bytestring, stdenv, text +, unordered-containers, websockets +}: +mkDerivation { + pname = "picarones-hs"; + version = "0.1.0.0"; + src = ./.; + isLibrary = false; + isExecutable = true; + executableHaskellDepends = [ + aeson base bytestring text unordered-containers websockets + ]; + license = "unknown"; + hydraPlatforms = stdenv.lib.platforms.none; +} diff --git a/picarones-hs/default.nix b/picarones-hs/default.nix index ebcb880..c61d763 100644 --- a/picarones-hs/default.nix +++ b/picarones-hs/default.nix @@ -1,33 +1,15 @@ -{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }: - -let - - inherit (nixpkgs) pkgs; - - f = { mkDerivation, aeson, base, bytestring, stdenv, text - , unordered-containers, websockets - }: - mkDerivation { - pname = "haskell-ws-test"; - version = "0.1.0.0"; - src = ./.; - isLibrary = false; - isExecutable = true; - executableHaskellDepends = [ - aeson base bytestring text unordered-containers websockets - ]; - license = "unknown"; - hydraPlatforms = stdenv.lib.platforms.none; - }; - - haskellPackages = if compiler == "default" - then pkgs.haskellPackages - else pkgs.haskell.packages.${compiler}; - - variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id; - - drv = variant (haskellPackages.callPackage f {}); - -in - - if pkgs.lib.inNixShell then drv.env else drv +{ mkDerivation, aeson, base, bytestring, stdenv, text +, unordered-containers, websockets +}: +mkDerivation { + pname = "picarones-hs"; + version = "0.1.0.0"; + src = ./.; + isLibrary = false; + isExecutable = true; + executableHaskellDepends = [ + aeson base bytestring text unordered-containers websockets + ]; + license = "unknown"; + hydraPlatforms = stdenv.lib.platforms.none; +} diff --git a/pkgs.nix b/pkgs.nix new file mode 100644 index 0000000..2ede710 --- /dev/null +++ b/pkgs.nix @@ -0,0 +1,6 @@ +{ pkgs }: + +{ + picarones-hs = pkgs.haskellPackages.callPackage ./picarones-hs/default.nix {}; + picarones-elm = pkgs.lib.callPackageWith pkgs ./picarones-elm/default.nix {}; +} |