diff --git a/libs/c-crdtlib.jar b/libs/c-crdtlib-jvm.jar similarity index 100% rename from libs/c-crdtlib.jar rename to libs/c-crdtlib-jvm.jar diff --git a/libs/c-crdtlib-metadata.jar b/libs/c-crdtlib-metadata.jar new file mode 100644 index 0000000000000000000000000000000000000000..10814ec686c51f93da06bfd5d070da59f0be75d2 Binary files /dev/null and b/libs/c-crdtlib-metadata.jar differ diff --git a/libs/c-crdtlib-nodejs.jar b/libs/c-crdtlib-nodejs.jar new file mode 100644 index 0000000000000000000000000000000000000000..c0171c7ad27b92ae205cca0eeebd7f045cd0e182 Binary files /dev/null and b/libs/c-crdtlib-nodejs.jar differ diff --git a/src/commonMain/kotlin/client/CObject.kt b/src/commonMain/kotlin/client/CObject.kt index 192b94e28f76aef967e894b9dc86f152abb310b8..cf51f21a4b5fdf4b043d9d5782a929c31d8f9199 100644 --- a/src/commonMain/kotlin/client/CObject.kt +++ b/src/commonMain/kotlin/client/CObject.kt @@ -21,37 +21,47 @@ package client import client.utils.ActiveSession import client.utils.CObjectUId +import client.utils.OperationUId +import crdtlib.crdt.DeltaCRDT -class CObject<T> { +open class CObject<T> { /** * Concordant object unique id */ - private val id: CObjectUId + private val id: CObjectUId<T> /** * Is openned in read only mode */ private val readOnly: Boolean - constructor(oid: CObjectUId, readOnly: Boolean) { + /** + * The encapsulated CRDT + */ + protected var crdt: DeltaCRDT<T>? = null + + constructor(oid: CObjectUId<T>, readOnly: Boolean) { this.id = oid this.readOnly = readOnly } - fun update() { + protected fun beforeUpdate(): OperationUId { if (this.readOnly) throw RuntimeException("CObject has been opened in read-only mode.") + if (ActiveSession == null) RuntimeException("Not active session.") + this.crdt = CService.getObject<T>(this.id) + return (ActiveSession as Session).environment.tick() + } + + protected fun afterUpdate() { + CService.pushObject<T>(this.id, this.crdt) + } - // Should be integrated to CRDTs - val crdt = CService.getObject<T>(this.id) - val ts = ActiveSession.environment.tick() - // crdt.update(ts) - CService.pushObject<T>(this.id, crdt) + protected fun beforeGetter() { + this.crdt = CService.getObject<T>(this.id) } - fun getter(): Any { - val crdt = CService.getObject<T>(this.id) - return 1 // crdt.getter() + protected fun afterGetter() { } fun close() { diff --git a/src/commonMain/kotlin/client/CService.kt b/src/commonMain/kotlin/client/CService.kt index 12cee746fc1ae8b50ba6da9a70e2b1e66d60f8c5..74da7035a91c82b8b0fe13b3ff8f3171f21ce8e0 100644 --- a/src/commonMain/kotlin/client/CService.kt +++ b/src/commonMain/kotlin/client/CService.kt @@ -31,11 +31,11 @@ class CService { return true } - fun <T> getObject(oid: CObjectUId): DeltaCRDT<T>? { + fun <T> getObject(oid: CObjectUId<T>): DeltaCRDT<T>? { return null } - fun <T> pushObject(oid: CObjectUId, crdt: DeltaCRDT<T>) { + fun <T> pushObject(oid: CObjectUId<T>, crdt: DeltaCRDT<T>?) { } fun close(cid: ClientUId) { diff --git a/src/commonMain/kotlin/client/Collection.kt b/src/commonMain/kotlin/client/Collection.kt index 98a82df5e8fc3e1bda86e50f241a6f401b5647a3..997e331cae7fd2398caa9aacdf352b0ae82e94db 100644 --- a/src/commonMain/kotlin/client/Collection.kt +++ b/src/commonMain/kotlin/client/Collection.kt @@ -41,11 +41,11 @@ class Collection { } // c_open_read|write<T> - fun <T> open(oid: String, readOnly: Boolean, handler: NotificationHandler): T { + fun <T> open(oid: String, readOnly: Boolean, handler: NotificationHandler<T>): T { if (this.readOnly && !readOnly) throw RuntimeException("Collection has been opened in read-only mode.") - val oid = CObjectUId<T>(this.id, oid, T) - return CObject<T>(oid, readOnly) + val oid = CObjectUId<T>(this.id, oid) + return CObject<T>(oid, readOnly) as T } // c_close_collection diff --git a/src/commonMain/kotlin/client/Session.kt b/src/commonMain/kotlin/client/Session.kt index 52b549c2480155b203bd041cbcd5f353cae05c9c..46343f14c7e1d08e9839bfe80fbfd5a7ac09a4f8 100644 --- a/src/commonMain/kotlin/client/Session.kt +++ b/src/commonMain/kotlin/client/Session.kt @@ -37,7 +37,7 @@ class Session { /** * The environment linked to the session */ - private val environment: SimpleEnvironment + public val environment: SimpleEnvironment private constructor(cid: ClientUId) { this.clientUId = cid @@ -66,7 +66,7 @@ class Session { companion object { // c_begin_session fun connect(dbName: String, credentials: String): Session { - val clientUId = UUID() + val clientUId = ClientUId("MY_ID") if (!CService.connect(dbName, clientUId)) throw RuntimeException("Connection to server failed.") val session = Session(clientUId) ActiveSession = session diff --git a/src/commonMain/kotlin/client/utils/CObjectUId.kt b/src/commonMain/kotlin/client/utils/CObjectUId.kt index 88d253abf8f93ceaf60446cc0ab19c0b32ce4240..4deadbc592c2d6ee442bcb2d18e36caa4c918576 100644 --- a/src/commonMain/kotlin/client/utils/CObjectUId.kt +++ b/src/commonMain/kotlin/client/utils/CObjectUId.kt @@ -22,4 +22,4 @@ package client.utils /** * Concordant object unique identifiers */ -data class CObjectUId(val cid: CollectionUId, val name: String, val type: Type) +data class CObjectUId<T>(val cid: CollectionUId, val name: String) diff --git a/src/commonMain/kotlin/client/utils/NotificationHandler.kt b/src/commonMain/kotlin/client/utils/NotificationHandler.kt index bdd03a8c7851a18814be65455dd64834dd2659a7..152f93e8b78df74c2dfde996e411a697a4c0a2ce 100644 --- a/src/commonMain/kotlin/client/utils/NotificationHandler.kt +++ b/src/commonMain/kotlin/client/utils/NotificationHandler.kt @@ -24,4 +24,4 @@ import crdtlib.utils.VersionVector /** * The notification handler (function) type accepted for c-objects */ -typealias NotificationHandler = (VersionVector, CObjectUId) -> Unit +typealias NotificationHandler<T> = (VersionVector, CObjectUId<T>) -> Unit