add quickstart 4 examples (#26)

* init quickstart 4

* fix Op indentation

* update packages
This commit is contained in:
boneyard93501
2021-10-12 11:47:57 -05:00
committed by GitHub
parent ad6a72bb92
commit 7795d24f34
22 changed files with 8016 additions and 0 deletions

View File

@ -0,0 +1,565 @@
/**
*
* 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.0-226
*
*/
import { Fluence, FluencePeer } from '@fluencelabs/fluence';
import {
ResultCodes,
RequestFlow,
RequestFlowBuilder,
CallParams,
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v1';
// Services
export interface AddOneDef {
add_one: (arg0: number, callParams: CallParams<'arg0'>) => number;
}
export function registerAddOne(serviceId: string, service: AddOneDef): void;
export function registerAddOne(peer: FluencePeer, serviceId: string, service: AddOneDef): void;
export function registerAddOne(...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];
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'add_one') {
const callParams = {
...req.particleContext,
tetraplets: {
arg0: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.add_one(req.args[0], callParams)
}
next();
});
}
export interface MyOpDef {
identity: (u: number, callParams: CallParams<'u'>) => void;
}
export function registerMyOp(service: MyOpDef): void;
export function registerMyOp(serviceId: string, service: MyOpDef): void;
export function registerMyOp(peer: FluencePeer, service: MyOpDef): void;
export function registerMyOp(peer: FluencePeer, serviceId: string, service: MyOpDef): void;
export function registerMyOp(...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 = "op"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'identity') {
const callParams = {
...req.particleContext,
tetraplets: {
u: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
service.identity(req.args[0], callParams); resp.result = {}
}
next();
});
}
// Functions
export function add_one(value: number, node: string, service_id: string, config?: {ttl?: number}) : Promise<number>;
export function add_one(peer: FluencePeer, value: number, node: string, service_id: string, config?: {ttl?: number}) : Promise<number>;
export function add_one(...args: any) {
let peer: FluencePeer;
let value: any;
let node: any;
let service_id: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
value = args[1];
node = args[2];
service_id = args[3];
config = args[4];
} else {
peer = Fluence.getPeer();
value = args[0];
node = args[1];
service_id = args[2];
config = args[3];
}
let request: RequestFlow;
const promise = new Promise<number>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "value") [] value)
)
(call %init_peer_id% ("getDataSrv" "node") [] node)
)
(call %init_peer_id% ("getDataSrv" "service_id") [] service_id)
)
(call -relay- ("op" "noop") [])
)
(xor
(seq
(call -relay- ("op" "noop") [])
(call node (service_id "add_one") [value] res)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [res])
(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', 'value', () => {return value;});
h.on('getDataSrv', 'node', () => {return node;});
h.on('getDataSrv', 'service_id', () => {return service_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 add_one');
})
if(config && config.ttl) {
r.withTTL(config.ttl)
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function add_one_three_times(value: number, ns_tuples: {node_id:string;service_id:string}[], config?: {ttl?: number}) : Promise<number>;
export function add_one_three_times(peer: FluencePeer, value: number, ns_tuples: {node_id:string;service_id:string}[], config?: {ttl?: number}) : Promise<number>;
export function add_one_three_times(...args: any) {
let peer: FluencePeer;
let value: any;
let ns_tuples: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
value = args[1];
ns_tuples = args[2];
config = args[3];
} else {
peer = Fluence.getPeer();
value = args[0];
ns_tuples = args[1];
config = args[2];
}
let request: RequestFlow;
const promise = new Promise<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" "value") [] value)
)
(call %init_peer_id% ("getDataSrv" "ns_tuples") [] ns_tuples)
)
(call -relay- ("op" "noop") [])
)
(xor
(seq
(call -relay- ("op" "noop") [])
(call ns_tuples.$.[0].node_id! (ns_tuples.$.[0].service_id! "add_one") [value] res1)
)
(seq
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
(call -relay- ("op" "noop") [])
)
)
)
(xor
(call ns_tuples.$.[1].node_id! (ns_tuples.$.[1].service_id! "add_one") [res1] res2)
(seq
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
)
(call -relay- ("op" "noop") [])
)
)
)
(xor
(call ns_tuples.$.[2].node_id! (ns_tuples.$.[2].service_id! "add_one") [res2] res3)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
)
)
)
(call -relay- ("op" "noop") [])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [res3])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
)
)
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 5])
)
`,
)
.configHandler((h) => {
h.on('getDataSrv', '-relay-', () => {
return peer.getStatus().relayPeerId;
});
h.on('getDataSrv', 'value', () => {return value;});
h.on('getDataSrv', 'ns_tuples', () => {return ns_tuples;});
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 add_one_three_times');
})
if(config && config.ttl) {
r.withTTL(config.ttl)
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function add_one_par(value: number, ns_tuples: {node_id:string;service_id:string}[], config?: {ttl?: number}) : Promise<number[]>;
export function add_one_par(peer: FluencePeer, value: number, ns_tuples: {node_id:string;service_id:string}[], config?: {ttl?: number}) : Promise<number[]>;
export function add_one_par(...args: any) {
let peer: FluencePeer;
let value: any;
let ns_tuples: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
value = args[1];
ns_tuples = args[2];
config = args[3];
} else {
peer = Fluence.getPeer();
value = args[0];
ns_tuples = args[1];
config = args[2];
}
let request: RequestFlow;
const promise = new Promise<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" "value") [] value)
)
(call %init_peer_id% ("getDataSrv" "ns_tuples") [] ns_tuples)
)
(fold ns_tuples ns
(par
(seq
(seq
(seq
(call -relay- ("op" "noop") [])
(xor
(seq
(call -relay- ("op" "noop") [])
(call ns.$.node_id! (ns.$.service_id! "add_one") [value] $res)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("op" "noop") [])
)
(next ns)
)
)
)
(call %init_peer_id% ("op" "identity") [$res.$.[2]!])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [$res])
(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', 'value', () => {return value;});
h.on('getDataSrv', 'ns_tuples', () => {return ns_tuples;});
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 add_one_par');
})
if(config && config.ttl) {
r.withTTL(config.ttl)
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}
export function add_one_par_alt(payload: {node_id:string;service_id:string;value:number}[], config?: {ttl?: number}) : Promise<number[]>;
export function add_one_par_alt(peer: FluencePeer, payload: {node_id:string;service_id:string;value:number}[], config?: {ttl?: number}) : Promise<number[]>;
export function add_one_par_alt(...args: any) {
let peer: FluencePeer;
let payload: any;
let config: any;
if (FluencePeer.isInstance(args[0])) {
peer = args[0];
payload = args[1];
config = args[2];
} else {
peer = Fluence.getPeer();
payload = args[0];
config = args[1];
}
let request: RequestFlow;
const promise = new Promise<number[]>((resolve, reject) => {
const r = new RequestFlowBuilder()
.disableInjections()
.withRawScript(
`
(xor
(seq
(seq
(seq
(seq
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
(call %init_peer_id% ("getDataSrv" "payload") [] payload)
)
(fold payload vns
(par
(seq
(seq
(seq
(call -relay- ("op" "noop") [])
(xor
(seq
(call -relay- ("op" "noop") [])
(call vns.$.node_id! (vns.$.service_id! "add_one") [vns.$.value!] $res)
)
(seq
(call -relay- ("op" "noop") [])
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
)
)
)
(call -relay- ("op" "noop") [])
)
(call %init_peer_id% ("op" "noop") [])
)
(next vns)
)
)
)
(call %init_peer_id% ("op" "identity") [$res.$.[2]!])
)
(xor
(call %init_peer_id% ("callbackSrv" "response") [$res])
(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', 'payload', () => {return payload;});
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 add_one_par_alt');
})
if(config && config.ttl) {
r.withTTL(config.ttl)
}
request = r.build();
});
peer.internals.initiateFlow(request!);
return promise;
}

