diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000000000000000000000000000000000000..80a1d35495c7f69b78a8418f3bbdcf8d7c729269 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,59 @@ +// Copyright © 2020, Concordant and contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +plugins { + kotlin("multiplatform") version "1.3.72" +} + +repositories { + jcenter() + mavenCentral() +} + +kotlin { + + jvm() { + } + + js("nodeJs") { + nodejs {} + } + + sourceSets { + + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib")) + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + } + } + + val jvmMain by getting { + dependencies { + implementation(kotlin("stdlib-jdk8")) + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + } + } + + val nodeJsMain by getting { + dependencies { + implementation(kotlin("stdlib-js")) + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + } + } + } +} diff --git a/libs/c-crdtlib.jar b/libs/c-crdtlib.jar new file mode 100644 index 0000000000000000000000000000000000000000..a3f0bd99ee1a1b3de27679e38394472da65f0802 Binary files /dev/null and b/libs/c-crdtlib.jar differ diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000000000000000000000000000000000000..1b9fead8ceb0d59da42944f04a468728e40176f5 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +// Copyright © 2020, Concordant and contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +rootProject.name = "c-client" diff --git a/src/commonMain/kotlin/client/CObject.kt b/src/commonMain/kotlin/client/CObject.kt new file mode 100644 index 0000000000000000000000000000000000000000..192b94e28f76aef967e894b9dc86f152abb310b8 --- /dev/null +++ b/src/commonMain/kotlin/client/CObject.kt @@ -0,0 +1,59 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client + +import client.utils.ActiveSession +import client.utils.CObjectUId + +class CObject<T> { + + /** + * Concordant object unique id + */ + private val id: CObjectUId + + /** + * Is openned in read only mode + */ + private val readOnly: Boolean + + constructor(oid: CObjectUId, readOnly: Boolean) { + this.id = oid + this.readOnly = readOnly + } + + fun update() { + if (this.readOnly) throw RuntimeException("CObject has been opened in read-only mode.") + + // 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) + } + + fun getter(): Any { + val crdt = CService.getObject<T>(this.id) + return 1 // crdt.getter() + } + + fun close() { + } +} diff --git a/src/commonMain/kotlin/client/CService.kt b/src/commonMain/kotlin/client/CService.kt new file mode 100644 index 0000000000000000000000000000000000000000..12cee746fc1ae8b50ba6da9a70e2b1e66d60f8c5 --- /dev/null +++ b/src/commonMain/kotlin/client/CService.kt @@ -0,0 +1,44 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client + +import client.utils.CObjectUId +import crdtlib.crdt.DeltaCRDT +import crdtlib.utils.ClientUId + +class CService { + + companion object { + + fun connect(dbName: String, cid: ClientUId): Boolean { + return true + } + + fun <T> getObject(oid: CObjectUId): DeltaCRDT<T>? { + return null + } + + fun <T> pushObject(oid: CObjectUId, crdt: DeltaCRDT<T>) { + } + + fun close(cid: ClientUId) { + } + } +} diff --git a/src/commonMain/kotlin/client/Collection.kt b/src/commonMain/kotlin/client/Collection.kt new file mode 100644 index 0000000000000000000000000000000000000000..98a82df5e8fc3e1bda86e50f241a6f401b5647a3 --- /dev/null +++ b/src/commonMain/kotlin/client/Collection.kt @@ -0,0 +1,54 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client + +import client.utils.CObjectUId +import client.utils.CollectionUId +import client.utils.NotificationHandler + +class Collection { + + /** + * The collection unique id + */ + private val id: CollectionUId + + /** + * Is the collection open in read only mode + */ + private val readOnly: Boolean + + constructor(cid: CollectionUId, readOnly: Boolean) { + this.id = cid + this.readOnly = readOnly + } + + // c_open_read|write<T> + fun <T> open(oid: String, readOnly: Boolean, handler: NotificationHandler): 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) + } + + // c_close_collection + fun close() { + } +} diff --git a/src/commonMain/kotlin/client/Session.kt b/src/commonMain/kotlin/client/Session.kt new file mode 100644 index 0000000000000000000000000000000000000000..52b549c2480155b203bd041cbcd5f353cae05c9c --- /dev/null +++ b/src/commonMain/kotlin/client/Session.kt @@ -0,0 +1,76 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +package client + +import client.utils.ActiveSession +import client.utils.CollectionUId +import client.utils.ConsistencyLevel +import crdtlib.utils.ClientUId +import crdtlib.utils.SimpleEnvironment +import crdtlib.utils.VersionVector + +class Session { + + /** + * The client unique id + */ + private val clientUId: ClientUId + + /** + * The environment linked to the session + */ + private val environment: SimpleEnvironment + + private constructor(cid: ClientUId) { + this.clientUId = cid + this.environment = SimpleEnvironment(this.clientUId) + } + + // c_pull_XX_view + fun pull(type: ConsistencyLevel) { + } + + // c_pull_XX_view(v) + fun pull(type: ConsistencyLevel, vv: VersionVector) { + } + + // c_open_collection_read|write + fun openCollection(cid: CollectionUId, readOnly: Boolean): Collection { + return Collection(cid, readOnly) + } + + // c_end_session + fun close() { + CService.close(this.clientUId) + ActiveSession = null + } + + companion object { + // c_begin_session + fun connect(dbName: String, credentials: String): Session { + val clientUId = UUID() + if (!CService.connect(dbName, clientUId)) throw RuntimeException("Connection to server failed.") + val session = Session(clientUId) + ActiveSession = session + return session + } + } +} diff --git a/src/commonMain/kotlin/client/utils/CObjectUId.kt b/src/commonMain/kotlin/client/utils/CObjectUId.kt new file mode 100644 index 0000000000000000000000000000000000000000..88d253abf8f93ceaf60446cc0ab19c0b32ce4240 --- /dev/null +++ b/src/commonMain/kotlin/client/utils/CObjectUId.kt @@ -0,0 +1,25 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client.utils + +/** +* Concordant object unique identifiers +*/ +data class CObjectUId(val cid: CollectionUId, val name: String, val type: Type) diff --git a/src/commonMain/kotlin/client/utils/CollectionUId.kt b/src/commonMain/kotlin/client/utils/CollectionUId.kt new file mode 100644 index 0000000000000000000000000000000000000000..2d266f395b1fede44e52d4c27b503d18da9614f0 --- /dev/null +++ b/src/commonMain/kotlin/client/utils/CollectionUId.kt @@ -0,0 +1,26 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + + +package client.utils + +/** +* Collection unique identifiers +*/ +typealias CollectionUId = String diff --git a/src/commonMain/kotlin/client/utils/ConsistencyLevel.kt b/src/commonMain/kotlin/client/utils/ConsistencyLevel.kt new file mode 100644 index 0000000000000000000000000000000000000000..3decd745fd3eb142c039f0350a12bb44c7754e61 --- /dev/null +++ b/src/commonMain/kotlin/client/utils/ConsistencyLevel.kt @@ -0,0 +1,30 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client.utils + +/** +* Different types of consistency level provided by the Concordant platform +*/ +enum class ConsistencyLevel { + + RC, + Snapshot, + Strong +} diff --git a/src/commonMain/kotlin/client/utils/Globals.kt b/src/commonMain/kotlin/client/utils/Globals.kt new file mode 100644 index 0000000000000000000000000000000000000000..c1f3ea3c01dfa8bff84eb1affae09f3485ce6d9b --- /dev/null +++ b/src/commonMain/kotlin/client/utils/Globals.kt @@ -0,0 +1,27 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client.utils + +import client.Session + +/** +* Global variable(s) +*/ +var ActiveSession: Session? = null diff --git a/src/commonMain/kotlin/client/utils/NotificationHandler.kt b/src/commonMain/kotlin/client/utils/NotificationHandler.kt new file mode 100644 index 0000000000000000000000000000000000000000..bdd03a8c7851a18814be65455dd64834dd2659a7 --- /dev/null +++ b/src/commonMain/kotlin/client/utils/NotificationHandler.kt @@ -0,0 +1,27 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client.utils + +import crdtlib.utils.VersionVector + +/** +* The notification handler (function) type accepted for c-objects +*/ +typealias NotificationHandler = (VersionVector, CObjectUId) -> Unit diff --git a/src/commonMain/kotlin/client/utils/OperationUId.kt b/src/commonMain/kotlin/client/utils/OperationUId.kt new file mode 100644 index 0000000000000000000000000000000000000000..997b6a66f7340f0448c82da5a838f56351797b55 --- /dev/null +++ b/src/commonMain/kotlin/client/utils/OperationUId.kt @@ -0,0 +1,27 @@ +/* +* Copyright © 2020, Concordant and contributors. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +* associated documentation files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, publish, distribute, +* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package client.utils + +import crdtlib.utils.Timestamp + +/** +* Operations unique identifiers +*/ +typealias OperationUId = Timestamp