Refactor tests

This commit is contained in:
Akim Mamedov 2023-11-14 05:20:51 +07:00
parent 927277330e
commit 3a039cd355
8 changed files with 502 additions and 483 deletions

View File

@ -9,13 +9,16 @@
* If you find any bugs in generated JS/TS, please write an issue on GitHub: https://github.com/fluencelabs/js-client/issues * If you find any bugs in generated JS/TS, please write an issue on GitHub: https://github.com/fluencelabs/js-client/issues
* *
*/ */
import type { IFluenceClient as IFluenceClient$$, ParticleContext as ParticleContext$$ } from '@fluencelabs/js-client'; import type {
IFluenceClient as IFluenceClient$$,
ParticleContext as ParticleContext$$,
} from "@fluencelabs/js-client";
import { import {
v5_callFunction as callFunction$$, v5_callFunction as callFunction$$,
v5_registerService as registerService$$, v5_registerService as registerService$$,
FluencePeer as FluencePeer$$ FluencePeer as FluencePeer$$,
} from '@fluencelabs/js-client'; } from "@fluencelabs/js-client";
/** /**
* @typedef {import("@fluencelabs/js-client").NonArrowSimpleType} NonArrowSimpleType * @typedef {import("@fluencelabs/js-client").NonArrowSimpleType} NonArrowSimpleType
@ -28,53 +31,48 @@ import {
* @returns {JSONValue} value represented in typescript * @returns {JSONValue} value represented in typescript
*/ */
export function aqua2ts(value, schema) { export function aqua2ts(value, schema) {
if (schema.tag === "nil") { if (schema.tag === "nil") {
return null; return null;
} else if (schema.tag === "option") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "option") { if (value.length === 0) {
if (!Array.isArray(value)) { return null;
throw new Error("Bad schema"); } else {
} return aqua2ts(value[0], schema.type);
if (value.length === 0) {
return null;
}
else {
return aqua2ts(value[0], schema.type);
}
} }
else if (schema.tag === "scalar" || } else if (
schema.tag === "bottomType" || schema.tag === "scalar" ||
schema.tag === "topType") { schema.tag === "bottomType" ||
return value; schema.tag === "topType"
) {
return value;
} else if (schema.tag === "array") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "array") { return value.map((y) => {
if (!Array.isArray(value)) { return aqua2ts(y, schema.type);
throw new Error("Bad schema"); });
} } else if (schema.tag === "unlabeledProduct") {
return value.map((y) => { if (!Array.isArray(value)) {
return aqua2ts(y, schema.type); throw new Error("Bad schema");
});
} }
else if (schema.tag === "unlabeledProduct") { return value.map((y, i) => {
if (!Array.isArray(value)) { return aqua2ts(y, schema.items[i]);
throw new Error("Bad schema"); });
} } else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
return value.map((y, i) => { if (typeof value !== "object" || value == null || Array.isArray(value)) {
return aqua2ts(y, schema.items[i]); throw new Error("Bad schema");
});
}
else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
if (typeof value !== "object" || value == null || Array.isArray(value)) {
throw new Error("Bad schema");
}
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = aqua2ts(value[key], type);
return { ...agg, [key]: val };
}, {});
}
else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
} }
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = aqua2ts(value[key], type);
return { ...agg, [key]: val };
}, {});
} else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
}
} }
/** /**
* Convert value from its typescript representation to representation in aqua * Convert value from its typescript representation to representation in aqua
@ -83,52 +81,46 @@ export function aqua2ts(value, schema) {
* @returns {JSONValue} represented in aqua * @returns {JSONValue} represented in aqua
*/ */
export function ts2aqua(value, schema) { export function ts2aqua(value, schema) {
if (schema.tag === "nil") { if (schema.tag === "nil") {
return null; return null;
} else if (schema.tag === "option") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "option") { return value === null ? [] : [ts2aqua(value, schema.type)];
if (!Array.isArray(value)) { } else if (
throw new Error("Bad schema"); schema.tag === "scalar" ||
} schema.tag === "bottomType" ||
return value === null ? [] : [ts2aqua(value, schema.type)]; schema.tag === "topType"
) {
return value;
} else if (schema.tag === "array") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "scalar" || return value.map((y) => {
schema.tag === "bottomType" || return ts2aqua(y, schema.type);
schema.tag === "topType") { });
return value; } else if (schema.tag === "unlabeledProduct") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "array") { return value.map((y, i) => {
if (!Array.isArray(value)) { return ts2aqua(y, schema.items[i]);
throw new Error("Bad schema"); });
} } else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
return value.map((y) => { if (typeof value !== "object" || value == null || Array.isArray(value)) {
return ts2aqua(y, schema.type); throw new Error("Bad schema");
});
}
else if (schema.tag === "unlabeledProduct") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
}
return value.map((y, i) => {
return ts2aqua(y, schema.items[i]);
});
}
else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
if (typeof value !== "object" || value == null || Array.isArray(value)) {
throw new Error("Bad schema");
}
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = ts2aqua(value[key], type);
return { ...agg, [key]: val };
}, {});
}
else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
} }
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = ts2aqua(value[key], type);
return { ...agg, [key]: val };
}, {});
} else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
}
} }
// Functions // Functions
export const test_script = ` export const test_script = `
(seq (seq
@ -143,41 +135,38 @@ export const test_script = `
) )
`; `;
export function test( export function test(config?: { ttl?: number }): Promise<void>;
config?: {ttl?: number}
): Promise<void>;
export function test( export function test(
peer: IFluenceClient$$, peer: IFluenceClient$$,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<void>; ): Promise<void>;
export async function test(...args: any[]) { export async function test(...args: any[]) {
const argNames = []; const argNames = [];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: test_script, const result = await callFunction$$({
...params, script: test_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"tag": "nil" tag: "nil",
} });
);
} }

View File

@ -9,13 +9,16 @@
* If you find any bugs in generated JS/TS, please write an issue on GitHub: https://github.com/fluencelabs/js-client/issues * If you find any bugs in generated JS/TS, please write an issue on GitHub: https://github.com/fluencelabs/js-client/issues
* *
*/ */
import type { IFluenceClient as IFluenceClient$$, ParticleContext as ParticleContext$$ } from '@fluencelabs/js-client'; import type {
IFluenceClient as IFluenceClient$$,
ParticleContext as ParticleContext$$,
} from "@fluencelabs/js-client";
import { import {
v5_callFunction as callFunction$$, v5_callFunction as callFunction$$,
v5_registerService as registerService$$, v5_registerService as registerService$$,
FluencePeer as FluencePeer$$ FluencePeer as FluencePeer$$,
} from '@fluencelabs/js-client'; } from "@fluencelabs/js-client";
/** /**
* @typedef {import("@fluencelabs/js-client").NonArrowSimpleType} NonArrowSimpleType * @typedef {import("@fluencelabs/js-client").NonArrowSimpleType} NonArrowSimpleType
@ -28,53 +31,48 @@ import {
* @returns {JSONValue} value represented in typescript * @returns {JSONValue} value represented in typescript
*/ */
export function aqua2ts(value, schema) { export function aqua2ts(value, schema) {
if (schema.tag === "nil") { if (schema.tag === "nil") {
return null; return null;
} else if (schema.tag === "option") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "option") { if (value.length === 0) {
if (!Array.isArray(value)) { return null;
throw new Error("Bad schema"); } else {
} return aqua2ts(value[0], schema.type);
if (value.length === 0) {
return null;
}
else {
return aqua2ts(value[0], schema.type);
}
} }
else if (schema.tag === "scalar" || } else if (
schema.tag === "bottomType" || schema.tag === "scalar" ||
schema.tag === "topType") { schema.tag === "bottomType" ||
return value; schema.tag === "topType"
) {
return value;
} else if (schema.tag === "array") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "array") { return value.map((y) => {
if (!Array.isArray(value)) { return aqua2ts(y, schema.type);
throw new Error("Bad schema"); });
} } else if (schema.tag === "unlabeledProduct") {
return value.map((y) => { if (!Array.isArray(value)) {
return aqua2ts(y, schema.type); throw new Error("Bad schema");
});
} }
else if (schema.tag === "unlabeledProduct") { return value.map((y, i) => {
if (!Array.isArray(value)) { return aqua2ts(y, schema.items[i]);
throw new Error("Bad schema"); });
} } else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
return value.map((y, i) => { if (typeof value !== "object" || value == null || Array.isArray(value)) {
return aqua2ts(y, schema.items[i]); throw new Error("Bad schema");
});
}
else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
if (typeof value !== "object" || value == null || Array.isArray(value)) {
throw new Error("Bad schema");
}
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = aqua2ts(value[key], type);
return { ...agg, [key]: val };
}, {});
}
else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
} }
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = aqua2ts(value[key], type);
return { ...agg, [key]: val };
}, {});
} else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
}
} }
/** /**
* Convert value from its typescript representation to representation in aqua * Convert value from its typescript representation to representation in aqua
@ -83,145 +81,195 @@ export function aqua2ts(value, schema) {
* @returns {JSONValue} represented in aqua * @returns {JSONValue} represented in aqua
*/ */
export function ts2aqua(value, schema) { export function ts2aqua(value, schema) {
if (schema.tag === "nil") { if (schema.tag === "nil") {
return null; return null;
} else if (schema.tag === "option") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "option") { return value === null ? [] : [ts2aqua(value, schema.type)];
if (!Array.isArray(value)) { } else if (
throw new Error("Bad schema"); schema.tag === "scalar" ||
} schema.tag === "bottomType" ||
return value === null ? [] : [ts2aqua(value, schema.type)]; schema.tag === "topType"
) {
return value;
} else if (schema.tag === "array") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "scalar" || return value.map((y) => {
schema.tag === "bottomType" || return ts2aqua(y, schema.type);
schema.tag === "topType") { });
return value; } else if (schema.tag === "unlabeledProduct") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
} }
else if (schema.tag === "array") { return value.map((y, i) => {
if (!Array.isArray(value)) { return ts2aqua(y, schema.items[i]);
throw new Error("Bad schema"); });
} } else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
return value.map((y) => { if (typeof value !== "object" || value == null || Array.isArray(value)) {
return ts2aqua(y, schema.type); throw new Error("Bad schema");
});
}
else if (schema.tag === "unlabeledProduct") {
if (!Array.isArray(value)) {
throw new Error("Bad schema");
}
return value.map((y, i) => {
return ts2aqua(y, schema.items[i]);
});
}
else if (schema.tag === "struct" || schema.tag === "labeledProduct") {
if (typeof value !== "object" || value == null || Array.isArray(value)) {
throw new Error("Bad schema");
}
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = ts2aqua(value[key], type);
return { ...agg, [key]: val };
}, {});
}
else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
} }
return Object.entries(schema.fields).reduce((agg, [key, type]) => {
const val = ts2aqua(value[key], type);
return { ...agg, [key]: val };
}, {});
} else {
throw new Error("Unexpected tag: " + JSON.stringify(schema));
}
} }
// Services // Services
export interface SrvDef { export interface SrvDef {
create: (wasm_b64_content: string, callParams: ParticleContext$$) => { error: string | null; service_id: string | null; success: boolean; } | Promise<{ error: string | null; service_id: string | null; success: boolean; }>; create: (
list: (callParams: ParticleContext$$) => string[] | Promise<string[]>; wasm_b64_content: string,
remove: (service_id: string, callParams: ParticleContext$$) => { error: string | null; success: boolean; } | Promise<{ error: string | null; success: boolean; }>; callParams: ParticleContext$$,
) =>
| { error: string | null; service_id: string | null; success: boolean }
| Promise<{
error: string | null;
service_id: string | null;
success: boolean;
}>;
list: (callParams: ParticleContext$$) => string[] | Promise<string[]>;
remove: (
service_id: string,
callParams: ParticleContext$$,
) =>
| { error: string | null; success: boolean }
| Promise<{ error: string | null; success: boolean }>;
} }
export function registerSrv(service: SrvDef): void; export function registerSrv(service: SrvDef): void;
export function registerSrv(serviceId: string, service: SrvDef): void; export function registerSrv(serviceId: string, service: SrvDef): void;
export function registerSrv(peer: IFluenceClient$$, service: SrvDef): void; export function registerSrv(peer: IFluenceClient$$, service: SrvDef): void;
export function registerSrv(peer: IFluenceClient$$, serviceId: string, service: SrvDef): void; export function registerSrv(
peer: IFluenceClient$$,
serviceId: string,
service: SrvDef,
): void;
export function registerSrv(...args: any[]) { export function registerSrv(...args: any[]) {
const service = args.pop(); const service = args.pop();
const defaultServiceId = "single_module_srv"; const defaultServiceId = "single_module_srv";
const params = args[0] instanceof FluencePeer$$ ? ({ const params =
peer: args[0], args[0] instanceof FluencePeer$$
serviceId: args[1] ?? defaultServiceId ? {
}) : ({ peer: args[0],
peer: undefined, serviceId: args[1] ?? defaultServiceId,
serviceId: args[0] ?? defaultServiceId }
}); : {
peer: undefined,
if (params.serviceId == null) { serviceId: args[0] ?? defaultServiceId,
throw new Error("Service ID is not provided"); };
}
if (params.serviceId == null) {
registerService$$({ throw new Error("Service ID is not provided");
service, }
...params
}); registerService$$({
service,
...params,
});
} }
export interface CalcServiceDef { export interface CalcServiceDef {
divide: (num: number, callParams: ParticleContext$$) => number | Promise<number>; divide: (
clear_state: (callParams: ParticleContext$$) => void | Promise<void>; num: number,
test_logs: (callParams: ParticleContext$$) => void | Promise<void>; callParams: ParticleContext$$,
multiply: (num: number, callParams: ParticleContext$$) => number | Promise<number>; ) => number | Promise<number>;
add: (num: number, callParams: ParticleContext$$) => number | Promise<number>; clear_state: (callParams: ParticleContext$$) => void | Promise<void>;
state: (callParams: ParticleContext$$) => number | Promise<number>; test_logs: (callParams: ParticleContext$$) => void | Promise<void>;
subtract: (num: number, callParams: ParticleContext$$) => number | Promise<number>; multiply: (
num: number,
callParams: ParticleContext$$,
) => number | Promise<number>;
add: (num: number, callParams: ParticleContext$$) => number | Promise<number>;
state: (callParams: ParticleContext$$) => number | Promise<number>;
subtract: (
num: number,
callParams: ParticleContext$$,
) => number | Promise<number>;
} }
export function registerCalcService(serviceId: string, service: CalcServiceDef): void; export function registerCalcService(
export function registerCalcService(peer: IFluenceClient$$, serviceId: string, service: CalcServiceDef): void; serviceId: string,
service: CalcServiceDef,
): void;
export function registerCalcService(
peer: IFluenceClient$$,
serviceId: string,
service: CalcServiceDef,
): void;
export function registerCalcService(...args: any[]) { export function registerCalcService(...args: any[]) {
const service = args.pop(); const service = args.pop();
const defaultServiceId = undefined; const defaultServiceId = undefined;
const params = args[0] instanceof FluencePeer$$ ? ({ const params =
peer: args[0], args[0] instanceof FluencePeer$$
serviceId: args[1] ?? defaultServiceId ? {
}) : ({ peer: args[0],
peer: undefined, serviceId: args[1] ?? defaultServiceId,
serviceId: args[0] ?? defaultServiceId }
}); : {
peer: undefined,
if (params.serviceId == null) { serviceId: args[0] ?? defaultServiceId,
throw new Error("Service ID is not provided"); };
}
if (params.serviceId == null) {
registerService$$({ throw new Error("Service ID is not provided");
service, }
...params
}); registerService$$({
service,
...params,
});
} }
export interface HelloWorldDef { export interface HelloWorldDef {
hello: (str: string, callParams: ParticleContext$$) => string | Promise<string>; hello: (
str: string,
callParams: ParticleContext$$,
) => string | Promise<string>;
} }
export function registerHelloWorld(service: HelloWorldDef): void; export function registerHelloWorld(service: HelloWorldDef): void;
export function registerHelloWorld(serviceId: string, service: HelloWorldDef): void; export function registerHelloWorld(
export function registerHelloWorld(peer: IFluenceClient$$, service: HelloWorldDef): void; serviceId: string,
export function registerHelloWorld(peer: IFluenceClient$$, serviceId: string, service: HelloWorldDef): void; service: HelloWorldDef,
): void;
export function registerHelloWorld(
peer: IFluenceClient$$,
service: HelloWorldDef,
): void;
export function registerHelloWorld(
peer: IFluenceClient$$,
serviceId: string,
service: HelloWorldDef,
): void;
export function registerHelloWorld(...args: any[]) { export function registerHelloWorld(...args: any[]) {
const service = args.pop(); const service = args.pop();
const defaultServiceId = "hello-world"; const defaultServiceId = "hello-world";
const params = args[0] instanceof FluencePeer$$ ? ({
peer: args[0],
serviceId: args[1] ?? defaultServiceId
}) : ({
peer: undefined,
serviceId: args[0] ?? defaultServiceId
});
if (params.serviceId == null) {
throw new Error("Service ID is not provided");
}
registerService$$({
service,
...params
});
}
const params =
args[0] instanceof FluencePeer$$
? {
peer: args[0],
serviceId: args[1] ?? defaultServiceId,
}
: {
peer: undefined,
serviceId: args[0] ?? defaultServiceId,
};
if (params.serviceId == null) {
throw new Error("Service ID is not provided");
}
registerService$$({
service,
...params,
});
}
// Functions // Functions
export const resourceTest_script = ` export const resourceTest_script = `
@ -447,63 +495,62 @@ export const resourceTest_script = `
) )
`; `;
export type ResourceTestResult = [string | null, string[]] export type ResourceTestResult = [string | null, string[]];
export function resourceTest( export function resourceTest(
label: string, label: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<ResourceTestResult>; ): Promise<ResourceTestResult>;
export function resourceTest( export function resourceTest(
peer: IFluenceClient$$, peer: IFluenceClient$$,
label: string, label: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<ResourceTestResult>; ): Promise<ResourceTestResult>;
export async function resourceTest(...args: any[]) { export async function resourceTest(...args: any[]) {
const argNames = ["label"]; const argNames = ["label"];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: resourceTest_script, const result = await callFunction$$({
...params, script: resourceTest_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"items": [ items: [
{ {
"type": { type: {
"name": "string", name: "string",
"tag": "scalar" tag: "scalar",
},
"tag": "option"
}, },
{ tag: "option",
"type": { },
"name": "string", {
"tag": "scalar" type: {
}, name: "string",
"tag": "array" tag: "scalar",
} },
tag: "array",
},
], ],
"tag": "unlabeledProduct" tag: "unlabeledProduct",
} });
);
} }
export const helloTest_script = ` export const helloTest_script = `
@ -519,44 +566,41 @@ export const helloTest_script = `
) )
`; `;
export function helloTest( export function helloTest(config?: { ttl?: number }): Promise<string>;
config?: {ttl?: number}
): Promise<string>;
export function helloTest( export function helloTest(
peer: IFluenceClient$$, peer: IFluenceClient$$,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<string>; ): Promise<string>;
export async function helloTest(...args: any[]) { export async function helloTest(...args: any[]) {
const argNames = []; const argNames = [];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: helloTest_script, const result = await callFunction$$({
...params, script: helloTest_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"name": "string", name: "string",
"tag": "scalar" tag: "scalar",
} });
);
} }
export const callHappy_script = ` export const callHappy_script = `
@ -585,51 +629,50 @@ export const callHappy_script = `
`; `;
export function callHappy( export function callHappy(
a: string, a: string,
b: number, b: number,
c: number, c: number,
d: (arg0: string) => number | Promise<number>, d: (arg0: string) => number | Promise<number>,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export function callHappy( export function callHappy(
peer: IFluenceClient$$, peer: IFluenceClient$$,
a: string, a: string,
b: number, b: number,
c: number, c: number,
d: (arg0: string) => number | Promise<number>, d: (arg0: string) => number | Promise<number>,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export async function callHappy(...args: any[]) { export async function callHappy(...args: any[]) {
const argNames = ["a", "b", "c", "d"]; const argNames = ["a", "b", "c", "d"];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: callHappy_script, const result = await callFunction$$({
...params, script: callHappy_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"name": "f64", name: "f64",
"tag": "scalar" tag: "scalar",
} });
);
} }
export const demo_calculation_script = ` export const demo_calculation_script = `
@ -664,45 +707,44 @@ export const demo_calculation_script = `
`; `;
export function demo_calculation( export function demo_calculation(
service_id: string, service_id: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export function demo_calculation( export function demo_calculation(
peer: IFluenceClient$$, peer: IFluenceClient$$,
service_id: string, service_id: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export async function demo_calculation(...args: any[]) { export async function demo_calculation(...args: any[]) {
const argNames = ["service_id"]; const argNames = ["service_id"];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: demo_calculation_script, const result = await callFunction$$({
...params, script: demo_calculation_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"name": "f64", name: "f64",
"tag": "scalar" tag: "scalar",
} });
);
} }
export const marineTest_script = ` export const marineTest_script = `
@ -740,43 +782,42 @@ export const marineTest_script = `
`; `;
export function marineTest( export function marineTest(
wasm64: string, wasm64: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export function marineTest( export function marineTest(
peer: IFluenceClient$$, peer: IFluenceClient$$,
wasm64: string, wasm64: string,
config?: {ttl?: number} config?: { ttl?: number },
): Promise<number>; ): Promise<number>;
export async function marineTest(...args: any[]) { export async function marineTest(...args: any[]) {
const argNames = ["wasm64"]; const argNames = ["wasm64"];
const argCount = argNames.length; const argCount = argNames.length;
let peer = undefined; let peer = undefined;
if (args[0] instanceof FluencePeer$$) { if (args[0] instanceof FluencePeer$$) {
peer = args[0]; peer = args[0];
args = args.slice(1); args = args.slice(1);
} }
const callArgs = Object.fromEntries(
const callArgs = Object.fromEntries(args.slice(0, argCount).map((arg, i) => [argNames[i], arg])); args.slice(0, argCount).map((arg, i) => [argNames[i], arg]),
);
const params = ({
peer, const params = {
args: callArgs, peer,
config: args[argCount] args: callArgs,
}); config: args[argCount],
};
const result = await callFunction$$({
script: marineTest_script, const result = await callFunction$$({
...params, script: marineTest_script,
}); ...params,
});
return aqua2ts(result,
{ return aqua2ts(result, {
"name": "f64", name: "f64",
"tag": "scalar" tag: "scalar",
} });
);
} }

View File

@ -14,10 +14,10 @@
* limitations under the License. * limitations under the License.
*/ */
import { JSONValue, NonArrowType } from "@fluencelabs/interfaces"; import { JSONValue, NonArrowSimpleType } from "@fluencelabs/interfaces";
import { it, describe, expect, test } from "vitest"; import { it, describe, expect, test } from "vitest";
import { aqua2ts, ts2aqua } from "../conversions.js"; import { aqua2ts, ts2aqua } from "../converters.js";
const i32 = { tag: "scalar", name: "i32" } as const; const i32 = { tag: "scalar", name: "i32" } as const;
@ -172,7 +172,7 @@ const nestedStructs = [
interface ConversionTestArgs { interface ConversionTestArgs {
aqua: JSONValue; aqua: JSONValue;
ts: JSONValue; ts: JSONValue;
type: NonArrowType; type: NonArrowSimpleType;
} }
describe("Conversion from aqua to typescript", () => { describe("Conversion from aqua to typescript", () => {

View File

@ -68,11 +68,7 @@ export function ts2aqua(value, schema) {
if (schema.tag === "nil") { if (schema.tag === "nil") {
return null; return null;
} else if (schema.tag === "option") { } else if (schema.tag === "option") {
if (!Array.isArray(value)) { return value == null ? [] : [ts2aqua(value, schema.type)];
throw new Error("Bad schema");
}
return value === null ? [] : [ts2aqua(value, schema.type)];
} else if ( } else if (
schema.tag === "scalar" || schema.tag === "scalar" ||
schema.tag === "bottomType" || schema.tag === "bottomType" ||

View File

@ -55,7 +55,6 @@
"libp2p": "0.46.6", "libp2p": "0.46.6",
"multiformats": "11.0.1", "multiformats": "11.0.1",
"rxjs": "7.5.5", "rxjs": "7.5.5",
"ts-pattern": "3.3.3",
"uint8arrays": "4.0.3", "uint8arrays": "4.0.3",
"uuid": "8.3.2", "uuid": "8.3.2",
"zod": "3.22.4" "zod": "3.22.4"

View File

@ -15,17 +15,17 @@
*/ */
import { CallResultsArray } from "@fluencelabs/avm"; import { CallResultsArray } from "@fluencelabs/avm";
import { JSONValue } from "@fluencelabs/interfaces";
import { fromUint8Array, toUint8Array } from "js-base64"; import { fromUint8Array, toUint8Array } from "js-base64";
import { concat } from "uint8arrays/concat"; import { concat } from "uint8arrays/concat";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { z } from "zod"; import { z } from "zod";
import { ExpirationError } from "../jsPeer/errors.js";
import { KeyPair } from "../keypair/index.js"; import { KeyPair } from "../keypair/index.js";
import { numberToLittleEndianBytes } from "../util/bytes.js"; import { numberToLittleEndianBytes } from "../util/bytes.js";
import { IParticle } from "./interfaces.js"; import { IParticle } from "./interfaces.js";
import { JSONValue } from "@fluencelabs/interfaces";
import { ExpirationError } from "../jsPeer/errors.js";
const particleSchema = z.object({ const particleSchema = z.object({
id: z.string(), id: z.string(),

View File

@ -71,6 +71,7 @@ describe("Sig service test suite", () => {
}); });
const p = await peer.internals.createNewParticle(script); const p = await peer.internals.createNewParticle(script);
peer.internals.initiateParticle( peer.internals.initiateParticle(
p, p,
() => {}, () => {},

7
pnpm-lock.yaml generated
View File

@ -280,9 +280,6 @@ importers:
rxjs: rxjs:
specifier: 7.5.5 specifier: 7.5.5
version: 7.5.5 version: 7.5.5
ts-pattern:
specifier: 3.3.3
version: 3.3.3
uint8arrays: uint8arrays:
specifier: 4.0.3 specifier: 4.0.3
version: 4.0.3 version: 4.0.3
@ -14060,10 +14057,6 @@ packages:
yn: 3.1.1 yn: 3.1.1
dev: true dev: true
/ts-pattern@3.3.3:
resolution: {integrity: sha512-Z5EFi6g6wyX3uDFHqxF5W5c5h663oZg9O6aOiAT7fqNu0HPSfCxtHzrQ7SblTy738Mrg2Ezorky8H5aUOm8Pvg==}
dev: false
/ts-pattern@5.0.5: /ts-pattern@5.0.5:
resolution: {integrity: sha512-tL0w8U/pgaacOmkb9fRlYzWEUDCfVjjv9dD4wHTgZ61MjhuMt46VNWTG747NqW6vRzoWIKABVhFSOJ82FvXrfA==} resolution: {integrity: sha512-tL0w8U/pgaacOmkb9fRlYzWEUDCfVjjv9dD4wHTgZ61MjhuMt46VNWTG747NqW6vRzoWIKABVhFSOJ82FvXrfA==}
dev: true dev: true