Jinaga 1.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Jinaga --version 1.0.0                
NuGet\Install-Package Jinaga -Version 1.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Jinaga" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Jinaga --version 1.0.0                
#r "nuget: Jinaga, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Jinaga as a Cake Addin
#addin nuget:?package=Jinaga&version=1.0.0

// Install Jinaga as a Cake Tool
#tool nuget:?package=Jinaga&version=1.0.0                

Jinaga.NET

Resilient, reliable data transfer for .NET.

What it Does

In Jinaga, you define a data model in terms of immutable facts. A fact represents an entity, a change to an entity, or a decision that a user or service has made.

In Jinaga.NET, facts are C# records.:

[FactType("Corporate.Company")]
record Company(string identifier) {}

[FactType("Corporate.Employee")]
record Employee(Company company, int employeeNumber) {}

When a user or service makes a decision, you will add a fact to the system. This will store it in the local database. It will also update the local UI. And it will publish it so that others can learn about the decision.

var contoso = await j.Fact(new Company("Contoso"));
var jane = await j.Fact(new Employee(contoso, 1));
var bob = await j.Fact(new Employee(contoso, 2));

To query facts, write a specification. Start at a know fact and find all related facts that match that specification.

var employeesOfCompany = Given<Company>.Match((company, facts) =>
    from employee in facts.OfType<Employee>()
    where employee.company == company
    select employee
);

var contosoEmployees = await j.Query(contoso, employeesOfCompany);

A query returns results at a point in time. If you want to keep a user interface up-to-date, you will need to set up an event-based watch.

var observer = j.Watch(contoso, employeesOfCompany, employee =>
{
    var component = AddEmployeeComponent(employee);
    return () =>
    {
        RemoveEmployeeComponent(component);
    };
});

Finally, if you want to be notified in real time of new information, just subscribe.

var subscription = j.Subscribe(contoso, employeesOfCompany);

The client will open a persistent connection with the server. The server will notify the client the moment a new employee is hired. Because the client already set up a watch, the new employee will appear on the UI.

Running a Replicator

A Jinaga front end connects to a device called a Replicator. The Jinaga Replicator is a single machine in a network. It stores and shares facts. To get started, create a Replicator of your very own using Docker.

docker pull jinaga/jinaga-replicator
docker create --name my-replicator -p8080:8080 jinaga/jinaga-replicator
docker start my-replicator

This creates and starts a new container called my-replicator. The container is listening at port 8080 for commands. Configure Jinaga to use the replicator:

var j = JinagaClient.Create(options =>
{
    options.HttpEndpoint = new Uri("http://localhost:8080/jinaga");
});

Roadmap

Jinaga.NET is co-evolving with Jinaga.JS. Each of these projects has a front end and a back end. Either front end is intended to work with either back end. And the back ends are intended to interconnect to form a decision substrate.

Jinaga Roadmap

APIs

The primary APIs for Jinaga are:

  • j.Fact - Add and publish a fact
  • j.Query - Project the facts matching a specification
  • j.Watch - Continually update a projection
  • j.Subscribe - Receive continuous updates from peers

The Subscribe API is not fully implemented in Jinaga.JS, and not implemented yet in Jinaga.NET. The JS version uses polling rather than the intended mechanism of Web Sockets or HTTP/2 Server Push.

Storage

Jinaga.NET currently has only memory storage, which is packaged with the core library. The next storage solutions to implement are SQLite to support Xamarin mobile apps and PostgreSQL to support Docker deployment. After that, the MS SQL Server implementation will support enterprise solutions that need to keep the journal transactionally consistent with the projection.

Rules

Authorization rules -- which limit the users who can create facts -- are implemented in Jinaga.JS, but not yet in Jinaga.NET. Distribution rules -- which limit the specifications that a user can query -- are not yet implemented in either.

Release

This repository uses Nerdbank.GitVersioning to manage version numbers. To release a new version of the Jinaga.NET library, create a new tag in the format 1.2.3. Then create a new release based on that tag. The release will be published to NuGet.

To accomplish this from the command line, use a combination of git and gh commands.

$VERSION = "1.2.3"
git checkout main
git pull
git tag $VERSION
git push --tags
gh release create $VERSION --generate-notes --verify-tag
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (5)

Showing the top 5 NuGet packages that depend on Jinaga:

