From c8519bbb16829a6e29073e167c9d1087f1851d05 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Sun, 17 Oct 2021 22:54:39 +0300 Subject: [PATCH] Extend multireturn example --- aqua/examples/multiReturn.aqua | 10 +- src/__test__/examples.spec.ts | 5 + src/compiled/examples/multiReturn.ts | 132 +++++++++++++++++++++++++-- src/examples/multiReturnCall.ts | 15 ++- 4 files changed, 149 insertions(+), 13 deletions(-) diff --git a/aqua/examples/multiReturn.aqua b/aqua/examples/multiReturn.aqua index df7ac3b..b861450 100644 --- a/aqua/examples/multiReturn.aqua +++ b/aqua/examples/multiReturn.aqua @@ -4,6 +4,10 @@ service GetStr("multiret-test"): service GetNum("multiret-num"): retNum: -> u8 +service GetMulti("multiret-multiret"): + ret: -> string, u8 + retOpt: -> string, ?u8, ?u8 + const SOME_NUM = 5 const SOME_STR = "some-str" @@ -12,9 +16,11 @@ func tupleFunc() -> string, u8: n <- GetNum.retNum() <- str, n -func multiReturnFunc(somethingToReturn: []u8, smthOption: ?string) -> []string, u8, string, []u8, ?string, u8 : +func multiReturnFunc(somethingToReturn: []u8, smthOption: ?string) -> []string, u8, string, []u8, ?string, u8, string, u8, string, ?u8, ?u8: res: *string res <- GetStr.retStr(SOME_STR) res <- GetStr.retStr("random-str") + m1, m2 <- GetMulti.ret() + mo1, mo2, mo3 <- GetMulti.retOpt() res, tNum <- tupleFunc() - <- res, SOME_NUM, SOME_STR, somethingToReturn, smthOption, tNum \ No newline at end of file + <- res, SOME_NUM, SOME_STR, somethingToReturn, smthOption, tNum, m1, m2, mo1, mo2, mo3 \ No newline at end of file diff --git a/src/__test__/examples.spec.ts b/src/__test__/examples.spec.ts index 6b9bc61..a167e6c 100644 --- a/src/__test__/examples.spec.ts +++ b/src/__test__/examples.spec.ts @@ -219,6 +219,11 @@ describe('Testing examples', () => { [1, 2], null, 10, + 'non-opt', + 1, + 'opt', + 1, + null, ]); }); diff --git a/src/compiled/examples/multiReturn.ts b/src/compiled/examples/multiReturn.ts index 24efead..6d29a99 100644 --- a/src/compiled/examples/multiReturn.ts +++ b/src/compiled/examples/multiReturn.ts @@ -154,6 +154,82 @@ export function registerGetNum(...args: any) { }); } +export interface GetMultiDef { + ret: (callParams: CallParams) => [string, number]; + retOpt: (callParams: CallParams) => [string, number | null, number | null]; +} + +export function registerGetMulti(service: GetMultiDef): void; +export function registerGetMulti(serviceId: string, service: GetMultiDef): void; +export function registerGetMulti(peer: FluencePeer, service: GetMultiDef): void; +export function registerGetMulti(peer: FluencePeer, serviceId: string, service: GetMultiDef): void; +export function registerGetMulti(...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 = 'multiret-multiret'; + } + + // 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]; + } + + const incorrectServiceDefinitions = missingFields(service, ['ret', 'retOpt']); + if (!!incorrectServiceDefinitions.length) { + throw new Error( + 'Error registering service GetMulti: missing functions: ' + + incorrectServiceDefinitions.map((d) => "'" + d + "'").join(', '), + ); + } + + peer.internals.callServiceHandler.use((req, resp, next) => { + if (req.serviceId !== serviceId) { + next(); + return; + } + + if (req.fnName === 'ret') { + const callParams = { + ...req.particleContext, + tetraplets: {}, + }; + resp.retCode = ResultCodes.success; + resp.result = service.ret(callParams); + } + + if (req.fnName === 'retOpt') { + const callParams = { + ...req.particleContext, + tetraplets: {}, + }; + resp.retCode = ResultCodes.success; + resp.result = service.retOpt(callParams); + } + + next(); + }); +} + // Functions export function tupleFunc(config?: { ttl?: number }): Promise<[string, number]>; @@ -228,13 +304,17 @@ export function multiReturnFunc( somethingToReturn: number[], smthOption: string | null, config?: { ttl?: number }, -): Promise<[string[], number, string, number[], string | null, number]>; +): Promise< + [string[], number, string, number[], string | null, number, string, number, string, number | null, number | null] +>; export function multiReturnFunc( peer: FluencePeer, somethingToReturn: number[], smthOption: string | null, config?: { ttl?: number }, -): Promise<[string[], number, string, number[], string | null, number]>; +): Promise< + [string[], number, string, number[], string | null, number, string, number, string, number | null, number | null] +>; export function multiReturnFunc(...args: any) { let peer: FluencePeer; let somethingToReturn: any; @@ -253,7 +333,21 @@ export function multiReturnFunc(...args: any) { } let request: RequestFlow; - const promise = new Promise<[string[], number, string, number[], string | null, number]>((resolve, reject) => { + const promise = new Promise< + [ + string[], + number, + string, + number[], + string | null, + number, + string, + number, + string, + number | null, + number | null, + ] + >((resolve, reject) => { const r = new RequestFlowBuilder() .disableInjections() .withRawScript( @@ -267,14 +361,20 @@ export function multiReturnFunc(...args: any) { (seq (seq (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "somethingToReturn") [] somethingToReturn) + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "somethingToReturn") [] somethingToReturn) + ) + (call %init_peer_id% ("getDataSrv" "smthOption") [] smthOption) + ) + (call %init_peer_id% ("multiret-test" "retStr") ["some-str"] $res) ) - (call %init_peer_id% ("getDataSrv" "smthOption") [] smthOption) + (call %init_peer_id% ("multiret-test" "retStr") ["random-str"] $res) ) - (call %init_peer_id% ("multiret-test" "retStr") ["some-str"] $res) + (call %init_peer_id% ("multiret-multiret" "ret") [] m1) ) - (call %init_peer_id% ("multiret-test" "retStr") ["random-str"] $res) + (call %init_peer_id% ("multiret-multiret" "retOpt") [] mo1) ) (call %init_peer_id% ("multiret-test" "retStr") ["some-str"] str) ) @@ -283,7 +383,7 @@ export function multiReturnFunc(...args: any) { (ap str $res) ) (xor - (call %init_peer_id% ("callbackSrv" "response") [$res 5 "some-str" somethingToReturn smthOption n]) + (call %init_peer_id% ("callbackSrv" "response") [$res 5 "some-str" somethingToReturn smthOption n m1 m2 mo1 mo2 mo3]) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) ) ) @@ -310,6 +410,20 @@ export function multiReturnFunc(...args: any) { opt[4] = opt[4][0]; } } + if (Array.isArray(opt[9])) { + if (opt[9].length === 0) { + opt[9] = null; + } else { + opt[9] = opt[9][0]; + } + } + if (Array.isArray(opt[10])) { + if (opt[10].length === 0) { + opt[10] = null; + } else { + opt[10] = opt[10][0]; + } + } return resolve(opt); }); h.onEvent('errorHandlingSrv', 'error', (args) => { diff --git a/src/examples/multiReturnCall.ts b/src/examples/multiReturnCall.ts index 31f0763..42c3c5e 100644 --- a/src/examples/multiReturnCall.ts +++ b/src/examples/multiReturnCall.ts @@ -1,7 +1,9 @@ import { FluencePeer } from '@fluencelabs/fluence'; -import { multiReturnFunc, registerGetStr, registerGetNum } from '../compiled/examples/multiReturn'; +import { multiReturnFunc, registerGetStr, registerGetNum, registerGetMulti } from '../compiled/examples/multiReturn'; -export async function multiReturnCall(): Promise<[string[], number, string, number[], string | null, number]> { +export async function multiReturnCall(): Promise< + [string[], number, string, number[], string | null, number, string, number, string, number | null, number | null] +> { registerGetStr({ retStr: (args0) => { return args0; @@ -14,5 +16,14 @@ export async function multiReturnCall(): Promise<[string[], number, string, numb }, }); + registerGetMulti({ + ret: () => { + return ['non-opt', 1]; + }, + retOpt: () => { + return ['opt', 1, null]; + }, + }); + return await multiReturnFunc([1, 2], null); }