# `@actual-app/crdt`

This package contains the core CRDT logic that enables Actual’s syncing. It is shared between the client and server. We may or may not follow semver when updating this package; any usage of it outside Actual is undocumented and at your own risk.

## protobuf

We use [protobuf](https://developers.google.com/protocol-buffers/) to encode messages as binary data to send across the network.

### Generating protobuf

The protobuf is generated by using the [protoc](https://github.com/protocolbuffers/protobuf) compiler.

This can be installed by downloading one of the [pre-built binaries](https://github.com/protocolbuffers/protobuf/releases/) and placing it in your `$PATH`. The version used to build the current protobuf is [v3.20.1](https://github.com/protocolbuffers/protobuf/releases/tag/v3.20.1). You’ll also need to [download the latest version of `protoc-gen-js`](https://github.com/protocolbuffers/protobuf-javascript/releases/latest). For convenience, you can put both of these binaries in `./bin`.

Once installed, the protobuf can be generated by running `./bin/generate-proto`.

However there is one very important thing to remember! The default output includes this near the top:

```
var global = (function() { return this || window || global || self || Function('return this')(); }).call(null);
```

This will not work with our CSP directives. You must manually modify this to this:

```
var global = globalThis;
```