Package Downloads
Jinaga.UnitTest

Support for unit testing Jinaga applications. Data management for web and mobile applications. Connect your client to a replicator to replace your hand-written API and database. Jinaga supports occasionally connected clients with local storage in SQLite.

Jinaga.Graphviz

Generates visualizations of Jinaga facts and types. For use wihtin .NET Interactive Notebooks. Data management for web and mobile applications. Connect your client to a replicator to replace your hand-written API and database. Jinaga supports occasionally connected clients with local storage in SQLite.

Jinaga.Store.SQLite

SQLite storage for Jinaga applications. Data management for web and mobile applications. Connect your client to a replicator to replace your hand-written API and database. Jinaga supports occasionally connected clients with local storage in SQLite.

Jinaga.Notebooks

Generates visualizations of Jinaga facts and types. For use wihtin .NET Interactive Notebooks. Data management for web and mobile applications. Connect your client to a replicator to replace your hand-written API and database. Jinaga supports occasionally connected clients with local storage in SQLite.

Jinaga.Maui

Data management for web and mobile applications. Connect your client to a replicator to replace your hand-written API and database. Jinaga supports occasionally connected clients with local storage in SQLite.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.15 86 10/27/2024
1.0.6 137 9/17/2024
1.0.6-g3fd5de50a5 99 9/20/2024
1.0.0 213 7/16/2024
0.12.8 167 7/14/2024
0.12.7 144 7/14/2024
0.12.6 168 7/13/2024
0.12.5 213 7/7/2024
0.12.4 201 7/6/2024
0.12.3 192 7/3/2024
0.12.2 179 6/29/2024
0.12.1 147 6/9/2024
0.12.0 206 5/26/2024
0.11.18 186 5/18/2024
0.11.17 219 4/19/2024
0.11.16 185 4/14/2024
0.11.15 199 4/9/2024
0.11.14 165 4/7/2024
0.11.13 186 4/7/2024
0.11.12 172 4/7/2024
0.11.11 195 4/1/2024
0.11.10 201 3/31/2024
0.11.9 191 3/30/2024
0.11.8 181 3/30/2024
0.11.7 196 3/29/2024
0.11.6 185 3/24/2024
0.11.5 210 3/13/2024
0.11.4 261 3/6/2024
0.11.3 258 3/1/2024
0.11.2 211 2/29/2024
0.11.1 240 2/19/2024
0.11.0 208 2/16/2024
0.10.1 256 2/15/2024
0.10.0 268 2/11/2024
0.9.7 260 2/10/2024
0.9.6 245 2/8/2024
0.9.5 268 2/2/2024
0.9.4 231 2/1/2024
0.9.3 242 1/31/2024
0.9.2 255 1/24/2024
0.9.1 294 1/20/2024
0.9.0 274 1/19/2024
0.8.4 496 11/17/2023
0.8.3 379 11/11/2023
0.8.2 336 11/2/2023
0.8.1 353 11/1/2023
0.8.0 191 10/23/2023
0.7.2 341 10/19/2023
0.7.1 348 9/21/2023
0.7.0 368 9/12/2023
0.6.5 426 8/29/2023
0.6.4 412 8/26/2023
0.6.3 349 8/26/2023
0.6.2 416 8/19/2023
0.6.1 389 8/19/2023
0.6.0 360 8/17/2023
0.5.1 395 8/16/2023
0.5.0 392 8/12/2023
0.4.0 435 5/28/2023
0.3.0 594 2/12/2023
0.2.109 702 2/5/2023
0.2.108 924 10/18/2022
0.2.107 987 10/15/2022
0.2.106 1,025 10/12/2022
0.2.105 981 10/11/2022
0.2.104 1,002 9/25/2022
0.2.103 1,040 9/25/2022
0.2.98 1,039 9/25/2022
0.2.97 1,026 9/25/2022
0.2.24 711 11/30/2021
0.2.23 728 11/27/2021
0.2.22 2,406 11/27/2021
0.2.21 3,287 11/25/2021
0.2.20 830 11/12/2021
0.2.19 732 11/11/2021
0.2.15 758 11/9/2021
0.2.13 760 11/8/2021
0.2.3 826 11/4/2021
0.2.1 777 11/3/2021
0.2.0 805 11/1/2021
0.1.1 816 9/26/2021
0.1.0 865 9/26/2021