High-level dht api (#11)

* dht api

* add branch to ci to test release

* add some comments

* add aqua-lib dependency

* par in onProviders

* release!

* delete release branch

* Tiny changes

Co-authored-by: dmitry <dmitry@fluence.one>
This commit is contained in:
Dima 2021-06-04 11:37:17 +03:00 committed by GitHub
parent a621c64a86
commit fe5dcd46c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 165 additions and 4 deletions

2
.gitignore vendored
View File

@ -13,3 +13,5 @@ Cargo.lock
# Added by cargo
/target
.idea

2
npm/.gitignore vendored
View File

@ -1 +1,3 @@
*.tgz
node_modules
target

86
npm/dht-api.aqua Normal file
View File

@ -0,0 +1,86 @@
import "dht.aqua"
import "@fluencelabs/aqua-lib/builtin.aqua"
-- get neighbors in Kademlia network
func getNeighbours(key: string, node_id: string) -> []PeerId:
on node_id:
k <- Op.string_to_b58(key)
nodes <- Kademlia.neighborhood(k, false)
<- nodes
func clearHostValue(key: string, node_id: string):
nodes <- getNeighbours(key, node_id)
for n <- nodes par:
on n:
try:
t <- Peer.timestamp_sec()
AquaDHT.clear_host_value(key, t)
func registerKey(node_id: string, key: string) -> []string:
nodes <- getNeighbours(key, node_id)
for n <- nodes par:
on n:
try:
t <- Peer.timestamp_sec()
AquaDHT.register_key(key, t, true, 0)
<- nodes
func registerKeyPutValue(node_id: string, key: string, value: string, relay_id: ?string, service_id: ?string) -> []string:
nodes <- getNeighbours(key, node_id)
on node_id:
for n <- nodes par:
on n:
try:
t <- Peer.timestamp_sec()
AquaDHT.register_key(key, t, false, 0)
AquaDHT.put_value(key, value, t, relay_id, service_id, 0)
<- nodes
func registerKeyPutHostValue(node_id: string, key: string, value: string, service_id: ?string):
on node_id:
t <- Peer.timestamp_sec()
AquaDHT.register_key(key, t, false, 0)
nil: ?string
AquaDHT.put_host_value(key, value, t, nil, service_id, 0)
-- get all neighbors around the key in Kademlia network and store a value into them
-- relay_id is for finding a route to the owner of the value
func putValue(node_id: string, key: string, value: string, relay_id: ?string, service_id: ?string) -> []string:
nodes <- getNeighbours(key, node_id)
for n <- nodes par:
on n:
try:
t <- Peer.timestamp_sec()
AquaDHT.put_value(key, value, t, relay_id, service_id, 0)
<- nodes
-- put a value on behalf of node_id (ie owner of the record will be node_id)
func putHostValue(node_id: string, key: string, value: string, service_id: ?string):
on node_id:
nil: ?string
t <- Peer.timestamp_sec()
AquaDHT.put_host_value(key, value, t, nil, service_id, 0)
func getValues(node_id: string, key: string) -> []Record:
on node_id:
k <- Op.string_to_b58(key)
nodes <- Kademlia.neighborhood(k, false)
res: *GetValuesResult
for n <- nodes par:
on n:
try:
t <- Peer.timestamp_sec()
res <- AquaDHT.get_values(key, t)
v <- AquaDHT.merge_two(res!.result, res!1.result)
<- v.result
-- get records by key and call the callback on their owners
func onProviders(node_id: string, key: string, callback: Record -> ()):
on node_id:
k <- Op.string_to_b58(key)
t <- Peer.timestamp_sec()
res <- AquaDHT.get_values(key, t)
for r <- res.result par:
on r.peer_id via r.relay_id:
callback(r)

View File

@ -0,0 +1,19 @@
import "dht.aqua"
import "@fluencelabs/aqua-lib/builtin.aqua"
-- clears expired records
func clearExpired():
t <- Peer.timestamp_sec()
AquaDHT.clear_expired(t)
-- get all old records and replicate it by keys
func replicate():
t <- Peer.timestamp_sec()
res <- AquaDHT.evict_stale(t)
for r <- res.results par:
k <- Op.string_to_b58(r.key.key)
nodes <- Kademlia.neighborhood(k, false)
for n <- nodes par:
on n:
AquaDHT.republish_key(r.key, t)
AquaDHT.republish_values(r.key.key, r.records, t)

View File

@ -0,0 +1 @@
-- this file will be generated automatically

43
npm/package-lock.json generated
View File

@ -1,5 +1,46 @@
{
"name": "@fluencelabs/aqua-dht",
"version": "0.1.0",
"lockfileVersion": 1
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@fluencelabs/aqua-dht",
"version": "0.1.0",
"license": "MIT",
"dependencies": {
"@fluencelabs/aqua-lib": "^0.1.5"
},
"devDependencies": {
"@fluencelabs/aqua-cli": "^0.1.4-136"
}
},
"node_modules/@fluencelabs/aqua-cli": {
"version": "0.1.4-136",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.4-136.tgz",
"integrity": "sha512-hvoS+Mc5xOlyWV2i7tCvnABSuSifoKQehoepaREerUhRvymAFwg7nOSc9HPtLY9Ou0j3H3TWhRgTI27+4wZrlA==",
"dev": true,
"bin": {
"aqua-cli": "index.js"
}
},
"node_modules/@fluencelabs/aqua-lib": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.1.5.tgz",
"integrity": "sha512-0f5Lo9NT4ZvN+S/oGYiNxLUtpZsTfDy2qL0D4SFPVoj2+YPPK2PKSzZnja2clfM1KHHP6kT6Jd20sHVBIxBMtw=="
}
},
"dependencies": {
"@fluencelabs/aqua-cli": {
"version": "0.1.4-136",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-cli/-/aqua-cli-0.1.4-136.tgz",
"integrity": "sha512-hvoS+Mc5xOlyWV2i7tCvnABSuSifoKQehoepaREerUhRvymAFwg7nOSc9HPtLY9Ou0j3H3TWhRgTI27+4wZrlA==",
"dev": true
},
"@fluencelabs/aqua-lib": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-lib/-/aqua-lib-0.1.5.tgz",
"integrity": "sha512-0f5Lo9NT4ZvN+S/oGYiNxLUtpZsTfDy2qL0D4SFPVoj2+YPPK2PKSzZnja2clfM1KHHP6kT6Jd20sHVBIxBMtw=="
}
}
}

View File

@ -3,9 +3,16 @@
"version": "0.1.0",
"description": "Aqua DHT library",
"files": [
"dht.aqua"
"dht.aqua",
"dht-api.aqua",
"dht-scheduled-scripts"
],
"scripts": {},
"dependencies": {
"@fluencelabs/aqua-lib": "^0.1.5"
},
"scripts": {
"compile-aqua": "aqua-cli -i . -o ./target"
},
"repository": {
"type": "git",
"url": "git+https://github.com/fluencelabs/aqua-dht.git"
@ -19,5 +26,8 @@
"bugs": {
"url": "https://github.com/fluencelabs/aqua-dht/issues"
},
"homepage": "https://github.com/fluencelabs/aqua-dht#readme"
"homepage": "https://github.com/fluencelabs/aqua-dht#readme",
"devDependencies": {
"@fluencelabs/aqua-cli": "^0.1.4-136"
}
}