@@ -20,17 +20,21 @@ import io.ktor.server.application.ApplicationCall
20
20
import io.ktor.server.application.call
21
21
import io.ktor.server.plugins.origin
22
22
import io.ktor.server.request.receive
23
+ import io.ktor.server.request.receiveStream
23
24
import io.ktor.server.response.respond
24
25
import io.ktor.server.response.respondText
25
26
import io.ktor.server.routing.Route
26
27
import io.ktor.server.routing.get
27
28
import io.ktor.server.routing.post
29
+ import io.ktor.server.routing.put
28
30
import io.ktor.server.routing.route
29
31
import io.ktor.server.routing.routing
30
32
import io.ktor.server.websocket.webSocket
31
33
import io.ktor.util.pipeline.PipelineContext
32
34
import io.ktor.websocket.send
35
+ import kotlinx.coroutines.Dispatchers
33
36
import kotlinx.coroutines.Job
37
+ import kotlinx.coroutines.withContext
34
38
import kotlinx.serialization.encodeToString
35
39
import kotlinx.serialization.json.Json
36
40
import org.modelix.authorization.getUserName
@@ -44,6 +48,7 @@ import org.modelix.model.lazy.CLTree
44
48
import org.modelix.model.lazy.CLVersion
45
49
import org.modelix.model.lazy.RepositoryId
46
50
import org.modelix.model.operations.OTBranch
51
+ import org.modelix.model.persistent.HashUtil
47
52
import org.modelix.model.server.api.v2.VersionDelta
48
53
import org.modelix.model.server.store.IStoreClient
49
54
import org.modelix.model.server.store.LocalModelClient
@@ -211,6 +216,32 @@ class ModelReplicationServer(val repositoriesManager: RepositoriesManager) {
211
216
}
212
217
}
213
218
}
219
+ route(" objects" ) {
220
+ put {
221
+ var writtenEntries = 0
222
+ withContext(Dispatchers .IO ) {
223
+ var isKey = true
224
+ var key = " "
225
+ call.receiveStream().bufferedReader().lineSequence().forEach { line ->
226
+ if (isKey) {
227
+ key = line
228
+ } else {
229
+ val value = line
230
+ require(HashUtil .isSha256(key)) {
231
+ " This API cannot be used to store other entries than serialized objects." +
232
+ " The key is expected to be a SHA256 hash over the value: $key -> $value "
233
+ }
234
+ val expectedKey = HashUtil .sha256(value)
235
+ require(expectedKey == key) { " Hash mismatch. Expected $expectedKey , but $key was provided. Value: $value " }
236
+ storeClient.put(key, value, true )
237
+ writtenEntries++
238
+ }
239
+ isKey = ! isKey
240
+ }
241
+ }
242
+ call.respondText(" $writtenEntries objects received" )
243
+ }
244
+ }
214
245
}
215
246
}
216
247
route(" versions" ) {
0 commit comments