View File

@ -0,0 +1,921 @@
/**
*
* 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.0-226
*
*/
import { Fluence, FluencePeer } from '@fluencelabs/fluence';
import {
ResultCodes,
RequestFlow,
RequestFlowBuilder,
CallParams,
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v1';
// Services
export interface SrvDef {
add_alias: (alias: string, service_id: string, callParams: CallParams<'alias' | 'service_id'>) => void;
create: (blueprint_id: string, callParams: CallParams<'blueprint_id'>) => string;
get_interface: (service_id: string, callParams: CallParams<'service_id'>) => {function_signatures:{arguments:string[][];name:string;output_types:string[]}[];record_types:{fields:string[][];id:number;name:string}[]};
list: (callParams: CallParams<null>) => {blueprint_id:string;id:string;owner_id:string}[];
remove: (service_id: string, callParams: CallParams<'service_id'>) => void;
resolve_alias: (alias: string, callParams: CallParams<'alias'>) => string;
}
export function registerSrv(service: SrvDef): void;
export function registerSrv(serviceId: string, service: SrvDef): void;
export function registerSrv(peer: FluencePeer, service: SrvDef): void;
export function registerSrv(peer: FluencePeer, serviceId: string, service: SrvDef): void;
export function registerSrv(...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 = "srv"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'add_alias') {
const callParams = {
...req.particleContext,
tetraplets: {
alias: req.tetraplets[0],service_id: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
service.add_alias(req.args[0], req.args[1], callParams); resp.result = {}
}
if (req.fnName === 'create') {
const callParams = {
...req.particleContext,
tetraplets: {
blueprint_id: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.create(req.args[0], callParams)
}
if (req.fnName === 'get_interface') {
const callParams = {
...req.particleContext,
tetraplets: {
service_id: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.get_interface(req.args[0], callParams)
}
if (req.fnName === 'list') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.list(callParams)
}
if (req.fnName === 'remove') {
const callParams = {
...req.particleContext,
tetraplets: {
service_id: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
service.remove(req.args[0], callParams); resp.result = {}
}
if (req.fnName === 'resolve_alias') {
const callParams = {
...req.particleContext,
tetraplets: {
alias: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.resolve_alias(req.args[0], callParams)
}
next();
});
}
export interface PeerDef {
connect: (id: string, multiaddrs: string[] | null, callParams: CallParams<'id' | 'multiaddrs'>) => boolean;
get_contact: (peer: string, callParams: CallParams<'peer'>) => {addresses:string[];peer_id:string};
identify: (callParams: CallParams<null>) => {external_addresses:string[]};
is_connected: (peer: string, callParams: CallParams<'peer'>) => boolean;
timestamp_ms: (callParams: CallParams<null>) => number;
timestamp_sec: (callParams: CallParams<null>) => number;
}
export function registerPeer(service: PeerDef): void;
export function registerPeer(serviceId: string, service: PeerDef): void;
export function registerPeer(peer: FluencePeer, service: PeerDef): void;
export function registerPeer(peer: FluencePeer, serviceId: string, service: PeerDef): void;
export function registerPeer(...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 = "peer"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'connect') {
const callParams = {
...req.particleContext,
tetraplets: {
id: req.tetraplets[0],multiaddrs: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.connect(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], callParams)
}
if (req.fnName === 'get_contact') {
const callParams = {
...req.particleContext,
tetraplets: {
peer: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.get_contact(req.args[0], callParams)
}
if (req.fnName === 'identify') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.identify(callParams)
}
if (req.fnName === 'is_connected') {
const callParams = {
...req.particleContext,
tetraplets: {
peer: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.is_connected(req.args[0], callParams)
}
if (req.fnName === 'timestamp_ms') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.timestamp_ms(callParams)
}
if (req.fnName === 'timestamp_sec') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.timestamp_sec(callParams)
}
next();
});
}
export interface OpDef {
array: (a: string, b: string | null, c: string | null, d: string | null, callParams: CallParams<'a' | 'b' | 'c' | 'd'>) => string[];
array_length: (array: string[], callParams: CallParams<'array'>) => number;
bytes_from_b58: (b: string, callParams: CallParams<'b'>) => number[];
bytes_to_b58: (bs: number[], callParams: CallParams<'bs'>) => string;
concat: (a: string[], b: string[] | null, c: string[] | null, d: string[] | null, callParams: CallParams<'a' | 'b' | 'c' | 'd'>) => string[];
concat_strings: (a: string, b: string, callParams: CallParams<'a' | 'b'>) => string;
identity: (s: string | null, callParams: CallParams<'s'>) => string | null;
noop: (callParams: CallParams<null>) => void;
sha256_string: (s: string, callParams: CallParams<'s'>) => string;
string_from_b58: (b: string, callParams: CallParams<'b'>) => string;
string_to_b58: (s: string, callParams: CallParams<'s'>) => string;
}
export function registerOp(service: OpDef): void;
export function registerOp(serviceId: string, service: OpDef): void;
export function registerOp(peer: FluencePeer, service: OpDef): void;
export function registerOp(peer: FluencePeer, serviceId: string, service: OpDef): void;
export function registerOp(...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 = "op"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'array') {
const callParams = {
...req.particleContext,
tetraplets: {
a: req.tetraplets[0],b: req.tetraplets[1],c: req.tetraplets[2],d: req.tetraplets[3]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.array(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], req.args[2].length === 0 ? null : req.args[2][0], req.args[3].length === 0 ? null : req.args[3][0], callParams)
}
if (req.fnName === 'array_length') {
const callParams = {
...req.particleContext,
tetraplets: {
array: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.array_length(req.args[0], callParams)
}
if (req.fnName === 'bytes_from_b58') {
const callParams = {
...req.particleContext,
tetraplets: {
b: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.bytes_from_b58(req.args[0], callParams)
}
if (req.fnName === 'bytes_to_b58') {
const callParams = {
...req.particleContext,
tetraplets: {
bs: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.bytes_to_b58(req.args[0], callParams)
}
if (req.fnName === 'concat') {
const callParams = {
...req.particleContext,
tetraplets: {
a: req.tetraplets[0],b: req.tetraplets[1],c: req.tetraplets[2],d: req.tetraplets[3]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.concat(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], req.args[2].length === 0 ? null : req.args[2][0], req.args[3].length === 0 ? null : req.args[3][0], callParams)
}
if (req.fnName === 'concat_strings') {
const callParams = {
...req.particleContext,
tetraplets: {
a: req.tetraplets[0],b: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.concat_strings(req.args[0], req.args[1], callParams)
}
if (req.fnName === 'identity') {
const callParams = {
...req.particleContext,
tetraplets: {
s: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
var respResult = service.identity(req.args[0].length === 0 ? null : req.args[0][0], callParams);
resp.result = respResult === null ? [] : [respResult]
}
if (req.fnName === 'noop') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
service.noop(callParams); resp.result = {}
}
if (req.fnName === 'sha256_string') {
const callParams = {
...req.particleContext,
tetraplets: {
s: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.sha256_string(req.args[0], callParams)
}
if (req.fnName === 'string_from_b58') {
const callParams = {
...req.particleContext,
tetraplets: {
b: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.string_from_b58(req.args[0], callParams)
}
if (req.fnName === 'string_to_b58') {
const callParams = {
...req.particleContext,
tetraplets: {
s: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.string_to_b58(req.args[0], callParams)
}
next();
});
}
export interface KademliaDef {
merge: (target: string, left: string[], right: string[], count: number | null, callParams: CallParams<'target' | 'left' | 'right' | 'count'>) => string[];
neighborhood: (key: string, already_hashed: boolean | null, count: number | null, callParams: CallParams<'key' | 'already_hashed' | 'count'>) => string[];
}
export function registerKademlia(service: KademliaDef): void;
export function registerKademlia(serviceId: string, service: KademliaDef): void;
export function registerKademlia(peer: FluencePeer, service: KademliaDef): void;
export function registerKademlia(peer: FluencePeer, serviceId: string, service: KademliaDef): void;
export function registerKademlia(...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 = "kad"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'merge') {
const callParams = {
...req.particleContext,
tetraplets: {
target: req.tetraplets[0],left: req.tetraplets[1],right: req.tetraplets[2],count: req.tetraplets[3]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.merge(req.args[0], req.args[1], req.args[2], req.args[3].length === 0 ? null : req.args[3][0], callParams)
}
if (req.fnName === 'neighborhood') {
const callParams = {
...req.particleContext,
tetraplets: {
key: req.tetraplets[0],already_hashed: req.tetraplets[1],count: req.tetraplets[2]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.neighborhood(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], req.args[2].length === 0 ? null : req.args[2][0], callParams)
}
next();
});
}
export interface ScriptDef {
add: (air_script: string, interval: string | null, callParams: CallParams<'air_script' | 'interval'>) => string;
list: (callParams: CallParams<null>) => {failures:number;id:string;interval:string;owner:string;src:string};
remove: (script_id: string, callParams: CallParams<'script_id'>) => boolean;
}
export function registerScript(service: ScriptDef): void;
export function registerScript(serviceId: string, service: ScriptDef): void;
export function registerScript(peer: FluencePeer, service: ScriptDef): void;
export function registerScript(peer: FluencePeer, serviceId: string, service: ScriptDef): void;
export function registerScript(...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 = "script"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'add') {
const callParams = {
...req.particleContext,
tetraplets: {
air_script: req.tetraplets[0],interval: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.add(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], callParams)
}
if (req.fnName === 'list') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.list(callParams)
}
if (req.fnName === 'remove') {
const callParams = {
...req.particleContext,
tetraplets: {
script_id: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.remove(req.args[0], callParams)
}
next();
});
}
export interface DistDef {
add_blueprint: (blueprint: {dependencies:string[];name:string}, callParams: CallParams<'blueprint'>) => string;
add_module: (wasm_b56_content: number[], conf: {name:string}, callParams: CallParams<'wasm_b56_content' | 'conf'>) => string;
add_module_from_vault: (path: string, config: {name:string}, callParams: CallParams<'path' | 'config'>) => string;
default_module_config: (module_name: string, callParams: CallParams<'module_name'>) => {name:string};
get_interface: (module_id: string, callParams: CallParams<'module_id'>) => {function_signatures:{arguments:string[][];name:string;output_types:string[]}[];record_types:{fields:string[][];id:number;name:string}[]};
list_blueprints: (callParams: CallParams<null>) => {dependencies:string[];id:string;name:string}[];
list_modules: (callParams: CallParams<null>) => {config:{name:string};hash:string;name:string}[];
make_blueprint: (name: string, dependencies: string[], callParams: CallParams<'name' | 'dependencies'>) => {dependencies:string[];name:string};
make_module_config: (name: string, mem_pages_count: number | null, logger_enabled: boolean | null, preopened_files: string[] | null, envs: string[][] | null, mapped_dirs: string[][] | null, mounted_binaries: string[][] | null, logging_mask: number | null, callParams: CallParams<'name' | 'mem_pages_count' | 'logger_enabled' | 'preopened_files' | 'envs' | 'mapped_dirs' | 'mounted_binaries' | 'logging_mask'>) => {name:string};
}
export function registerDist(service: DistDef): void;
export function registerDist(serviceId: string, service: DistDef): void;
export function registerDist(peer: FluencePeer, service: DistDef): void;
export function registerDist(peer: FluencePeer, serviceId: string, service: DistDef): void;
export function registerDist(...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 = "dist"
}
// Figuring out which overload is the 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];
}
peer.internals.callServiceHandler.use((req, resp, next) => {
if (req.serviceId !== serviceId) {
next();
return;
}
if (req.fnName === 'add_blueprint') {
const callParams = {
...req.particleContext,
tetraplets: {
blueprint: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.add_blueprint(req.args[0], callParams)
}
if (req.fnName === 'add_module') {
const callParams = {
...req.particleContext,
tetraplets: {
wasm_b56_content: req.tetraplets[0],conf: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.add_module(req.args[0], req.args[1], callParams)
}
if (req.fnName === 'add_module_from_vault') {
const callParams = {
...req.particleContext,
tetraplets: {
path: req.tetraplets[0],config: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.add_module_from_vault(req.args[0], req.args[1], callParams)
}
if (req.fnName === 'default_module_config') {
const callParams = {
...req.particleContext,
tetraplets: {
module_name: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.default_module_config(req.args[0], callParams)
}
if (req.fnName === 'get_interface') {
const callParams = {
...req.particleContext,
tetraplets: {
module_id: req.tetraplets[0]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.get_interface(req.args[0], callParams)
}
if (req.fnName === 'list_blueprints') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.list_blueprints(callParams)
}
if (req.fnName === 'list_modules') {
const callParams = {
...req.particleContext,
tetraplets: {
},
};
resp.retCode = ResultCodes.success;
resp.result = service.list_modules(callParams)
}
if (req.fnName === 'make_blueprint') {
const callParams = {
...req.particleContext,
tetraplets: {
name: req.tetraplets[0],dependencies: req.tetraplets[1]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.make_blueprint(req.args[0], req.args[1], callParams)
}
if (req.fnName === 'make_module_config') {
const callParams = {
...req.particleContext,
tetraplets: {
name: req.tetraplets[0],mem_pages_count: req.tetraplets[1],logger_enabled: req.tetraplets[2],preopened_files: req.tetraplets[3],envs: req.tetraplets[4],mapped_dirs: req.tetraplets[5],mounted_binaries: req.tetraplets[6],logging_mask: req.tetraplets[7]
},
};
resp.retCode = ResultCodes.success;
resp.result = service.make_module_config(req.args[0], req.args[1].length === 0 ? null : req.args[1][0], req.args[2].length === 0 ? null : req.args[2][0], req.args[3].length === 0 ? null : req.args[3][0], req.args[4].length === 0 ? null : req.args[4][0], req.args[5].length === 0 ? null : req.args[5][0], req.args[6].length === 0 ? null : req.args[6][0], req.args[7].length === 0 ? null : req.args[7][0], callParams)
}
next();
});
}
// Functions

View File

@ -0,0 +1,115 @@
/*
* Copyright 2021 Fluence Labs Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Fluence, setLogLevel, FluencePeer } from "@fluencelabs/fluence";
import { krasnodar, Node } from "@fluencelabs/fluence-network-environment";
import { add_one, add_one_par, add_one_three_times, add_one_par_alt } from "./compiled-aqua/adder";
interface NodeServiceTuple {
node_id: string;
service_id: string;
}
let topos: Array<NodeServiceTuple> = [
{
"node_id": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id": "7b2ab89f-0897-4537-b726-8120b405074d"
},
{
"node_id": "12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA",
"service_id": "e013f18a-200f-4249-8303-d42d10d3ce46"
},
{
"node_id": "12D3KooWDUszU2NeWyUVjCXhGEt1MoZrhvdmaQQwtZUriuGN1jTr",
"service_id": "191ef700-fd13-4151-9b7c-3fabfe3c0387"
}
];
interface ValueNodeService {
value: number,
node_id: string;
service_id: string;
}
let topos_alt: Array<ValueNodeService> = [
{
"value": 5,
"node_id": "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt",
"service_id": "7b2ab89f-0897-4537-b726-8120b405074d"
},
{
"value": 10,
"node_id": "12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA",
"service_id": "e013f18a-200f-4249-8303-d42d10d3ce46"
},
{
"value": 15,
"node_id": "12D3KooWDUszU2NeWyUVjCXhGEt1MoZrhvdmaQQwtZUriuGN1jTr",
"service_id": "191ef700-fd13-4151-9b7c-3fabfe3c0387"
}
];
let value = 5;
// let greeting_service =
async function main() {
// console.log("hello");
// setLogLevel('DEBUG');
await Fluence.start({ connectTo: krasnodar[2] });
console.log(
"created a Fluence client %s with relay %s",
Fluence.getStatus().peerId,
Fluence.getStatus().relayPeerId
);
let basic_add = await add_one(
value,
topos[0].node_id,
topos[0].service_id
);
console.log("add_one to ", value, " equals ", basic_add);
let seq_add = await add_one_three_times(
value,
topos
);
console.log("add_one sequentially equals ", seq_add);
let par_add = await add_one_par(
value,
topos
);
console.log("add_one parallel equals ", par_add);
let par_add_alt = await add_one_par_alt(
topos_alt
);
console.log("add_one parallel alt equals ", par_add_alt);
return;
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});