Skip to content

Instantly share code, notes, and snippets.

@folex
Created July 14, 2021 11:48
Show Gist options
  • Save folex/06eb754fb6198057c96af12191dfd52e to your computer and use it in GitHub Desktop.
Save folex/06eb754fb6198057c96af12191dfd52e to your computer and use it in GitHub Desktop.
Aqua DHT record retrieval bug
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
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