Created
July 14, 2021 11:48
-
-
Save folex/06eb754fb6198057c96af12191dfd52e to your computer and use it in GitHub Desktop.
Aqua DHT record retrieval bug
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import "dht.aqua" | |
import "@fluencelabs/aqua-lib/builtin.aqua" | |
service RecordOp("op"): | |
identity(records: []Record) -> []Record | |
func get_result(values_result: GetValuesResult) -> []Record: | |
records <- RecordOp.identity(values_result.result) | |
<- records | |
func append_records(peer: string, stream: *[]Record): | |
on peer: | |
values_result <- AquaDHT.get_values(peer, 0) | |
if values_result.success: | |
stream <- get_result(values_result) | |
func retrieve_records(client_peer: string) -> [][]Record: | |
records: *[]Record | |
append_records(client_peer, records) | |
<- records |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export async function retrieve_records(client: FluenceClient, client_peer: string, config?: {ttl?: number}): Promise<{peer_id:string;relay_id:string[];service_id:string[];set_by:string;timestamp_created:number;value:string;weight:number}[][]> { | |
let request: RequestFlow; | |
const promise = new Promise<{peer_id:string;relay_id:string[];service_id:string[];set_by:string;timestamp_created:number;value:string;weight:number}[][]>((resolve, reject) => { | |
const r = new RequestFlowBuilder() | |
.disableInjections() | |
.withRawScript( | |
` | |
(xor | |
(seq | |
(seq | |
(seq | |
(seq | |
(seq | |
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) | |
(call %init_peer_id% ("getDataSrv" "client_peer") [] client_peer) | |
) | |
(call -relay- ("op" "noop") []) | |
) | |
(xor | |
(seq | |
(call client_peer ("aqua-dht" "get_values") [client_peer 0] values_result) | |
(xor | |
(match values_result.$.success! true | |
(xor | |
(call client_peer ("op" "identity") [values_result.$.result!] records) | |
(seq | |
(call -relay- ("op" "noop") []) | |
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) | |
) | |
) | |
) | |
(null) | |
) | |
) | |
(seq | |
(call -relay- ("op" "noop") []) | |
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) | |
) | |
) | |
) | |
(call -relay- ("op" "noop") []) | |
) | |
(xor | |
(call %init_peer_id% ("callbackSrv" "response") [$records]) | |
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) | |
) | |
) | |
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) | |
) | |
`, | |
) | |
.configHandler((h) => { | |
h.on('getDataSrv', '-relay-', () => { | |
return client.relayPeerId!; | |
}); | |
h.on('getDataSrv', 'client_peer', () => {return client_peer;}); | |
h.onEvent('callbackSrv', 'response', (args) => { | |
const [res] = args; | |
resolve(res); | |
}); | |
h.onEvent('errorHandlingSrv', 'error', (args) => { | |
// assuming error is the single argument | |
const [err] = args; | |
reject(err); | |
}); | |
}) | |
.handleScriptError(reject) | |
.handleTimeout(() => { | |
reject('Request timed out for retrieve_records'); | |
}) | |
if(config?.ttl) { | |
r.withTTL(config.ttl) | |
} | |
request = r.build(); | |
}); | |
await client.initiateFlow(request!); | |
return promise; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment