From fa077934a791e39ee6ad0b45f13569b689f995fb Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 00:00:25 +0400 Subject: [PATCH 01/13] Add ability to create multiple peers in the same JS engine instance --- packages/@tests/aqua/src/index.ts | 51 ++++++++++--------- .../api/src/compilerSupport/implementation.ts | 16 ++++-- packages/client/api/src/index.ts | 39 +++++++------- packages/client/api/src/util.ts | 23 +++++++-- packages/client/js-client.node/src/index.ts | 13 ++++- .../js-client.web.standalone/src/index.ts | 13 ++++- packages/core/interfaces/src/fluenceClient.ts | 39 +++++++------- .../src/compilerSupport/callFunction.ts | 11 ++-- .../src/compilerSupport/registerService.ts | 9 +--- .../core/js-peer/src/js-peer/FluencePeer.ts | 20 ++------ .../core/js-peer/src/js-peer/__test__/util.ts | 10 +++- .../js-peer/src/js-peer/_aqua/node-utils.ts | 2 +- .../js-peer/src/js-peer/_aqua/services.ts | 2 +- .../src/js-peer/_aqua/single-module-srv.ts | 2 +- .../core/js-peer/src/js-peer/_aqua/util.ts | 9 ++++ 15 files changed, 149 insertions(+), 110 deletions(-) create mode 100644 packages/core/js-peer/src/js-peer/_aqua/util.ts diff --git a/packages/@tests/aqua/src/index.ts b/packages/@tests/aqua/src/index.ts index 34daa1a90..23dbea4c7 100644 --- a/packages/@tests/aqua/src/index.ts +++ b/packages/@tests/aqua/src/index.ts @@ -19,32 +19,33 @@ const rndSk = () => { }; export const main = async () => { - console.log('starting fluence...'); - await Fluence.start({ - relay: relay, - // keyPair: { - // type: 'Ed25519', - // source: rndSk(), - // }, - }); - - console.log('started fluence'); - const p = await Fluence.getPeer(); - - console.log('my peer id: ', p.getStatus().peerId); - console.log('my sk id: ', fromByteArray(p.getSk())); - - console.log('running some aqua...'); - const [res, errors] = await smokeTest('my_resource'); - if (res === null) { - console.log('aqua failed, errors', errors); - } else { - console.log('aqua finished, result', res); + try { + console.log('connecting to Fluence Network...'); + await Fluence.connect(relay, { + // keyPair: { + // type: 'Ed25519', + // source: rndSk(), + // }, + }); + + console.log('connected'); + const p = await Fluence.getPeer(); + + console.log('my peer id: ', p.getStatus().peerId); + console.log('my sk id: ', fromByteArray(p.getSk())); + + console.log('running some aqua...'); + const [res, errors] = await smokeTest('my_resource'); + if (res === null) { + console.log('aqua failed, errors', errors); + } else { + console.log('aqua finished, result', res); + } + } finally { + console.log('disconnecting from Fluence Network...'); + await Fluence.disconnect(); + console.log('disconnected'); } - - console.log('stopping fluence...'); - await Fluence.stop(); - console.log('stopped fluence...'); }; export const runMain = () => { diff --git a/packages/client/api/src/compilerSupport/implementation.ts b/packages/client/api/src/compilerSupport/implementation.ts index 5d8dbad6d..fad691af1 100644 --- a/packages/client/api/src/compilerSupport/implementation.ts +++ b/packages/client/api/src/compilerSupport/implementation.ts @@ -19,7 +19,7 @@ import type { IFluenceClient } from '@fluencelabs/interfaces'; import { getArgumentTypes } from '@fluencelabs/interfaces'; import { isFluencePeer } from '@fluencelabs/interfaces'; -import { getDefaultPeer } from '../util.js'; +import { getFluenceInterface } from '../util.js'; /** * Convenience function to support Aqua `func` generation backend @@ -31,11 +31,13 @@ import { getDefaultPeer } from '../util.js'; */ export const callFunction = async (rawFnArgs: Array, def: FunctionCallDef, script: string): Promise => { const { args, peer, config } = await extractFunctionArgs(rawFnArgs, def); - return peer.compilerSupport.callFunction({ + const fluence = await getFluenceInterface(); + return fluence.callAquaFunction({ args, def, script, config: config || {}, + peer: peer, }); }; @@ -47,10 +49,12 @@ export const callFunction = async (rawFnArgs: Array, def: FunctionCallDef, */ export const registerService = async (args: any[], def: ServiceDef): Promise => { const { peer, service, serviceId } = await extractServiceArgs(args, def.defaultServiceId); - return peer.compilerSupport.registerService({ + const fluence = await getFluenceInterface(); + return fluence.registerServiceImpl({ def, service, serviceId, + peer, }); }; @@ -84,7 +88,8 @@ const extractFunctionArgs = async ( structuredArgs = args.slice(1, numberOfExpectedArgs + 1); config = args[numberOfExpectedArgs + 1]; } else { - peer = await getDefaultPeer(); + const fluence = await getFluenceInterface(); + peer = fluence.defaultPeer; structuredArgs = args.slice(0, numberOfExpectedArgs); config = args[numberOfExpectedArgs]; } @@ -124,7 +129,8 @@ const extractServiceArgs = async ( if (isFluencePeer(args[0])) { peer = args[0]; } else { - peer = await getDefaultPeer(); + const fluence = await getFluenceInterface(); + peer = fluence.defaultPeer; } if (typeof args[0] === 'string') { diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index 7e0d9ca22..f490541c5 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -1,5 +1,5 @@ -import { getDefaultPeer } from './util.js'; -import type { IFluenceClient, ClientOptions } from '@fluencelabs/interfaces'; +import { getFluenceInterface } from './util.js'; +import type { IFluenceClient, ClientOptions, RelayOptions } from '@fluencelabs/interfaces'; export type { IFluenceClient, ClientOptions, CallParams } from '@fluencelabs/interfaces'; export { @@ -30,33 +30,38 @@ export { } from './compilerSupport/implementation.js'; /** - * Public interface to Fluence JS + * Public interface to Fluence Network */ export const Fluence = { /** - * Initializes the default peer: starts the Aqua VM, initializes the default call service handlers - * and (optionally) connect to the Fluence network - * @param options - object specifying peer configuration + * Connect to the Fluence network + * @param relay - relay node to connect to + * @param options - client options */ - start: async (options?: ClientOptions): Promise => { - const peer = await getDefaultPeer(); - return peer.start(options); + connect: async (relay: RelayOptions, options?: ClientOptions): Promise => { + const fluence = await getFluenceInterface(); + return fluence.defaultPeer.start({ ...options, relay }); }, /** - * Un-initializes the default peer: stops all the underlying workflows, stops the Aqua VM - * and disconnects from the Fluence network + * Disconnect from the Fluence network */ - stop: async (): Promise => { - const peer = await getDefaultPeer(); - return peer.stop(); + disconnect: async (): Promise => { + const fluence = await getFluenceInterface(); + return fluence.defaultPeer.stop(); }, /** - * Get the default peer instance - * @returns the default peer instance + * Get the underlying Fluence Peer instance + * @returns Fluence Peer instance */ getPeer: async (): Promise => { - return getDefaultPeer(); + const fluence = await getFluenceInterface(); + return fluence.defaultPeer; }, }; + +export const DangerouslyCreateClient = async (): Promise => { + const fluence = await getFluenceInterface(); + return fluence.peerFactory(); +}; diff --git a/packages/client/api/src/util.ts b/packages/client/api/src/util.ts index e12a08747..d918b4db3 100644 --- a/packages/client/api/src/util.ts +++ b/packages/client/api/src/util.ts @@ -1,8 +1,15 @@ -import type { IFluenceClient } from '@fluencelabs/interfaces'; +import type { CallAquaFunction, IFluenceClient, RegisterService } from '@fluencelabs/interfaces'; -const getPeerFromGlobalThis = (): IFluenceClient | undefined => { +type PublicFluenceInterface = { + defaultPeer: IFluenceClient; + peerFactory: () => IFluenceClient; + callAquaFunction: CallAquaFunction; + registerServiceImpl: RegisterService; +}; + +const getFluenceInterfaceFromGlobalThis = (): PublicFluenceInterface | undefined => { // @ts-ignore - return globalThis.defaultPeer; + return globalThis.fluence; }; // TODO: DXJ-271 @@ -17,7 +24,13 @@ const POLL_PEER_INTERVAL = 100; /** * Wait until the js client script it loaded and return the default peer from globalThis */ -export const getDefaultPeer = (): Promise => { +export const getFluenceInterface = (): Promise => { + // If the script is already loaded, then return the value immediately + const optimisticResult = getFluenceInterfaceFromGlobalThis(); + if (optimisticResult) { + return Promise.resolve(optimisticResult); + } + return new Promise((resolve, reject) => { // This function is internal // Make it sure that would be zero way for unnecessary types @@ -30,7 +43,7 @@ export const getDefaultPeer = (): Promise => { reject(REJECT_MESSAGE); } - let res = getPeerFromGlobalThis(); + let res = getFluenceInterfaceFromGlobalThis(); if (res) { clearInterval(interval); resolve(res); diff --git a/packages/client/js-client.node/src/index.ts b/packages/client/js-client.node/src/index.ts index 6a881e0ba..6160267b7 100644 --- a/packages/client/js-client.node/src/index.ts +++ b/packages/client/js-client.node/src/index.ts @@ -1,6 +1,8 @@ import * as platform from 'platform'; import { FluencePeer } from '@fluencelabs/js-peer/dist/js-peer/FluencePeer.js'; +import { callAquaFunction } from '@fluencelabs/js-peer/dist/compilerSupport/callFunction.js'; +import { registerService } from '@fluencelabs/js-peer/dist/compilerSupport/registerService.js'; import { MarineBasedAvmRunner } from '@fluencelabs/js-peer/dist/js-peer/avm.js'; import { MarineBackgroundRunner } from '@fluencelabs/js-peer/dist/marine/worker/index.js'; import { marineLogFunction } from '@fluencelabs/js-peer/dist/js-peer/utils.js'; @@ -20,7 +22,7 @@ export const defaultNames = { }, }; -export const makeDefaultPeer = () => { +export const createPeer = () => { const workerLoader = new WorkerLoader(); const controlModuleLoader = new WasmLoaderFromNpm(defaultNames.marine.package, defaultNames.marine.file); const avmModuleLoader = new WasmLoaderFromNpm(defaultNames.avm.package, defaultNames.avm.file); @@ -30,8 +32,15 @@ export const makeDefaultPeer = () => { return new FluencePeer(marine, avm); }; +const publicFluenceInterface = { + peerFactory: createPeer, + defaultPeer: createPeer(), + callAquaFunction, + registerService, +}; + // @ts-ignore -globalThis.defaultPeer = makeDefaultPeer(); +globalThis.fluence = publicFluenceInterface; function throwIfNotSupported() { if (platform.name === 'Node.js' && platform.version) { diff --git a/packages/client/js-client.web.standalone/src/index.ts b/packages/client/js-client.web.standalone/src/index.ts index 6e4fd7693..f35317a76 100644 --- a/packages/client/js-client.web.standalone/src/index.ts +++ b/packages/client/js-client.web.standalone/src/index.ts @@ -1,10 +1,12 @@ import { FluencePeer } from '@fluencelabs/js-peer/dist/js-peer/FluencePeer.js'; +import { callAquaFunction } from '@fluencelabs/js-peer/dist/compilerSupport/callFunction.js'; +import { registerService } from '@fluencelabs/js-peer/dist/compilerSupport/registerService.js'; import { MarineBasedAvmRunner } from '@fluencelabs/js-peer/dist/js-peer/avm.js'; import { MarineBackgroundRunner } from '@fluencelabs/js-peer/dist/marine/worker'; import { checkConnection, marineLogFunction } from '@fluencelabs/js-peer/dist/js-peer/utils.js'; import { InlinedWorkerLoader, InlinedWasmLoader } from '@fluencelabs/js-peer/dist/marine/deps-loader/common.js'; -export const makeDefaultPeer = () => { +const createPeer = () => { const workerLoader = new InlinedWorkerLoader('___worker___'); const controlModuleLoader = new InlinedWasmLoader('___marine___'); const avmModuleLoader = new InlinedWasmLoader('___avm___'); @@ -14,5 +16,12 @@ export const makeDefaultPeer = () => { return new FluencePeer(marine, avm); }; +const publicFluenceInterface = { + peerFactory: createPeer, + defaultPeer: createPeer(), + callAquaFunction, + registerService, +}; + // @ts-ignore -globalThis.defaultPeer = makeDefaultPeer(); +globalThis.fluence = publicFluenceInterface; diff --git a/packages/core/interfaces/src/fluenceClient.ts b/packages/core/interfaces/src/fluenceClient.ts index 193e02601..05e047da4 100644 --- a/packages/core/interfaces/src/fluenceClient.ts +++ b/packages/core/interfaces/src/fluenceClient.ts @@ -53,6 +53,14 @@ type Node = { }; // TODO: either drop support for this exact type or get it back + +/** + * A node in Fluence network a client can connect to. + * Can be in the form of: + * - string: multiaddr in string format + * - Multiaddr: multiaddr object, @see https://github.com/multiformats/js-multiaddr + * - Node: node structure, @see Node + */ export type RelayOptions = string | /* MultiaddrInput | */ Node; export type KeyTypes = 'RSA' | 'Ed25519' | 'secp256k1'; @@ -66,17 +74,6 @@ export type KeyPairOptions = { * Configuration used when initiating Fluence Client */ export interface ClientOptions { - /** - * Node in Fluence network to connect to. - * Can be in the form of: - * - string: multiaddr in string format - * - Multiaddr: multiaddr object, @see https://github.com/multiformats/js-multiaddr - * - Node: node structure, @see Node - * - Implementation of FluenceConnection class, @see FluenceConnection - * If not specified the will work locally and would not be able to send or receive particles. - */ - relay?: RelayOptions; - /** * Specify the KeyPair to be used to identify the Fluence Peer. * Will be generated randomly if not specified @@ -157,11 +154,13 @@ export type PeerStatus = relayPeerId: null; }; +export type FluenceStartConfig = ClientOptions & { relay: RelayOptions }; + export interface IFluenceClient { /** * Get the peer's status */ - start(config?: ClientOptions): Promise; + start(config: FluenceStartConfig): Promise; /** * Un-initializes the peer: stops all the underlying workflows, stops the Aqua VM and disconnects from the Fluence network @@ -185,25 +184,31 @@ export interface IFluenceClient { internals: any; // TODO: extract this out of Client interface - compilerSupport: { - callFunction: (args: CallFunctionArgs) => Promise; - registerService: (args: RegisterServiceArgs) => void; - }; + // compilerSupport: { + // callFunction: (args: CallFunctionArgs) => Promise; + // registerService: (args: RegisterServiceArgs) => void; + // }; } -export interface CallFunctionArgs { +export interface CallAquaFunctionArgs { def: FunctionCallDef; script: string; config: FnConfig; + peer: IFluenceClient; args: { [key: string]: any }; } +export type CallAquaFunction = (args: CallAquaFunctionArgs) => Promise; + export interface RegisterServiceArgs { + peer: IFluenceClient; def: ServiceDef; serviceId: string | undefined; service: any; } +export type RegisterService = (args: RegisterServiceArgs) => void; + export const asFluencePeer = (fluencePeerCandidate: unknown): IFluenceClient => { if (isFluencePeer(fluencePeerCandidate)) { return fluencePeerCandidate; diff --git a/packages/core/js-peer/src/compilerSupport/callFunction.ts b/packages/core/js-peer/src/compilerSupport/callFunction.ts index 4421d6ae7..bd5adefea 100644 --- a/packages/core/js-peer/src/compilerSupport/callFunction.ts +++ b/packages/core/js-peer/src/compilerSupport/callFunction.ts @@ -6,6 +6,7 @@ import { getArgumentTypes, isReturnTypeVoid, IFluenceClient, + CallAquaFunction, } from '@fluencelabs/interfaces'; import { @@ -29,13 +30,7 @@ import { * @param args - args in the form of JSON where each key corresponds to the name of the argument * @returns */ -export function callFunctionImpl( - def: FunctionCallDef, - script: string, - config: FnConfig, - peer: IFluenceClient, - args: { [key: string]: any }, -): Promise { +export const callAquaFunction: CallAquaFunction = ({ def, script, config, peer, args }) => { const argumentTypes = getArgumentTypes(def); const promise = new Promise((resolve, reject) => { @@ -87,4 +82,4 @@ export function callFunctionImpl( }); return promise; -} +}; diff --git a/packages/core/js-peer/src/compilerSupport/registerService.ts b/packages/core/js-peer/src/compilerSupport/registerService.ts index c478bf28b..1f3af36ac 100644 --- a/packages/core/js-peer/src/compilerSupport/registerService.ts +++ b/packages/core/js-peer/src/compilerSupport/registerService.ts @@ -1,12 +1,7 @@ -import type { IFluenceClient, ServiceDef } from '@fluencelabs/interfaces'; +import type { RegisterService } from '@fluencelabs/interfaces'; import { registerGlobalService, userHandlerService } from './services.js'; -export const registerServiceImpl = ( - peer: IFluenceClient, - def: ServiceDef, - serviceId: string | undefined, - service: any, -) => { +export const registerService: RegisterService = ({ peer, def, serviceId, service }) => { // TODO: TBH service registration is just putting some stuff into a hashmap // there should not be such a check at all if (!peer.getStatus().isInitialized) { diff --git a/packages/core/js-peer/src/js-peer/FluencePeer.ts b/packages/core/js-peer/src/js-peer/FluencePeer.ts index 458495d74..46cb4c353 100644 --- a/packages/core/js-peer/src/js-peer/FluencePeer.ts +++ b/packages/core/js-peer/src/js-peer/FluencePeer.ts @@ -28,11 +28,9 @@ import type { PeerIdB58, IFluenceClient, PeerStatus, - CallFunctionArgs, - RegisterServiceArgs, - ClientOptions, KeyPairOptions, RelayOptions, + ClientOptions, } from '@fluencelabs/interfaces/dist/fluenceClient'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle.js'; import { dataToString, jsonify, isString, ServiceError } from './utils.js'; @@ -49,12 +47,10 @@ import { LogLevel } from '@fluencelabs/marine-js/dist/types'; import { NodeUtils, Srv } from './builtins/SingleModuleSrv.js'; import { registerNodeUtils } from './_aqua/node-utils.js'; import type { MultiaddrInput } from '@multiformats/multiaddr'; -import { callFunctionImpl } from '../compilerSupport/callFunction.js'; -import { registerServiceImpl } from '../compilerSupport/registerService.js'; const DEFAULT_TTL = 7000; -export type PeerConfig = ClientOptions; +export type PeerConfig = ClientOptions & { relay?: RelayOptions }; /** * This class implements the Fluence protocol for javascript-based environments. @@ -132,7 +128,7 @@ export class FluencePeer implements IFluenceClient { const keyPair = await makeKeyPair(config.keyPair); await this.init(config, keyPair); - const conn = await configToConnection(keyPair, config?.relay, config?.connectionOptions?.dialTimeoutMs); + const conn = await configToConnection(keyPair, config.relay, config.connectionOptions?.dialTimeoutMs); if (conn !== null) { await this.connect(conn); @@ -195,16 +191,6 @@ export class FluencePeer implements IFluenceClient { } // internal api - get compilerSupport() { - return { - callFunction: (args: CallFunctionArgs): Promise => { - return callFunctionImpl(args.def, args.script, args.config, this, args.args); - }, - registerService: (args: RegisterServiceArgs): void => { - return registerServiceImpl(this, args.def, args.serviceId, args.service); - }, - }; - } /** * @private Is not intended to be used manually. Subject to change diff --git a/packages/core/js-peer/src/js-peer/__test__/util.ts b/packages/core/js-peer/src/js-peer/__test__/util.ts index 09a8b2b60..8d9d80715 100644 --- a/packages/core/js-peer/src/js-peer/__test__/util.ts +++ b/packages/core/js-peer/src/js-peer/__test__/util.ts @@ -6,7 +6,7 @@ import { Particle } from '../Particle.js'; import { MakeServiceCall } from '../utils.js'; import { avmModuleLoader, controlModuleLoader } from '../utilsForNode.js'; import { ServiceDef } from '@fluencelabs/interfaces'; -import { callFunctionImpl } from '../../compilerSupport/callFunction.js'; +import { callAquaFunction } from '../../compilerSupport/callFunction.js'; import { marineLogFunction } from '../utils.js'; import { MarineBackgroundRunner } from '../../marine/worker/index.js'; @@ -40,7 +40,13 @@ export const compileAqua = async (aquaFile: string): Promise => { const functions = Object.entries(compilationResult.functions) .map(([name, fnInfo]) => { const callFn = (peer: FluencePeer, args: { [key: string]: any }) => { - return callFunctionImpl(fnInfo.funcDef, fnInfo.script, {}, peer, args); + return callAquaFunction({ + def: fnInfo.funcDef, + script: fnInfo.script, + config: {}, + peer: peer, + args, + }); }; return { [name]: callFn }; }) diff --git a/packages/core/js-peer/src/js-peer/_aqua/node-utils.ts b/packages/core/js-peer/src/js-peer/_aqua/node-utils.ts index a0dfe971d..0208f4365 100644 --- a/packages/core/js-peer/src/js-peer/_aqua/node-utils.ts +++ b/packages/core/js-peer/src/js-peer/_aqua/node-utils.ts @@ -7,7 +7,7 @@ * */ import { CallParams } from '@fluencelabs/interfaces'; -import { registerServiceImpl } from '../../compilerSupport/registerService.js'; +import { registerServiceImpl } from './util.js'; import { FluencePeer } from '../FluencePeer.js'; // Services diff --git a/packages/core/js-peer/src/js-peer/_aqua/services.ts b/packages/core/js-peer/src/js-peer/_aqua/services.ts index 1f797cd96..33b3e9616 100644 --- a/packages/core/js-peer/src/js-peer/_aqua/services.ts +++ b/packages/core/js-peer/src/js-peer/_aqua/services.ts @@ -7,7 +7,7 @@ * */ import { CallParams } from '@fluencelabs/interfaces'; -import { registerServiceImpl } from '../../compilerSupport/registerService.js'; +import { registerServiceImpl } from './util.js'; import { FluencePeer } from '../FluencePeer.js'; // Services diff --git a/packages/core/js-peer/src/js-peer/_aqua/single-module-srv.ts b/packages/core/js-peer/src/js-peer/_aqua/single-module-srv.ts index e5eb69814..f08240432 100644 --- a/packages/core/js-peer/src/js-peer/_aqua/single-module-srv.ts +++ b/packages/core/js-peer/src/js-peer/_aqua/single-module-srv.ts @@ -7,7 +7,7 @@ * */ import { CallParams } from '@fluencelabs/interfaces'; -import { registerServiceImpl } from '../../compilerSupport/registerService.js'; +import { registerServiceImpl } from './util.js'; import { FluencePeer } from '../FluencePeer.js'; // Services diff --git a/packages/core/js-peer/src/js-peer/_aqua/util.ts b/packages/core/js-peer/src/js-peer/_aqua/util.ts new file mode 100644 index 000000000..492882739 --- /dev/null +++ b/packages/core/js-peer/src/js-peer/_aqua/util.ts @@ -0,0 +1,9 @@ +import { IFluenceClient, ServiceDef } from '@fluencelabs/interfaces'; +import { registerService } from '../../compilerSupport/registerService.js'; + +export const registerServiceImpl = ( + peer: IFluenceClient, + def: ServiceDef, + serviceId: string | undefined, + service: any, +) => registerService({ peer, def, service, serviceId }); From 19486c48140e5ef959c31ad4d5fa46043a07bf3f Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 00:03:37 +0400 Subject: [PATCH 02/13] remove forgotten comment --- packages/core/interfaces/src/fluenceClient.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/core/interfaces/src/fluenceClient.ts b/packages/core/interfaces/src/fluenceClient.ts index 05e047da4..b0c08e617 100644 --- a/packages/core/interfaces/src/fluenceClient.ts +++ b/packages/core/interfaces/src/fluenceClient.ts @@ -182,12 +182,6 @@ export interface IFluenceClient { // - particle initialization // - service registration internals: any; - - // TODO: extract this out of Client interface - // compilerSupport: { - // callFunction: (args: CallFunctionArgs) => Promise; - // registerService: (args: RegisterServiceArgs) => void; - // }; } export interface CallAquaFunctionArgs { From 0a6980ef2a87e2a12e1d04024ce3dc401cd3c6e4 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 01:42:40 +0400 Subject: [PATCH 03/13] Simplify connection state API --- packages/@tests/aqua/src/index.ts | 6 +- .../api/src/compilerSupport/implementation.ts | 15 +++++ packages/client/api/src/index.ts | 26 +++++++- packages/client/api/src/util.ts | 2 +- packages/core/interfaces/src/fluenceClient.ts | 46 +++++-------- .../src/compilerSupport/registerService.ts | 8 --- .../js-peer/src/compilerSupport/services.ts | 2 +- .../core/js-peer/src/js-peer/FluencePeer.ts | 64 +++++++++++++++++-- 8 files changed, 116 insertions(+), 53 deletions(-) diff --git a/packages/@tests/aqua/src/index.ts b/packages/@tests/aqua/src/index.ts index 23dbea4c7..bb0aaac2f 100644 --- a/packages/@tests/aqua/src/index.ts +++ b/packages/@tests/aqua/src/index.ts @@ -20,6 +20,8 @@ const rndSk = () => { export const main = async () => { try { + Fluence.onConnectionStateChange((state) => console.info('connection state changed: ', state)); + console.log('connecting to Fluence Network...'); await Fluence.connect(relay, { // keyPair: { @@ -31,8 +33,8 @@ export const main = async () => { console.log('connected'); const p = await Fluence.getPeer(); - console.log('my peer id: ', p.getStatus().peerId); - console.log('my sk id: ', fromByteArray(p.getSk())); + console.log('my peer id: ', p.getPeerId()); + console.log('my sk id: ', fromByteArray(p.getPeerSecretKey())); console.log('running some aqua...'); const [res, errors] = await smokeTest('my_resource'); diff --git a/packages/client/api/src/compilerSupport/implementation.ts b/packages/client/api/src/compilerSupport/implementation.ts index fad691af1..e26e48faf 100644 --- a/packages/client/api/src/compilerSupport/implementation.ts +++ b/packages/client/api/src/compilerSupport/implementation.ts @@ -31,6 +31,12 @@ import { getFluenceInterface } from '../util.js'; */ export const callFunction = async (rawFnArgs: Array, def: FunctionCallDef, script: string): Promise => { const { args, peer, config } = await extractFunctionArgs(rawFnArgs, def); + if (peer.internals.getConnectionState() !== 'connected') { + throw new Error( + 'Could not call the Aqua function because client is disconnected. Did you forget to call Fluence.connect()?', + ); + } + const fluence = await getFluenceInterface(); return fluence.callAquaFunction({ args, @@ -49,6 +55,15 @@ export const callFunction = async (rawFnArgs: Array, def: FunctionCallDef, */ export const registerService = async (args: any[], def: ServiceDef): Promise => { const { peer, service, serviceId } = await extractServiceArgs(args, def.defaultServiceId); + + // TODO: TBH service registration is just putting some stuff into a hashmap + // there should not be such a check at all + if (peer.internals.getConnectionState() !== 'connected') { + throw new Error( + 'Could not register Aqua service because client is disconnected. Did you forget to call Fluence.connect()?', + ); + } + const fluence = await getFluenceInterface(); return fluence.registerServiceImpl({ def, diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index f490541c5..dfaecb005 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -1,5 +1,11 @@ -import { getFluenceInterface } from './util.js'; -import type { IFluenceClient, ClientOptions, RelayOptions } from '@fluencelabs/interfaces'; +import { getFluenceInterface, getFluenceInterfaceFromGlobalThis } from './util.js'; +import { + IFluenceClient, + ClientOptions, + RelayOptions, + ConnectionState, + ConnectionStates, +} from '@fluencelabs/interfaces'; export type { IFluenceClient, ClientOptions, CallParams } from '@fluencelabs/interfaces'; export { @@ -52,7 +58,21 @@ export const Fluence = { }, /** - * Get the underlying Fluence Peer instance + * Handle connection state changes. Immediately returns the current connection state + */ + onConnectionStateChange(handler: (state: ConnectionState) => void): ConnectionState { + const optimisticResult = getFluenceInterfaceFromGlobalThis(); + if (optimisticResult) { + return optimisticResult.defaultPeer.onConnectionStateChange(handler); + } + + getFluenceInterface().then((fluence) => fluence.defaultPeer.onConnectionStateChange(handler)); + + return 'disconnected'; + }, + + /** + * Get the underlying Fluence Peer instance which holds the connection to the network * @returns Fluence Peer instance */ getPeer: async (): Promise => { diff --git a/packages/client/api/src/util.ts b/packages/client/api/src/util.ts index d918b4db3..43164e35d 100644 --- a/packages/client/api/src/util.ts +++ b/packages/client/api/src/util.ts @@ -7,7 +7,7 @@ type PublicFluenceInterface = { registerServiceImpl: RegisterService; }; -const getFluenceInterfaceFromGlobalThis = (): PublicFluenceInterface | undefined => { +export const getFluenceInterfaceFromGlobalThis = (): PublicFluenceInterface | undefined => { // @ts-ignore return globalThis.fluence; }; diff --git a/packages/core/interfaces/src/fluenceClient.ts b/packages/core/interfaces/src/fluenceClient.ts index b0c08e617..35a0bda9e 100644 --- a/packages/core/interfaces/src/fluenceClient.ts +++ b/packages/core/interfaces/src/fluenceClient.ts @@ -127,35 +127,11 @@ export interface ClientOptions { * - `relayPeerId`: Peer Id of the relay the peer is connected to. If the connection is direct relayPeerId is null * - `isDirect`: True if the peer is connected to the network directly (not through relay) */ -export type PeerStatus = - | { - isInitialized: false; - peerId: null; - isConnected: false; - relayPeerId: null; - } - | { - isInitialized: true; - peerId: PeerIdB58; - isConnected: false; - relayPeerId: null; - } - | { - isInitialized: true; - peerId: PeerIdB58; - isConnected: true; - relayPeerId: PeerIdB58; - } - | { - isInitialized: true; - peerId: PeerIdB58; - isConnected: true; - isDirect: true; - relayPeerId: null; - }; - export type FluenceStartConfig = ClientOptions & { relay: RelayOptions }; +export const ConnectionStates = ['disconnected', 'connecting', 'connected', 'disconnecting'] as const; +export type ConnectionState = typeof ConnectionStates[number]; + export interface IFluenceClient { /** * Get the peer's status @@ -168,19 +144,27 @@ export interface IFluenceClient { stop(): Promise; /** - * Get the peer's status + * Handle connection state changes. Immediately returns current connection state + */ + onConnectionStateChange(handler: (state: ConnectionState) => void): ConnectionState; + + /** + * Return peers secret key as byte array. */ - getStatus(): PeerStatus; + getPeerSecretKey(): Uint8Array; /** - * Return peers SK + * Return peers public key as a base58 string (multihash/CIDv0). */ - getSk(): Uint8Array; + getPeerId(): string; // TODO: come up with a working interface for // - particle creation // - particle initialization // - service registration + /** + * For internal use only. Do not call directly + */ internals: any; } diff --git a/packages/core/js-peer/src/compilerSupport/registerService.ts b/packages/core/js-peer/src/compilerSupport/registerService.ts index 1f3af36ac..0581ff2aa 100644 --- a/packages/core/js-peer/src/compilerSupport/registerService.ts +++ b/packages/core/js-peer/src/compilerSupport/registerService.ts @@ -2,14 +2,6 @@ import type { RegisterService } from '@fluencelabs/interfaces'; import { registerGlobalService, userHandlerService } from './services.js'; export const registerService: RegisterService = ({ peer, def, serviceId, service }) => { - // TODO: TBH service registration is just putting some stuff into a hashmap - // there should not be such a check at all - if (!peer.getStatus().isInitialized) { - throw new Error( - 'Could not register the service because the peer is not initialized. Are you passing the wrong peer to the register function?', - ); - } - // Checking for missing keys const requiredKeys = def.functions.tag === 'nil' ? [] : Object.keys(def.functions.fields); const incorrectServiceDefinitions = requiredKeys.filter((f) => !(f in service)); diff --git a/packages/core/js-peer/src/compilerSupport/services.ts b/packages/core/js-peer/src/compilerSupport/services.ts index 322789991..f71b506da 100644 --- a/packages/core/js-peer/src/compilerSupport/services.ts +++ b/packages/core/js-peer/src/compilerSupport/services.ts @@ -30,7 +30,7 @@ export const injectRelayService = (def: FunctionCallDef, peer: IFluenceClient) = handler: () => { return { retCode: ResultCodes.success, - result: peer.getStatus().relayPeerId, + result: peer.internals.getRelayPeerId(), }; }, }; diff --git a/packages/core/js-peer/src/js-peer/FluencePeer.ts b/packages/core/js-peer/src/js-peer/FluencePeer.ts index 46cb4c353..20800b6f8 100644 --- a/packages/core/js-peer/src/js-peer/FluencePeer.ts +++ b/packages/core/js-peer/src/js-peer/FluencePeer.ts @@ -27,10 +27,10 @@ import { import type { PeerIdB58, IFluenceClient, - PeerStatus, KeyPairOptions, RelayOptions, ClientOptions, + ConnectionState, } from '@fluencelabs/interfaces/dist/fluenceClient'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle.js'; import { dataToString, jsonify, isString, ServiceError } from './utils.js'; @@ -52,11 +52,41 @@ const DEFAULT_TTL = 7000; export type PeerConfig = ClientOptions & { relay?: RelayOptions }; +type PeerStatus = + | { + isInitialized: false; + peerId: null; + isConnected: false; + relayPeerId: null; + } + | { + isInitialized: true; + peerId: PeerIdB58; + isConnected: false; + relayPeerId: null; + } + | { + isInitialized: true; + peerId: PeerIdB58; + isConnected: true; + relayPeerId: PeerIdB58; + } + | { + isInitialized: true; + peerId: PeerIdB58; + isConnected: true; + isDirect: true; + relayPeerId: null; + }; + /** * This class implements the Fluence protocol for javascript-based environments. * It provides all the necessary features to communicate with Fluence network */ export class FluencePeer implements IFluenceClient { + connectionState: ConnectionState = 'disconnected'; + connectionStateChangeHandler: (state: ConnectionState) => void = () => {}; + constructor(private marine: IMarine, private avmRunner: IAvmRunner) {} /** @@ -68,10 +98,10 @@ export class FluencePeer implements IFluenceClient { __isFluenceAwesome = true; /** - * Get the peer's status + * TODO: remove this from here. Switch to `ConnectionState` instead + * @deprecated */ getStatus(): PeerStatus { - // TODO:: use explicit mechanism for peer's state if (this._keyPair === undefined) { return { isInitialized: false, @@ -108,10 +138,11 @@ export class FluencePeer implements IFluenceClient { }; } - /** - * Return peers SK - */ - getSk(): Uint8Array { + getPeerId(): string { + return this.getStatus().peerId!; + } + + getPeerSecretKey(): Uint8Array { if (!this._keyPair) { throw new Error("Can't get key pair: peer is not initialized"); } @@ -119,12 +150,19 @@ export class FluencePeer implements IFluenceClient { return this._keyPair.toEd25519PrivateKey(); } + onConnectionStateChange(handler: (state: ConnectionState) => void): ConnectionState { + this.connectionStateChangeHandler = handler; + + return this.connectionState; + } + /** * Initializes the peer: starts the Aqua VM, initializes the default call service handlers * and (optionally) connect to the Fluence network * @param config - object specifying peer configuration */ async start(config: PeerConfig = {}): Promise { + this.changeConnectionState('connecting'); const keyPair = await makeKeyPair(config.keyPair); await this.init(config, keyPair); @@ -133,6 +171,7 @@ export class FluencePeer implements IFluenceClient { if (conn !== null) { await this.connect(conn); } + this.changeConnectionState('connected'); } getServices() { @@ -178,6 +217,7 @@ export class FluencePeer implements IFluenceClient { * and disconnects from the Fluence network */ async stop() { + this.changeConnectionState('disconnecting'); this._keyPair = undefined; // This will set peer to non-initialized state and stop particle processing this._stopParticleProcessing(); await this.disconnect(); @@ -188,6 +228,7 @@ export class FluencePeer implements IFluenceClient { this._particleSpecificHandlers.clear(); this._commonHandlers.clear(); this._marineServices.clear(); + this.changeConnectionState('disconnected'); } // internal api @@ -197,6 +238,10 @@ export class FluencePeer implements IFluenceClient { */ get internals() { return { + getConnectionState: () => this.connectionState, + + getRelayPeerId: () => this.getStatus().relayPeerId, + parseAst: async (air: string): Promise<{ success: boolean; data: any }> => { const status = this.getStatus(); @@ -356,6 +401,11 @@ export class FluencePeer implements IFluenceClient { // private + private changeConnectionState(state: ConnectionState) { + this.connectionState = state; + this.connectionStateChangeHandler(state); + } + // Queues for incoming and outgoing particles private _incomingParticles = new Subject(); From a50c6cabcf1ccdba1e8756889ac21e570c227aff Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 02:11:32 +0400 Subject: [PATCH 04/13] Get rid of crypto stuff in the test --- packages/@tests/aqua/src/index.ts | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/@tests/aqua/src/index.ts b/packages/@tests/aqua/src/index.ts index bb0aaac2f..86fb91050 100644 --- a/packages/@tests/aqua/src/index.ts +++ b/packages/@tests/aqua/src/index.ts @@ -10,12 +10,21 @@ import { smokeTest } from './_aqua/smoke_test.js'; const relay = krasnodar[4]; -const rndSk = () => { - // if (getRandomValues) { - // return getRandomValues(new Uint8Array(32)); - // } - // @ts-ignore - // return globalThis.crypto.webcrypto.getRandomValues(new Uint8Array(32)); +function generateRandomUint8Array() { + const uint8Array = new Uint8Array(32); + for (let i = 0; i < uint8Array.length; i++) { + uint8Array[i] = Math.floor(Math.random() * 256); + } + return uint8Array; +} + +const optsWithRandomKeyPair = () => { + return { + keyPair: { + type: 'Ed25519', + source: generateRandomUint8Array(), + }, + } as const; }; export const main = async () => { @@ -23,12 +32,7 @@ export const main = async () => { Fluence.onConnectionStateChange((state) => console.info('connection state changed: ', state)); console.log('connecting to Fluence Network...'); - await Fluence.connect(relay, { - // keyPair: { - // type: 'Ed25519', - // source: rndSk(), - // }, - }); + await Fluence.connect(relay, optsWithRandomKeyPair()); console.log('connected'); const p = await Fluence.getPeer(); From 77d5c894208ab3d0b2336ec0546e31f6f1c9c5c8 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 03:19:26 +0400 Subject: [PATCH 05/13] Align API between different entities --- packages/client/api/src/index.ts | 4 ++-- packages/core/interfaces/src/fluenceClient.ts | 20 +++++----------- .../core/js-peer/src/js-peer/FluencePeer.ts | 24 +++++++++++++++---- .../core/js-peer/src/js-peer/ephemeral.ts | 4 ++-- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index dfaecb005..a480fb257 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -46,7 +46,7 @@ export const Fluence = { */ connect: async (relay: RelayOptions, options?: ClientOptions): Promise => { const fluence = await getFluenceInterface(); - return fluence.defaultPeer.start({ ...options, relay }); + return fluence.defaultPeer.connect(relay, options); }, /** @@ -54,7 +54,7 @@ export const Fluence = { */ disconnect: async (): Promise => { const fluence = await getFluenceInterface(); - return fluence.defaultPeer.stop(); + return fluence.defaultPeer.disconnect(); }, /** diff --git a/packages/core/interfaces/src/fluenceClient.ts b/packages/core/interfaces/src/fluenceClient.ts index 35a0bda9e..928d1fc7e 100644 --- a/packages/core/interfaces/src/fluenceClient.ts +++ b/packages/core/interfaces/src/fluenceClient.ts @@ -85,7 +85,6 @@ export interface ClientOptions { * When the peer established the connection to the network it sends a ping-like message to check if it works correctly. * The options allows to specify the timeout for that message in milliseconds. * If not specified the default timeout will be used - CallParams, */ skipCheckConnection?: boolean; @@ -118,15 +117,6 @@ export interface ClientOptions { }; } -/** - * Information about Fluence Peer connection. - * Represented as object with the following keys: - * - `isInitialized`: Is the peer initialized or not. - * - `peerId`: Peer Id of the peer. Null if the peer is not initialized - * - `isConnected`: Is the peer connected to network or not - * - `relayPeerId`: Peer Id of the relay the peer is connected to. If the connection is direct relayPeerId is null - * - `isDirect`: True if the peer is connected to the network directly (not through relay) - */ export type FluenceStartConfig = ClientOptions & { relay: RelayOptions }; export const ConnectionStates = ['disconnected', 'connecting', 'connected', 'disconnecting'] as const; @@ -134,14 +124,16 @@ export type ConnectionState = typeof ConnectionStates[number]; export interface IFluenceClient { /** - * Get the peer's status + * Connect to the Fluence network + * @param relay - relay node to connect to + * @param options - client options */ - start(config: FluenceStartConfig): Promise; + connect: (relay: RelayOptions, options?: ClientOptions) => Promise; /** - * Un-initializes the peer: stops all the underlying workflows, stops the Aqua VM and disconnects from the Fluence network + * Disconnect from the Fluence network */ - stop(): Promise; + disconnect(): Promise; /** * Handle connection state changes. Immediately returns current connection state diff --git a/packages/core/js-peer/src/js-peer/FluencePeer.ts b/packages/core/js-peer/src/js-peer/FluencePeer.ts index 20800b6f8..bf8dac004 100644 --- a/packages/core/js-peer/src/js-peer/FluencePeer.ts +++ b/packages/core/js-peer/src/js-peer/FluencePeer.ts @@ -156,6 +156,22 @@ export class FluencePeer implements IFluenceClient { return this.connectionState; } + /** + * Connect to the Fluence network + * @param relay - relay node to connect to + * @param options - client options + */ + async connect(relay: RelayOptions, options?: ClientOptions): Promise { + return this.start({ relay, ...options }); + } + + /** + * Disconnect from the Fluence network + */ + disconnect(): Promise { + return this.stop(); + } + /** * Initializes the peer: starts the Aqua VM, initializes the default call service handlers * and (optionally) connect to the Fluence network @@ -169,7 +185,7 @@ export class FluencePeer implements IFluenceClient { const conn = await configToConnection(keyPair, config.relay, config.connectionOptions?.dialTimeoutMs); if (conn !== null) { - await this.connect(conn); + await this._connect(conn); } this.changeConnectionState('connected'); } @@ -220,7 +236,7 @@ export class FluencePeer implements IFluenceClient { this.changeConnectionState('disconnecting'); this._keyPair = undefined; // This will set peer to non-initialized state and stop particle processing this._stopParticleProcessing(); - await this.disconnect(); + await this._disconnect(); await this.marine.stop(); await this.avmRunner.stop(); this._classServices = undefined; @@ -383,7 +399,7 @@ export class FluencePeer implements IFluenceClient { /** * @private Subject to change. Do not use this method directly */ - async connect(connection: FluenceConnection): Promise { + async _connect(connection: FluenceConnection): Promise { if (this.connection) { await this.connection.disconnect(); } @@ -395,7 +411,7 @@ export class FluencePeer implements IFluenceClient { /** * @private Subject to change. Do not use this method directly */ - async disconnect(): Promise { + async _disconnect(): Promise { await this.connection?.disconnect(); } diff --git a/packages/core/js-peer/src/js-peer/ephemeral.ts b/packages/core/js-peer/src/js-peer/ephemeral.ts index 1488dbd98..2b6e7cb5a 100644 --- a/packages/core/js-peer/src/js-peer/ephemeral.ts +++ b/packages/core/js-peer/src/js-peer/ephemeral.ts @@ -157,7 +157,7 @@ export class EphemeralNetwork { sendParticle = sendParticle; }; - await peer.connect(new connectionCtor()); + await peer._connect(new connectionCtor()); const peerId = peer.getStatus().peerId!; const ephPeer: PeerAdapter = { @@ -181,7 +181,7 @@ export class EphemeralNetwork { log.debug('Shutting down ephemeral network...'); const peers = Array.from(this._peers.entries()); const promises = peers.map(([k, p]) => { - return p.isEphemeral ? p.peer.stop() : p.peer.disconnect(); + return p.isEphemeral ? p.peer.stop() : p.peer._disconnect(); }); await Promise.all(promises); this._peers.clear(); From f46d9d2a2debfa4de5acd327f89ddf2ebda490b5 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 12:03:51 +0400 Subject: [PATCH 06/13] fix tests --- packages/@tests/aqua/package.json | 2 +- .../@tests/frameworks/cra-ts/package.json | 4 +- packages/@tests/smoke_node/package.json | 6 +- packages/@tests/smoke_web/package.json | 2 +- pnpm-lock.yaml | 335 ++++++++++++------ 5 files changed, 233 insertions(+), 116 deletions(-) diff --git a/packages/@tests/aqua/package.json b/packages/@tests/aqua/package.json index f3e02467d..f5697d461 100644 --- a/packages/@tests/aqua/package.json +++ b/packages/@tests/aqua/package.json @@ -17,7 +17,7 @@ "author": "Fluence Labs", "license": "Apache-2.0", "dependencies": { - "@fluencelabs/js-client.api": "workspace:*", + "@fluencelabs/js-client.api": "workspace:^", "@fluencelabs/fluence-network-environment": "1.0.13", "base64-js": "1.5.1" }, diff --git a/packages/@tests/frameworks/cra-ts/package.json b/packages/@tests/frameworks/cra-ts/package.json index abc786636..455abc766 100644 --- a/packages/@tests/frameworks/cra-ts/package.json +++ b/packages/@tests/frameworks/cra-ts/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@fluencelabs/js-client.api": "workspace:*", - "@test/aqua_for_test": "workspace:*", + "@fluencelabs/js-client.api": "workspace:^", + "@test/aqua_for_test": "workspace:^", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "13.4.0", "@testing-library/user-event": "13.5.0", diff --git a/packages/@tests/smoke_node/package.json b/packages/@tests/smoke_node/package.json index 69c723acb..7e4903f13 100644 --- a/packages/@tests/smoke_node/package.json +++ b/packages/@tests/smoke_node/package.json @@ -17,9 +17,9 @@ "author": "Fluence Labs", "license": "Apache-2.0", "dependencies": { - "@fluencelabs/js-client.api": "workspace:*", - "@fluencelabs/js-client.node": "workspace:*", - "@test/aqua_for_test": "workspace:*" + "@fluencelabs/js-client.api": "workspace:^", + "@fluencelabs/js-client.node": "workspace:^", + "@test/aqua_for_test": "workspace:^" }, "devDependencies": {} } diff --git a/packages/@tests/smoke_web/package.json b/packages/@tests/smoke_web/package.json index fba2f4d85..d2bf3aa8d 100644 --- a/packages/@tests/smoke_web/package.json +++ b/packages/@tests/smoke_web/package.json @@ -18,7 +18,7 @@ "license": "Apache-2.0", "dependencies": {}, "devDependencies": { - "@fluencelabs/js-client.web.standalone": "workspace:*", + "@fluencelabs/js-client.web.standalone": "workspace:^", "http-server": "14.1.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc7398123..88100bb0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,21 +22,21 @@ importers: specifiers: '@fluencelabs/aqua': 0.9.4 '@fluencelabs/fluence-network-environment': 1.0.13 - '@fluencelabs/js-client.api': workspace:* + '@fluencelabs/js-client.api': workspace:^ '@fluencelabs/registry': 0.7.0 base64-js: 1.5.1 dependencies: '@fluencelabs/fluence-network-environment': 1.0.13 - '@fluencelabs/js-client.api': 0.10.0 + '@fluencelabs/js-client.api': link:../../client/api base64-js: 1.5.1 devDependencies: - '@fluencelabs/aqua': 0.9.4_jaxubti5gf66xc76fsqhxmuwn4 + '@fluencelabs/aqua': 0.9.4_sxyfz5frysr7cnkewysdljfvwu '@fluencelabs/registry': 0.7.0 packages/@tests/frameworks/cra-ts: specifiers: - '@fluencelabs/js-client.api': workspace:* - '@test/aqua_for_test': workspace:* + '@fluencelabs/js-client.api': workspace:^ + '@test/aqua_for_test': workspace:^ '@testing-library/jest-dom': 5.16.5 '@testing-library/react': 13.4.0 '@testing-library/user-event': 13.5.0 @@ -50,7 +50,7 @@ importers: typescript: 4.9.5 web-vitals: 2.1.4 dependencies: - '@fluencelabs/js-client.api': 0.10.0 + '@fluencelabs/js-client.api': link:../../../client/api '@test/aqua_for_test': link:../../aqua '@testing-library/jest-dom': 5.16.5 '@testing-library/react': 13.4.0_biqbaboplfbrettd7655fr4n2y @@ -67,17 +67,17 @@ importers: packages/@tests/smoke_node: specifiers: - '@fluencelabs/js-client.api': workspace:* - '@fluencelabs/js-client.node': workspace:* - '@test/aqua_for_test': workspace:* + '@fluencelabs/js-client.api': workspace:^ + '@fluencelabs/js-client.node': workspace:^ + '@test/aqua_for_test': workspace:^ dependencies: - '@fluencelabs/js-client.api': 0.10.0 - '@fluencelabs/js-client.node': 0.5.0_uint8arraylist@2.4.3 + '@fluencelabs/js-client.api': link:../../client/api + '@fluencelabs/js-client.node': link:../../client/js-client.node '@test/aqua_for_test': link:../aqua packages/@tests/smoke_web: specifiers: - '@fluencelabs/js-client.web.standalone': workspace:* + '@fluencelabs/js-client.web.standalone': workspace:^ http-server: 14.1.1 devDependencies: '@fluencelabs/js-client.web.standalone': link:../../client/js-client.web.standalone @@ -141,10 +141,10 @@ importers: '@types/node': 16.11.59 jest: 28.1.0_@types+node@16.11.59 js-base64: 3.7.2 - ts-jest: 28.0.2_byf75w6xilfwy3ncjzlldwxox4 + ts-jest: 28.0.2_m4pn7vsromlf5ffrouypoapnnq vite: 4.0.4_@types+node@16.11.59 vite-plugin-replace: 0.1.1_vite@4.0.4 - vite-tsconfig-paths: 4.0.3_trrwuuiz4f5khno7hdf3cjz2ky + vite-tsconfig-paths: 4.0.3_egung5nfepmolqa7uavvqho3gq packages/client/tools: specifiers: @@ -233,7 +233,7 @@ importers: uint8arrays: 4.0.3 uuid: 8.3.2 devDependencies: - '@fluencelabs/aqua': 0.7.7-362_cgl6iwuyfzkj3bzihtpi7yfmsi + '@fluencelabs/aqua': 0.7.7-362_4ybkoodcah37urerzfcwvnjsoe '@fluencelabs/aqua-api': 0.9.1-373 '@fluencelabs/aqua-lib': 0.6.0 '@fluencelabs/fluence-network-environment': 1.0.13 @@ -241,7 +241,7 @@ importers: '@types/jest': 29.4.0 '@types/uuid': 8.3.2 jest: 29.4.1 - ts-jest: 29.0.5_knhdxpg4pvwuf6vrybjt5d2q5i + ts-jest: 29.0.5_ecv55cdbauq6znr7ci2lzguwra packages: @@ -2037,13 +2037,13 @@ packages: resolution: {integrity: sha512-ifjtCM93KO3LhzPkMxqmXhwLmrg/scjOiyTihEVg7ns5N+BVzaK1eWzdOdqGdl9ZVoah43pdlQUepEo7VdRmsw==} dev: true - /@fluencelabs/aqua/0.7.7-362_cgl6iwuyfzkj3bzihtpi7yfmsi: + /@fluencelabs/aqua/0.7.7-362_4ybkoodcah37urerzfcwvnjsoe: resolution: {integrity: sha512-CwvBc3wKQdvnDM4Zxj6yFE5MR2oeh+EZ++m2hLvENt7OWl3cnZVR4cJQkRxMMLVT0MxRwLiy97UIBwGsPqlSCA==} hasBin: true dependencies: '@fluencelabs/aqua-ipfs': 0.5.5 '@fluencelabs/aqua-lib': 0.5.2 - '@fluencelabs/fluence': 0.26.3-snapshot-4_cgl6iwuyfzkj3bzihtpi7yfmsi + '@fluencelabs/fluence': 0.26.3-snapshot-4_4ybkoodcah37urerzfcwvnjsoe '@fluencelabs/fluence-network-environment': 1.0.13 ipfs-http-client: 50.1.2_node-fetch@3.3.0 transitivePeerDependencies: @@ -2083,13 +2083,13 @@ packages: - utf-8-validate dev: true - /@fluencelabs/aqua/0.9.4_jaxubti5gf66xc76fsqhxmuwn4: + /@fluencelabs/aqua/0.9.4_sxyfz5frysr7cnkewysdljfvwu: resolution: {integrity: sha512-DAy2XT4E4oR4Imgsc9ns8jd14StwxktHcZe3MTaZT1PDo3KdbrXda5MBGWFiuqhZcB/Xr4EruCvH/LscrsKlQg==} hasBin: true dependencies: '@fluencelabs/aqua-ipfs': 0.5.8 '@fluencelabs/aqua-lib': 0.6.0 - '@fluencelabs/fluence': 0.28.0_jaxubti5gf66xc76fsqhxmuwn4 + '@fluencelabs/fluence': 0.28.0_sxyfz5frysr7cnkewysdljfvwu '@fluencelabs/fluence-network-environment': 1.0.13 ipfs-http-client: 50.1.2_node-fetch@3.3.0 transitivePeerDependencies: @@ -2149,7 +2149,7 @@ packages: /@fluencelabs/fluence-network-environment/1.0.13: resolution: {integrity: sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==} - /@fluencelabs/fluence/0.26.3-snapshot-4_cgl6iwuyfzkj3bzihtpi7yfmsi: + /@fluencelabs/fluence/0.26.3-snapshot-4_4ybkoodcah37urerzfcwvnjsoe: resolution: {integrity: sha512-M/iQhnViXfMaATj3gFPQXrZe9zSVcyN9F9A9hfJBUn0VLamhmbfeIoSZeheK8VGBxYbRGcrtoqLPTy1vJQVgVw==} engines: {node: '>=10', pnpm: '>=3'} hasBin: true @@ -2158,7 +2158,7 @@ packages: '@fluencelabs/connection': 0.2.0_node-fetch@3.3.0 '@fluencelabs/interfaces': 0.1.0 '@fluencelabs/keypair': 0.2.0 - '@fluencelabs/marine-js': 0.3.18_2g5e7lwqsvuxdxojhdo55sfvve + '@fluencelabs/marine-js': 0.3.18_ddylxr3wxksmlyjpihqkkowegi async: 3.2.3 base64-js: 1.5.1 browser-or-node: 2.1.1 @@ -2223,7 +2223,7 @@ packages: - utf-8-validate dev: true - /@fluencelabs/fluence/0.28.0_jaxubti5gf66xc76fsqhxmuwn4: + /@fluencelabs/fluence/0.28.0_sxyfz5frysr7cnkewysdljfvwu: resolution: {integrity: sha512-SXb2vjTj8m/nw4jEILV0tu9VIFprGo8mNb2nOB5btxdsOI8GzQZkpGzTLrSd/+UagIo2GdxAu0GhBP8dxZXaqg==} engines: {node: '>=10', pnpm: '>=3'} hasBin: true @@ -2232,7 +2232,7 @@ packages: '@fluencelabs/connection': 0.2.0_node-fetch@3.3.0 '@fluencelabs/interfaces': 0.1.0 '@fluencelabs/keypair': 0.2.0 - '@fluencelabs/marine-js': 0.3.37_g4n3hsjlbmz4ag5o32ytojordu + '@fluencelabs/marine-js': 0.3.37_cnngzrja2umb46xxazlucyx2qu async: 3.2.4 base64-js: 1.5.1 browser-or-node: 2.0.0 @@ -2265,78 +2265,6 @@ packages: engines: {node: '>=10', pnpm: '>=3'} dev: true - /@fluencelabs/interfaces/0.5.0: - resolution: {integrity: sha512-L3bukC3eYog82cEANAg+K7OS7CQxWvFRcdItWVZkW+Bz49uDALdkBD8Isgyl94MTKElK5i5kCiwyrxYoNmHBfA==} - engines: {node: '>=10', pnpm: '>=3'} - dev: false - - /@fluencelabs/interfaces/0.6.0: - resolution: {integrity: sha512-WK3TbFJQ9lXW6PU4aeBj1ZY5cuRG/nd765F6aoA1+SfQk+zrC9D4t1hxOkv7kpI6Msuop0Rt3cJH2tBjlvGKrQ==} - engines: {node: '>=10', pnpm: '>=3'} - dev: false - - /@fluencelabs/js-client.api/0.10.0: - resolution: {integrity: sha512-MHMKW1/Jp8FuPib7c1DqNDxJNm7HHrW0Wm3Wqzu9RaXymmjlq9iz1sbWXFzpcHR7GvTKa97XlbSPIBUG1vUoLA==} - engines: {node: '>=10', pnpm: '>=3'} - dependencies: - '@fluencelabs/interfaces': 0.5.0 - dev: false - - /@fluencelabs/js-client.node/0.5.0_uint8arraylist@2.4.3: - resolution: {integrity: sha512-H5qqTZzauB9eLVjEtiBBhaO2bTMH+ESHogKF9jcCvDHyCyhCK19xgl6POz73dmWLBRpxYgR+5XNkNs5LS0ocvQ==} - engines: {node: '>=10', pnpm: '>=3'} - dependencies: - '@fluencelabs/avm': 0.35.4 - '@fluencelabs/js-peer': 0.7.0_uint8arraylist@2.4.3 - '@fluencelabs/marine-js': 0.3.45 - platform: 1.3.6 - transitivePeerDependencies: - - bufferutil - - supports-color - - uint8arraylist - - utf-8-validate - dev: false - - /@fluencelabs/js-peer/0.7.0_uint8arraylist@2.4.3: - resolution: {integrity: sha512-TB+jw2jv33DxJl0NAGfgPJaHlARruJy7QHumANPQG1NZsFPz5KiY4OnHEPFPgQFZLa1KvKzsm5ABOg1vEXzycQ==} - engines: {node: '>=10', pnpm: '>=3'} - dependencies: - '@chainsafe/libp2p-noise': 11.0.0 - '@fluencelabs/avm': 0.35.4 - '@fluencelabs/interfaces': 0.6.0 - '@fluencelabs/marine-js': 0.3.45 - '@libp2p/crypto': 1.0.8_uint8arraylist@2.4.3 - '@libp2p/interface-connection': 3.0.8 - '@libp2p/interface-keys': 1.0.7 - '@libp2p/interface-peer-id': 2.0.1 - '@libp2p/interfaces': 3.3.1 - '@libp2p/mplex': 7.1.1 - '@libp2p/peer-id': 2.0.1 - '@libp2p/peer-id-factory': 2.0.1 - '@libp2p/websockets': 5.0.3 - '@multiformats/multiaddr': 11.3.0 - async: 3.2.4 - bs58: 5.0.0 - buffer: 6.0.3 - it-length-prefixed: 8.0.4 - it-map: 2.0.0 - it-pipe: 2.0.5 - js-base64: 3.7.2 - libp2p: 0.42.2 - loglevel: 1.8.1 - multiformats: 11.0.1 - rxjs: 7.5.5 - threads: 1.7.0 - ts-pattern: 3.3.3 - uint8arrays: 4.0.3 - uuid: 8.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - uint8arraylist - - utf-8-validate - dev: false - /@fluencelabs/keypair/0.2.0: resolution: {integrity: sha512-sNFvoeefSa0Xa/xzzLwWBXPMB4y/vHEFh3BaA6FCGNPwbtN0pje9rd8AOgSP9fjlTPpxy3TuBI+eAIzBk5b+SQ==} engines: {node: '>=10', pnpm: '>=3'} @@ -2346,7 +2274,7 @@ packages: peer-id: 0.16.0 dev: true - /@fluencelabs/marine-js/0.3.18_2g5e7lwqsvuxdxojhdo55sfvve: + /@fluencelabs/marine-js/0.3.18_ddylxr3wxksmlyjpihqkkowegi: resolution: {integrity: sha512-aNuGtyY910kJvtRwfqmZKjVs+1l3LVWShv5xvkY04faHm65nX3sZLe8UHwughdja/4ixV1IFKlaTUgw2u3Sf5A==} dependencies: '@wasmer/wasi': 0.12.0 @@ -2354,7 +2282,26 @@ packages: browser-or-node: 2.1.1 buffer: 6.0.3 threads: 1.7.0 - ts-jest: 27.1.5_2g5e7lwqsvuxdxojhdo55sfvve + ts-jest: 27.1.5_ddylxr3wxksmlyjpihqkkowegi + transitivePeerDependencies: + - '@babel/core' + - '@types/jest' + - babel-jest + - esbuild + - jest + - supports-color + - typescript + dev: true + + /@fluencelabs/marine-js/0.3.37_cnngzrja2umb46xxazlucyx2qu: + resolution: {integrity: sha512-/Kpu3S+aDOfrOpKBAK1VeWSHKCoD36/dxtHEWHbj3Lsro0GB9zkoaZPHlFFL7rorCB+hyjAJqLDuBGI8f3l/qg==} + dependencies: + '@wasmer/wasi': 0.12.0 + '@wasmer/wasmfs': 0.12.0 + browser-or-node: 2.0.0 + buffer: 6.0.3 + threads: 1.7.0 + ts-jest: 27.1.5_cnngzrja2umb46xxazlucyx2qu transitivePeerDependencies: - '@babel/core' - '@types/jest' @@ -2516,6 +2463,51 @@ packages: - ts-node - utf-8-validate + /@jest/core/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.13.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 27.5.1 + jest-config: 27.5.1_ts-node@10.9.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /@jest/core/28.1.3: resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -9183,6 +9175,36 @@ packages: - ts-node - utf-8-validate + /jest-cli/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@10.9.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 27.5.1_ts-node@10.9.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-cli/28.1.3_@types+node@16.11.59: resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -9278,6 +9300,47 @@ packages: - supports-color - utf-8-validate + /jest-config/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.12 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.20.12 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.0 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_j777nnsruz44drbtesvg2fqc7y + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-config/28.1.3_@types+node@16.11.59: resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -10359,6 +10422,27 @@ packages: - ts-node - utf-8-validate + /jest/27.5.1_ts-node@10.9.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1_ts-node@10.9.1 + import-local: 3.1.0 + jest-cli: 27.5.1_ts-node@10.9.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest/28.1.0_@types+node@16.11.59: resolution: {integrity: sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -14461,7 +14545,40 @@ packages: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} dev: false - /ts-jest/27.1.5_2g5e7lwqsvuxdxojhdo55sfvve: + /ts-jest/27.1.5_cnngzrja2umb46xxazlucyx2qu: + resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1 + jest-util: 27.5.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 4.9.5 + yargs-parser: 20.2.9 + dev: true + + /ts-jest/27.1.5_ddylxr3wxksmlyjpihqkkowegi: resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -14492,7 +14609,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.7.4 + typescript: 4.9.5 yargs-parser: 20.2.9 dev: true @@ -14519,7 +14636,7 @@ packages: dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1 + jest: 27.5.1_ts-node@10.9.1 jest-util: 27.5.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -14529,7 +14646,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-jest/28.0.2_byf75w6xilfwy3ncjzlldwxox4: + /ts-jest/28.0.2_m4pn7vsromlf5ffrouypoapnnq: resolution: {integrity: sha512-IOZMb3D0gx6IHO9ywPgiQxJ3Zl4ECylEFwoVpENB55aTn5sdO0Ptyx/7noNBxAaUff708RqQL4XBNxxOVjY0vQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -14560,11 +14677,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.7.4 + typescript: 4.9.5 yargs-parser: 20.2.9 dev: true - /ts-jest/29.0.5_knhdxpg4pvwuf6vrybjt5d2q5i: + /ts-jest/29.0.5_ecv55cdbauq6znr7ci2lzguwra: resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -14594,7 +14711,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.7.4 + typescript: 4.9.5 yargs-parser: 21.1.1 dev: true @@ -14632,7 +14749,7 @@ packages: /ts-pattern/3.3.3: resolution: {integrity: sha512-Z5EFi6g6wyX3uDFHqxF5W5c5h663oZg9O6aOiAT7fqNu0HPSfCxtHzrQ7SblTy738Mrg2Ezorky8H5aUOm8Pvg==} - /tsconfck/2.0.2_typescript@4.7.4: + /tsconfck/2.0.2_typescript@4.9.5: resolution: {integrity: sha512-H3DWlwKpow+GpVLm/2cpmok72pwRr1YFROV3YzAmvzfGFiC1zEM/mc9b7+1XnrxuXtEbhJ7xUSIqjPFbedp7aQ==} engines: {node: ^14.13.1 || ^16 || >=18, pnpm: ^7.18.0} hasBin: true @@ -14642,7 +14759,7 @@ packages: typescript: optional: true dependencies: - typescript: 4.7.4 + typescript: 4.9.5 dev: true /tsconfig-paths/3.14.1: @@ -14969,14 +15086,14 @@ packages: vite: 4.0.4_@types+node@16.11.59 dev: true - /vite-tsconfig-paths/4.0.3_trrwuuiz4f5khno7hdf3cjz2ky: + /vite-tsconfig-paths/4.0.3_egung5nfepmolqa7uavvqho3gq: resolution: {integrity: sha512-gRO2Q/tOkV+9kMht5tz90+IaEKvW2zCnvwJV3tp2ruPNZOTM5rF+yXorJT4ggmAMYEaJ3nyXjx5P5jY5FwiZ+A==} peerDependencies: vite: '>2.0.0-0' dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.0.2_typescript@4.7.4 + tsconfck: 2.0.2_typescript@4.9.5 vite: 4.0.4_@types+node@16.11.59 transitivePeerDependencies: - supports-color From 4fa85c4c612e6b800478eedd690e58355f6f6fb6 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 13:25:52 +0400 Subject: [PATCH 07/13] DangerouslyCreateClient -> dangerouslyCreateClient --- packages/client/api/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index a480fb257..bc6447fba 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -81,7 +81,7 @@ export const Fluence = { }, }; -export const DangerouslyCreateClient = async (): Promise => { +export const dangerouslyCreateClient = async (): Promise => { const fluence = await getFluenceInterface(); return fluence.peerFactory(); }; From 96ab65a5313e5d57b963d71f9f58d04d4858a54e Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 13:29:01 +0400 Subject: [PATCH 08/13] fixes --- packages/client/api/src/index.ts | 6 +++--- packages/client/api/src/util.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index bc6447fba..a051c5739 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -72,10 +72,10 @@ export const Fluence = { }, /** - * Get the underlying Fluence Peer instance which holds the connection to the network - * @returns Fluence Peer instance + * Get the underlying client instance which holds the connection to the network + * @returns IFluenceClient instance */ - getPeer: async (): Promise => { + getClient: async (): Promise => { const fluence = await getFluenceInterface(); return fluence.defaultPeer; }, diff --git a/packages/client/api/src/util.ts b/packages/client/api/src/util.ts index 43164e35d..0eadc0462 100644 --- a/packages/client/api/src/util.ts +++ b/packages/client/api/src/util.ts @@ -4,7 +4,7 @@ type PublicFluenceInterface = { defaultPeer: IFluenceClient; peerFactory: () => IFluenceClient; callAquaFunction: CallAquaFunction; - registerServiceImpl: RegisterService; + registerService: RegisterService; }; export const getFluenceInterfaceFromGlobalThis = (): PublicFluenceInterface | undefined => { From 0c3749edfa40643992a6a150cf3dfe7389cdc981 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 13:41:20 +0400 Subject: [PATCH 09/13] rename peer -> client in api --- packages/@tests/aqua/package.json | 2 +- packages/@tests/aqua/src/index.ts | 10 +++++----- .../client/api/src/compilerSupport/implementation.ts | 12 ++++++------ packages/client/api/src/index.ts | 12 ++++++------ packages/client/api/src/util.ts | 4 ++-- packages/client/js-client.node/src/index.ts | 8 ++++---- .../client/js-client.web.standalone/src/index.ts | 6 +++--- pnpm-lock.yaml | 9 +++++++-- 8 files changed, 34 insertions(+), 29 deletions(-) diff --git a/packages/@tests/aqua/package.json b/packages/@tests/aqua/package.json index f5697d461..d95f271fe 100644 --- a/packages/@tests/aqua/package.json +++ b/packages/@tests/aqua/package.json @@ -18,7 +18,7 @@ "license": "Apache-2.0", "dependencies": { "@fluencelabs/js-client.api": "workspace:^", - "@fluencelabs/fluence-network-environment": "1.0.13", + "@fluencelabs/fluence-network-environment": "1.0.14", "base64-js": "1.5.1" }, "devDependencies": { diff --git a/packages/@tests/aqua/src/index.ts b/packages/@tests/aqua/src/index.ts index 86fb91050..a7f0c5b69 100644 --- a/packages/@tests/aqua/src/index.ts +++ b/packages/@tests/aqua/src/index.ts @@ -1,6 +1,6 @@ import { fromByteArray } from 'base64-js'; import { Fluence } from '@fluencelabs/js-client.api'; -import { krasnodar } from '@fluencelabs/fluence-network-environment'; +import { kras, randomKras } from '@fluencelabs/fluence-network-environment'; import { smokeTest } from './_aqua/smoke_test.js'; // const relay = { @@ -8,7 +8,7 @@ import { smokeTest } from './_aqua/smoke_test.js'; // peerId: '12D3KooWKEprYXUXqoV5xSBeyqrWLpQLLH4PXfvVkDJtmcqmh5V3', // }; -const relay = krasnodar[4]; +const relay = randomKras(); function generateRandomUint8Array() { const uint8Array = new Uint8Array(32); @@ -35,10 +35,10 @@ export const main = async () => { await Fluence.connect(relay, optsWithRandomKeyPair()); console.log('connected'); - const p = await Fluence.getPeer(); + const client = await Fluence.getClient(); - console.log('my peer id: ', p.getPeerId()); - console.log('my sk id: ', fromByteArray(p.getPeerSecretKey())); + console.log('my peer id: ', client.getPeerId()); + console.log('my sk id: ', fromByteArray(client.getPeerSecretKey())); console.log('running some aqua...'); const [res, errors] = await smokeTest('my_resource'); diff --git a/packages/client/api/src/compilerSupport/implementation.ts b/packages/client/api/src/compilerSupport/implementation.ts index e26e48faf..8d6904065 100644 --- a/packages/client/api/src/compilerSupport/implementation.ts +++ b/packages/client/api/src/compilerSupport/implementation.ts @@ -30,7 +30,7 @@ import { getFluenceInterface } from '../util.js'; * @param script - air script with function execution logic generated by the Aqua compiler */ export const callFunction = async (rawFnArgs: Array, def: FunctionCallDef, script: string): Promise => { - const { args, peer, config } = await extractFunctionArgs(rawFnArgs, def); + const { args, client: peer, config } = await extractFunctionArgs(rawFnArgs, def); if (peer.internals.getConnectionState() !== 'connected') { throw new Error( 'Could not call the Aqua function because client is disconnected. Did you forget to call Fluence.connect()?', @@ -65,7 +65,7 @@ export const registerService = async (args: any[], def: ServiceDef): Promise => { @@ -104,7 +104,7 @@ const extractFunctionArgs = async ( config = args[numberOfExpectedArgs + 1]; } else { const fluence = await getFluenceInterface(); - peer = fluence.defaultPeer; + peer = fluence.defaultClient; structuredArgs = args.slice(0, numberOfExpectedArgs); config = args[numberOfExpectedArgs]; } @@ -116,7 +116,7 @@ const extractFunctionArgs = async ( const argsRes = argumentNames.reduce((acc, name, index) => ({ ...acc, [name]: structuredArgs[index] }), {}); return { - peer: peer, + client: peer, config: config, args: argsRes, }; @@ -145,7 +145,7 @@ const extractServiceArgs = async ( peer = args[0]; } else { const fluence = await getFluenceInterface(); - peer = fluence.defaultPeer; + peer = fluence.defaultClient; } if (typeof args[0] === 'string') { diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index a051c5739..9669468ad 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -46,7 +46,7 @@ export const Fluence = { */ connect: async (relay: RelayOptions, options?: ClientOptions): Promise => { const fluence = await getFluenceInterface(); - return fluence.defaultPeer.connect(relay, options); + return fluence.defaultClient.connect(relay, options); }, /** @@ -54,7 +54,7 @@ export const Fluence = { */ disconnect: async (): Promise => { const fluence = await getFluenceInterface(); - return fluence.defaultPeer.disconnect(); + return fluence.defaultClient.disconnect(); }, /** @@ -63,10 +63,10 @@ export const Fluence = { onConnectionStateChange(handler: (state: ConnectionState) => void): ConnectionState { const optimisticResult = getFluenceInterfaceFromGlobalThis(); if (optimisticResult) { - return optimisticResult.defaultPeer.onConnectionStateChange(handler); + return optimisticResult.defaultClient.onConnectionStateChange(handler); } - getFluenceInterface().then((fluence) => fluence.defaultPeer.onConnectionStateChange(handler)); + getFluenceInterface().then((fluence) => fluence.defaultClient.onConnectionStateChange(handler)); return 'disconnected'; }, @@ -77,11 +77,11 @@ export const Fluence = { */ getClient: async (): Promise => { const fluence = await getFluenceInterface(); - return fluence.defaultPeer; + return fluence.defaultClient; }, }; export const dangerouslyCreateClient = async (): Promise => { const fluence = await getFluenceInterface(); - return fluence.peerFactory(); + return fluence.clientFactory(); }; diff --git a/packages/client/api/src/util.ts b/packages/client/api/src/util.ts index 0eadc0462..c274340d4 100644 --- a/packages/client/api/src/util.ts +++ b/packages/client/api/src/util.ts @@ -1,8 +1,8 @@ import type { CallAquaFunction, IFluenceClient, RegisterService } from '@fluencelabs/interfaces'; type PublicFluenceInterface = { - defaultPeer: IFluenceClient; - peerFactory: () => IFluenceClient; + clientFactory: () => IFluenceClient; + defaultClient: IFluenceClient; callAquaFunction: CallAquaFunction; registerService: RegisterService; }; diff --git a/packages/client/js-client.node/src/index.ts b/packages/client/js-client.node/src/index.ts index 6160267b7..2971e0f51 100644 --- a/packages/client/js-client.node/src/index.ts +++ b/packages/client/js-client.node/src/index.ts @@ -22,7 +22,7 @@ export const defaultNames = { }, }; -export const createPeer = () => { +export const createClient = () => { const workerLoader = new WorkerLoader(); const controlModuleLoader = new WasmLoaderFromNpm(defaultNames.marine.package, defaultNames.marine.file); const avmModuleLoader = new WasmLoaderFromNpm(defaultNames.avm.package, defaultNames.avm.file); @@ -33,8 +33,8 @@ export const createPeer = () => { }; const publicFluenceInterface = { - peerFactory: createPeer, - defaultPeer: createPeer(), + clientFactory: createClient, + defaultClient: createClient(), callAquaFunction, registerService, }; @@ -48,7 +48,7 @@ function throwIfNotSupported() { const major = version[0]; if (major < 16) { throw new Error( - 'FluenceJS requires node.js version >= "16.x"; Detected ' + + 'Fluence JS Client requires node.js version >= "16.x"; Detected ' + platform.description + ' Please update node.js to version 16 or higher.\nYou can use https://nvm.sh utility to update node.js version: "nvm install 17 && nvm use 17 && nvm alias default 17"', ); diff --git a/packages/client/js-client.web.standalone/src/index.ts b/packages/client/js-client.web.standalone/src/index.ts index f35317a76..e69ccb262 100644 --- a/packages/client/js-client.web.standalone/src/index.ts +++ b/packages/client/js-client.web.standalone/src/index.ts @@ -6,7 +6,7 @@ import { MarineBackgroundRunner } from '@fluencelabs/js-peer/dist/marine/worker' import { checkConnection, marineLogFunction } from '@fluencelabs/js-peer/dist/js-peer/utils.js'; import { InlinedWorkerLoader, InlinedWasmLoader } from '@fluencelabs/js-peer/dist/marine/deps-loader/common.js'; -const createPeer = () => { +const createClient = () => { const workerLoader = new InlinedWorkerLoader('___worker___'); const controlModuleLoader = new InlinedWasmLoader('___marine___'); const avmModuleLoader = new InlinedWasmLoader('___avm___'); @@ -17,8 +17,8 @@ const createPeer = () => { }; const publicFluenceInterface = { - peerFactory: createPeer, - defaultPeer: createPeer(), + clientFactory: createClient, + defaultClient: createClient(), callAquaFunction, registerService, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88100bb0b..e1437f16e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,12 +21,12 @@ importers: packages/@tests/aqua: specifiers: '@fluencelabs/aqua': 0.9.4 - '@fluencelabs/fluence-network-environment': 1.0.13 + '@fluencelabs/fluence-network-environment': 1.0.14 '@fluencelabs/js-client.api': workspace:^ '@fluencelabs/registry': 0.7.0 base64-js: 1.5.1 dependencies: - '@fluencelabs/fluence-network-environment': 1.0.13 + '@fluencelabs/fluence-network-environment': 1.0.14 '@fluencelabs/js-client.api': link:../../client/api base64-js: 1.5.1 devDependencies: @@ -2148,6 +2148,11 @@ packages: /@fluencelabs/fluence-network-environment/1.0.13: resolution: {integrity: sha512-2pci3T0sUHE08jwEs1r/vHKVT4XUh/A3j/QJ0eIhddsxyIjEksjdn05X7DF6STD14CF8GgBVOJEPgav8qaUMpA==} + dev: true + + /@fluencelabs/fluence-network-environment/1.0.14: + resolution: {integrity: sha512-lMiH+7obmJW2Q+PMUR/vNAuX6TcVqlKmsWAHvnBogH7s8IeMT+UGN8qrweILWmE57G7MfauB302dIFQowR9tug==} + dev: false /@fluencelabs/fluence/0.26.3-snapshot-4_4ybkoodcah37urerzfcwvnjsoe: resolution: {integrity: sha512-M/iQhnViXfMaATj3gFPQXrZe9zSVcyN9F9A9hfJBUn0VLamhmbfeIoSZeheK8VGBxYbRGcrtoqLPTy1vJQVgVw==} From 9d27e96a8ce314e9386b0d0641d507433e6ddbd1 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 14:22:01 +0400 Subject: [PATCH 10/13] Prettier error messages --- packages/client/api/src/compilerSupport/implementation.ts | 2 +- packages/client/api/src/util.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/client/api/src/compilerSupport/implementation.ts b/packages/client/api/src/compilerSupport/implementation.ts index 8d6904065..d9442f18d 100644 --- a/packages/client/api/src/compilerSupport/implementation.ts +++ b/packages/client/api/src/compilerSupport/implementation.ts @@ -60,7 +60,7 @@ export const registerService = async (args: any[], def: ServiceDef): Promise tag to your HTML. +Please refer to the documentation page for more details: https://fluence.dev/ +`; // Let's assume that if the library has not been loaded in 5 seconds, then the user has forgotten to add the script tag const POLL_PEER_TIMEOUT = 5000; From 75cd27d98558a77783f2313ff7f4e1ee03b9c57b Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 14:24:28 +0400 Subject: [PATCH 11/13] Add service to smoke test --- packages/@tests/aqua/_aqua/smoke_test.aqua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/@tests/aqua/_aqua/smoke_test.aqua b/packages/@tests/aqua/_aqua/smoke_test.aqua index 9a2cf31b6..f3f7ef040 100644 --- a/packages/@tests/aqua/_aqua/smoke_test.aqua +++ b/packages/@tests/aqua/_aqua/smoke_test.aqua @@ -1,5 +1,9 @@ import "@fluencelabs/registry/resources-api.aqua" -func smokeTest(label: string) -> ?string, *string: +service HelloWorld("hello-world"): + hello(str: string) -> string + +func smokeTest(label: string) -> ?string, *string, string: res, errors <- createResource(label) - <- res, errors + hello <- HelloWorld.hello("Fluence user") + <- res, errors, hello \ No newline at end of file From 4e8e1038080a214dda483a09f4222860f0a3b1df Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 14:48:25 +0400 Subject: [PATCH 12/13] Add services to smoke test --- packages/@tests/aqua/src/_aqua/smoke_test.ts | 292 +++++++++++-------- packages/@tests/aqua/src/index.ts | 12 +- 2 files changed, 180 insertions(+), 124 deletions(-) diff --git a/packages/@tests/aqua/src/_aqua/smoke_test.ts b/packages/@tests/aqua/src/_aqua/smoke_test.ts index 4fadaef41..f4a25ac8e 100644 --- a/packages/@tests/aqua/src/_aqua/smoke_test.ts +++ b/packages/@tests/aqua/src/_aqua/smoke_test.ts @@ -1,3 +1,5 @@ +/* eslint-disable */ +// @ts-nocheck /** * * This file is auto-generated. Do not edit manually: changes may be erased. @@ -6,17 +8,54 @@ * Aqua version: 0.9.4 * */ - -// eslint-disable -//ts-nocheck import type { IFluenceClient as IFluenceClient$$, CallParams as CallParams$$ } from '@fluencelabs/js-client.api'; import { v5_callFunction as callFunction$$, v5_registerService as registerService$$ } from '@fluencelabs/js-client.api'; // Services +export interface HelloWorldDef { + hello: (str: string, callParams: CallParams$$<'str'>) => string | Promise; +} +export function registerHelloWorld(service: HelloWorldDef): void; +export function registerHelloWorld(serviceId: string, 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) { + registerService$$(args, { + defaultServiceId: 'hello-world', + functions: { + tag: 'labeledProduct', + fields: { + hello: { + tag: 'arrow', + domain: { + tag: 'labeledProduct', + fields: { + str: { + tag: 'scalar', + name: 'string', + }, + }, + }, + codomain: { + tag: 'unlabeledProduct', + items: [ + { + tag: 'scalar', + name: 'string', + }, + ], + }, + }, + }, + }, + }); +} + // Functions -export type SmokeTestResult = [string | null, string[]]; +export type SmokeTestResult = [string | null, string[], string]; export function smokeTest(label: string, config?: { ttl?: number }): Promise; export function smokeTest(peer: IFluenceClient$$, label: string, config?: { ttl?: number }): Promise; @@ -27,208 +66,211 @@ export function smokeTest(...args: any) { (seq (seq (seq - (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) - (call %init_peer_id% ("getDataSrv" "label") [] label) - ) - (new $resource_id - (new $successful - (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call %init_peer_id% ("getDataSrv" "label") [] label) + ) + (new $resource_id + (new $successful (seq (seq - (call %init_peer_id% ("peer" "timestamp_sec") [] t) - (xor - (seq + (seq + (call %init_peer_id% ("peer" "timestamp_sec") [] t) + (xor (seq - (call -relay- ("registry" "get_key_bytes") [label [] t [] ""] bytes) - (xor - (call %init_peer_id% ("sig" "sign") [bytes] result) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) - ) - ) - (xor - (match result.$.success! false - (ap result.$.error.[0]! $error) - ) (seq + (call -relay- ("registry" "get_key_bytes") [label [] t [] ""] bytes) + (xor + (call %init_peer_id% ("sig" "sign") [bytes] result) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1]) + ) + ) + (xor + (match result.$.success! false + (ap result.$.error.[0]! $error) + ) (seq (seq (seq (seq (seq - (ap result.$.signature! result_flat) - (call -relay- ("registry" "get_key_id") [label %init_peer_id%] id) + (seq + (ap result.$.signature! result_flat) + (call -relay- ("registry" "get_key_id") [label %init_peer_id%] id) + ) + (call -relay- ("op" "string_to_b58") [id] k) ) - (call -relay- ("op" "string_to_b58") [id] k) + (call -relay- ("kad" "neighborhood") [k [] []] nodes) ) - (call -relay- ("kad" "neighborhood") [k [] []] nodes) - ) - (par - (fold nodes n-0 - (par - (seq - (xor + (par + (fold nodes n-0 + (par + (seq (xor - (seq + (xor (seq (seq - (call n-0 ("peer" "timestamp_sec") [] t-0) - (call n-0 ("trust-graph" "get_weight") [%init_peer_id% t-0] weight) + (seq + (call n-0 ("peer" "timestamp_sec") [] t-0) + (call n-0 ("trust-graph" "get_weight") [%init_peer_id% t-0] weight) + ) + (call n-0 ("registry" "register_key") [label [] t [] "" result_flat.$.[0]! weight t-0] result-0) ) - (call n-0 ("registry" "register_key") [label [] t [] "" result_flat.$.[0]! weight t-0] result-0) - ) - (xor - (match result-0.$.success! true - (ap true $successful) + (xor + (match result-0.$.success! true + (ap true $successful) + ) + (ap result-0.$.error! $error) ) - (ap result-0.$.error! $error) ) + (call n-0 ("op" "noop") []) + ) + (seq + (call -relay- ("op" "noop") []) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) - (call n-0 ("op" "noop") []) - ) - (seq - (call -relay- ("op" "noop") []) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2]) ) + (call -relay- ("op" "noop") []) ) - (call -relay- ("op" "noop") []) + (next n-0) ) - (next n-0) + (never) ) - (never) + (null) ) - (null) ) - ) - (new $status - (new $result-1 - (seq + (new $status + (new $result-1 (seq (seq - (par - (seq + (seq + (par (seq (seq - (call -relay- ("math" "sub") [1 1] sub) - (new $successful_test - (seq + (seq + (call -relay- ("math" "sub") [1 1] sub) + (new $successful_test (seq (seq - (call -relay- ("math" "add") [sub 1] successful_incr) - (fold $successful s - (seq + (seq + (call -relay- ("math" "add") [sub 1] successful_incr) + (fold $successful s (seq - (ap s $successful_test) - (canon -relay- $successful_test #successful_iter_canon) - ) - (xor - (match #successful_iter_canon.length successful_incr - (null) + (seq + (ap s $successful_test) + (canon -relay- $successful_test #successful_iter_canon) + ) + (xor + (match #successful_iter_canon.length successful_incr + (null) + ) + (next s) ) - (next s) ) + (never) ) - (never) ) + (canon -relay- $successful_test #successful_result_canon) ) - (canon -relay- $successful_test #successful_result_canon) + (ap #successful_result_canon successful_gate) ) - (ap #successful_result_canon successful_gate) ) ) + (call -relay- ("math" "sub") [1 1] sub-0) ) - (call -relay- ("math" "sub") [1 1] sub-0) + (ap "ok" $status) ) - (ap "ok" $status) + (call -relay- ("peer" "timeout") [6000 "timeout"] $status) ) - (call -relay- ("peer" "timeout") [6000 "timeout"] $status) - ) - (new $status_test - (seq + (new $status_test (seq (seq - (call -relay- ("math" "add") [0 1] status_incr) - (fold $status s - (seq + (seq + (call -relay- ("math" "add") [0 1] status_incr) + (fold $status s (seq - (ap s $status_test) - (canon -relay- $status_test #status_iter_canon) - ) - (xor - (match #status_iter_canon.length status_incr - (null) + (seq + (ap s $status_test) + (canon -relay- $status_test #status_iter_canon) + ) + (xor + (match #status_iter_canon.length status_incr + (null) + ) + (next s) ) - (next s) ) + (never) ) - (never) ) + (canon -relay- $status_test #status_result_canon) ) - (canon -relay- $status_test #status_result_canon) + (ap #status_result_canon status_gate) ) - (ap #status_result_canon status_gate) ) ) - ) - (xor - (match status_gate.$.[0]! "ok" - (ap true $result-1) + (xor + (match status_gate.$.[0]! "ok" + (ap true $result-1) + ) + (ap false $result-1) ) - (ap false $result-1) ) - ) - (new $result-1_test - (seq + (new $result-1_test (seq (seq - (call -relay- ("math" "add") [0 1] result-1_incr) - (fold $result-1 s - (seq + (seq + (call -relay- ("math" "add") [0 1] result-1_incr) + (fold $result-1 s (seq - (ap s $result-1_test) - (canon -relay- $result-1_test #result-1_iter_canon) - ) - (xor - (match #result-1_iter_canon.length result-1_incr - (null) + (seq + (ap s $result-1_test) + (canon -relay- $result-1_test #result-1_iter_canon) + ) + (xor + (match #result-1_iter_canon.length result-1_incr + (null) + ) + (next s) ) - (next s) ) + (never) ) - (never) ) + (canon -relay- $result-1_test #result-1_result_canon) ) - (canon -relay- $result-1_test #result-1_result_canon) + (ap #result-1_result_canon result-1_gate) ) - (ap #result-1_result_canon result-1_gate) ) ) ) ) ) - ) - (xor - (match result-1_gate.$.[0]! false - (ap "resource wasn't created: timeout exceeded" $error) + (xor + (match result-1_gate.$.[0]! false + (ap "resource wasn't created: timeout exceeded" $error) + ) + (ap id $resource_id) ) - (ap id $resource_id) ) ) ) + (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) - (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3]) ) + (canon %init_peer_id% $resource_id #-resource_id-fix-0) ) - (canon %init_peer_id% $resource_id #-resource_id-fix-0) + (ap #-resource_id-fix-0 -resource_id-flat-0) ) - (ap #-resource_id-fix-0 -resource_id-flat-0) ) ) ) + (call %init_peer_id% ("hello-world" "hello") ["Fluence user"] hello) ) (xor (seq (canon %init_peer_id% $error #error_canon) - (call %init_peer_id% ("callbackSrv" "response") [-resource_id-flat-0 #error_canon]) + (call %init_peer_id% ("callbackSrv" "response") [-resource_id-flat-0 #error_canon hello]) ) (call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4]) ) @@ -268,6 +310,10 @@ export function smokeTest(...args: any) { name: 'string', }, }, + { + tag: 'scalar', + name: 'string', + }, ], }, }, @@ -284,3 +330,5 @@ export function smokeTest(...args: any) { script, ); } + +/* eslint-enable */ diff --git a/packages/@tests/aqua/src/index.ts b/packages/@tests/aqua/src/index.ts index a7f0c5b69..4b4802917 100644 --- a/packages/@tests/aqua/src/index.ts +++ b/packages/@tests/aqua/src/index.ts @@ -1,7 +1,7 @@ import { fromByteArray } from 'base64-js'; import { Fluence } from '@fluencelabs/js-client.api'; import { kras, randomKras } from '@fluencelabs/fluence-network-environment'; -import { smokeTest } from './_aqua/smoke_test.js'; +import { registerHelloWorld, smokeTest } from './_aqua/smoke_test.js'; // const relay = { // multiaddr: '/ip4/127.0.0.1/tcp/4310/ws/p2p/12D3KooWKEprYXUXqoV5xSBeyqrWLpQLLH4PXfvVkDJtmcqmh5V3', @@ -35,13 +35,21 @@ export const main = async () => { await Fluence.connect(relay, optsWithRandomKeyPair()); console.log('connected'); + + await registerHelloWorld({ + hello(str) { + return 'Hello, ' + str + '!'; + }, + }); + const client = await Fluence.getClient(); console.log('my peer id: ', client.getPeerId()); console.log('my sk id: ', fromByteArray(client.getPeerSecretKey())); console.log('running some aqua...'); - const [res, errors] = await smokeTest('my_resource'); + const [res, errors, hello] = await smokeTest('my_resource'); + console.log(hello); if (res === null) { console.log('aqua failed, errors', errors); } else { From 6683cbfb1c20ecfb1171e1563ba035c293602b3d Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 16 Feb 2023 15:32:42 +0400 Subject: [PATCH 13/13] dangerouslyCreateClient - > createClient. Comments about low level --- packages/client/api/src/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/client/api/src/index.ts b/packages/client/api/src/index.ts index 9669468ad..c2cd21527 100644 --- a/packages/client/api/src/index.ts +++ b/packages/client/api/src/index.ts @@ -72,7 +72,7 @@ export const Fluence = { }, /** - * Get the underlying client instance which holds the connection to the network + * Low level API. Get the underlying client instance which holds the connection to the network * @returns IFluenceClient instance */ getClient: async (): Promise => { @@ -81,7 +81,11 @@ export const Fluence = { }, }; -export const dangerouslyCreateClient = async (): Promise => { +/** + * Low level API. Generally you need Fluence.connect() instead. + * @returns IFluenceClient instance + */ +export const createClient = async (): Promise => { const fluence = await getFluenceInterface(); return fluence.clientFactory(); };