Giter VIP home page Giter VIP logo

datsync's People

Contributors

bamarco avatar charles-dyfis-net avatar metasoarous avatar pepe avatar podviaznikov avatar remaininlight avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

datsync's Issues

Scoping, filtering, security

Experimenting with doing something similar to the datsys architecture, but am having trouble working through some of the security concerns managing a datascript <-> datomic connection.

I did read this, but I don't feel like it answers all the questions. What are your thoughts on doing access control, permissions, etc. at both the write and read level? In other words, how do we prevent one client from executing a transaction they shouldn't, and how do we effectively scope responses being sent back down based of a query or as a reaction to a transaction?

Remote (central) eid tracking broken?

It's possible there's a bug somewhere in consumer code, but this should be pretty automated by now. I'm seeing entities from Datomic that don't have :dat.sync.remote.db/id attributes in DataScript client side. Need to look at things in greater detail.

Figure out why bootstrap is so slow

Right now bootstrap with a pretty bare bones database (schema + a few todo items) takes like 10 second on a laptop and 20 on a good phone. I wasn't particularly careful in how I did things, so going through the processing pipeline on the client should reveal some smoking guns.

Take out :dat.sync.remote.db/id client side stuff

Was originally thinking it might not hurt to leave it in (in spite of new global identity/lookup based approach), but realizing it confuses things for P2P.

Some users have seen some bugs as a result of this (they are using identity for client -> server, but obviously not server -> client since that hasn't been generalized yet). So perhaps in the short term, we could fix this problem for them by making sure we don't send :dat.sync.remote.db/id to the server with the globalize-datoms function, just as we did with the old apply-remote-tx! function.

Runaway condition causes infinite round-trip

There is a runaway condition in Datsync. It seems as if transacting the :txInstant is sent to the other side to be transacted which causes a round-trip.

This occurs after I implemented a handler for the key :dat.sync.client.bootstrap/complete?. This caused an error on the client side and stopped the round trip.

Here is an excerpt of the JS log:

core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871186}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871187}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871188}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871189}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871190}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
utils.cljs?rel=1479751156161:49 Figwheel: notified of file changes
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {-1001849 1853, :db/current-tx 536871191}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ([-1853 :db/txInstant #inst "2016-12-08T21:20:13.410-00:00" 536871191 true] [-1853 :dat.sync.remote.db/id 13194139537180 536871191 true])
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {-1001850 1854, :db/current-tx 536871192}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ([-1854 :db/txInstant #inst "2016-12-08T21:20:13.446-00:00" 536871192 true] [-1854 :dat.sync.remote.db/id 13194139537181 536871192 true])
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {-1001851 1855, :db/current-tx 536871193}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ([-1855 :db/txInstant #inst "2016-12-08T21:20:13.484-00:00" 536871193 true] [-1855 :dat.sync.remote.db/id 13194139537182 536871193 true])
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871194}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871195}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:584] - Calling globalize datoms
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:38] - Tx report tempids: {:db/current-tx 536871196}
core.cljs?rel=1479751134668:143 INFO [com.elumindata.optiq.persistence.sync:39] - Sending local tx datoms to server as tx: ()
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.tx/error
core.cljs?rel=1479751134668:143 ERROR [dat.reactor:228] - No definition for event: [:dat.sync.tx/error {:tx.error/message "java.lang.IllegalArgumentException: :db.error/not-an-entity Unable to resolve entity: :dat.sync.remote.db/id", :tx/data ([-1809 :db/txInstant #inst "2016-12-08T21:20:10.752-00:00" 536871059 true] [-1809 :dat.sync.remote.db/id 13194139537136 536871059 true]), :tx/error {:db/error :db.error/not-an-entity}}] You should probably go add one in your events ns
core.cljs?rel=1479751134668:143 DEBUG [dat.remote.impl.sente:85] - Sente message recieved: :chsk/recv
core.cljs?rel=1479751134668:143 INFO [dat.remote.impl.sente:115] - :chsk/recv for event-id: :dat.sync.client/recv-remote-tx
core.cljs?rel=1479751134668:143 INFO [dat.sync.client:708] - Running remote-tx in :dat.sync/recv-remote-tx.
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:394] - Calling translate-eids
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:410] - n local eids w remote 0
core.cljs?rel=1479751134668:143 DEBUG [dat.sync.client:411] - n local eids w/o remote 1
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:192] - Handler :dat.reactor/local-tx called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:187] - Handler :dat.reactor/resolve-tx-report called.
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:127] - Adding effects for effect-ids: (:dat.reactor/execute-tx-report-handlers!)
core.cljs?rel=1479751134668:143 DEBUG [dat.reactor:204] - Effect handler :dat.reactor/fire-tx-report-handlers! called.

Generalize transaction listeners for tx-report -> remote notifications

In line with #13, we'll have to generalize the ability to add transaction listeners to both Datomic and DataScript, such that tx-report datoms get translated and sent out to all subscribed remotes. This starts to beg the question of how those subscriptions are (generally speaking) managed (see #10), and how we apply authorization and scoping filters in this setting. We should have at the very least a clear vision of what these filters look like writ large before committing to the listener functions, so we don't dev ourselves into a corner.

Handle tx-reports with idents

Having some issues where tx reports of datoms with idents instead of eids leads to an inability to translate server side. Should more explicitly handle this scenario as part of the work for #5.

Decentralize/isomorphize API (+ P2P, etc)

In some recent work getting local first (true sync; optimistic update; offline write availability, etc) working on clients (see commits 0fc7139, 25c93e1 and 4c75956), we've realized that using centralized Datomic eids via :dat.sync.remote.db/id on the client is an absolute mess of state maintenance. Everything ends up being much simpler if we just assume there are :db.unique/identity attributes we can use for asserting global identity between entities. As a bonus, this opens up the opportunity for us to use the same datom/tx translation mechanisms on the client and server, and thus eliminate the need for distinctions between client/server (everything is a remote, no matter where you are). This can potentially lead to a single dat.sync namespace with generalized translation functions. It will, however, involve creating some abstractions for letting us seamlessly handle DataScript vs Datomic. These may end up being generally handy as part of the public API as well.

Note that this connects with #12, as once we're fully utilizing lookup refs from identity attributes in our translations, there's no need to keep :dat.sync.remote.db/id any longer, and in fact, doing so makes it harder to get true P2P functionality.

Docs: Data examples to show full flow from client->server and server->client

Nice to see the new README with API docs.

Next improvement would be to see examples of how a real transaction from client would be sent to server and applied and how it would look in reverse (server-> client).
Perhaps with a simple Todo model.

Also needs example of how common concurrency issues are resolved (optimistic commit/merge?). Cheers :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.