using async branch version of fluence-js

This commit is contained in:
Pavel Murygin 2021-10-06 15:41:31 +03:00
parent dbaab5b9b4
commit 4cd2b7d75b
4 changed files with 721 additions and 6 deletions

View File

@ -17,7 +17,7 @@
"typescript": "^4.4.2"
},
"dependencies": {
"@fluencelabs/fluence": "0.13.0",
"@fluencelabs/fluence": "0.10.4-async-454.0",
"@fluencelabs/fluence-network-environment": "1.0.10",
"@types/sqlite3": "^3.1.7",
"ethers": "^5.4.7",

713
src/_aqua/snapshot.ts Normal file
View File

@ -0,0 +1,713 @@
/**
*
* This file is auto-generated. Do not edit manually: changes may be erased.
* Generated by Aqua compiler: https://github.com/fluencelabs/aqua/.
* If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues
* Aqua version: 0.3.1-231
*
*/
import { Fluence, FluencePeer } from "@fluencelabs/fluence";
import {
ResultCodes,
RequestFlow,
RequestFlowBuilder,
CallParams,
} from "@fluencelabs/fluence/dist/internal/compilerSupport/v1";
function missingFields(obj: any, fields: string[]): string[] {
return fields.filter((f) => !(f in obj));
}
// Services
export interface ProVoValidationDef {
eip712_validation_string: (
eip_str: string,
peer_id: string,
callParams: CallParams<"eip_str" | "peer_id">
) => string | Promise<string>;
eip712_validation_url: (
eip_str: string,
peer_id: string,
callParams: CallParams<"eip_str" | "peer_id">
) => string | Promise<string>;
}
export function registerProVoValidation(service: ProVoValidationDef): void;
export function registerProVoValidation(
serviceId: string,
service: ProVoValidationDef
): void;
export function registerProVoValidation(
peer: FluencePeer,
service: ProVoValidationDef
): void;
export function registerProVoValidation(
peer: FluencePeer,
serviceId: string,
service: ProVoValidationDef
): void;
export function registerProVoValidation(...args: any) {
let peer: FluencePeer;
let serviceId: any;
let service: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
} else {
peer = Fluence.getPeer();
}
if (typeof args[0] === "string") {
serviceId = args[0];
} else if (typeof args[1] === "string") {
serviceId = args[1];
} else {
serviceId = "eip_validation";
}
// Figuring out which overload is the await service.
// If the first argument is not Fluence Peer and it is an object, then it can only be the service def
// If the first argument is peer, we are checking further. The second argument might either be
// an object, that it must be the service object
// or a string, which is the service id. In that case the service is the third argument
if (!FluencePeer.isInstance(args[0]) && typeof args[0] === "object") {
service = args[0];
} else if (typeof args[1] === "object") {
service = args[1];
} else {
service = args[2];
}
const incorrectServiceDefinitions = missingFields(service, [
"eip712_validation_string",
"eip712_validation_url",
]);
if (!!incorrectServiceDefinitions.length) {
throw new Error(
"Error registering service ProVoValidation: missing functions: " +
incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", ")
);
}
peer.internals.callServiceHandler.use(async (req, resp, next) => {
if (req.serviceId !== serviceId) {
await next();
return;
}
if (req.fnName === "eip712_validation_string") {
const callParams = {
...req.particleContext,
tetraplets: {
eip_str: req.tetraplets[0],
peer_id: req.tetraplets[1],
},
};
resp.retCode = ResultCodes.success;
resp.result = await service.eip712_validation_string(
req.args[0],
req.args[1],
callParams
);
}
if (req.fnName === "eip712_validation_url") {
const callParams = {
...req.particleContext,
tetraplets: {
eip_str: req.tetraplets[0],
peer_id: req.tetraplets[1],
},
};
resp.retCode = ResultCodes.success;
resp.result = await service.eip712_validation_url(
req.args[0],
req.args[1],
callParams
);
}
await next();
});
}
export interface DataProviderDef {
get_record: (
snapshot_id: number,
callParams: CallParams<"snapshot_id">
) => { snapshot_id: number };
get_records: (callParams: CallParams<null>) => { snapshot_id: number }[];
}
export function registerDataProvider(service: DataProviderDef): void;
export function registerDataProvider(
serviceId: string,
service: DataProviderDef
): void;
export function registerDataProvider(
peer: FluencePeer,
service: DataProviderDef
): void;
export function registerDataProvider(
peer: FluencePeer,
serviceId: string,
service: DataProviderDef
): void;
export function registerDataProvider(...args: any) {
let peer: FluencePeer;
let serviceId: any;
let service: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
} else {
peer = Fluence.getPeer();
}
if (typeof args[0] === "string") {
serviceId = args[0];
} else if (typeof args[1] === "string") {
serviceId = args[1];
} else {
serviceId = "";
}
// Figuring out which overload is the await service.
// If the first argument is not Fluence Peer and it is an object, then it can only be the service def
// If the first argument is peer, we are checking further. The second argument might either be
// an object, that it must be the service object
// or a string, which is the service id. In that case the service is the third argument
if (!FluencePeer.isInstance(args[0]) && typeof args[0] === "object") {
service = args[0];
} else if (typeof args[1] === "object") {
service = args[1];
} else {
service = args[2];
}
const incorrectServiceDefinitions = missingFields(service, [
"get_record",
"get_records",
]);
if (!!incorrectServiceDefinitions.length) {
throw new Error(
"Error registering service DataProvider: missing functions: " +
incorrectServiceDefinitions.map((d) => "'" + d + "'").join(", ")
);
}
peer.internals.callServiceHandler.use(async (req, resp, next) => {
if (req.serviceId !== serviceId) {
await next();
return;
}
if (req.fnName === "get_record") {
const callParams = {
...req.particleContext,
tetraplets: {
snapshot_id: req.tetraplets[0],
},
};
resp.retCode = ResultCodes.success;
resp.result = await service.get_record(req.args[0], callParams);
}
if (req.fnName === "get_records") {
const callParams = {
...req.particleContext,
tetraplets: {},
};
resp.retCode = ResultCodes.success;
resp.result = await service.get_records(callParams);
}
await next();
});
}
// Functions
export function validate(
relay: string,
peer_: string,
eip712_json: string,
config?: { ttl?: number }
): Promise<string>;
export function validate(
peer: FluencePeer,
relay: string,
peer_: string,
eip712_json: string,
config?: { ttl?: number }
): Promise<string>;
export function validate(...args: any) {
let peer: FluencePeer;
let relay: any;
let peer_: any;
let eip712_json: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
relay = args[1];
peer_ = args[2];
eip712_json = args[3];
config = args[4];
} else {
peer = Fluence.getPeer();
relay = args[0];
peer_ = args[1];
eip712_json = args[2];
config = args[3];
}
let request: RequestFlow;
const promise = new Promise<string>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "eip712_json") [] eip712_json)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("eip_validation" "eip712_validation_string") [eip712_json peer] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
)
.configHandler((h) => {
h.on("getDataSrv", "-relay-", () => {
return peer.getStatus().relayPeerId;
});
h.on("getDataSrv", "relay", () => {
return relay;
});
h.on("getDataSrv", "peer", () => {
return peer_;
});
h.on("getDataSrv", "eip712_json", () => {
return eip712_json;
});
h.onEvent("callbackSrv", "response", (args) => {
const [res] = args;
resolve(res);
});
h.onEvent("errorHandlingSrv", "error", (args) => {
const [err] = args;
reject(err);
});
})
.handleScriptError(reject)
.handleTimeout(() => {
reject("Request timed out for validate");
});
if (config && config.ttl) {
r.withTTL(config.ttl);
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function validate_from_url(
relay: string,
peer_: string,
eip712_url: string,
config?: { ttl?: number }
): Promise<string>;
export function validate_from_url(
peer: FluencePeer,
relay: string,
peer_: string,
eip712_url: string,
config?: { ttl?: number }
): Promise<string>;
export function validate_from_url(...args: any) {
let peer: FluencePeer;
let relay: any;
let peer_: any;
let eip712_url: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
relay = args[1];
peer_ = args[2];
eip712_url = args[3];
config = args[4];
} else {
peer = Fluence.getPeer();
relay = args[0];
peer_ = args[1];
eip712_url = args[2];
config = args[3];
}
let request: RequestFlow;
const promise = new Promise<string>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "eip712_url") [] eip712_url)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("eip_validation" "eip712_validation_url") [eip712_url peer] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
)
.configHandler((h) => {
h.on("getDataSrv", "-relay-", () => {
return peer.getStatus().relayPeerId;
});
h.on("getDataSrv", "relay", () => {
return relay;
});
h.on("getDataSrv", "peer", () => {
return peer_;
});
h.on("getDataSrv", "eip712_url", () => {
return eip712_url;
});
h.onEvent("callbackSrv", "response", (args) => {
const [res] = args;
resolve(res);
});
h.onEvent("errorHandlingSrv", "error", (args) => {
const [err] = args;
reject(err);
});
})
.handleScriptError(reject)
.handleTimeout(() => {
reject("Request timed out for validate_from_url");
});
if (config && config.ttl) {
r.withTTL(config.ttl);
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function get_record(
relay: string,
peer_: string,
snapshot_id: number,
config?: { ttl?: number }
): Promise<{ snapshot_id: number }>;
export function get_record(
peer: FluencePeer,
relay: string,
peer_: string,
snapshot_id: number,
config?: { ttl?: number }
): Promise<{ snapshot_id: number }>;
export function get_record(...args: any) {
let peer: FluencePeer;
let relay: any;
let peer_: any;
let snapshot_id: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
relay = args[1];
peer_ = args[2];
snapshot_id = args[3];
config = args[4];
} else {
peer = Fluence.getPeer();
relay = args[0];
peer_ = args[1];
snapshot_id = args[2];
config = args[3];
}
let request: RequestFlow;
const promise = new Promise<{ snapshot_id: number }>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call %init_peer_id% ("getDataSrv" "snapshot_id") [] snapshot_id)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("" "get_record") [snapshot_id] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
)
.configHandler((h) => {
h.on("getDataSrv", "-relay-", () => {
return peer.getStatus().relayPeerId;
});
h.on("getDataSrv", "relay", () => {
return relay;
});
h.on("getDataSrv", "peer", () => {
return peer_;
});
h.on("getDataSrv", "snapshot_id", () => {
return snapshot_id;
});
h.onEvent("callbackSrv", "response", (args) => {
const [res] = args;
resolve(res);
});
h.onEvent("errorHandlingSrv", "error", (args) => {
const [err] = args;
reject(err);
});
})
.handleScriptError(reject)
.handleTimeout(() => {
reject("Request timed out for get_record");
});
if (config && config.ttl) {
r.withTTL(config.ttl);
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function get_records(
relay: string,
peer_: string,
config?: { ttl?: number }
): Promise<{ snapshot_id: number }[]>;
export function get_records(
peer: FluencePeer,
relay: string,
peer_: string,
config?: { ttl?: number }
): Promise<{ snapshot_id: number }[]>;
export function get_records(...args: any) {
let peer: FluencePeer;
let relay: any;
let peer_: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
relay = args[1];
peer_ = args[2];
config = args[3];
} else {
peer = Fluence.getPeer();
relay = args[0];
peer_ = args[1];
config = args[2];
}
let request: RequestFlow;
const promise = new Promise<{ snapshot_id: number }[]>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "relay") [] relay)
)
(call %init_peer_id% ("getDataSrv" "peer") [] peer)
)
(call -relay- ("op" "noop") [])
)
(call relay ("op" "noop") [])
)
(xor
(call peer ("" "get_records") [] result)
(seq
(seq
(seq
(call relay ("op" "noop") [])
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(call relay ("op" "noop") [])
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [result])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
`
)
.configHandler((h) => {
h.on("getDataSrv", "-relay-", () => {
return peer.getStatus().relayPeerId;
});
h.on("getDataSrv", "relay", () => {
return relay;
});
h.on("getDataSrv", "peer", () => {
return peer_;
});
h.onEvent("callbackSrv", "response", (args) => {
const [res] = args;
resolve(res);
});
h.onEvent("errorHandlingSrv", "error", (args) => {
const [err] = args;
reject(err);
});
})
.handleScriptError(reject)
.handleTimeout(() => {
reject("Request timed out for get_records");
});
if (config && config.ttl) {
r.withTTL(config.ttl);
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}

View File

@ -38,6 +38,7 @@ function check_signature(eip_obj: any): boolean {
// export async function eip_validation(eip_str: string, peer_id: string): Promise<Response> {
export function eip_validation(eip_str: string, peer_id: string): Response {
console.log("eip_str", eip_str)
const eip_obj = JSON.parse(eip_str);
console.log("eip doc parsed: ", eip_obj);

View File

@ -19,7 +19,7 @@ function sign_response(wallet: ethers.Wallet, response: Response): Promise<strin
}
class EIPValidator implements ProVoValidationDef {
eip712_validation_string(eip712_json: string): string {
async eip712_validation_string(eip712_json: string): Promise<string> {
// todo: need to fix this to use local peer key
const wallet = create_wallet();
let response = eip_validation(eip712_json, wallet.address);
@ -27,7 +27,7 @@ class EIPValidator implements ProVoValidationDef {
const resp_str = JSON.stringify(response);
console.log("eip validation response: ", resp_str);
const signed_response = wallet.signMessage(resp_str);
const signed_response = await wallet.signMessage(resp_str);
console.log("signed response: ", signed_response);
// verify test
@ -39,16 +39,17 @@ class EIPValidator implements ProVoValidationDef {
return JSON.stringify(obj);
}
eip712_validation_url(eip712_url: string): string {
async eip712_validation_url(eip712_url: string): Promise<string> {
const eip_json: any = got('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS').json();
const eip = await got.get('https://ipfs.fleek.co/ipfs/QmWGzSQFm57ohEq2ATw4UNHWmYU2HkMjtedcNLodYywpmS');
const eip_json = eip.body;
// todo: need to fix this to use local peer key
const wallet = create_wallet();
let response = eip_validation(eip_json, wallet.address);
const resp_str = JSON.stringify(response);
const signed_response = wallet.signMessage(resp_str);
const signed_response = await wallet.signMessage(resp_str);
// verify test