Package

purescript-bf-gun

Repository
gorillatron/purescript-bf-gun
License
(GPL-3.0-only OR MIT)
Uploaded by
gorillatron
Published on
2021-10-20T17:54:49Z

Gun DB in purescript.

Server

module Examples.Basic.Server where

import Prelude hiding (apply)

import Data.Maybe (Maybe(..))
import Data.Options (Options, (:=))
import Effect (Effect)
import Effect.Class (liftEffect)
import Effect.Console (log)
import Effect.Timer (setInterval)
import Examples.Basic.State (stateFromJson, stateToJson)
import Gun as Gun
import Gun.Configuration (Configuration, fileOption, webOption)
import Node.Express.App (App, listenHttp, get)
import Node.Express.Response (send)
import Node.HTTP (Server)

app :: App
app = get "/" do
  send "body"

main :: Effect Server
main = do

  server <-
    listenHttp app 8080 \_ ->
      log $ "Server Listening on " <> show 8080
      
  let
    gunConfig :: Options Configuration
    gunConfig =
      webOption := Just server
        <> fileOption
        := Just "radata"

  gun <- liftEffect $ (Gun.create gunConfig)

  statenode <- liftEffect $ Gun.get stateFromJson stateToJson "state" gun

  _ <-
    liftEffect
      $ setInterval 3000 do
        log "sending message"
        _ <- statenode # Gun.put { message: "Message from server" }
        pure unit

  pure server

Client

module Examples.Basic.Client where

import Prelude

import Data.Either (Either(..))
import Data.Maybe (Maybe(..))
import Data.Options (Options, (:=))
import Debug (trace)
import Effect (Effect)
import Effect.Aff (launchAff_)
import Effect.Class (liftEffect)
import Effect.Class.Console (log)
import Examples.Basic.State (stateFromJson, stateToJson)
import Gun as Gun
import Gun.Configuration (Configuration, peersOption)

main :: Effect Unit
main = launchAff_ do
  let
    gunConfig :: Options Configuration
    gunConfig =
      peersOption := Just ["http://localhost:8080/gun"]

  gun <- liftEffect $ (Gun.create gunConfig)

  statenode <- liftEffect $ Gun.get stateFromJson stateToJson "state" gun

  pure $ trace statenode identity

  _ <- do  
    log "listening"
    _ <- liftEffect $ statenode # Gun.on (\d -> do 
      case d.data of 
        (Left _) -> do log "error parsing server message "
        (Right state) -> do log state.message
    )
    pure unit
      

  pure unit