Skip to content

IRC-style chat demo featuring full-stack F#, Akka.Streams, Akkling, Fable, Elmish, Websockets and .NET Core

License

Notifications You must be signed in to change notification settings

OlegZee/SAFE-Chat

 
 

Repository files navigation

Build Status

F#chat

Sample chat application built with netcore, F#, Akka.net and Fable.

Harvest chat

Requirements

Building and running the app

  • Install JS dependencies: yarn
  • Move to src/Client folder: cd src\Client
  • Install F# dependencies: dotnet restore
  • Build client bundle: dotnet fable webpack -p
  • Move to src/Server folder: cd ..\Server
  • Install F# dependencies: dotnet restore
  • Run the server: dotnet run
  • Head your browser to http://localhost:8083/

Developing the app

  • Start the server (see instruction above)
  • Move to src/Client folder: cd src\Client
  • Start Fable daemon and Webpack dev server: dotnet fable webpack-dev-server
  • In your browser, open: http://localhost:8080/
  • Enjoy HMR (hotload module reload) experience

Running integration (e2e) tests

E2e tests are based on canopy and webdriver so currently I know it runs on Windows. I have no idea how to run in non-windows environment.

  • Follow the instructions above to start the server
  • Move to test/e2e folder: cd test\e2e
  • run the tests: dotnet run

It used to work with Expecto plugin but it's no longer included in Ionide.

Implementation overview

Authentication

FsChat supports both permanent users, authorized via goodle or github account, and anonymous ones, those who provide only nickname.

In order to support the google/fb authentication scenario, fill in the client/secret in the CHAT_DATA/suave.oauth.config file. In case you do not see this file, run the server once and the file will be created automatically.

Akka streams

FsChat backend is based on Akka.Streams. The entry point is a GroupChatFlow module which implements the actor, serving group chat.

UserSessionFlow defines the flows for user and control messages, brings everything together and exposes flow for user session.

AboutFlow is an example of implementing channel with specific purpose, other than chatting

ChatServer is an actor which purpose is to keep the channel list. It's responsible for creating/dropping the channels.

UserStore is an actor which purpose is to know all users logged in. It supposed to be made persistent but it does not work for some reason (I created issue).

SocketFlow implements a flow decorating the server-side web socket.

Akkling

Akkling is an unofficial Akka.NET API for F#. It's not just wrapper around Akka.NET API, but introduces some cool concepts such as Effects, typed actors and many more.

Fable, Elmish

Client is written on F# with the help of Fable and Elmish (library?, framework?). Fable is absolutely mature technology, Elmish is just great.

Communication protocol

After client is authenticated all communication between client and server is carried via WebSockets. The protocol is defined in src/Shared/ChatProtocol.fs file which is shared between client and server projects.

References

About

IRC-style chat demo featuring full-stack F#, Akka.Streams, Akkling, Fable, Elmish, Websockets and .NET Core

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • F# 90.6%
  • CSS 6.6%
  • JavaScript 1.9%
  • Other 0.9%