From ec830bca7637ef4eeb5813c5aefd623defb60fc1 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Thu, 16 Nov 2023 21:16:03 +0700 Subject: [PATCH] Refactor --- packages/core/aqua-to-js/package.json | 2 + .../__test__/__snapshots__/generate.snap.d.ts | 45 ++++------------ .../__test__/__snapshots__/generate.snap.js | 1 + .../__test__/__snapshots__/generate.snap.ts | 53 +++++-------------- .../core/aqua-to-js/src/generate/function.ts | 9 ++-- .../aqua-to-js/src/generate/interfaces.ts | 28 +++++----- .../src/clientPeer/__test__/client.spec.ts | 2 +- .../src/compilerSupport/callFunction.ts | 6 +-- .../src/compilerSupport/registerService.ts | 12 +++-- .../core/js-client/src/jsPeer/FluencePeer.ts | 1 + .../core/js-client/src/services/NodeUtils.ts | 1 - .../js-client/src/services/SingleModuleSrv.ts | 4 +- .../src/services/_aqua/node-utils.ts | 4 +- .../js-client/src/services/_aqua/services.ts | 4 +- .../src/services/_aqua/single-module-srv.ts | 4 +- .../js-client/src/services/_aqua/tracing.ts | 9 ++-- pnpm-lock.yaml | 16 ++++++ 17 files changed, 86 insertions(+), 115 deletions(-) diff --git a/packages/core/aqua-to-js/package.json b/packages/core/aqua-to-js/package.json index 33cd1d42..474df3e8 100644 --- a/packages/core/aqua-to-js/package.json +++ b/packages/core/aqua-to-js/package.json @@ -23,6 +23,8 @@ "@fluencelabs/interfaces": "workspace:*", "@fluencelabs/js-client": "workspace:^", "@fluencelabs/registry": "0.8.7", + "@fluencelabs/spell": "0.5.20", + "@fluencelabs/trust-graph": "0.4.7", "vitest": "0.34.6", "zod": "3.22.4" } diff --git a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.d.ts b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.d.ts index cf538ef3..0795649f 100644 --- a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.d.ts +++ b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.d.ts @@ -11,6 +11,7 @@ */ import type { IFluenceClient as IFluenceClient$$, ParticleContext as ParticleContext$$ } from '@fluencelabs/js-client'; +// Making aliases to reduce chance of accidental name collision import { v5_callFunction as callFunction$$, v5_registerService as registerService$$, @@ -47,47 +48,21 @@ export function registerHelloWorld(peer: IFluenceClient$$, service: HelloWorldDe export function registerHelloWorld(peer: IFluenceClient$$, serviceId: string, service: HelloWorldDef): void; // Functions -export type ResourceTestResult = [string | null, string[]] +export type ResourceTestResultType = [string | null, string[]] -export function resourceTest( - label: string, - config?: {ttl?: number} -): Promise; +export type resourceTestParams = [label: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, label: string, config?: {ttl?: number}]; -export function resourceTest( - peer: IFluenceClient$$, - label: string, - config?: {ttl?: number} -): Promise; +export type ResourceTestResult = Promise; -export function helloTest( - config?: {ttl?: number} -): Promise; +export type helloTestParams = [config?: {ttl?: number}] | [peer: IFluenceClient$$, config?: {ttl?: number}]; -export function helloTest( - peer: IFluenceClient$$, - config?: {ttl?: number} -): Promise; +export type HelloTestResult = Promise; -export function demo_calculation( - service_id: string, - config?: {ttl?: number} -): Promise; +export type demo_calculationParams = [service_id: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, service_id: string, config?: {ttl?: number}]; -export function demo_calculation( - peer: IFluenceClient$$, - service_id: string, - config?: {ttl?: number} -): Promise; +export type Demo_calculationResult = Promise; -export function marineTest( - wasm64: string, - config?: {ttl?: number} -): Promise; +export type marineTestParams = [wasm64: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, wasm64: string, config?: {ttl?: number}]; -export function marineTest( - peer: IFluenceClient$$, - wasm64: string, - config?: {ttl?: number} -): Promise; +export type MarineTestResult = Promise; diff --git a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.js b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.js index b617eabc..2ab80eb2 100644 --- a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.js +++ b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.js @@ -11,6 +11,7 @@ */ +// Making aliases to reduce chance of accidental name collision import { v5_callFunction as callFunction$$, v5_registerService as registerService$$, diff --git a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.ts b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.ts index 94a30b81..e680d7c8 100644 --- a/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.ts +++ b/packages/core/aqua-to-js/src/generate/__test__/__snapshots__/generate.snap.ts @@ -11,6 +11,7 @@ */ import type { IFluenceClient as IFluenceClient$$, ParticleContext as ParticleContext$$ } from '@fluencelabs/js-client'; +// Making aliases to reduce chance of accidental name collision import { v5_callFunction as callFunction$$, v5_registerService as registerService$$, @@ -539,20 +540,13 @@ export const resourceTest_script = ` ) `; -export type ResourceTestResult = [string | null, string[]] +export type ResourceTestResultType = [string | null, string[]] -export function resourceTest( - label: string, - config?: {ttl?: number} -): Promise; +export type resourceTestParams = [label: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, label: string, config?: {ttl?: number}]; -export function resourceTest( - peer: IFluenceClient$$, - label: string, - config?: {ttl?: number} -): Promise; +export type ResourceTestResult = Promise; -export function resourceTest(...args: any[]) { +export function resourceTest(...args: resourceTestParams): ResourceTestResult { return callFunction$$( args, { @@ -615,16 +609,11 @@ export const helloTest_script = ` ) `; -export function helloTest( - config?: {ttl?: number} -): Promise; +export type helloTestParams = [config?: {ttl?: number}] | [peer: IFluenceClient$$, config?: {ttl?: number}]; -export function helloTest( - peer: IFluenceClient$$, - config?: {ttl?: number} -): Promise; +export type HelloTestResult = Promise; -export function helloTest(...args: any[]) { +export function helloTest(...args: helloTestParams): HelloTestResult { return callFunction$$( args, { @@ -690,18 +679,11 @@ export const demo_calculation_script = ` ) `; -export function demo_calculation( - service_id: string, - config?: {ttl?: number} -): Promise; +export type demo_calculationParams = [service_id: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, service_id: string, config?: {ttl?: number}]; -export function demo_calculation( - peer: IFluenceClient$$, - service_id: string, - config?: {ttl?: number} -): Promise; +export type Demo_calculationResult = Promise; -export function demo_calculation(...args: any[]) { +export function demo_calculation(...args: demo_calculationParams): Demo_calculationResult { return callFunction$$( args, { @@ -775,18 +757,11 @@ export const marineTest_script = ` ) `; -export function marineTest( - wasm64: string, - config?: {ttl?: number} -): Promise; +export type marineTestParams = [wasm64: string, config?: {ttl?: number}] | [peer: IFluenceClient$$, wasm64: string, config?: {ttl?: number}]; -export function marineTest( - peer: IFluenceClient$$, - wasm64: string, - config?: {ttl?: number} -): Promise; +export type MarineTestResult = Promise; -export function marineTest(...args: any[]) { +export function marineTest(...args: marineTestParams): MarineTestResult { return callFunction$$( args, { diff --git a/packages/core/aqua-to-js/src/generate/function.ts b/packages/core/aqua-to-js/src/generate/function.ts index 0eca8ab6..2aba865d 100644 --- a/packages/core/aqua-to-js/src/generate/function.ts +++ b/packages/core/aqua-to-js/src/generate/function.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { recursiveRenameLaquaProps } from "../utils.js"; +import { capitalize, recursiveRenameLaquaProps } from "../utils.js"; import { AquaFunction, TypeGenerator } from "./interfaces.js"; @@ -40,8 +40,11 @@ ${func.script}\`; ${typeGenerator.funcType(func)} export function ${func.funcDef.functionName}(${typeGenerator.type( "...args", - "any[]", - )}) { + `${func.funcDef.functionName}Params`, + )})${typeGenerator.type( + "", + `${capitalize(func.funcDef.functionName)}Result`, + )} { return callFunction$$( args, ${JSON.stringify(recursiveRenameLaquaProps(funcDef), null, 4)}, diff --git a/packages/core/aqua-to-js/src/generate/interfaces.ts b/packages/core/aqua-to-js/src/generate/interfaces.ts index 3a8c400a..7b46d5f8 100644 --- a/packages/core/aqua-to-js/src/generate/interfaces.ts +++ b/packages/core/aqua-to-js/src/generate/interfaces.ts @@ -56,7 +56,7 @@ export class TSTypeGenerator implements TypeGenerator { args.push([undefined, `config?: {ttl?: number}`]); const argsDefs = args.map(([, def]) => { - return " " + def; + return def; }); const argsDesc = args @@ -68,28 +68,28 @@ export class TSTypeGenerator implements TypeGenerator { }); const functionOverloads = [ - argsDefs.join(",\n"), - [` peer: ${CLIENT}`, ...argsDefs].join(",\n"), + argsDefs.join(", "), + [`peer: ${CLIENT}`, ...argsDefs].join(", "), ]; const [resTypeDesc, resType] = genTypeName( funcDef.arrow.codomain, - capitalize(funcDef.functionName) + "Result", + capitalize(funcDef.functionName) + "ResultType", ); + const functionOverloadArgsType = functionOverloads + .map((overload) => { + return `[${overload}]`; + }) + .join(" | "); + return [ argsDesc.join("\n"), resTypeDesc ?? "", - functionOverloads - .flatMap((fo) => { - return [ - `export function ${funcDef.functionName}(`, - fo, - `): Promise<${resType}>;`, - "", - ]; - }) - .join("\n"), + `export type ${funcDef.functionName}Params = ${functionOverloadArgsType};`, + `export type ${capitalize( + funcDef.functionName, + )}Result = Promise<${resType}>;\n`, ] .filter((s) => { return s !== ""; diff --git a/packages/core/js-client/src/clientPeer/__test__/client.spec.ts b/packages/core/js-client/src/clientPeer/__test__/client.spec.ts index dc6c548b..64fff82e 100644 --- a/packages/core/js-client/src/clientPeer/__test__/client.spec.ts +++ b/packages/core/js-client/src/clientPeer/__test__/client.spec.ts @@ -17,7 +17,7 @@ import { JSONValue } from "@fluencelabs/interfaces"; import { it, describe, expect } from "vitest"; -import { ExpirationError, SendError } from "../../jsPeer/errors.js"; +import { ExpirationError } from "../../jsPeer/errors.js"; import { CallServiceData } from "../../jsServiceHost/interfaces.js"; import { handleTimeout } from "../../particle/Particle.js"; import { registerHandlersHelper, withClient } from "../../util/testUtils.js"; diff --git a/packages/core/js-client/src/compilerSupport/callFunction.ts b/packages/core/js-client/src/compilerSupport/callFunction.ts index 7042fea8..cf1272cd 100644 --- a/packages/core/js-client/src/compilerSupport/callFunction.ts +++ b/packages/core/js-client/src/compilerSupport/callFunction.ts @@ -82,6 +82,9 @@ export const callAquaFunction = async ({ registerParticleScopeService(peer, particle, service); } + // If fireAndForget is enabled, then function call completed when one of the two conditions is met: + // 1. The particle is sent to the network + // 2. All CallRequests are executed, e.g., all variable loading and local function calls are completed if (!fireAndForget) { registerParticleScopeService(peer, particle, responseService(resolve)); } @@ -89,9 +92,6 @@ export const callAquaFunction = async ({ registerParticleScopeService(peer, particle, injectRelayService(peer)); registerParticleScopeService(peer, particle, errorHandlingService(reject)); - // If function is void, then it's completed when one of the two conditions is met: - // 1. The particle is sent to the network (state 'sent') - // 2. All CallRequests are executed, e.g., all variable loading and local function calls are completed (state 'localWorkDone') peer.internals.initiateParticle(particle, resolve, reject); }); diff --git a/packages/core/js-client/src/compilerSupport/registerService.ts b/packages/core/js-client/src/compilerSupport/registerService.ts index de1c6db6..1ed7740c 100644 --- a/packages/core/js-client/src/compilerSupport/registerService.ts +++ b/packages/core/js-client/src/compilerSupport/registerService.ts @@ -28,7 +28,9 @@ interface RegisterServiceArgs { service: ServiceImpl; } -const findAllPossibleServiceMethods = (service: ServiceImpl): Set => { +const findAllPossibleRegisteredServiceFunctions = ( + service: ServiceImpl, +): Set => { let prototype: Record = service; const serviceMethods = new Set(); @@ -60,17 +62,17 @@ export const registerService = ({ throw new Error("Service ID must be specified"); } - const serviceMethods = findAllPossibleServiceMethods(service); + const serviceFunctions = findAllPossibleRegisteredServiceFunctions(service); - for (const method of serviceMethods) { + for (const serviceFunction of serviceFunctions) { // The function has type of (arg1, arg2, arg3, ... , ParticleContext) => CallServiceResultType | void // Account for the fact that user service might be defined as a class - .bind(...) - const handler = service[method]; + const handler = service[serviceFunction]; const userDefinedHandler = handler.bind(service); const serviceDescription = userHandlerService( serviceId, - method, + serviceFunction, userDefinedHandler, ); diff --git a/packages/core/js-client/src/jsPeer/FluencePeer.ts b/packages/core/js-client/src/jsPeer/FluencePeer.ts index 3764e7bd..9d43bfc1 100644 --- a/packages/core/js-client/src/jsPeer/FluencePeer.ts +++ b/packages/core/js-client/src/jsPeer/FluencePeer.ts @@ -334,6 +334,7 @@ export abstract class FluencePeer { registerTracing(this, "tracingSrv", this._classServices.tracing); } + // TODO: too long, refactor private _startParticleProcessing() { this._particleSourceSubscription = this.connection.particleSource.subscribe( { diff --git a/packages/core/js-client/src/services/NodeUtils.ts b/packages/core/js-client/src/services/NodeUtils.ts index 1e017876..a5cdc015 100644 --- a/packages/core/js-client/src/services/NodeUtils.ts +++ b/packages/core/js-client/src/services/NodeUtils.ts @@ -41,7 +41,6 @@ export class NodeUtils { } try { - // Strange enough, but Buffer type works here, while reading with encoding 'utf-8' doesn't const data = await readFile(path, "base64"); return { diff --git a/packages/core/js-client/src/services/SingleModuleSrv.ts b/packages/core/js-client/src/services/SingleModuleSrv.ts index e75e2cda..822348b5 100644 --- a/packages/core/js-client/src/services/SingleModuleSrv.ts +++ b/packages/core/js-client/src/services/SingleModuleSrv.ts @@ -45,7 +45,7 @@ export class Srv { if (!this.securityGuard_create(callParams)) { return { success: false, - error: ["Security guard validation failed"], + error: ["Marine services could be registered on %init_peer_id% only"], service_id: null, }; } @@ -80,7 +80,7 @@ export class Srv { if (!this.securityGuard_remove(callParams)) { return { success: false, - error: ["Security guard validation failed"], + error: ["Marine services could be remove on %init_peer_id% only"], service_id: null, }; } diff --git a/packages/core/js-client/src/services/_aqua/node-utils.ts b/packages/core/js-client/src/services/_aqua/node-utils.ts index ebdd8d9f..a31f966a 100644 --- a/packages/core/js-client/src/services/_aqua/node-utils.ts +++ b/packages/core/js-client/src/services/_aqua/node-utils.ts @@ -23,11 +23,11 @@ export function registerNodeUtils( serviceId: string, service: NodeUtils, ) { - const anyService: Record = service; + const nodeUtilsService: Record = service; registerService({ peer, - service: anyService, + service: nodeUtilsService, serviceId, }); } diff --git a/packages/core/js-client/src/services/_aqua/services.ts b/packages/core/js-client/src/services/_aqua/services.ts index 1afce610..3a87d23e 100644 --- a/packages/core/js-client/src/services/_aqua/services.ts +++ b/packages/core/js-client/src/services/_aqua/services.ts @@ -45,11 +45,11 @@ export function registerSig( serviceId: string, service: Sig, ) { - const anyService: Record = service; + const sigService: Record = service; registerService({ peer, - service: anyService, + service: sigService, serviceId, }); } diff --git a/packages/core/js-client/src/services/_aqua/single-module-srv.ts b/packages/core/js-client/src/services/_aqua/single-module-srv.ts index a5443424..71b34ef5 100644 --- a/packages/core/js-client/src/services/_aqua/single-module-srv.ts +++ b/packages/core/js-client/src/services/_aqua/single-module-srv.ts @@ -23,12 +23,12 @@ export function registerSrv( serviceId: string, service: Srv, ) { - const anyService: Record = service; + const singleModuleService: Record = service; registerService({ peer, serviceId, - service: anyService, + service: singleModuleService, }); } diff --git a/packages/core/js-client/src/services/_aqua/tracing.ts b/packages/core/js-client/src/services/_aqua/tracing.ts index 67c010a8..96ce332e 100644 --- a/packages/core/js-client/src/services/_aqua/tracing.ts +++ b/packages/core/js-client/src/services/_aqua/tracing.ts @@ -19,7 +19,6 @@ */ import { registerService } from "../../compilerSupport/registerService.js"; -import { ServiceImpl } from "../../compilerSupport/types.js"; import { FluencePeer } from "../../jsPeer/FluencePeer.js"; import { ParticleContext } from "../../jsServiceHost/interfaces.js"; import { Tracing } from "../Tracing.js"; @@ -39,13 +38,11 @@ export function registerTracing( serviceId: string, service: Tracing, ) { + const tracingService: Record = service; + registerService({ peer, serviceId, - // TODO: fix this after changing registerService signature - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - service: service as unknown as ServiceImpl, + service: tracingService, }); } - -// Functions diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 084305ae..50e10803 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -181,6 +181,12 @@ importers: '@fluencelabs/registry': specifier: 0.8.7 version: 0.8.7 + '@fluencelabs/spell': + specifier: 0.5.20 + version: 0.5.20 + '@fluencelabs/trust-graph': + specifier: 0.4.7 + version: 0.4.7 vitest: specifier: 0.34.6 version: 0.34.6 @@ -3725,6 +3731,10 @@ packages: '@fluencelabs/trust-graph': 0.4.1 dev: true + /@fluencelabs/spell@0.5.20: + resolution: {integrity: sha512-QFbknWwALLUWMzpWkFt34McuwTz9xwQuiPP1zXqhPqVZ1J6g8F3gwHHtzgHFW5Z7WrRmwsL+IQtFJy8YZubhDw==} + dev: true + /@fluencelabs/threads@2.0.0: resolution: {integrity: sha512-dgYpZg55OcEmop1U3G2bFKEJXg2avjXWYfWsdPlkSbHOHguaRifvr5bgwIYTg1wxoPGcn0jegcjKKwrY0qrV+g==} dependencies: @@ -3744,6 +3754,12 @@ packages: '@fluencelabs/aqua-lib': 0.7.3 dev: true + /@fluencelabs/trust-graph@0.4.7: + resolution: {integrity: sha512-e4TxWimUh9GBWjqSO8WGsSqjZfyIs6f39/8Pzfo6PCcNoSf8FPaaO817Pw4FmAXYEKR1IalIUX3CDdym3NlHWw==} + dependencies: + '@fluencelabs/aqua-lib': 0.7.3 + dev: true + /@fluencelabs/trust-graph@3.1.2: resolution: {integrity: sha512-HpyHtiomh09wv6/83z+bhbkqVngIUdqNGEXRTIPg4sArVPMZ9UCXBrkQsHDRqdMUx0lBAcgB3IjlbdhkwHGaXA==} dependencies: