From d6daaf05f1023fd14481c7776dcc4ae26c8eca38 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 1 Dec 2021 17:19:28 +0300 Subject: [PATCH 01/23] Swap Air Interpreter with AVM Worker abstraction --- package-lock.json | 55 ++++++++++++++++++++++++++---- package.json | 3 +- src/internal/FluencePeer.ts | 35 +++++++++---------- src/internal/Particle.ts | 2 +- src/internal/commonTypes.ts | 2 +- src/internal/compilerSupport/v2.ts | 2 +- src/internal/defaultServices.ts | 2 +- src/internal/utils.ts | 47 ++++++++++++------------- 8 files changed, 93 insertions(+), 55 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e2456137..d7566bd87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm": "0.16.0-restriction-operator.9", + "@fluencelabs/avm-worker": "^0.0.2", + "@fluencelabs/avm-worker-common": "^0.0.2", "async": "3.2.0", "base64-js": "1.5.1", "bs58": "4.0.1", @@ -646,13 +647,32 @@ } }, "node_modules/@fluencelabs/avm": { - "version": "0.16.0-restriction-operator.9", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.16.0-restriction-operator.9.tgz", - "integrity": "sha512-34vJqo8TIho5H2+WhEAJOa6WxAPiS+c7Z3WKmRZVi+GAsZN3Hv2NiuiCFNFBmPRoD+juzHe4Dmv5cF7HZc6O6w==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.4.tgz", + "integrity": "sha512-VKD/XaEDXsP0eEgpbncBCsLyHbGDh+f7b96KbYoHld25r3C7mgEbbEVImKLaHGDUiR7ylPBxrtQhNL9MpgKwxA==", "dependencies": { "base64-js": "1.5.1" } }, + "node_modules/@fluencelabs/avm-worker": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.0.2.tgz", + "integrity": "sha512-S5ijm0QpqNSVSlj3grj6479mBfdF9O1E03xUb5N1/RiBH3fTQnGpK5u5GmbKwPJ6CvZonH7jy8tfMhGDQq5q2w==", + "dependencies": { + "@fluencelabs/avm": "^0.17.4", + "@fluencelabs/avm-worker-common": "^0.0.1" + } + }, + "node_modules/@fluencelabs/avm-worker-common": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.2.tgz", + "integrity": "sha512-2SrM9gReZ3h1A9oJGFGVxLSXEnjy1qhN+GG+abA0WEVkOTup6IKAkmKdbkby+HNgZYvdSqlVpCYhcPzdtmwlGw==" + }, + "node_modules/@fluencelabs/avm-worker/node_modules/@fluencelabs/avm-worker-common": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.1.tgz", + "integrity": "sha512-e3+oJD5NmEnCsKhAamZa68ogKX2AOZsWOJkORmYeAF+vDyzSa/nFxqRYa1KVOWhtlXZrKkUg7Mdk4qrZpZiuQg==" + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -8687,13 +8707,34 @@ } }, "@fluencelabs/avm": { - "version": "0.16.0-restriction-operator.9", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.16.0-restriction-operator.9.tgz", - "integrity": "sha512-34vJqo8TIho5H2+WhEAJOa6WxAPiS+c7Z3WKmRZVi+GAsZN3Hv2NiuiCFNFBmPRoD+juzHe4Dmv5cF7HZc6O6w==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.4.tgz", + "integrity": "sha512-VKD/XaEDXsP0eEgpbncBCsLyHbGDh+f7b96KbYoHld25r3C7mgEbbEVImKLaHGDUiR7ylPBxrtQhNL9MpgKwxA==", "requires": { "base64-js": "1.5.1" } }, + "@fluencelabs/avm-worker": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.0.2.tgz", + "integrity": "sha512-S5ijm0QpqNSVSlj3grj6479mBfdF9O1E03xUb5N1/RiBH3fTQnGpK5u5GmbKwPJ6CvZonH7jy8tfMhGDQq5q2w==", + "requires": { + "@fluencelabs/avm": "^0.17.4", + "@fluencelabs/avm-worker-common": "^0.0.1" + }, + "dependencies": { + "@fluencelabs/avm-worker-common": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.1.tgz", + "integrity": "sha512-e3+oJD5NmEnCsKhAamZa68ogKX2AOZsWOJkORmYeAF+vDyzSa/nFxqRYa1KVOWhtlXZrKkUg7Mdk4qrZpZiuQg==" + } + } + }, + "@fluencelabs/avm-worker-common": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.2.tgz", + "integrity": "sha512-2SrM9gReZ3h1A9oJGFGVxLSXEnjy1qhN+GG+abA0WEVkOTup6IKAkmKdbkby+HNgZYvdSqlVpCYhcPzdtmwlGw==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", diff --git a/package.json b/package.json index df976bf14..d61b82610 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm": "0.16.0-restriction-operator.9", + "@fluencelabs/avm-worker": "^0.0.2", + "@fluencelabs/avm-worker-common": "^0.0.2", "async": "3.2.0", "base64-js": "1.5.1", "bs58": "4.0.1", diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 401ec7d72..46f1124a0 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -14,14 +14,6 @@ * limitations under the License. */ -import { - AirInterpreter, - CallRequestsArray, - CallResultsArray, - InterpreterResult, - LogLevel, - CallServiceResult as AvmCallServiceResult, -} from '@fluencelabs/avm'; import { Multiaddr } from 'multiaddr'; import { CallServiceData, CallServiceResult, GenericCallServiceHandler, ResultCodes } from './commonTypes'; import { CallServiceHandler as LegacyCallServiceHandler } from './compilerSupport/LegacyCallServiceHandler'; @@ -29,12 +21,13 @@ import { PeerIdB58 } from './commonTypes'; import { FluenceConnection } from './FluenceConnection'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle'; import { KeyPair } from './KeyPair'; -import { createInterpreter, dataToString } from './utils'; +import { dataToString, avmLogFunction } from './utils'; import { filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; import { defaultServices } from './defaultServices'; -import { instanceOf } from 'ts-pattern'; +import { AvmWorker, InterpreterResult, LogLevel } from '@fluencelabs/avm-worker-common'; +import Worker from '@fluencelabs/avm-worker'; /** * Node of the Fluence network specified as a pair of node's multiaddr and it's peer id @@ -102,6 +95,11 @@ export interface PeerConfig { * If the option is not set default TTL will be 7000 */ defaultTtlMs?: number; + + /** + * Pluggable AVM worker implementation + */ + avmWorker?: AvmWorker; } /** @@ -182,7 +180,8 @@ export class FluencePeer { ? config?.defaultTtlMs : DEFAULT_TTL; - this._interpreter = await createInterpreter(config?.avmLogLevel || 'off'); + this._worker = config?.avmWorker || new Worker(avmLogFunction); + await this._worker.init(config?.avmLogLevel || 'off'); if (config?.connectTo) { let connectToMultiAddr: Multiaddr; @@ -358,7 +357,7 @@ export class FluencePeer { private _relayPeerId: PeerIdB58 | null = null; private _keyPair: KeyPair; private _connection: FluenceConnection; - private _interpreter: AirInterpreter; + private _worker: AvmWorker; private _timeouts: Array = []; private _particleQueues = new Map>(); @@ -420,9 +419,9 @@ export class FluencePeer { // force new line filterExpiredParticles(this._expireParticle.bind(this)), ) - .subscribe((item) => { + .subscribe(async (item) => { const particle = item.particle; - const result = runInterpreter(this.getStatus().peerId, this._interpreter, particle, prevData); + const result = await runAvmWorker(this.getStatus().peerId, this._worker, particle, prevData); // Do not continue if there was an error in particle interpretation if (!isInterpretationSuccessful(result)) { @@ -585,16 +584,16 @@ function registerDefaultServices(peer: FluencePeer) { } } -function runInterpreter( +async function runAvmWorker( currentPeerId: PeerIdB58, - interpreter: AirInterpreter, + worker: AvmWorker, particle: Particle, prevData: Uint8Array, -): InterpreterResult { +): Promise { particle.logTo('debug', 'Sending particle to interpreter'); log.debug('prevData: ', dataToString(prevData)); log.debug('data: ', dataToString(particle.data)); - const interpreterResult = interpreter.invoke( + const interpreterResult = await worker.run( particle.script, prevData, particle.data, diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index dba8747d0..441b286bc 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -16,7 +16,7 @@ import { v4 as uuidv4 } from 'uuid'; import { fromByteArray, toByteArray } from 'base64-js'; -import { CallResultsArray, LogLevel } from '@fluencelabs/avm'; +import { CallResultsArray, LogLevel } from '@fluencelabs/avm-worker-common'; import log from 'loglevel'; import { ParticleContext } from './commonTypes'; import { dataToString } from './utils'; diff --git a/src/internal/commonTypes.ts b/src/internal/commonTypes.ts index 02d2e92d5..31b35bd5f 100644 --- a/src/internal/commonTypes.ts +++ b/src/internal/commonTypes.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CallRequest, SecurityTetraplet } from '@fluencelabs/avm'; +import { SecurityTetraplet } from '@fluencelabs/avm-worker-common'; /** * Peer ID's id as a base58 string (multihash/CIDv0). diff --git a/src/internal/compilerSupport/v2.ts b/src/internal/compilerSupport/v2.ts index 6150f93c3..5e7a9096c 100644 --- a/src/internal/compilerSupport/v2.ts +++ b/src/internal/compilerSupport/v2.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SecurityTetraplet } from '@fluencelabs/avm'; +import { SecurityTetraplet } from '@fluencelabs/avm-worker-common'; import { match } from 'ts-pattern'; import { CallParams, Fluence, FluencePeer } from '../../index'; import { CallServiceData, GenericCallServiceHandler, CallServiceResult, ResultCodes } from '../commonTypes'; diff --git a/src/internal/defaultServices.ts b/src/internal/defaultServices.ts index b33c45a35..39ec7f779 100644 --- a/src/internal/defaultServices.ts +++ b/src/internal/defaultServices.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CallServiceResult } from '@fluencelabs/avm'; +import { CallServiceResult } from '@fluencelabs/avm-worker-common'; import { encode, decode } from 'bs58'; import { GenericCallServiceHandler, ResultCodes } from './commonTypes'; diff --git a/src/internal/utils.ts b/src/internal/utils.ts index 2146dc6bd..41828343d 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -14,34 +14,31 @@ * limitations under the License. */ -import { AirInterpreter, LogLevel as AvmLogLevel } from '@fluencelabs/avm'; import log from 'loglevel'; import { CallServiceData, CallServiceResult, CallServiceResultType, ResultCodes } from './commonTypes'; -import { AvmLoglevel, FluencePeer } from './FluencePeer'; +import { FluencePeer } from './FluencePeer'; import { Particle, ParticleExecutionStage } from './Particle'; - -export const createInterpreter = (logLevel: AvmLoglevel): Promise => { - const logFn = (level: AvmLogLevel, msg: string) => { - switch (level) { - case 'error': - log.error(msg); - break; - - case 'warn': - log.warn(msg); - break; - - case 'info': - log.info(msg); - break; - - case 'debug': - case 'trace': - log.log(msg); - break; - } - }; - return AirInterpreter.create(logLevel, logFn); +import { LogLevel as AvmLoglevel } from '@fluencelabs/avm-worker-common'; + +export const avmLogFunction = (level: AvmLoglevel, msg: string) => { + switch (level) { + case 'error': + log.error(msg); + break; + + case 'warn': + log.warn(msg); + break; + + case 'info': + log.info(msg); + break; + + case 'debug': + case 'trace': + log.log(msg); + break; + } }; export const MakeServiceCall = (fn: (args: any[]) => CallServiceResultType) => { From 64fedb37ccbed441542f0c4a5207b6d96d1d3987 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 01:03:53 +0300 Subject: [PATCH 02/23] Update docs --- docs/assets/js/search.js | 2 +- docs/classes/FluencePeer.html | 12 ++++++------ docs/classes/KeyPair.html | 10 +++++----- docs/interfaces/CallParams.html | 12 ++++++------ docs/interfaces/PeerConfig.html | 33 ++++++++++++++++++++++++++------- docs/interfaces/PeerStatus.html | 8 ++++---- docs/modules.html | 8 ++++---- src/internal/FluencePeer.ts | 2 +- 8 files changed, 53 insertions(+), 34 deletions(-) diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js index 5ace1724d..a8e153db4 100644 --- a/docs/assets/js/search.js +++ b/docs/assets/js/search.js @@ -1 +1 @@ -window.searchData = {"kinds":{"32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias"},"rows":[{"id":0,"kind":64,"name":"setLogLevel","url":"modules.html#setLogLevel","classes":"tsd-kind-function"},{"id":1,"kind":32,"name":"Fluence","url":"modules.html#Fluence","classes":"tsd-kind-variable"},{"id":2,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type","classes":"tsd-kind-type-literal tsd-parent-kind-variable","parent":"Fluence"},{"id":3,"kind":1024,"name":"start","url":"modules.html#Fluence.__type.start","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":4,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":5,"kind":1024,"name":"stop","url":"modules.html#Fluence.__type.stop","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":6,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":7,"kind":1024,"name":"getStatus","url":"modules.html#Fluence.__type.getStatus","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":8,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":9,"kind":1024,"name":"getPeer","url":"modules.html#Fluence.__type.getPeer","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":10,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":11,"kind":256,"name":"PeerStatus","url":"interfaces/PeerStatus.html","classes":"tsd-kind-interface"},{"id":12,"kind":1024,"name":"isInitialized","url":"interfaces/PeerStatus.html#isInitialized","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":13,"kind":1024,"name":"isConnected","url":"interfaces/PeerStatus.html#isConnected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":14,"kind":1024,"name":"peerId","url":"interfaces/PeerStatus.html#peerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":15,"kind":1024,"name":"relayPeerId","url":"interfaces/PeerStatus.html#relayPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":16,"kind":128,"name":"KeyPair","url":"classes/KeyPair.html","classes":"tsd-kind-class"},{"id":17,"kind":2048,"name":"fromEd25519SK","url":"classes/KeyPair.html#fromEd25519SK","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":18,"kind":2048,"name":"randomEd25519","url":"classes/KeyPair.html#randomEd25519","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":19,"kind":512,"name":"constructor","url":"classes/KeyPair.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"KeyPair"},{"id":20,"kind":1024,"name":"Libp2pPeerId","url":"classes/KeyPair.html#Libp2pPeerId","classes":"tsd-kind-property tsd-parent-kind-class","parent":"KeyPair"},{"id":21,"kind":2048,"name":"toEd25519PrivateKey","url":"classes/KeyPair.html#toEd25519PrivateKey","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":22,"kind":128,"name":"FluencePeer","url":"classes/FluencePeer.html","classes":"tsd-kind-class"},{"id":23,"kind":2048,"name":"isInstance","url":"classes/FluencePeer.html#isInstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"FluencePeer"},{"id":24,"kind":512,"name":"constructor","url":"classes/FluencePeer.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"FluencePeer"},{"id":25,"kind":2048,"name":"getStatus","url":"classes/FluencePeer.html#getStatus","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":26,"kind":2048,"name":"start","url":"classes/FluencePeer.html#start","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":27,"kind":2048,"name":"stop","url":"classes/FluencePeer.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":28,"kind":262144,"name":"internals","url":"classes/FluencePeer.html#internals","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"FluencePeer"},{"id":29,"kind":4194304,"name":"AvmLoglevel","url":"modules.html#AvmLoglevel","classes":"tsd-kind-type-alias"},{"id":30,"kind":256,"name":"PeerConfig","url":"interfaces/PeerConfig.html","classes":"tsd-kind-interface"},{"id":31,"kind":1024,"name":"connectTo","url":"interfaces/PeerConfig.html#connectTo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":32,"kind":1024,"name":"avmLogLevel","url":"interfaces/PeerConfig.html#avmLogLevel","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":33,"kind":1024,"name":"KeyPair","url":"interfaces/PeerConfig.html#KeyPair","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":34,"kind":1024,"name":"checkConnectionTimeoutMs","url":"interfaces/PeerConfig.html#checkConnectionTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":35,"kind":1024,"name":"skipCheckConnection","url":"interfaces/PeerConfig.html#skipCheckConnection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":36,"kind":1024,"name":"dialTimeoutMs","url":"interfaces/PeerConfig.html#dialTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":37,"kind":1024,"name":"defaultTtlMs","url":"interfaces/PeerConfig.html#defaultTtlMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":38,"kind":4194304,"name":"PeerIdB58","url":"modules.html#PeerIdB58","classes":"tsd-kind-type-alias"},{"id":39,"kind":256,"name":"CallParams","url":"interfaces/CallParams.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":40,"kind":1024,"name":"particleId","url":"interfaces/CallParams.html#particleId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":41,"kind":1024,"name":"initPeerId","url":"interfaces/CallParams.html#initPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":42,"kind":1024,"name":"timestamp","url":"interfaces/CallParams.html#timestamp","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":43,"kind":1024,"name":"ttl","url":"interfaces/CallParams.html#ttl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":44,"kind":1024,"name":"signature","url":"interfaces/CallParams.html#signature","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":45,"kind":1024,"name":"tetraplets","url":"interfaces/CallParams.html#tetraplets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,34.447]],["parent/0",[]],["name/1",[1,29.339]],["parent/1",[]],["name/2",[2,21.454]],["parent/2",[1,2.668]],["name/3",[3,29.339]],["parent/3",[4,1.555]],["name/4",[2,21.454]],["parent/4",[4,1.555]],["name/5",[5,29.339]],["parent/5",[4,1.555]],["name/6",[2,21.454]],["parent/6",[4,1.555]],["name/7",[6,29.339]],["parent/7",[4,1.555]],["name/8",[2,21.454]],["parent/8",[4,1.555]],["name/9",[7,34.447]],["parent/9",[4,1.555]],["name/10",[2,21.454]],["parent/10",[4,1.555]],["name/11",[8,21.454]],["parent/11",[]],["name/12",[9,34.447]],["parent/12",[8,1.951]],["name/13",[10,34.447]],["parent/13",[8,1.951]],["name/14",[11,34.447]],["parent/14",[8,1.951]],["name/15",[12,34.447]],["parent/15",[8,1.951]],["name/16",[13,18.352]],["parent/16",[]],["name/17",[14,34.447]],["parent/17",[13,1.669]],["name/18",[15,34.447]],["parent/18",[13,1.669]],["name/19",[16,29.339]],["parent/19",[13,1.669]],["name/20",[17,34.447]],["parent/20",[13,1.669]],["name/21",[18,34.447]],["parent/21",[13,1.669]],["name/22",[19,18.352]],["parent/22",[]],["name/23",[20,34.447]],["parent/23",[19,1.669]],["name/24",[16,29.339]],["parent/24",[19,1.669]],["name/25",[6,29.339]],["parent/25",[19,1.669]],["name/26",[3,29.339]],["parent/26",[19,1.669]],["name/27",[5,29.339]],["parent/27",[19,1.669]],["name/28",[21,34.447]],["parent/28",[19,1.669]],["name/29",[22,29.339]],["parent/29",[]],["name/30",[23,17.101]],["parent/30",[]],["name/31",[24,34.447]],["parent/31",[23,1.555]],["name/32",[22,29.339]],["parent/32",[23,1.555]],["name/33",[13,18.352]],["parent/33",[23,1.555]],["name/34",[25,34.447]],["parent/34",[23,1.555]],["name/35",[26,34.447]],["parent/35",[23,1.555]],["name/36",[27,34.447]],["parent/36",[23,1.555]],["name/37",[28,34.447]],["parent/37",[23,1.555]],["name/38",[29,34.447]],["parent/38",[]],["name/39",[30,18.352]],["parent/39",[]],["name/40",[31,34.447]],["parent/40",[30,1.669]],["name/41",[32,34.447]],["parent/41",[30,1.669]],["name/42",[33,34.447]],["parent/42",[30,1.669]],["name/43",[34,34.447]],["parent/43",[30,1.669]],["name/44",[35,34.447]],["parent/44",[30,1.669]],["name/45",[36,34.447]],["parent/45",[30,1.669]]],"invertedIndex":[["__type",{"_index":2,"name":{"2":{},"4":{},"6":{},"8":{},"10":{}},"parent":{}}],["avmloglevel",{"_index":22,"name":{"29":{},"32":{}},"parent":{}}],["callparams",{"_index":30,"name":{"39":{}},"parent":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{}}}],["checkconnectiontimeoutms",{"_index":25,"name":{"34":{}},"parent":{}}],["connectto",{"_index":24,"name":{"31":{}},"parent":{}}],["constructor",{"_index":16,"name":{"19":{},"24":{}},"parent":{}}],["defaultttlms",{"_index":28,"name":{"37":{}},"parent":{}}],["dialtimeoutms",{"_index":27,"name":{"36":{}},"parent":{}}],["fluence",{"_index":1,"name":{"1":{}},"parent":{"2":{}}}],["fluence.__type",{"_index":4,"name":{},"parent":{"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{}}}],["fluencepeer",{"_index":19,"name":{"22":{}},"parent":{"23":{},"24":{},"25":{},"26":{},"27":{},"28":{}}}],["fromed25519sk",{"_index":14,"name":{"17":{}},"parent":{}}],["getpeer",{"_index":7,"name":{"9":{}},"parent":{}}],["getstatus",{"_index":6,"name":{"7":{},"25":{}},"parent":{}}],["initpeerid",{"_index":32,"name":{"41":{}},"parent":{}}],["internals",{"_index":21,"name":{"28":{}},"parent":{}}],["isconnected",{"_index":10,"name":{"13":{}},"parent":{}}],["isinitialized",{"_index":9,"name":{"12":{}},"parent":{}}],["isinstance",{"_index":20,"name":{"23":{}},"parent":{}}],["keypair",{"_index":13,"name":{"16":{},"33":{}},"parent":{"17":{},"18":{},"19":{},"20":{},"21":{}}}],["libp2ppeerid",{"_index":17,"name":{"20":{}},"parent":{}}],["particleid",{"_index":31,"name":{"40":{}},"parent":{}}],["peerconfig",{"_index":23,"name":{"30":{}},"parent":{"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{}}}],["peerid",{"_index":11,"name":{"14":{}},"parent":{}}],["peeridb58",{"_index":29,"name":{"38":{}},"parent":{}}],["peerstatus",{"_index":8,"name":{"11":{}},"parent":{"12":{},"13":{},"14":{},"15":{}}}],["randomed25519",{"_index":15,"name":{"18":{}},"parent":{}}],["relaypeerid",{"_index":12,"name":{"15":{}},"parent":{}}],["setloglevel",{"_index":0,"name":{"0":{}},"parent":{}}],["signature",{"_index":35,"name":{"44":{}},"parent":{}}],["skipcheckconnection",{"_index":26,"name":{"35":{}},"parent":{}}],["start",{"_index":3,"name":{"3":{},"26":{}},"parent":{}}],["stop",{"_index":5,"name":{"5":{},"27":{}},"parent":{}}],["tetraplets",{"_index":36,"name":{"45":{}},"parent":{}}],["timestamp",{"_index":33,"name":{"42":{}},"parent":{}}],["toed25519privatekey",{"_index":18,"name":{"21":{}},"parent":{}}],["ttl",{"_index":34,"name":{"43":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file +window.searchData = {"kinds":{"32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias"},"rows":[{"id":0,"kind":64,"name":"setLogLevel","url":"modules.html#setLogLevel","classes":"tsd-kind-function"},{"id":1,"kind":32,"name":"Fluence","url":"modules.html#Fluence","classes":"tsd-kind-variable"},{"id":2,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type","classes":"tsd-kind-type-literal tsd-parent-kind-variable","parent":"Fluence"},{"id":3,"kind":1024,"name":"start","url":"modules.html#Fluence.__type.start","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":4,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":5,"kind":1024,"name":"stop","url":"modules.html#Fluence.__type.stop","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":6,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":7,"kind":1024,"name":"getStatus","url":"modules.html#Fluence.__type.getStatus","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":8,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":9,"kind":1024,"name":"getPeer","url":"modules.html#Fluence.__type.getPeer","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":10,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":11,"kind":256,"name":"PeerStatus","url":"interfaces/PeerStatus.html","classes":"tsd-kind-interface"},{"id":12,"kind":1024,"name":"isInitialized","url":"interfaces/PeerStatus.html#isInitialized","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":13,"kind":1024,"name":"isConnected","url":"interfaces/PeerStatus.html#isConnected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":14,"kind":1024,"name":"peerId","url":"interfaces/PeerStatus.html#peerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":15,"kind":1024,"name":"relayPeerId","url":"interfaces/PeerStatus.html#relayPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":16,"kind":128,"name":"KeyPair","url":"classes/KeyPair.html","classes":"tsd-kind-class"},{"id":17,"kind":2048,"name":"fromEd25519SK","url":"classes/KeyPair.html#fromEd25519SK","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":18,"kind":2048,"name":"randomEd25519","url":"classes/KeyPair.html#randomEd25519","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":19,"kind":512,"name":"constructor","url":"classes/KeyPair.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"KeyPair"},{"id":20,"kind":1024,"name":"Libp2pPeerId","url":"classes/KeyPair.html#Libp2pPeerId","classes":"tsd-kind-property tsd-parent-kind-class","parent":"KeyPair"},{"id":21,"kind":2048,"name":"toEd25519PrivateKey","url":"classes/KeyPair.html#toEd25519PrivateKey","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":22,"kind":128,"name":"FluencePeer","url":"classes/FluencePeer.html","classes":"tsd-kind-class"},{"id":23,"kind":2048,"name":"isInstance","url":"classes/FluencePeer.html#isInstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"FluencePeer"},{"id":24,"kind":512,"name":"constructor","url":"classes/FluencePeer.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"FluencePeer"},{"id":25,"kind":2048,"name":"getStatus","url":"classes/FluencePeer.html#getStatus","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":26,"kind":2048,"name":"start","url":"classes/FluencePeer.html#start","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":27,"kind":2048,"name":"stop","url":"classes/FluencePeer.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":28,"kind":262144,"name":"internals","url":"classes/FluencePeer.html#internals","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"FluencePeer"},{"id":29,"kind":4194304,"name":"AvmLoglevel","url":"modules.html#AvmLoglevel","classes":"tsd-kind-type-alias"},{"id":30,"kind":256,"name":"PeerConfig","url":"interfaces/PeerConfig.html","classes":"tsd-kind-interface"},{"id":31,"kind":1024,"name":"connectTo","url":"interfaces/PeerConfig.html#connectTo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":32,"kind":1024,"name":"avmLogLevel","url":"interfaces/PeerConfig.html#avmLogLevel","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":33,"kind":1024,"name":"KeyPair","url":"interfaces/PeerConfig.html#KeyPair","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":34,"kind":1024,"name":"checkConnectionTimeoutMs","url":"interfaces/PeerConfig.html#checkConnectionTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":35,"kind":1024,"name":"skipCheckConnection","url":"interfaces/PeerConfig.html#skipCheckConnection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":36,"kind":1024,"name":"dialTimeoutMs","url":"interfaces/PeerConfig.html#dialTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":37,"kind":1024,"name":"defaultTtlMs","url":"interfaces/PeerConfig.html#defaultTtlMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":38,"kind":1024,"name":"avmWorker","url":"interfaces/PeerConfig.html#avmWorker","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":39,"kind":4194304,"name":"PeerIdB58","url":"modules.html#PeerIdB58","classes":"tsd-kind-type-alias"},{"id":40,"kind":256,"name":"CallParams","url":"interfaces/CallParams.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":41,"kind":1024,"name":"particleId","url":"interfaces/CallParams.html#particleId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":42,"kind":1024,"name":"initPeerId","url":"interfaces/CallParams.html#initPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":43,"kind":1024,"name":"timestamp","url":"interfaces/CallParams.html#timestamp","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":44,"kind":1024,"name":"ttl","url":"interfaces/CallParams.html#ttl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":45,"kind":1024,"name":"signature","url":"interfaces/CallParams.html#signature","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":46,"kind":1024,"name":"tetraplets","url":"interfaces/CallParams.html#tetraplets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,34.657]],["parent/0",[]],["name/1",[1,29.549]],["parent/1",[]],["name/2",[2,21.665]],["parent/2",[1,2.694]],["name/3",[3,29.549]],["parent/3",[4,1.578]],["name/4",[2,21.665]],["parent/4",[4,1.578]],["name/5",[5,29.549]],["parent/5",[4,1.578]],["name/6",[2,21.665]],["parent/6",[4,1.578]],["name/7",[6,29.549]],["parent/7",[4,1.578]],["name/8",[2,21.665]],["parent/8",[4,1.578]],["name/9",[7,34.657]],["parent/9",[4,1.578]],["name/10",[2,21.665]],["parent/10",[4,1.578]],["name/11",[8,21.665]],["parent/11",[]],["name/12",[9,34.657]],["parent/12",[8,1.975]],["name/13",[10,34.657]],["parent/13",[8,1.975]],["name/14",[11,34.657]],["parent/14",[8,1.975]],["name/15",[12,34.657]],["parent/15",[8,1.975]],["name/16",[13,18.563]],["parent/16",[]],["name/17",[14,34.657]],["parent/17",[13,1.692]],["name/18",[15,34.657]],["parent/18",[13,1.692]],["name/19",[16,29.549]],["parent/19",[13,1.692]],["name/20",[17,34.657]],["parent/20",[13,1.692]],["name/21",[18,34.657]],["parent/21",[13,1.692]],["name/22",[19,18.563]],["parent/22",[]],["name/23",[20,34.657]],["parent/23",[19,1.692]],["name/24",[16,29.549]],["parent/24",[19,1.692]],["name/25",[6,29.549]],["parent/25",[19,1.692]],["name/26",[3,29.549]],["parent/26",[19,1.692]],["name/27",[5,29.549]],["parent/27",[19,1.692]],["name/28",[21,34.657]],["parent/28",[19,1.692]],["name/29",[22,29.549]],["parent/29",[]],["name/30",[23,16.199]],["parent/30",[]],["name/31",[24,34.657]],["parent/31",[23,1.477]],["name/32",[22,29.549]],["parent/32",[23,1.477]],["name/33",[13,18.563]],["parent/33",[23,1.477]],["name/34",[25,34.657]],["parent/34",[23,1.477]],["name/35",[26,34.657]],["parent/35",[23,1.477]],["name/36",[27,34.657]],["parent/36",[23,1.477]],["name/37",[28,34.657]],["parent/37",[23,1.477]],["name/38",[29,34.657]],["parent/38",[23,1.477]],["name/39",[30,34.657]],["parent/39",[]],["name/40",[31,18.563]],["parent/40",[]],["name/41",[32,34.657]],["parent/41",[31,1.692]],["name/42",[33,34.657]],["parent/42",[31,1.692]],["name/43",[34,34.657]],["parent/43",[31,1.692]],["name/44",[35,34.657]],["parent/44",[31,1.692]],["name/45",[36,34.657]],["parent/45",[31,1.692]],["name/46",[37,34.657]],["parent/46",[31,1.692]]],"invertedIndex":[["__type",{"_index":2,"name":{"2":{},"4":{},"6":{},"8":{},"10":{}},"parent":{}}],["avmloglevel",{"_index":22,"name":{"29":{},"32":{}},"parent":{}}],["avmworker",{"_index":29,"name":{"38":{}},"parent":{}}],["callparams",{"_index":31,"name":{"40":{}},"parent":{"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}}}],["checkconnectiontimeoutms",{"_index":25,"name":{"34":{}},"parent":{}}],["connectto",{"_index":24,"name":{"31":{}},"parent":{}}],["constructor",{"_index":16,"name":{"19":{},"24":{}},"parent":{}}],["defaultttlms",{"_index":28,"name":{"37":{}},"parent":{}}],["dialtimeoutms",{"_index":27,"name":{"36":{}},"parent":{}}],["fluence",{"_index":1,"name":{"1":{}},"parent":{"2":{}}}],["fluence.__type",{"_index":4,"name":{},"parent":{"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{}}}],["fluencepeer",{"_index":19,"name":{"22":{}},"parent":{"23":{},"24":{},"25":{},"26":{},"27":{},"28":{}}}],["fromed25519sk",{"_index":14,"name":{"17":{}},"parent":{}}],["getpeer",{"_index":7,"name":{"9":{}},"parent":{}}],["getstatus",{"_index":6,"name":{"7":{},"25":{}},"parent":{}}],["initpeerid",{"_index":33,"name":{"42":{}},"parent":{}}],["internals",{"_index":21,"name":{"28":{}},"parent":{}}],["isconnected",{"_index":10,"name":{"13":{}},"parent":{}}],["isinitialized",{"_index":9,"name":{"12":{}},"parent":{}}],["isinstance",{"_index":20,"name":{"23":{}},"parent":{}}],["keypair",{"_index":13,"name":{"16":{},"33":{}},"parent":{"17":{},"18":{},"19":{},"20":{},"21":{}}}],["libp2ppeerid",{"_index":17,"name":{"20":{}},"parent":{}}],["particleid",{"_index":32,"name":{"41":{}},"parent":{}}],["peerconfig",{"_index":23,"name":{"30":{}},"parent":{"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{}}}],["peerid",{"_index":11,"name":{"14":{}},"parent":{}}],["peeridb58",{"_index":30,"name":{"39":{}},"parent":{}}],["peerstatus",{"_index":8,"name":{"11":{}},"parent":{"12":{},"13":{},"14":{},"15":{}}}],["randomed25519",{"_index":15,"name":{"18":{}},"parent":{}}],["relaypeerid",{"_index":12,"name":{"15":{}},"parent":{}}],["setloglevel",{"_index":0,"name":{"0":{}},"parent":{}}],["signature",{"_index":36,"name":{"45":{}},"parent":{}}],["skipcheckconnection",{"_index":26,"name":{"35":{}},"parent":{}}],["start",{"_index":3,"name":{"3":{},"26":{}},"parent":{}}],["stop",{"_index":5,"name":{"5":{},"27":{}},"parent":{}}],["tetraplets",{"_index":37,"name":{"46":{}},"parent":{}}],["timestamp",{"_index":34,"name":{"43":{}},"parent":{}}],["toed25519privatekey",{"_index":18,"name":{"21":{}},"parent":{}}],["ttl",{"_index":35,"name":{"44":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/classes/FluencePeer.html b/docs/classes/FluencePeer.html index b38c44626..50d487d48 100644 --- a/docs/classes/FluencePeer.html +++ b/docs/classes/FluencePeer.html @@ -121,7 +121,7 @@

constructor

  • @@ -146,7 +146,7 @@

    internals

  • @@ -325,7 +325,7 @@

    getStatus

  • @@ -347,7 +347,7 @@

    start

  • @@ -379,7 +379,7 @@

    stop

  • @@ -402,7 +402,7 @@

    Static isInstance

  • diff --git a/docs/classes/KeyPair.html b/docs/classes/KeyPair.html index 77009dbba..3ad41240b 100644 --- a/docs/classes/KeyPair.html +++ b/docs/classes/KeyPair.html @@ -112,7 +112,7 @@

    constructor

  • Parameters

    @@ -134,7 +134,7 @@

    Libp2pPeerId

    Libp2pPeerId: PeerId
    @@ -156,7 +156,7 @@

    toEd25519PrivateKey

  • Returns Uint8Array

    @@ -174,7 +174,7 @@

    Static fromEd25519SK

  • @@ -205,7 +205,7 @@

    Static randomEd25519

  • diff --git a/docs/interfaces/CallParams.html b/docs/interfaces/CallParams.html index e193c41d5..74218ac70 100644 --- a/docs/interfaces/CallParams.html +++ b/docs/interfaces/CallParams.html @@ -118,7 +118,7 @@

    initPeerId

    initPeerId: string
    @@ -133,7 +133,7 @@

    particleId

    particleId: string
    @@ -148,7 +148,7 @@

    signature

    signature: string
    @@ -163,7 +163,7 @@

    tetraplets

    tetraplets: {[ key in string]: SecurityTetraplet[] }
    @@ -178,7 +178,7 @@

    timestamp

    timestamp: number
    @@ -193,7 +193,7 @@

    ttl

    ttl: number
    diff --git a/docs/interfaces/PeerConfig.html b/docs/interfaces/PeerConfig.html index 6ed5621f4..08f3953e9 100644 --- a/docs/interfaces/PeerConfig.html +++ b/docs/interfaces/PeerConfig.html @@ -89,6 +89,7 @@

    Properties

    • KeyPair
    • avmLogLevel
    • +
    • avmWorker
    • checkConnectionTimeoutMs
    • connectTo
    • defaultTtlMs
    • @@ -107,7 +108,7 @@

      Optional KeyPair

      KeyPair: KeyPair
      @@ -123,7 +124,7 @@

      Optional avmLogLevel
      avmLogLevel: LogLevel
      @@ -132,13 +133,28 @@

      Optional avmLogLevel

      +
      + +

      Optional avmWorker

      +
      avmWorker: AvmWorker
      + +
      +
      +

      Plugable AVM worker implementation. If no specified a single-thread, ui-blocking worker will be used.

      +
      +
      +

      Optional checkConnectionTimeoutMs

      checkConnectionTimeoutMs: number
      @@ -155,7 +171,7 @@

      Optional connectTo

      connectTo: string | Multiaddr | Node
      @@ -177,7 +193,7 @@

      Optional defaultTtlM
      defaultTtlMs: number
      @@ -194,7 +210,7 @@

      Optional dialTimeout
      dialTimeoutMs: number
      @@ -209,7 +225,7 @@

      Optional skipCheckCo
      skipCheckConnection: boolean
      @@ -252,6 +268,9 @@

      Optional skipCheckCo
    • avmLogLevel
    • +
    • + avmWorker +
    • checkConnectionTimeoutMs
    • diff --git a/docs/interfaces/PeerStatus.html b/docs/interfaces/PeerStatus.html index 3b6b6cd92..5355f52f9 100644 --- a/docs/interfaces/PeerStatus.html +++ b/docs/interfaces/PeerStatus.html @@ -104,7 +104,7 @@

      isConnected

      isConnected: Boolean
      @@ -119,7 +119,7 @@

      isInitialized

      isInitialized: Boolean
      @@ -134,7 +134,7 @@

      peerId

      peerId: string
      @@ -149,7 +149,7 @@

      relayPeerId

      relayPeerId: string
      diff --git a/docs/modules.html b/docs/modules.html index a1a62bafa..5113a8e04 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -106,7 +106,7 @@

      AvmLoglevel

      AvmLoglevel: LogLevel
      @@ -122,7 +122,7 @@

      PeerIdB58

      PeerIdB58: string
      @@ -140,7 +140,7 @@

      Const Fluence

      Fluence: { getPeer: () => FluencePeer; getStatus: () => PeerStatus; start: (config?: PeerConfig) => Promise<void>; stop: () => Promise<void> } = ...
      @@ -260,7 +260,7 @@

      Const setLogLevel

    • Parameters

      diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 46f1124a0..d2447c8b5 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -97,7 +97,7 @@ export interface PeerConfig { defaultTtlMs?: number; /** - * Pluggable AVM worker implementation + * Plugable AVM worker implementation. If no specified a single-thread, ui-blocking worker will be used. */ avmWorker?: AvmWorker; } From 78f5239d985cead3e409d0449439071f3a284321 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 16:23:32 +0300 Subject: [PATCH 03/23] Update packages version --- package-lock.json | 44 ++++++++++++++++---------------------------- package.json | 4 ++-- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7566bd87..7f914e1a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.0.2", - "@fluencelabs/avm-worker-common": "^0.0.2", + "@fluencelabs/avm-worker": "^0.1.0", + "@fluencelabs/avm-worker-common": "^0.1.0", "async": "3.2.0", "base64-js": "1.5.1", "bs58": "4.0.1", @@ -655,23 +655,18 @@ } }, "node_modules/@fluencelabs/avm-worker": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.0.2.tgz", - "integrity": "sha512-S5ijm0QpqNSVSlj3grj6479mBfdF9O1E03xUb5N1/RiBH3fTQnGpK5u5GmbKwPJ6CvZonH7jy8tfMhGDQq5q2w==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.0.tgz", + "integrity": "sha512-2f/eFmYy57JeTNbfe2QBk95HZC1ruwHxAqx/MSEwTCOffs3cZEXz5ZfQk+uBgurLgu2jY7tHoqC68p8k09FVrQ==", "dependencies": { "@fluencelabs/avm": "^0.17.4", - "@fluencelabs/avm-worker-common": "^0.0.1" + "@fluencelabs/avm-worker-common": "^0.1.0" } }, "node_modules/@fluencelabs/avm-worker-common": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.2.tgz", - "integrity": "sha512-2SrM9gReZ3h1A9oJGFGVxLSXEnjy1qhN+GG+abA0WEVkOTup6IKAkmKdbkby+HNgZYvdSqlVpCYhcPzdtmwlGw==" - }, - "node_modules/@fluencelabs/avm-worker/node_modules/@fluencelabs/avm-worker-common": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.1.tgz", - "integrity": "sha512-e3+oJD5NmEnCsKhAamZa68ogKX2AOZsWOJkORmYeAF+vDyzSa/nFxqRYa1KVOWhtlXZrKkUg7Mdk4qrZpZiuQg==" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.1.0.tgz", + "integrity": "sha512-dbQdyza1/OaHiz2t4FoYRBuy4KGDyCCFpk6NKnEvv9ELDe1V/pjPgKfpTFbyeSOJhl5/2lVwZzkXqY544b9qwg==" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -8715,25 +8710,18 @@ } }, "@fluencelabs/avm-worker": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.0.2.tgz", - "integrity": "sha512-S5ijm0QpqNSVSlj3grj6479mBfdF9O1E03xUb5N1/RiBH3fTQnGpK5u5GmbKwPJ6CvZonH7jy8tfMhGDQq5q2w==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.0.tgz", + "integrity": "sha512-2f/eFmYy57JeTNbfe2QBk95HZC1ruwHxAqx/MSEwTCOffs3cZEXz5ZfQk+uBgurLgu2jY7tHoqC68p8k09FVrQ==", "requires": { "@fluencelabs/avm": "^0.17.4", - "@fluencelabs/avm-worker-common": "^0.0.1" - }, - "dependencies": { - "@fluencelabs/avm-worker-common": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.1.tgz", - "integrity": "sha512-e3+oJD5NmEnCsKhAamZa68ogKX2AOZsWOJkORmYeAF+vDyzSa/nFxqRYa1KVOWhtlXZrKkUg7Mdk4qrZpZiuQg==" - } + "@fluencelabs/avm-worker-common": "^0.1.0" } }, "@fluencelabs/avm-worker-common": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.0.2.tgz", - "integrity": "sha512-2SrM9gReZ3h1A9oJGFGVxLSXEnjy1qhN+GG+abA0WEVkOTup6IKAkmKdbkby+HNgZYvdSqlVpCYhcPzdtmwlGw==" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.1.0.tgz", + "integrity": "sha512-dbQdyza1/OaHiz2t4FoYRBuy4KGDyCCFpk6NKnEvv9ELDe1V/pjPgKfpTFbyeSOJhl5/2lVwZzkXqY544b9qwg==" }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", diff --git a/package.json b/package.json index d61b82610..88fe75f78 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.0.2", - "@fluencelabs/avm-worker-common": "^0.0.2", + "@fluencelabs/avm-worker": "^0.1.0", + "@fluencelabs/avm-worker-common": "^0.1.0", "async": "3.2.0", "base64-js": "1.5.1", "bs58": "4.0.1", From a4a064ee40ee6f5f745163e519e0404747bcb424 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 16:45:57 +0300 Subject: [PATCH 04/23] Update @fluencelabs/avm-worker version --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f914e1a4..643845692 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.1.0", + "@fluencelabs/avm-worker": "^0.1.1", "@fluencelabs/avm-worker-common": "^0.1.0", "async": "3.2.0", "base64-js": "1.5.1", @@ -647,19 +647,19 @@ } }, "node_modules/@fluencelabs/avm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.4.tgz", - "integrity": "sha512-VKD/XaEDXsP0eEgpbncBCsLyHbGDh+f7b96KbYoHld25r3C7mgEbbEVImKLaHGDUiR7ylPBxrtQhNL9MpgKwxA==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.6.tgz", + "integrity": "sha512-UV3vKW4O3CmECNyao3aizbrdL5syX0cxoV/+GtqEFOSazLJ0s+qrfYr8j0UWp9zLFi64Z75r8DoJqxKb9wBxkA==", "dependencies": { "base64-js": "1.5.1" } }, "node_modules/@fluencelabs/avm-worker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.0.tgz", - "integrity": "sha512-2f/eFmYy57JeTNbfe2QBk95HZC1ruwHxAqx/MSEwTCOffs3cZEXz5ZfQk+uBgurLgu2jY7tHoqC68p8k09FVrQ==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.1.tgz", + "integrity": "sha512-E/PCxBhlYEfEbBOei+Lyoh4RGfeZDarcz1QxA9vzamOlMqpOMG1GlZDhqIhAyGDQS//KetvQ7cNKRLgZR+Kiiw==", "dependencies": { - "@fluencelabs/avm": "^0.17.4", + "@fluencelabs/avm": "^0.17.6", "@fluencelabs/avm-worker-common": "^0.1.0" } }, @@ -8702,19 +8702,19 @@ } }, "@fluencelabs/avm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.4.tgz", - "integrity": "sha512-VKD/XaEDXsP0eEgpbncBCsLyHbGDh+f7b96KbYoHld25r3C7mgEbbEVImKLaHGDUiR7ylPBxrtQhNL9MpgKwxA==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.6.tgz", + "integrity": "sha512-UV3vKW4O3CmECNyao3aizbrdL5syX0cxoV/+GtqEFOSazLJ0s+qrfYr8j0UWp9zLFi64Z75r8DoJqxKb9wBxkA==", "requires": { "base64-js": "1.5.1" } }, "@fluencelabs/avm-worker": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.0.tgz", - "integrity": "sha512-2f/eFmYy57JeTNbfe2QBk95HZC1ruwHxAqx/MSEwTCOffs3cZEXz5ZfQk+uBgurLgu2jY7tHoqC68p8k09FVrQ==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.1.1.tgz", + "integrity": "sha512-E/PCxBhlYEfEbBOei+Lyoh4RGfeZDarcz1QxA9vzamOlMqpOMG1GlZDhqIhAyGDQS//KetvQ7cNKRLgZR+Kiiw==", "requires": { - "@fluencelabs/avm": "^0.17.4", + "@fluencelabs/avm": "^0.17.6", "@fluencelabs/avm-worker-common": "^0.1.0" } }, diff --git a/package.json b/package.json index 88fe75f78..6cb8e76ad 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.1.0", + "@fluencelabs/avm-worker": "^0.1.1", "@fluencelabs/avm-worker-common": "^0.1.0", "async": "3.2.0", "base64-js": "1.5.1", From 9810aa682b338f0af94b55ed6d431a5385f1a287 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 17:47:14 +0300 Subject: [PATCH 05/23] Logging call requests --- src/internal/Particle.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index 441b286bc..cc14aaee5 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -135,6 +135,7 @@ export class Particle { ttl: this.ttl, script: this.script, signature: this.signature, + callResults: this.callResults, data: data, }); } From 9d0a4da200608ea08275d3e676587dcccd88e0b9 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 17:56:39 +0300 Subject: [PATCH 06/23] More debugging --- src/internal/FluencePeer.ts | 7 ++++--- src/internal/Particle.ts | 23 +++++++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index d2447c8b5..6bdd821a5 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -529,7 +529,9 @@ export class FluencePeer { ? await handler(req) : { retCode: ResultCodes.unknownError, - result: `No handler has been registered for serviceId='${req.serviceId}' fnName='${req.fnName}' args='${req.args}'`, + result: + `No handler has been registered for serviceId='${req.serviceId}' fnName='${req.fnName}' ` + + `args='${JSON.stringify(req.args)}'`, }; } @@ -537,7 +539,7 @@ export class FluencePeer { res.result = null; } - log.debug('executed call service handler, req and res are: ', req, res); + log.debug('executed call service handler, req and res are: ', JSON.stringify(req), JSON.stringify(res)); return res; } @@ -592,7 +594,6 @@ async function runAvmWorker( ): Promise { particle.logTo('debug', 'Sending particle to interpreter'); log.debug('prevData: ', dataToString(prevData)); - log.debug('data: ', dataToString(particle.data)); const interpreterResult = await worker.run( particle.script, prevData, diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index cc14aaee5..e94bff60d 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -128,16 +128,19 @@ export class Particle { return; } - fn(message, { - id: this.id, - init_peer_id: this.initPeerId, - timestamp: this.timestamp, - ttl: this.ttl, - script: this.script, - signature: this.signature, - callResults: this.callResults, - data: data, - }); + fn( + message, + JSON.stringify({ + id: this.id, + init_peer_id: this.initPeerId, + timestamp: this.timestamp, + ttl: this.ttl, + script: this.script, + signature: this.signature, + callResults: this.callResults, + data: data, + }), + ); } } From 3610ebabc7b95c248dfe1d11d305f846361d824c Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 18:32:33 +0300 Subject: [PATCH 07/23] fix logging once more --- src/internal/FluencePeer.ts | 10 +++++----- src/internal/Particle.ts | 4 ++-- src/internal/utils.ts | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 6bdd821a5..0c54493ee 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -21,7 +21,7 @@ import { PeerIdB58 } from './commonTypes'; import { FluenceConnection } from './FluenceConnection'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle'; import { KeyPair } from './KeyPair'; -import { dataToString, avmLogFunction } from './utils'; +import { dataToString, avmLogFunction, w } from './utils'; import { filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; @@ -466,7 +466,7 @@ export class FluencePeer { ) .then((res) => { const serviceResult = { - result: JSON.stringify(res.result), + result: w(res.result), retCode: res.retCode, }; @@ -486,7 +486,7 @@ export class FluencePeer { } private async _execSingleCallRequest(req: CallServiceData): Promise { - log.debug('executing call service handler', req); + log.debug('executing call service handler', w(req)); const particleId = req.particleContext.particleId; // trying particle-specific handler @@ -531,7 +531,7 @@ export class FluencePeer { retCode: ResultCodes.unknownError, result: `No handler has been registered for serviceId='${req.serviceId}' fnName='${req.fnName}' ` + - `args='${JSON.stringify(req.args)}'`, + `args='${w(req.args)}'`, }; } @@ -539,7 +539,7 @@ export class FluencePeer { res.result = null; } - log.debug('executed call service handler, req and res are: ', JSON.stringify(req), JSON.stringify(res)); + log.debug('executed call service handler, req and res are: ', w(req), w(res)); return res; } diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index e94bff60d..e51ba976a 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -19,7 +19,7 @@ import { fromByteArray, toByteArray } from 'base64-js'; import { CallResultsArray, LogLevel } from '@fluencelabs/avm-worker-common'; import log from 'loglevel'; import { ParticleContext } from './commonTypes'; -import { dataToString } from './utils'; +import { dataToString, w } from './utils'; export class Particle { id: string; @@ -130,7 +130,7 @@ export class Particle { fn( message, - JSON.stringify({ + w({ id: this.id, init_peer_id: this.initPeerId, timestamp: this.timestamp, diff --git a/src/internal/utils.ts b/src/internal/utils.ts index 41828343d..b7c8b94b2 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -155,3 +155,7 @@ export const checkConnection = async (peer: FluencePeer, ttl?: number): Promise< export function dataToString(data: Uint8Array) { return new TextDecoder().decode(Buffer.from(data)); } + +export function w(obj) { + return JSON.stringify(obj, null, 4); +} From 658a41b41845a2420f93cf8a100f97a0fe1c6a73 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 8 Dec 2021 18:39:58 +0300 Subject: [PATCH 08/23] fix loggning once more 2 --- src/internal/FluencePeer.ts | 4 ++-- src/internal/utils.ts | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 0c54493ee..7cd10413b 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -609,9 +609,9 @@ async function runAvmWorker( toLog.data = dataToString(toLog.data); if (isInterpretationSuccessful(interpreterResult)) { - log.debug('Interpreter result: ', toLog); + log.debug('Interpreter result: ', w(toLog)); } else { - log.error('Interpreter failed: ', toLog); + log.error('Interpreter failed: ', w(toLog)); } return interpreterResult; } diff --git a/src/internal/utils.ts b/src/internal/utils.ts index b7c8b94b2..af727078d 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -153,7 +153,12 @@ export const checkConnection = async (peer: FluencePeer, ttl?: number): Promise< }; export function dataToString(data: Uint8Array) { - return new TextDecoder().decode(Buffer.from(data)); + const text = new TextDecoder().decode(Buffer.from(data)); + try { + return JSON.stringify(JSON.parse(text), null, 4); + } catch { + return text; + } } export function w(obj) { From 5613c1d1daa6200d3bb0f1d8a0e40e4ee2c91790 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Mon, 13 Dec 2021 18:10:13 +0300 Subject: [PATCH 09/23] Simple enough fix for the race issue --- src/__test__/integration/peer.spec.ts | 2 +- src/internal/FluencePeer.ts | 43 +++++++++++++++++---------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/__test__/integration/peer.spec.ts b/src/__test__/integration/peer.spec.ts index fe5e100f6..436cc11bf 100644 --- a/src/__test__/integration/peer.spec.ts +++ b/src/__test__/integration/peer.spec.ts @@ -328,7 +328,7 @@ describe('Typescript usage suite', () => { // assert await expect(res).rejects.toMatchObject({ msg: expect.stringContaining( - `No handler has been registered for serviceId='incorrect' fnName='incorrect' args=''\"'`, + `No handler has been registered for serviceId='incorrect' fnName='incorrect' args='[]'\"'`, ), instruction: 'call %init_peer_id% ("incorrect" "incorrect") [] res', }); diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 7cd10413b..73cf6f602 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -22,7 +22,7 @@ import { FluenceConnection } from './FluenceConnection'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle'; import { KeyPair } from './KeyPair'; import { dataToString, avmLogFunction, w } from './utils'; -import { filter, pipe, Subject, tap } from 'rxjs'; +import { concatMap, filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; import { defaultServices } from './defaultServices'; @@ -418,14 +418,28 @@ export class FluencePeer { .pipe( // force new line filterExpiredParticles(this._expireParticle.bind(this)), + + concatMap(async (item) => { + // IMPORTANT! + // AVM worker execution and prevData <-> newData swapping + // MUST happen sequentially (in a critical section). + // Otherwise the race between worker might occur corrupting the prevData + + const result = await runAvmWorker(this.getStatus().peerId, this._worker, item.particle, prevData); + const newData = Buffer.from(result.data); + prevData = newData; + + return { + ...item, + result: result, + newData: newData, + }; + }), ) .subscribe(async (item) => { - const particle = item.particle; - const result = await runAvmWorker(this.getStatus().peerId, this._worker, particle, prevData); - // Do not continue if there was an error in particle interpretation - if (!isInterpretationSuccessful(result)) { - item.onStageChange({ stage: 'interpreterError', errorMessage: result.errorMessage }); + if (!isInterpretationSuccessful(item.result)) { + item.onStageChange({ stage: 'interpreterError', errorMessage: item.result.errorMessage }); return; } @@ -433,26 +447,23 @@ export class FluencePeer { item.onStageChange({ stage: 'interpreted' }); }, 0); - const newData = Buffer.from(result.data); - prevData = newData; - // send particle further if requested - if (result.nextPeerPks.length > 0) { - const newParticle = particle.clone(); - newParticle.data = newData; + if (item.result.nextPeerPks.length > 0) { + const newParticle = item.particle.clone(); + newParticle.data = item.newData; this._outgoingParticles.next({ ...item, particle: newParticle }); } // execute call requests if needed // and put particle with the results back to queue - if (result.callRequests.length > 0) { - for (let [key, cr] of result.callRequests) { + if (item.result.callRequests.length > 0) { + for (let [key, cr] of item.result.callRequests) { const req = { fnName: cr.functionName, args: cr.arguments, serviceId: cr.serviceId, tetraplets: cr.tetraplets, - particleContext: particle.getParticleContext(), + particleContext: item.particle.getParticleContext(), }; this._execSingleCallRequest(req) @@ -470,7 +481,7 @@ export class FluencePeer { retCode: res.retCode, }; - const newParticle = particle.clone(); + const newParticle = item.particle.clone(); newParticle.callResults = [[key, serviceResult]]; newParticle.data = Buffer.from([]); From 9c92aaffcad79e1b3a1fd5fcd57ae196c78636b8 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Mon, 13 Dec 2021 18:33:57 +0300 Subject: [PATCH 10/23] better name for w --- src/internal/FluencePeer.ts | 16 +++++++++------- src/internal/Particle.ts | 4 ++-- src/internal/utils.ts | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 5ebfd3849..32b967624 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -21,7 +21,7 @@ import { PeerIdB58 } from './commonTypes'; import { FluenceConnection } from './FluenceConnection'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle'; import { KeyPair } from './KeyPair'; -import { dataToString, avmLogFunction, w } from './utils'; +import { dataToString, avmLogFunction, str } from './utils'; import { concatMap, filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; @@ -480,7 +480,7 @@ export class FluencePeer { ) .then((res) => { const serviceResult = { - result: w(res.result), + result: str(res.result), retCode: res.retCode, }; @@ -500,7 +500,7 @@ export class FluencePeer { } private async _execSingleCallRequest(req: CallServiceData): Promise { - log.debug('executing call service handler', w(req)); + log.debug('executing call service handler', str(req)); const particleId = req.particleContext.particleId; // trying particle-specific handler @@ -543,7 +543,9 @@ export class FluencePeer { ? await handler(req) : { retCode: ResultCodes.error, - result: `No handler has been registered for serviceId='${req.serviceId}' fnName='${req.fnName}' args='${w(req.args)}'`, + result: `No handler has been registered for serviceId='${req.serviceId}' fnName='${ + req.fnName + }' args='${str(req.args)}'`, }; } @@ -551,7 +553,7 @@ export class FluencePeer { res.result = null; } - log.debug('executed call service handler, req and res are: ', w(req), w(res)); + log.debug('executed call service handler, req and res are: ', str(req), str(res)); return res; } @@ -622,9 +624,9 @@ async function runAvmWorker( toLog.data = dataToString(toLog.data); if (isInterpretationSuccessful(interpreterResult)) { - log.debug('Interpreter result: ', w(toLog)); + log.debug('Interpreter result: ', str(toLog)); } else { - log.error('Interpreter failed: ', w(toLog)); + log.error('Interpreter failed: ', str(toLog)); } return interpreterResult; } diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index e51ba976a..eeecc6cb2 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -19,7 +19,7 @@ import { fromByteArray, toByteArray } from 'base64-js'; import { CallResultsArray, LogLevel } from '@fluencelabs/avm-worker-common'; import log from 'loglevel'; import { ParticleContext } from './commonTypes'; -import { dataToString, w } from './utils'; +import { dataToString, str } from './utils'; export class Particle { id: string; @@ -130,7 +130,7 @@ export class Particle { fn( message, - w({ + str({ id: this.id, init_peer_id: this.initPeerId, timestamp: this.timestamp, diff --git a/src/internal/utils.ts b/src/internal/utils.ts index af727078d..280a6e002 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -161,6 +161,6 @@ export function dataToString(data: Uint8Array) { } } -export function w(obj) { +export function str(obj) { return JSON.stringify(obj, null, 4); } From eaaf775b7c27039bb48a9bcddbf1b7d78678feca Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 14 Dec 2021 22:40:59 +0300 Subject: [PATCH 11/23] Update packages versions --- docs/assets/js/search.js | 2 +- docs/classes/FluencePeer.html | 12 +++--- docs/classes/KeyPair.html | 67 +++++++++++++++++++++++++++--- docs/interfaces/CallParams.html | 12 +++--- docs/interfaces/PeerConfig.html | 28 ++++++------- docs/interfaces/PeerStatus.html | 8 ++-- docs/modules.html | 8 ++-- package-lock.json | 40 +++++++++--------- package.json | 4 +- src/internal/FluencePeer.ts | 25 ++++++----- src/internal/Particle.ts | 2 +- src/internal/builtInServices.ts | 2 +- src/internal/commonTypes.ts | 2 +- src/internal/compilerSupport/v2.ts | 2 +- src/internal/utils.ts | 2 +- 15 files changed, 139 insertions(+), 77 deletions(-) diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js index a8e153db4..29e5b0f43 100644 --- a/docs/assets/js/search.js +++ b/docs/assets/js/search.js @@ -1 +1 @@ -window.searchData = {"kinds":{"32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias"},"rows":[{"id":0,"kind":64,"name":"setLogLevel","url":"modules.html#setLogLevel","classes":"tsd-kind-function"},{"id":1,"kind":32,"name":"Fluence","url":"modules.html#Fluence","classes":"tsd-kind-variable"},{"id":2,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type","classes":"tsd-kind-type-literal tsd-parent-kind-variable","parent":"Fluence"},{"id":3,"kind":1024,"name":"start","url":"modules.html#Fluence.__type.start","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":4,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":5,"kind":1024,"name":"stop","url":"modules.html#Fluence.__type.stop","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":6,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":7,"kind":1024,"name":"getStatus","url":"modules.html#Fluence.__type.getStatus","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":8,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":9,"kind":1024,"name":"getPeer","url":"modules.html#Fluence.__type.getPeer","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":10,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":11,"kind":256,"name":"PeerStatus","url":"interfaces/PeerStatus.html","classes":"tsd-kind-interface"},{"id":12,"kind":1024,"name":"isInitialized","url":"interfaces/PeerStatus.html#isInitialized","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":13,"kind":1024,"name":"isConnected","url":"interfaces/PeerStatus.html#isConnected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":14,"kind":1024,"name":"peerId","url":"interfaces/PeerStatus.html#peerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":15,"kind":1024,"name":"relayPeerId","url":"interfaces/PeerStatus.html#relayPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":16,"kind":128,"name":"KeyPair","url":"classes/KeyPair.html","classes":"tsd-kind-class"},{"id":17,"kind":2048,"name":"fromEd25519SK","url":"classes/KeyPair.html#fromEd25519SK","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":18,"kind":2048,"name":"randomEd25519","url":"classes/KeyPair.html#randomEd25519","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":19,"kind":512,"name":"constructor","url":"classes/KeyPair.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"KeyPair"},{"id":20,"kind":1024,"name":"Libp2pPeerId","url":"classes/KeyPair.html#Libp2pPeerId","classes":"tsd-kind-property tsd-parent-kind-class","parent":"KeyPair"},{"id":21,"kind":2048,"name":"toEd25519PrivateKey","url":"classes/KeyPair.html#toEd25519PrivateKey","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":22,"kind":128,"name":"FluencePeer","url":"classes/FluencePeer.html","classes":"tsd-kind-class"},{"id":23,"kind":2048,"name":"isInstance","url":"classes/FluencePeer.html#isInstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"FluencePeer"},{"id":24,"kind":512,"name":"constructor","url":"classes/FluencePeer.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"FluencePeer"},{"id":25,"kind":2048,"name":"getStatus","url":"classes/FluencePeer.html#getStatus","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":26,"kind":2048,"name":"start","url":"classes/FluencePeer.html#start","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":27,"kind":2048,"name":"stop","url":"classes/FluencePeer.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":28,"kind":262144,"name":"internals","url":"classes/FluencePeer.html#internals","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"FluencePeer"},{"id":29,"kind":4194304,"name":"AvmLoglevel","url":"modules.html#AvmLoglevel","classes":"tsd-kind-type-alias"},{"id":30,"kind":256,"name":"PeerConfig","url":"interfaces/PeerConfig.html","classes":"tsd-kind-interface"},{"id":31,"kind":1024,"name":"connectTo","url":"interfaces/PeerConfig.html#connectTo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":32,"kind":1024,"name":"avmLogLevel","url":"interfaces/PeerConfig.html#avmLogLevel","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":33,"kind":1024,"name":"KeyPair","url":"interfaces/PeerConfig.html#KeyPair","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":34,"kind":1024,"name":"checkConnectionTimeoutMs","url":"interfaces/PeerConfig.html#checkConnectionTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":35,"kind":1024,"name":"skipCheckConnection","url":"interfaces/PeerConfig.html#skipCheckConnection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":36,"kind":1024,"name":"dialTimeoutMs","url":"interfaces/PeerConfig.html#dialTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":37,"kind":1024,"name":"defaultTtlMs","url":"interfaces/PeerConfig.html#defaultTtlMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":38,"kind":1024,"name":"avmWorker","url":"interfaces/PeerConfig.html#avmWorker","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":39,"kind":4194304,"name":"PeerIdB58","url":"modules.html#PeerIdB58","classes":"tsd-kind-type-alias"},{"id":40,"kind":256,"name":"CallParams","url":"interfaces/CallParams.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":41,"kind":1024,"name":"particleId","url":"interfaces/CallParams.html#particleId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":42,"kind":1024,"name":"initPeerId","url":"interfaces/CallParams.html#initPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":43,"kind":1024,"name":"timestamp","url":"interfaces/CallParams.html#timestamp","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":44,"kind":1024,"name":"ttl","url":"interfaces/CallParams.html#ttl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":45,"kind":1024,"name":"signature","url":"interfaces/CallParams.html#signature","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":46,"kind":1024,"name":"tetraplets","url":"interfaces/CallParams.html#tetraplets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,34.657]],["parent/0",[]],["name/1",[1,29.549]],["parent/1",[]],["name/2",[2,21.665]],["parent/2",[1,2.694]],["name/3",[3,29.549]],["parent/3",[4,1.578]],["name/4",[2,21.665]],["parent/4",[4,1.578]],["name/5",[5,29.549]],["parent/5",[4,1.578]],["name/6",[2,21.665]],["parent/6",[4,1.578]],["name/7",[6,29.549]],["parent/7",[4,1.578]],["name/8",[2,21.665]],["parent/8",[4,1.578]],["name/9",[7,34.657]],["parent/9",[4,1.578]],["name/10",[2,21.665]],["parent/10",[4,1.578]],["name/11",[8,21.665]],["parent/11",[]],["name/12",[9,34.657]],["parent/12",[8,1.975]],["name/13",[10,34.657]],["parent/13",[8,1.975]],["name/14",[11,34.657]],["parent/14",[8,1.975]],["name/15",[12,34.657]],["parent/15",[8,1.975]],["name/16",[13,18.563]],["parent/16",[]],["name/17",[14,34.657]],["parent/17",[13,1.692]],["name/18",[15,34.657]],["parent/18",[13,1.692]],["name/19",[16,29.549]],["parent/19",[13,1.692]],["name/20",[17,34.657]],["parent/20",[13,1.692]],["name/21",[18,34.657]],["parent/21",[13,1.692]],["name/22",[19,18.563]],["parent/22",[]],["name/23",[20,34.657]],["parent/23",[19,1.692]],["name/24",[16,29.549]],["parent/24",[19,1.692]],["name/25",[6,29.549]],["parent/25",[19,1.692]],["name/26",[3,29.549]],["parent/26",[19,1.692]],["name/27",[5,29.549]],["parent/27",[19,1.692]],["name/28",[21,34.657]],["parent/28",[19,1.692]],["name/29",[22,29.549]],["parent/29",[]],["name/30",[23,16.199]],["parent/30",[]],["name/31",[24,34.657]],["parent/31",[23,1.477]],["name/32",[22,29.549]],["parent/32",[23,1.477]],["name/33",[13,18.563]],["parent/33",[23,1.477]],["name/34",[25,34.657]],["parent/34",[23,1.477]],["name/35",[26,34.657]],["parent/35",[23,1.477]],["name/36",[27,34.657]],["parent/36",[23,1.477]],["name/37",[28,34.657]],["parent/37",[23,1.477]],["name/38",[29,34.657]],["parent/38",[23,1.477]],["name/39",[30,34.657]],["parent/39",[]],["name/40",[31,18.563]],["parent/40",[]],["name/41",[32,34.657]],["parent/41",[31,1.692]],["name/42",[33,34.657]],["parent/42",[31,1.692]],["name/43",[34,34.657]],["parent/43",[31,1.692]],["name/44",[35,34.657]],["parent/44",[31,1.692]],["name/45",[36,34.657]],["parent/45",[31,1.692]],["name/46",[37,34.657]],["parent/46",[31,1.692]]],"invertedIndex":[["__type",{"_index":2,"name":{"2":{},"4":{},"6":{},"8":{},"10":{}},"parent":{}}],["avmloglevel",{"_index":22,"name":{"29":{},"32":{}},"parent":{}}],["avmworker",{"_index":29,"name":{"38":{}},"parent":{}}],["callparams",{"_index":31,"name":{"40":{}},"parent":{"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}}}],["checkconnectiontimeoutms",{"_index":25,"name":{"34":{}},"parent":{}}],["connectto",{"_index":24,"name":{"31":{}},"parent":{}}],["constructor",{"_index":16,"name":{"19":{},"24":{}},"parent":{}}],["defaultttlms",{"_index":28,"name":{"37":{}},"parent":{}}],["dialtimeoutms",{"_index":27,"name":{"36":{}},"parent":{}}],["fluence",{"_index":1,"name":{"1":{}},"parent":{"2":{}}}],["fluence.__type",{"_index":4,"name":{},"parent":{"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{}}}],["fluencepeer",{"_index":19,"name":{"22":{}},"parent":{"23":{},"24":{},"25":{},"26":{},"27":{},"28":{}}}],["fromed25519sk",{"_index":14,"name":{"17":{}},"parent":{}}],["getpeer",{"_index":7,"name":{"9":{}},"parent":{}}],["getstatus",{"_index":6,"name":{"7":{},"25":{}},"parent":{}}],["initpeerid",{"_index":33,"name":{"42":{}},"parent":{}}],["internals",{"_index":21,"name":{"28":{}},"parent":{}}],["isconnected",{"_index":10,"name":{"13":{}},"parent":{}}],["isinitialized",{"_index":9,"name":{"12":{}},"parent":{}}],["isinstance",{"_index":20,"name":{"23":{}},"parent":{}}],["keypair",{"_index":13,"name":{"16":{},"33":{}},"parent":{"17":{},"18":{},"19":{},"20":{},"21":{}}}],["libp2ppeerid",{"_index":17,"name":{"20":{}},"parent":{}}],["particleid",{"_index":32,"name":{"41":{}},"parent":{}}],["peerconfig",{"_index":23,"name":{"30":{}},"parent":{"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{}}}],["peerid",{"_index":11,"name":{"14":{}},"parent":{}}],["peeridb58",{"_index":30,"name":{"39":{}},"parent":{}}],["peerstatus",{"_index":8,"name":{"11":{}},"parent":{"12":{},"13":{},"14":{},"15":{}}}],["randomed25519",{"_index":15,"name":{"18":{}},"parent":{}}],["relaypeerid",{"_index":12,"name":{"15":{}},"parent":{}}],["setloglevel",{"_index":0,"name":{"0":{}},"parent":{}}],["signature",{"_index":36,"name":{"45":{}},"parent":{}}],["skipcheckconnection",{"_index":26,"name":{"35":{}},"parent":{}}],["start",{"_index":3,"name":{"3":{},"26":{}},"parent":{}}],["stop",{"_index":5,"name":{"5":{},"27":{}},"parent":{}}],["tetraplets",{"_index":37,"name":{"46":{}},"parent":{}}],["timestamp",{"_index":34,"name":{"43":{}},"parent":{}}],["toed25519privatekey",{"_index":18,"name":{"21":{}},"parent":{}}],["ttl",{"_index":35,"name":{"44":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file +window.searchData = {"kinds":{"32":"Variable","64":"Function","128":"Class","256":"Interface","512":"Constructor","1024":"Property","2048":"Method","65536":"Type literal","262144":"Accessor","4194304":"Type alias"},"rows":[{"id":0,"kind":64,"name":"setLogLevel","url":"modules.html#setLogLevel","classes":"tsd-kind-function"},{"id":1,"kind":32,"name":"Fluence","url":"modules.html#Fluence","classes":"tsd-kind-variable"},{"id":2,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type","classes":"tsd-kind-type-literal tsd-parent-kind-variable","parent":"Fluence"},{"id":3,"kind":1024,"name":"start","url":"modules.html#Fluence.__type.start","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":4,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-3","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":5,"kind":1024,"name":"stop","url":"modules.html#Fluence.__type.stop","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":6,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-4","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":7,"kind":1024,"name":"getStatus","url":"modules.html#Fluence.__type.getStatus","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":8,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-2","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":9,"kind":1024,"name":"getPeer","url":"modules.html#Fluence.__type.getPeer","classes":"tsd-kind-property tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":10,"kind":65536,"name":"__type","url":"modules.html#Fluence.__type.__type-1","classes":"tsd-kind-type-literal tsd-parent-kind-type-literal","parent":"Fluence.__type"},{"id":11,"kind":256,"name":"PeerStatus","url":"interfaces/PeerStatus.html","classes":"tsd-kind-interface"},{"id":12,"kind":1024,"name":"isInitialized","url":"interfaces/PeerStatus.html#isInitialized","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":13,"kind":1024,"name":"isConnected","url":"interfaces/PeerStatus.html#isConnected","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":14,"kind":1024,"name":"peerId","url":"interfaces/PeerStatus.html#peerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":15,"kind":1024,"name":"relayPeerId","url":"interfaces/PeerStatus.html#relayPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerStatus"},{"id":16,"kind":128,"name":"KeyPair","url":"classes/KeyPair.html","classes":"tsd-kind-class"},{"id":17,"kind":2048,"name":"fromEd25519SK","url":"classes/KeyPair.html#fromEd25519SK","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":18,"kind":2048,"name":"randomEd25519","url":"classes/KeyPair.html#randomEd25519","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"KeyPair"},{"id":19,"kind":512,"name":"constructor","url":"classes/KeyPair.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"KeyPair"},{"id":20,"kind":1024,"name":"Libp2pPeerId","url":"classes/KeyPair.html#Libp2pPeerId","classes":"tsd-kind-property tsd-parent-kind-class","parent":"KeyPair"},{"id":21,"kind":2048,"name":"toEd25519PrivateKey","url":"classes/KeyPair.html#toEd25519PrivateKey","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":22,"kind":2048,"name":"signBytes","url":"classes/KeyPair.html#signBytes","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":23,"kind":2048,"name":"verify","url":"classes/KeyPair.html#verify","classes":"tsd-kind-method tsd-parent-kind-class","parent":"KeyPair"},{"id":24,"kind":128,"name":"FluencePeer","url":"classes/FluencePeer.html","classes":"tsd-kind-class"},{"id":25,"kind":2048,"name":"isInstance","url":"classes/FluencePeer.html#isInstance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"FluencePeer"},{"id":26,"kind":512,"name":"constructor","url":"classes/FluencePeer.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"FluencePeer"},{"id":27,"kind":2048,"name":"getStatus","url":"classes/FluencePeer.html#getStatus","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":28,"kind":2048,"name":"start","url":"classes/FluencePeer.html#start","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":29,"kind":2048,"name":"stop","url":"classes/FluencePeer.html#stop","classes":"tsd-kind-method tsd-parent-kind-class","parent":"FluencePeer"},{"id":30,"kind":262144,"name":"internals","url":"classes/FluencePeer.html#internals","classes":"tsd-kind-get-signature tsd-parent-kind-class","parent":"FluencePeer"},{"id":31,"kind":4194304,"name":"AvmLoglevel","url":"modules.html#AvmLoglevel","classes":"tsd-kind-type-alias"},{"id":32,"kind":256,"name":"PeerConfig","url":"interfaces/PeerConfig.html","classes":"tsd-kind-interface"},{"id":33,"kind":1024,"name":"connectTo","url":"interfaces/PeerConfig.html#connectTo","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":34,"kind":1024,"name":"avmLogLevel","url":"interfaces/PeerConfig.html#avmLogLevel","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":35,"kind":1024,"name":"KeyPair","url":"interfaces/PeerConfig.html#KeyPair","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":36,"kind":1024,"name":"checkConnectionTimeoutMs","url":"interfaces/PeerConfig.html#checkConnectionTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":37,"kind":1024,"name":"skipCheckConnection","url":"interfaces/PeerConfig.html#skipCheckConnection","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":38,"kind":1024,"name":"dialTimeoutMs","url":"interfaces/PeerConfig.html#dialTimeoutMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":39,"kind":1024,"name":"defaultTtlMs","url":"interfaces/PeerConfig.html#defaultTtlMs","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":40,"kind":1024,"name":"avmRunner","url":"interfaces/PeerConfig.html#avmRunner","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"PeerConfig"},{"id":41,"kind":4194304,"name":"PeerIdB58","url":"modules.html#PeerIdB58","classes":"tsd-kind-type-alias"},{"id":42,"kind":256,"name":"CallParams","url":"interfaces/CallParams.html","classes":"tsd-kind-interface tsd-has-type-parameter"},{"id":43,"kind":1024,"name":"particleId","url":"interfaces/CallParams.html#particleId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":44,"kind":1024,"name":"initPeerId","url":"interfaces/CallParams.html#initPeerId","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":45,"kind":1024,"name":"timestamp","url":"interfaces/CallParams.html#timestamp","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":46,"kind":1024,"name":"ttl","url":"interfaces/CallParams.html#ttl","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":47,"kind":1024,"name":"signature","url":"interfaces/CallParams.html#signature","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"},{"id":48,"kind":1024,"name":"tetraplets","url":"interfaces/CallParams.html#tetraplets","classes":"tsd-kind-property tsd-parent-kind-interface","parent":"CallParams"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,35.066]],["parent/0",[]],["name/1",[1,29.957]],["parent/1",[]],["name/2",[2,22.073]],["parent/2",[1,2.743]],["name/3",[3,29.957]],["parent/3",[4,1.623]],["name/4",[2,22.073]],["parent/4",[4,1.623]],["name/5",[5,29.957]],["parent/5",[4,1.623]],["name/6",[2,22.073]],["parent/6",[4,1.623]],["name/7",[6,29.957]],["parent/7",[4,1.623]],["name/8",[2,22.073]],["parent/8",[4,1.623]],["name/9",[7,35.066]],["parent/9",[4,1.623]],["name/10",[2,22.073]],["parent/10",[4,1.623]],["name/11",[8,22.073]],["parent/11",[]],["name/12",[9,35.066]],["parent/12",[8,2.021]],["name/13",[10,35.066]],["parent/13",[8,2.021]],["name/14",[11,35.066]],["parent/14",[8,2.021]],["name/15",[12,35.066]],["parent/15",[8,2.021]],["name/16",[13,16.607]],["parent/16",[]],["name/17",[14,35.066]],["parent/17",[13,1.521]],["name/18",[15,35.066]],["parent/18",[13,1.521]],["name/19",[16,29.957]],["parent/19",[13,1.521]],["name/20",[17,35.066]],["parent/20",[13,1.521]],["name/21",[18,35.066]],["parent/21",[13,1.521]],["name/22",[19,35.066]],["parent/22",[13,1.521]],["name/23",[20,35.066]],["parent/23",[13,1.521]],["name/24",[21,18.971]],["parent/24",[]],["name/25",[22,35.066]],["parent/25",[21,1.737]],["name/26",[16,29.957]],["parent/26",[21,1.737]],["name/27",[6,29.957]],["parent/27",[21,1.737]],["name/28",[3,29.957]],["parent/28",[21,1.737]],["name/29",[5,29.957]],["parent/29",[21,1.737]],["name/30",[23,35.066]],["parent/30",[21,1.737]],["name/31",[24,29.957]],["parent/31",[]],["name/32",[25,16.607]],["parent/32",[]],["name/33",[26,35.066]],["parent/33",[25,1.521]],["name/34",[24,29.957]],["parent/34",[25,1.521]],["name/35",[13,16.607]],["parent/35",[25,1.521]],["name/36",[27,35.066]],["parent/36",[25,1.521]],["name/37",[28,35.066]],["parent/37",[25,1.521]],["name/38",[29,35.066]],["parent/38",[25,1.521]],["name/39",[30,35.066]],["parent/39",[25,1.521]],["name/40",[31,35.066]],["parent/40",[25,1.521]],["name/41",[32,35.066]],["parent/41",[]],["name/42",[33,18.971]],["parent/42",[]],["name/43",[34,35.066]],["parent/43",[33,1.737]],["name/44",[35,35.066]],["parent/44",[33,1.737]],["name/45",[36,35.066]],["parent/45",[33,1.737]],["name/46",[37,35.066]],["parent/46",[33,1.737]],["name/47",[38,35.066]],["parent/47",[33,1.737]],["name/48",[39,35.066]],["parent/48",[33,1.737]]],"invertedIndex":[["__type",{"_index":2,"name":{"2":{},"4":{},"6":{},"8":{},"10":{}},"parent":{}}],["avmloglevel",{"_index":24,"name":{"31":{},"34":{}},"parent":{}}],["avmrunner",{"_index":31,"name":{"40":{}},"parent":{}}],["callparams",{"_index":33,"name":{"42":{}},"parent":{"43":{},"44":{},"45":{},"46":{},"47":{},"48":{}}}],["checkconnectiontimeoutms",{"_index":27,"name":{"36":{}},"parent":{}}],["connectto",{"_index":26,"name":{"33":{}},"parent":{}}],["constructor",{"_index":16,"name":{"19":{},"26":{}},"parent":{}}],["defaultttlms",{"_index":30,"name":{"39":{}},"parent":{}}],["dialtimeoutms",{"_index":29,"name":{"38":{}},"parent":{}}],["fluence",{"_index":1,"name":{"1":{}},"parent":{"2":{}}}],["fluence.__type",{"_index":4,"name":{},"parent":{"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{}}}],["fluencepeer",{"_index":21,"name":{"24":{}},"parent":{"25":{},"26":{},"27":{},"28":{},"29":{},"30":{}}}],["fromed25519sk",{"_index":14,"name":{"17":{}},"parent":{}}],["getpeer",{"_index":7,"name":{"9":{}},"parent":{}}],["getstatus",{"_index":6,"name":{"7":{},"27":{}},"parent":{}}],["initpeerid",{"_index":35,"name":{"44":{}},"parent":{}}],["internals",{"_index":23,"name":{"30":{}},"parent":{}}],["isconnected",{"_index":10,"name":{"13":{}},"parent":{}}],["isinitialized",{"_index":9,"name":{"12":{}},"parent":{}}],["isinstance",{"_index":22,"name":{"25":{}},"parent":{}}],["keypair",{"_index":13,"name":{"16":{},"35":{}},"parent":{"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{}}}],["libp2ppeerid",{"_index":17,"name":{"20":{}},"parent":{}}],["particleid",{"_index":34,"name":{"43":{}},"parent":{}}],["peerconfig",{"_index":25,"name":{"32":{}},"parent":{"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"40":{}}}],["peerid",{"_index":11,"name":{"14":{}},"parent":{}}],["peeridb58",{"_index":32,"name":{"41":{}},"parent":{}}],["peerstatus",{"_index":8,"name":{"11":{}},"parent":{"12":{},"13":{},"14":{},"15":{}}}],["randomed25519",{"_index":15,"name":{"18":{}},"parent":{}}],["relaypeerid",{"_index":12,"name":{"15":{}},"parent":{}}],["setloglevel",{"_index":0,"name":{"0":{}},"parent":{}}],["signature",{"_index":38,"name":{"47":{}},"parent":{}}],["signbytes",{"_index":19,"name":{"22":{}},"parent":{}}],["skipcheckconnection",{"_index":28,"name":{"37":{}},"parent":{}}],["start",{"_index":3,"name":{"3":{},"28":{}},"parent":{}}],["stop",{"_index":5,"name":{"5":{},"29":{}},"parent":{}}],["tetraplets",{"_index":39,"name":{"48":{}},"parent":{}}],["timestamp",{"_index":36,"name":{"45":{}},"parent":{}}],["toed25519privatekey",{"_index":18,"name":{"21":{}},"parent":{}}],["ttl",{"_index":37,"name":{"46":{}},"parent":{}}],["verify",{"_index":20,"name":{"23":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/classes/FluencePeer.html b/docs/classes/FluencePeer.html index 50d487d48..4a434cde0 100644 --- a/docs/classes/FluencePeer.html +++ b/docs/classes/FluencePeer.html @@ -121,7 +121,7 @@

      constructor

    • @@ -146,7 +146,7 @@

      internals

    • @@ -325,7 +325,7 @@

      getStatus

    • @@ -347,7 +347,7 @@

      start

    • @@ -379,7 +379,7 @@

      stop

    • @@ -402,7 +402,7 @@

      Static isInstance

    • diff --git a/docs/classes/KeyPair.html b/docs/classes/KeyPair.html index 3ad41240b..fe68312a1 100644 --- a/docs/classes/KeyPair.html +++ b/docs/classes/KeyPair.html @@ -92,7 +92,9 @@

      Properties

      Methods

      @@ -112,7 +114,7 @@

      constructor

    • Parameters

      @@ -134,7 +136,7 @@

      Libp2pPeerId

      Libp2pPeerId: PeerId
      @@ -146,6 +148,29 @@

      Libp2pPeerId

    • Methods

      +
      + +

      signBytes

      +
        +
      • signBytes(data: Uint8Array): Promise<Uint8Array>
      • +
      +
        +
      • + +

        Parameters

        +
          +
        • +
          data: Uint8Array
          +
        • +
        +

        Returns Promise<Uint8Array>

        +
      • +
      +

      toEd25519PrivateKey

      @@ -156,7 +181,7 @@

      toEd25519PrivateKey

    • Returns Uint8Array

      @@ -164,6 +189,32 @@

      Returns Uint8Arra

    +
    + +

    verify

    +
      +
    • verify(data: Uint8Array, signature: Uint8Array): Promise<boolean>
    • +
    +
      +
    • + +

      Parameters

      +
        +
      • +
        data: Uint8Array
        +
      • +
      • +
        signature: Uint8Array
        +
      • +
      +

      Returns Promise<boolean>

      +
    • +
    +

    Static fromEd25519SK

    @@ -174,7 +225,7 @@

    Static fromEd25519SK

  • @@ -205,7 +256,7 @@

    Static randomEd25519

  • @@ -246,9 +297,15 @@

    Returns Promise Libp2pPeerId

  • +
  • + signBytes +
  • toEd25519PrivateKey
  • +
  • + verify +
  • fromEd25519SK
  • diff --git a/docs/interfaces/CallParams.html b/docs/interfaces/CallParams.html index 74218ac70..427161047 100644 --- a/docs/interfaces/CallParams.html +++ b/docs/interfaces/CallParams.html @@ -118,7 +118,7 @@

    initPeerId

    initPeerId: string
    @@ -133,7 +133,7 @@

    particleId

    particleId: string
    @@ -148,7 +148,7 @@

    signature

    signature: string
    @@ -163,7 +163,7 @@

    tetraplets

    tetraplets: {[ key in string]: SecurityTetraplet[] }
    @@ -178,7 +178,7 @@

    timestamp

    timestamp: number
    @@ -193,7 +193,7 @@

    ttl

    ttl: number
    diff --git a/docs/interfaces/PeerConfig.html b/docs/interfaces/PeerConfig.html index 08f3953e9..b147dee9c 100644 --- a/docs/interfaces/PeerConfig.html +++ b/docs/interfaces/PeerConfig.html @@ -89,7 +89,7 @@

    Properties

    - -

    Optional avmWorker

    -
    avmWorker: AvmWorker
    + +

    Optional avmRunner

    +
    avmRunner: AvmRunner
    -

    Plugable AVM worker implementation. If no specified a single-thread, ui-blocking worker will be used.

    +

    Plugable AVM runner implementation. If no specified a single-thread, ui-blocking runner will be used.

    @@ -154,7 +154,7 @@

    Optional checkConnection<
    checkConnectionTimeoutMs: number
    @@ -171,7 +171,7 @@

    Optional connectTo

    connectTo: string | Multiaddr | Node
    @@ -193,7 +193,7 @@

    Optional defaultTtlM
    defaultTtlMs: number
    @@ -210,7 +210,7 @@

    Optional dialTimeout
    dialTimeoutMs: number
    @@ -225,7 +225,7 @@

    Optional skipCheckCo
    skipCheckConnection: boolean
    @@ -269,7 +269,7 @@

    Optional skipCheckCo avmLogLevel

  • - avmWorker + avmRunner
  • checkConnectionTimeoutMs diff --git a/docs/interfaces/PeerStatus.html b/docs/interfaces/PeerStatus.html index 5355f52f9..263dc4988 100644 --- a/docs/interfaces/PeerStatus.html +++ b/docs/interfaces/PeerStatus.html @@ -104,7 +104,7 @@

    isConnected

    isConnected: Boolean
    @@ -119,7 +119,7 @@

    isInitialized

    isInitialized: Boolean
    @@ -134,7 +134,7 @@

    peerId

    peerId: string
    @@ -149,7 +149,7 @@

    relayPeerId

    relayPeerId: string
    diff --git a/docs/modules.html b/docs/modules.html index 5113a8e04..8698073cf 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -106,7 +106,7 @@

    AvmLoglevel

    AvmLoglevel: LogLevel
    @@ -122,7 +122,7 @@

    PeerIdB58

    PeerIdB58: string
    @@ -140,7 +140,7 @@

    Const Fluence

    Fluence: { getPeer: () => FluencePeer; getStatus: () => PeerStatus; start: (config?: PeerConfig) => Promise<void>; stop: () => Promise<void> } = ...
    @@ -260,7 +260,7 @@

    Const setLogLevel

  • Parameters

    diff --git a/package-lock.json b/package-lock.json index 91dd44ff3..cb3fac506 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.2.0", - "@fluencelabs/avm-worker-common": "^0.1.0", + "@fluencelabs/avm-runner-interface": "^0.2.0", + "@fluencelabs/avm-runner-mainthread": "^0.3.0", "async": "3.2.0", "bs58": "4.0.1", "cids": "0.8.1", @@ -654,20 +654,20 @@ "base64-js": "1.5.1" } }, - "node_modules/@fluencelabs/avm-worker": { + "node_modules/@fluencelabs/avm-runner-interface": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.2.0.tgz", - "integrity": "sha512-d6SYjPB5PUzdx1tuNhDQj+4I2174JGiXGAbGFZK3t7v74kotN+XfZNCfSucvQqiRkWpq6PPbXJK4w4bGBXc9Fg==", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-interface/-/avm-runner-interface-0.2.0.tgz", + "integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ==" + }, + "node_modules/@fluencelabs/avm-runner-mainthread": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-mainthread/-/avm-runner-mainthread-0.3.0.tgz", + "integrity": "sha512-UpGdwaKiQEk2FZGOow+pubWEex1YsBsK6Eu/9XHjfUOTWOvE3VfYg+XhCUwnhhkpvOs1nX2xkegaH+lVsMKjFQ==", "dependencies": { "@fluencelabs/avm": "^0.17.7", - "@fluencelabs/avm-worker-common": "^0.1.0" + "@fluencelabs/avm-runner-interface": "^0.2.0" } }, - "node_modules/@fluencelabs/avm-worker-common": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.1.0.tgz", - "integrity": "sha512-dbQdyza1/OaHiz2t4FoYRBuy4KGDyCCFpk6NKnEvv9ELDe1V/pjPgKfpTFbyeSOJhl5/2lVwZzkXqY544b9qwg==" - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -8715,20 +8715,20 @@ "base64-js": "1.5.1" } }, - "@fluencelabs/avm-worker": { + "@fluencelabs/avm-runner-interface": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker/-/avm-worker-0.2.0.tgz", - "integrity": "sha512-d6SYjPB5PUzdx1tuNhDQj+4I2174JGiXGAbGFZK3t7v74kotN+XfZNCfSucvQqiRkWpq6PPbXJK4w4bGBXc9Fg==", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-interface/-/avm-runner-interface-0.2.0.tgz", + "integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ==" + }, + "@fluencelabs/avm-runner-mainthread": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-mainthread/-/avm-runner-mainthread-0.3.0.tgz", + "integrity": "sha512-UpGdwaKiQEk2FZGOow+pubWEex1YsBsK6Eu/9XHjfUOTWOvE3VfYg+XhCUwnhhkpvOs1nX2xkegaH+lVsMKjFQ==", "requires": { "@fluencelabs/avm": "^0.17.7", - "@fluencelabs/avm-worker-common": "^0.1.0" + "@fluencelabs/avm-runner-interface": "^0.2.0" } }, - "@fluencelabs/avm-worker-common": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-worker-common/-/avm-worker-common-0.1.0.tgz", - "integrity": "sha512-dbQdyza1/OaHiz2t4FoYRBuy4KGDyCCFpk6NKnEvv9ELDe1V/pjPgKfpTFbyeSOJhl5/2lVwZzkXqY544b9qwg==" - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", diff --git a/package.json b/package.json index 1811dfb87..957bce133 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-worker": "^0.2.0", - "@fluencelabs/avm-worker-common": "^0.1.0", + "@fluencelabs/avm-runner-mainthread": "^0.3.0", + "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", "cids": "0.8.1", diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 32b967624..d032275da 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -26,8 +26,8 @@ import { concatMap, filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; import { BuiltInServiceContext, builtInServices } from './builtInServices'; -import { AvmWorker, InterpreterResult, LogLevel } from '@fluencelabs/avm-worker-common'; -import Worker from '@fluencelabs/avm-worker'; +import { AvmRunner, InterpreterResult, LogLevel } from '@fluencelabs/avm-runner-interface'; +import MainThreadRunner from '@fluencelabs/avm-runner-mainthread'; /** * Node of the Fluence network specified as a pair of node's multiaddr and it's peer id @@ -97,9 +97,9 @@ export interface PeerConfig { defaultTtlMs?: number; /** - * Plugable AVM worker implementation. If no specified a single-thread, ui-blocking worker will be used. + * Plugable AVM runner implementation. If no specified a single-thread, ui-blocking runner will be used. */ - avmWorker?: AvmWorker; + avmRunner?: AvmRunner; } /** @@ -180,8 +180,8 @@ export class FluencePeer { ? config?.defaultTtlMs : DEFAULT_TTL; - this._worker = config?.avmWorker || new Worker(avmLogFunction); - await this._worker.init(config?.avmLogLevel || 'off'); + this._avmRunner = config?.avmRunner || new MainThreadRunner(avmLogFunction); + await this._avmRunner.init(config?.avmLogLevel || 'off'); if (config?.connectTo) { let connectToMultiAddr: Multiaddr; @@ -360,7 +360,7 @@ export class FluencePeer { private _relayPeerId: PeerIdB58 | null = null; private _keyPair: KeyPair; private _connection: FluenceConnection; - private _worker: AvmWorker; + private _avmRunner: AvmRunner; private _timeouts: Array = []; private _particleQueues = new Map>(); @@ -428,7 +428,12 @@ export class FluencePeer { // MUST happen sequentially (in a critical section). // Otherwise the race between worker might occur corrupting the prevData - const result = await runAvmWorker(this.getStatus().peerId, this._worker, item.particle, prevData); + const result = await runAvmRunner( + this.getStatus().peerId, + this._avmRunner, + item.particle, + prevData, + ); const newData = Buffer.from(result.data); prevData = newData; @@ -601,9 +606,9 @@ function registerDefaultServices(peer: FluencePeer, context: BuiltInServiceConte } } -async function runAvmWorker( +async function runAvmRunner( currentPeerId: PeerIdB58, - worker: AvmWorker, + worker: AvmRunner, particle: Particle, prevData: Uint8Array, ): Promise { diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index eeecc6cb2..0d1a0a071 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -16,7 +16,7 @@ import { v4 as uuidv4 } from 'uuid'; import { fromByteArray, toByteArray } from 'base64-js'; -import { CallResultsArray, LogLevel } from '@fluencelabs/avm-worker-common'; +import { CallResultsArray, LogLevel } from '@fluencelabs/avm-runner-interface'; import log from 'loglevel'; import { ParticleContext } from './commonTypes'; import { dataToString, str } from './utils'; diff --git a/src/internal/builtInServices.ts b/src/internal/builtInServices.ts index 7873e9b4f..6422d1e95 100644 --- a/src/internal/builtInServices.ts +++ b/src/internal/builtInServices.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CallServiceResult } from '@fluencelabs/avm-worker-common'; +import { CallServiceResult } from '@fluencelabs/avm-runner-interface'; import { encode, decode } from 'bs58'; import { PeerIdB58 } from 'src'; import { GenericCallServiceHandler, ResultCodes } from './commonTypes'; diff --git a/src/internal/commonTypes.ts b/src/internal/commonTypes.ts index 83bbb10e1..cc14bba56 100644 --- a/src/internal/commonTypes.ts +++ b/src/internal/commonTypes.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SecurityTetraplet } from '@fluencelabs/avm-worker-common'; +import { SecurityTetraplet } from '@fluencelabs/avm-runner-interface'; /** * Peer ID's id as a base58 string (multihash/CIDv0). diff --git a/src/internal/compilerSupport/v2.ts b/src/internal/compilerSupport/v2.ts index 5e7a9096c..a61ed8d02 100644 --- a/src/internal/compilerSupport/v2.ts +++ b/src/internal/compilerSupport/v2.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { SecurityTetraplet } from '@fluencelabs/avm-worker-common'; +import { SecurityTetraplet } from '@fluencelabs/avm-runner-interface'; import { match } from 'ts-pattern'; import { CallParams, Fluence, FluencePeer } from '../../index'; import { CallServiceData, GenericCallServiceHandler, CallServiceResult, ResultCodes } from '../commonTypes'; diff --git a/src/internal/utils.ts b/src/internal/utils.ts index 280a6e002..4c6465af7 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -18,7 +18,7 @@ import log from 'loglevel'; import { CallServiceData, CallServiceResult, CallServiceResultType, ResultCodes } from './commonTypes'; import { FluencePeer } from './FluencePeer'; import { Particle, ParticleExecutionStage } from './Particle'; -import { LogLevel as AvmLoglevel } from '@fluencelabs/avm-worker-common'; +import { LogLevel as AvmLoglevel } from '@fluencelabs/avm-runner-interface'; export const avmLogFunction = (level: AvmLoglevel, msg: string) => { switch (level) { From c745df6b7a0c999b55cbab01c65a02d2d5f2bb79 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 22 Dec 2021 17:46:46 +0300 Subject: [PATCH 12/23] Set default Runner to Background runner --- .github/workflows/js_sdk_ci.yml | 5 +- jest-patched-jsdom.js | 14 --- jest.config.js | 2 +- package-lock.json | 155 +++++++++++++++++++++++++------- package.json | 7 +- src/internal/FluencePeer.ts | 4 +- 6 files changed, 132 insertions(+), 55 deletions(-) delete mode 100644 jest-patched-jsdom.js diff --git a/.github/workflows/js_sdk_ci.yml b/.github/workflows/js_sdk_ci.yml index 0640270ca..39f63ed03 100644 --- a/.github/workflows/js_sdk_ci.yml +++ b/.github/workflows/js_sdk_ci.yml @@ -13,8 +13,7 @@ jobs: strategy: matrix: - node-version: [14.x, 15.x] - node-env: ['', ':node'] + node-version: [16.x, 17.x] steps: - uses: actions/checkout@v2 @@ -37,6 +36,6 @@ jobs: docker run -d --rm -e RUST_LOG="info" -p 1210:1210 -p 4310:4310 fluencelabs/fluence -t 1210 -w 4310 -k gKdiCSUr1TFGFEgu2t8Ch1XEUsrN5A2UfBLjSZvfci9SPR3NvZpACfcpPGC3eY4zma1pk7UvYv5zb1VjvPHwCjj --local --aqua-pool-size 2 - run: npm install - - run: npm run test${{ matrix.node-env }}:all + - run: npm run test:all env: CI: true diff --git a/jest-patched-jsdom.js b/jest-patched-jsdom.js deleted file mode 100644 index a49175ac4..000000000 --- a/jest-patched-jsdom.js +++ /dev/null @@ -1,14 +0,0 @@ -const Environment = require('jest-environment-jsdom'); - -module.exports = class CustomTestEnvironment extends Environment { - async setup() { - await super.setup(); - if (typeof this.global.TextEncoder === 'undefined') { - const { TextEncoder, TextDecoder } = require('util'); - this.global.TextEncoder = TextEncoder; - this.global.TextDecoder = TextDecoder; - this.global.Uint8Array = Uint8Array; - this.global.ArrayBuffer = ArrayBuffer; - } - } -}; diff --git a/jest.config.js b/jest.config.js index 2b6b7eadb..6d6062b31 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,4 +1,4 @@ module.exports = { preset: 'ts-jest', - testEnvironment: './jest-patched-jsdom.js', + testEnvironment: 'node', }; diff --git a/package-lock.json b/package-lock.json index cb3fac506..270dc817f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", + "@fluencelabs/avm-runner-background": "0.0.2-init-4.0", "@fluencelabs/avm-runner-interface": "^0.2.0", - "@fluencelabs/avm-runner-mainthread": "^0.3.0", "async": "3.2.0", "bs58": "4.0.1", "cids": "0.8.1", @@ -29,6 +29,7 @@ "uuid": "8.3.0" }, "devDependencies": { + "@fluencelabs/avm": "0.18.0-dynamic-import-wasm.3", "@types/jest": "^26.0.22", "jest": "^26.6.3", "js-base64": "^3.7.2", @@ -647,11 +648,19 @@ } }, "node_modules/@fluencelabs/avm": { - "version": "0.17.7", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.7.tgz", - "integrity": "sha512-8JC0Dx8QDSv80hkftKUUxVdTUv/v/PMOL6aM/bLR3h4ns3v9j3+wEsZD0rJYNlFe/dlAvTTVoKM7KkLKR6Ji8g==", + "version": "0.18.0-dynamic-import-wasm.3", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.18.0-dynamic-import-wasm.3.tgz", + "integrity": "sha512-XAZvlTCC2YvY6GCuB/f4rhtkvENzZf2p7tx3yCf0XLs/TFqQcwyVuJJQl/odv2ZQnv1CjJJmb4OLoSYZKgqc8A==", + "dev": true + }, + "node_modules/@fluencelabs/avm-runner-background": { + "version": "0.0.2-init-4.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-4.0.tgz", + "integrity": "sha512-N3wEkDmfMu+ujcYk8I9ujsjnM6SFQrlocntVSMODR3OJPszDhd6Olb8HL6DCs+XLu7FDG8mnPN5VrvzKg+acCg==", "dependencies": { - "base64-js": "1.5.1" + "@fluencelabs/avm-runner-interface": "^0.2.0", + "browser-or-node": "^2.0.0", + "threads": "^1.7.0" } }, "node_modules/@fluencelabs/avm-runner-interface": { @@ -659,15 +668,6 @@ "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-interface/-/avm-runner-interface-0.2.0.tgz", "integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ==" }, - "node_modules/@fluencelabs/avm-runner-mainthread": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-mainthread/-/avm-runner-mainthread-0.3.0.tgz", - "integrity": "sha512-UpGdwaKiQEk2FZGOow+pubWEex1YsBsK6Eu/9XHjfUOTWOvE3VfYg+XhCUwnhhkpvOs1nX2xkegaH+lVsMKjFQ==", - "dependencies": { - "@fluencelabs/avm": "^0.17.7", - "@fluencelabs/avm-runner-interface": "^0.2.0" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1844,6 +1844,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "node_modules/browser-or-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.0.0.tgz", + "integrity": "sha512-3Lrks/Okgof+/cRguUNG+qRXSeq79SO3hY4QrXJayJofwJwHiGC0qi99uDjsfTwULUFSr1OGVsBkdIkygKjTUA==" + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -1955,7 +1960,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -2598,6 +2602,15 @@ "source-map": "~0.6.1" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -3702,6 +3715,17 @@ "node": ">=0.12.0" } }, + "node_modules/is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -5799,6 +5823,11 @@ "node": ">=0.10.0" } }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7476,6 +7505,23 @@ "node": ">=8" } }, + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } + }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -7496,6 +7542,15 @@ "resolved": "https://registry.npmjs.org/retimer/-/retimer-2.0.0.tgz", "integrity": "sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg==" }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "optional": true, + "dependencies": { + "esm": "^3.2.25" + } + }, "node_modules/tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -8708,11 +8763,19 @@ } }, "@fluencelabs/avm": { - "version": "0.17.7", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.17.7.tgz", - "integrity": "sha512-8JC0Dx8QDSv80hkftKUUxVdTUv/v/PMOL6aM/bLR3h4ns3v9j3+wEsZD0rJYNlFe/dlAvTTVoKM7KkLKR6Ji8g==", + "version": "0.18.0-dynamic-import-wasm.3", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.18.0-dynamic-import-wasm.3.tgz", + "integrity": "sha512-XAZvlTCC2YvY6GCuB/f4rhtkvENzZf2p7tx3yCf0XLs/TFqQcwyVuJJQl/odv2ZQnv1CjJJmb4OLoSYZKgqc8A==", + "dev": true + }, + "@fluencelabs/avm-runner-background": { + "version": "0.0.2-init-4.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-4.0.tgz", + "integrity": "sha512-N3wEkDmfMu+ujcYk8I9ujsjnM6SFQrlocntVSMODR3OJPszDhd6Olb8HL6DCs+XLu7FDG8mnPN5VrvzKg+acCg==", "requires": { - "base64-js": "1.5.1" + "@fluencelabs/avm-runner-interface": "^0.2.0", + "browser-or-node": "^2.0.0", + "threads": "^1.7.0" } }, "@fluencelabs/avm-runner-interface": { @@ -8720,15 +8783,6 @@ "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-interface/-/avm-runner-interface-0.2.0.tgz", "integrity": "sha512-Y41pL+UwZZVdormxju8cJQsNRp6tdER0VqJ9Kg9gH2wd1KJAaYTJkyVbn8NB7fEFRUbqfbb1BXHi9wWBYOgGYQ==" }, - "@fluencelabs/avm-runner-mainthread": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-mainthread/-/avm-runner-mainthread-0.3.0.tgz", - "integrity": "sha512-UpGdwaKiQEk2FZGOow+pubWEex1YsBsK6Eu/9XHjfUOTWOvE3VfYg+XhCUwnhhkpvOs1nX2xkegaH+lVsMKjFQ==", - "requires": { - "@fluencelabs/avm": "^0.17.7", - "@fluencelabs/avm-runner-interface": "^0.2.0" - } - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -9731,6 +9785,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "browser-or-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.0.0.tgz", + "integrity": "sha512-3Lrks/Okgof+/cRguUNG+qRXSeq79SO3hY4QrXJayJofwJwHiGC0qi99uDjsfTwULUFSr1OGVsBkdIkygKjTUA==" + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -9811,8 +9870,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "5.3.1", @@ -10318,6 +10376,12 @@ "source-map": "~0.6.1" } }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "optional": true + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -11171,6 +11235,11 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==" + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -12884,6 +12953,11 @@ "isobject": "^3.0.1" } }, + "observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14205,6 +14279,18 @@ "minimatch": "^3.0.4" } }, + "threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "requires": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1", + "tiny-worker": ">= 2" + } + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -14227,6 +14313,15 @@ } } }, + "tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "optional": true, + "requires": { + "esm": "^3.2.25" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", diff --git a/package.json b/package.json index 957bce133..23059758f 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,6 @@ "test:all": "jest", "test:unit": "jest --testPathPattern=src/__test__/unit", "test:integration": "jest --testPathPattern=src/__test__/integration", - "test:node": "jest --env=node --watch", - "test:node:all": "jest --env=node", - "test:node:unit": "jest --env=node --testPathPattern=src/__test__/unit", - "test:node:integration": "jest --env=node --testPathPattern=src/__test__/integration", "build": "tsc", "build:docs": "typedoc" }, @@ -21,7 +17,7 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-runner-mainthread": "^0.3.0", + "@fluencelabs/avm-runner-background": "0.0.2-init-4.0", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", @@ -40,6 +36,7 @@ "uuid": "8.3.0" }, "devDependencies": { + "@fluencelabs/avm": "0.18.0-dynamic-import-wasm.3", "@types/jest": "^26.0.22", "jest": "^26.6.3", "ts-jest": "^26.5.4", diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index d032275da..87af1cf78 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -27,7 +27,7 @@ import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; import { BuiltInServiceContext, builtInServices } from './builtInServices'; import { AvmRunner, InterpreterResult, LogLevel } from '@fluencelabs/avm-runner-interface'; -import MainThreadRunner from '@fluencelabs/avm-runner-mainthread'; +import { AvmRunnerBackground } from '@fluencelabs/avm-runner-background'; /** * Node of the Fluence network specified as a pair of node's multiaddr and it's peer id @@ -180,7 +180,7 @@ export class FluencePeer { ? config?.defaultTtlMs : DEFAULT_TTL; - this._avmRunner = config?.avmRunner || new MainThreadRunner(avmLogFunction); + this._avmRunner = config?.avmRunner || new AvmRunnerBackground(); await this._avmRunner.init(config?.avmLogLevel || 'off'); if (config?.connectTo) { From 63950a1b04cb2bd62bb08e131879644a306486ac Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Thu, 23 Dec 2021 16:41:17 +0300 Subject: [PATCH 13/23] Fix PR comments --- src/internal/FluencePeer.ts | 24 ++++++++++++------------ src/internal/Particle.ts | 6 +++--- src/internal/utils.ts | 24 ++---------------------- 3 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 501876434..3c7fa050f 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -21,7 +21,7 @@ import { PeerIdB58 } from './commonTypes'; import { FluenceConnection } from './FluenceConnection'; import { Particle, ParticleExecutionStage, ParticleQueueItem } from './Particle'; import { KeyPair } from './KeyPair'; -import { dataToString, avmLogFunction, str } from './utils'; +import { dataToString, jsonify } from './utils'; import { concatMap, filter, pipe, Subject, tap } from 'rxjs'; import { RequestFlow } from './compilerSupport/v1'; import log from 'loglevel'; @@ -97,7 +97,7 @@ export interface PeerConfig { defaultTtlMs?: number; /** - * Plugable AVM runner implementation. If no specified a single-thread, ui-blocking runner will be used. + * Plugable AVM runner implementation. If not specified AvmBackgroundRunner will be used */ avmRunner?: AvmRunner; } @@ -426,9 +426,9 @@ export class FluencePeer { concatMap(async (item) => { // IMPORTANT! - // AVM worker execution and prevData <-> newData swapping + // AVM runner execution and prevData <-> newData swapping // MUST happen sequentially (in a critical section). - // Otherwise the race between worker might occur corrupting the prevData + // Otherwise the race between runner might occur corrupting the prevData const result = await runAvmRunner( this.getStatus().peerId, @@ -487,7 +487,7 @@ export class FluencePeer { ) .then((res) => { const serviceResult = { - result: str(res.result), + result: jsonify(res.result), retCode: res.retCode, }; @@ -507,7 +507,7 @@ export class FluencePeer { } private async _execSingleCallRequest(req: CallServiceData): Promise { - log.debug('executing call service handler', str(req)); + log.debug('executing call service handler', jsonify(req)); const particleId = req.particleContext.particleId; // trying particle-specific handler @@ -552,7 +552,7 @@ export class FluencePeer { retCode: ResultCodes.error, result: `No handler has been registered for serviceId='${req.serviceId}' fnName='${ req.fnName - }' args='${str(req.args)}'`, + }' args='${jsonify(req.args)}'`, }; } @@ -560,7 +560,7 @@ export class FluencePeer { res.result = null; } - log.debug('executed call service handler, req and res are: ', str(req), str(res)); + log.debug('executed call service handler, req and res are: ', jsonify(req), jsonify(res)); return res; } @@ -610,13 +610,13 @@ function registerDefaultServices(peer: FluencePeer, context: BuiltInServiceConte async function runAvmRunner( currentPeerId: PeerIdB58, - worker: AvmRunner, + runner: AvmRunner, particle: Particle, prevData: Uint8Array, ): Promise { particle.logTo('debug', 'Sending particle to interpreter'); log.debug('prevData: ', dataToString(prevData)); - const interpreterResult = await worker.run( + const interpreterResult = await runner.run( particle.script, prevData, particle.data, @@ -631,9 +631,9 @@ async function runAvmRunner( toLog.data = dataToString(toLog.data); if (isInterpretationSuccessful(interpreterResult)) { - log.debug('Interpreter result: ', str(toLog)); + log.debug('Interpreter result: ', jsonify(toLog)); } else { - log.error('Interpreter failed: ', str(toLog)); + log.error('Interpreter failed: ', jsonify(toLog)); } return interpreterResult; } diff --git a/src/internal/Particle.ts b/src/internal/Particle.ts index 0d1a0a071..118c8fd4d 100644 --- a/src/internal/Particle.ts +++ b/src/internal/Particle.ts @@ -19,7 +19,7 @@ import { fromByteArray, toByteArray } from 'base64-js'; import { CallResultsArray, LogLevel } from '@fluencelabs/avm-runner-interface'; import log from 'loglevel'; import { ParticleContext } from './commonTypes'; -import { dataToString, str } from './utils'; +import { dataToString, jsonify } from './utils'; export class Particle { id: string; @@ -119,7 +119,7 @@ export class Particle { fn = log.info; break; case 'trace': - fn = log.trace; + fn = log.info; break; case 'warn': fn = log.warn; @@ -130,7 +130,7 @@ export class Particle { fn( message, - str({ + jsonify({ id: this.id, init_peer_id: this.initPeerId, timestamp: this.timestamp, diff --git a/src/internal/utils.ts b/src/internal/utils.ts index 4c6465af7..22d71e590 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -20,27 +20,6 @@ import { FluencePeer } from './FluencePeer'; import { Particle, ParticleExecutionStage } from './Particle'; import { LogLevel as AvmLoglevel } from '@fluencelabs/avm-runner-interface'; -export const avmLogFunction = (level: AvmLoglevel, msg: string) => { - switch (level) { - case 'error': - log.error(msg); - break; - - case 'warn': - log.warn(msg); - break; - - case 'info': - log.info(msg); - break; - - case 'debug': - case 'trace': - log.log(msg); - break; - } -}; - export const MakeServiceCall = (fn: (args: any[]) => CallServiceResultType) => { return (req: CallServiceData): CallServiceResult => { return { @@ -154,6 +133,7 @@ export const checkConnection = async (peer: FluencePeer, ttl?: number): Promise< export function dataToString(data: Uint8Array) { const text = new TextDecoder().decode(Buffer.from(data)); + // try to treat data as json and pretty-print it try { return JSON.stringify(JSON.parse(text), null, 4); } catch { @@ -161,6 +141,6 @@ export function dataToString(data: Uint8Array) { } } -export function str(obj) { +export function jsonify(obj) { return JSON.stringify(obj, null, 4); } From cfeef95ac8834724cf31ddead18a7993e3a55ff8 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Fri, 24 Dec 2021 11:34:32 +0300 Subject: [PATCH 14/23] Update versions --- package-lock.json | 26 +++++++++++++++----------- package.json | 7 +++++-- src/tools/copyAvmPublic.ts | 4 ++++ 3 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 src/tools/copyAvmPublic.ts diff --git a/package-lock.json b/package-lock.json index d2f107882..88116ad90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-runner-background": "0.0.2-init-4.0", + "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", + "@fluencelabs/avm-runner-background": "0.0.2-init-7.0", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", @@ -28,8 +29,10 @@ "ts-pattern": "^3.3.3", "uuid": "8.3.0" }, + "bin": { + "copy-avm-public": "dist/tools/copyAvmPublic" + }, "devDependencies": { - "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", "@types/jest": "^26.0.22", "jest": "^26.6.3", "js-base64": "^3.7.2", @@ -651,19 +654,21 @@ "version": "0.19.0-dynamic-import-wasm.3", "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.0-dynamic-import-wasm.3.tgz", "integrity": "sha512-eYNKI9G3E+qKwVNjrJKVzL5v6XZgWMkGvrhulibiuxnYq361yjCxvMQYJDhoQ1tKHZYjsXqtPje6Nk3d7Ldczg==", - "dev": true, "bin": { "avm": "dist/copyAvm.js" } }, "node_modules/@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-4.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-4.0.tgz", - "integrity": "sha512-N3wEkDmfMu+ujcYk8I9ujsjnM6SFQrlocntVSMODR3OJPszDhd6Olb8HL6DCs+XLu7FDG8mnPN5VrvzKg+acCg==", + "version": "0.0.2-init-7.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-7.0.tgz", + "integrity": "sha512-FmYyPdMv4cDKzqxdo3oUwVhEHKgc+1/cA4wQ1KJ+4/nUtclG1cPGZHbTUvv4gL3pgLGLncodRVN0NQuZ0gpE2Q==", "dependencies": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", "threads": "^1.7.0" + }, + "bin": { + "copy-avm-runner": "dist/copyRunnerScript.js" } }, "node_modules/@fluencelabs/avm-runner-interface": { @@ -8768,13 +8773,12 @@ "@fluencelabs/avm": { "version": "0.19.0-dynamic-import-wasm.3", "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.0-dynamic-import-wasm.3.tgz", - "integrity": "sha512-eYNKI9G3E+qKwVNjrJKVzL5v6XZgWMkGvrhulibiuxnYq361yjCxvMQYJDhoQ1tKHZYjsXqtPje6Nk3d7Ldczg==", - "dev": true + "integrity": "sha512-eYNKI9G3E+qKwVNjrJKVzL5v6XZgWMkGvrhulibiuxnYq361yjCxvMQYJDhoQ1tKHZYjsXqtPje6Nk3d7Ldczg==" }, "@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-4.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-4.0.tgz", - "integrity": "sha512-N3wEkDmfMu+ujcYk8I9ujsjnM6SFQrlocntVSMODR3OJPszDhd6Olb8HL6DCs+XLu7FDG8mnPN5VrvzKg+acCg==", + "version": "0.0.2-init-7.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-7.0.tgz", + "integrity": "sha512-FmYyPdMv4cDKzqxdo3oUwVhEHKgc+1/cA4wQ1KJ+4/nUtclG1cPGZHbTUvv4gL3pgLGLncodRVN0NQuZ0gpE2Q==", "requires": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", diff --git a/package.json b/package.json index d12231bcb..9eff75213 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,13 @@ "repository": "https://github.com/fluencelabs/fluence-js", "author": "Fluence Labs", "license": "Apache-2.0", + "bin": { + "copy-avm-public": "dist/tools/copyAvmPublic" + }, "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-runner-background": "0.0.2-init-4.0", + "@fluencelabs/avm-runner-background": "0.0.2-init-7.0", + "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", @@ -36,7 +40,6 @@ "uuid": "8.3.0" }, "devDependencies": { - "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", "@types/jest": "^26.0.22", "jest": "^26.6.3", "js-base64": "^3.7.2", diff --git a/src/tools/copyAvmPublic.ts b/src/tools/copyAvmPublic.ts new file mode 100644 index 000000000..f06f4c0c0 --- /dev/null +++ b/src/tools/copyAvmPublic.ts @@ -0,0 +1,4 @@ +#! /usr/bin/env node + +require('@fluencelabs/avm/dist/copyAvm'); +require('@fluencelabs/avm-runner-background/dist/copyRunnerScript'); From 862b6a5ff828b822d588c981bff82382a4c421bd Mon Sep 17 00:00:00 2001 From: folex <0xdxdy@gmail.com> Date: Mon, 27 Dec 2021 11:03:11 +0300 Subject: [PATCH 15/23] incorrect AIR test: call peer.stop --- src/__test__/integration/compiler/compiler.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/__test__/integration/compiler/compiler.spec.ts b/src/__test__/integration/compiler/compiler.spec.ts index 771867cae..dcc3f98c1 100644 --- a/src/__test__/integration/compiler/compiler.spec.ts +++ b/src/__test__/integration/compiler/compiler.spec.ts @@ -205,5 +205,7 @@ describe('Compiler support infrastructure tests', () => { // assert await expect(action).rejects.toMatch(/incorrect air script/); + + await anotherPeer.stop(); }); }); From dbbe74abe22e9e1af96671b7b08bfc6dbb2052fe Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 10:04:14 +0300 Subject: [PATCH 16/23] fixing race condition --- src/internal/FluencePeer.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index 3c7fa050f..c3dc2dd1e 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -222,11 +222,11 @@ export class FluencePeer { * and disconnects from the Fluence network */ async stop() { + this._relayPeerId = null; this._stopParticleProcessing(); await this._disconnect(); await this._avmRunner?.terminate(); this._avmRunner = undefined; - this._relayPeerId = null; this._legacyCallServiceHandler = null; this._particleSpecificHandlers.clear(); @@ -393,6 +393,10 @@ export class FluencePeer { }); this._outgoingParticles.subscribe(async (item) => { + if (this.getStatus().isInitialized) { + return null; + } + if (!this._connection) { item.particle.logTo('error', 'cannot send particle, peer is not connected'); item.onStageChange({ stage: 'sendingError' }); @@ -425,6 +429,10 @@ export class FluencePeer { filterExpiredParticles(this._expireParticle.bind(this)), concatMap(async (item) => { + if (this.getStatus().isInitialized) { + return null; + } + // IMPORTANT! // AVM runner execution and prevData <-> newData swapping // MUST happen sequentially (in a critical section). @@ -447,6 +455,10 @@ export class FluencePeer { }), ) .subscribe(async (item) => { + if (this.getStatus().isInitialized) { + return; + } + // Do not continue if there was an error in particle interpretation if (!isInterpretationSuccessful(item.result)) { item.onStageChange({ stage: 'interpreterError', errorMessage: item.result.errorMessage }); From de915b89d0631eeb91ddaaba2e4777279d408c7e Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 10:29:15 +0300 Subject: [PATCH 17/23] fix if condition --- src/__test__/integration/avm.spec.ts | 16 +++-- src/__test__/integration/peer.spec.ts | 96 ++++++++++++++------------- src/internal/FluencePeer.ts | 9 +-- 3 files changed, 66 insertions(+), 55 deletions(-) diff --git a/src/__test__/integration/avm.spec.ts b/src/__test__/integration/avm.spec.ts index 46f6dc123..55d504be6 100644 --- a/src/__test__/integration/avm.spec.ts +++ b/src/__test__/integration/avm.spec.ts @@ -3,10 +3,21 @@ import { Particle } from '../../internal/Particle'; import { handleTimeout } from '../../internal/utils'; import { registerHandlersHelper } from '../util'; +let peer: FluencePeer; + describe('Avm spec', () => { + afterEach(async () => { + if (peer) { + await peer.stop(); + } + }); + + beforeEach(() => { + peer = new FluencePeer(); + }); + it('Simple call', async () => { // arrange - const peer = new FluencePeer(); await peer.start(); // act @@ -36,7 +47,6 @@ describe('Avm spec', () => { it('Par call', async () => { // arrange - const peer = new FluencePeer(); await peer.start(); // act @@ -75,7 +85,6 @@ describe('Avm spec', () => { it('Timeout in par call: race', async () => { // arrange - const peer = new FluencePeer(); await peer.start(); // act @@ -113,7 +122,6 @@ describe('Avm spec', () => { it('Timeout in par call: wait', async () => { // arrange - const peer = new FluencePeer(); await peer.start(); // act diff --git a/src/__test__/integration/peer.spec.ts b/src/__test__/integration/peer.spec.ts index 436cc11bf..fc5d03e3e 100644 --- a/src/__test__/integration/peer.spec.ts +++ b/src/__test__/integration/peer.spec.ts @@ -5,15 +5,19 @@ import { checkConnection, doNothing, handleTimeout } from '../../internal/utils' import { Particle } from '../../internal/Particle'; import { registerHandlersHelper } from '../util'; -const anotherPeer = new FluencePeer(); +let peer; describe('Typescript usage suite', () => { afterEach(async () => { - if (anotherPeer) { - await anotherPeer.stop(); + if (peer) { + await peer.stop(); } }); + beforeEach(() => { + peer = new FluencePeer(); + }); + it('should perform test for FluencePeer class correctly', () => { // arrange const peer: any = new FluencePeer(); @@ -37,10 +41,10 @@ describe('Typescript usage suite', () => { describe('Should expose correct peer status', () => { it('Should expose correct status for uninitialized peer', () => { // arrange - const peer = new FluencePeer(); + const nonStartedPeer = new FluencePeer(); // act - const status = peer.getStatus(); + const status = nonStartedPeer.getStatus(); // assert expect(status.isConnected).toBe(false); @@ -51,7 +55,6 @@ describe('Typescript usage suite', () => { it('Should expose correct status for initialized but not connected peer', async () => { // arrange - const peer = new FluencePeer(); await peer.start(); // act @@ -68,7 +71,6 @@ describe('Typescript usage suite', () => { it('Should expose correct status for connected peer', async () => { // arrange - const peer = new FluencePeer(); await peer.start({ connectTo: nodes[0] }); // act @@ -86,7 +88,7 @@ describe('Typescript usage suite', () => { it('should make a call through network', async () => { // arrange - await anotherPeer.start({ connectTo: nodes[0] }); + await peer.start({ connectTo: nodes[0] }); // act const promise = new Promise((resolve, reject) => { @@ -105,10 +107,10 @@ describe('Typescript usage suite', () => { ) )`; const particle = Particle.createNew(script); - registerHandlersHelper(anotherPeer, particle, { + registerHandlersHelper(peer, particle, { load: { relay: (args) => { - return anotherPeer.getStatus().relayPeerId; + return peer.getStatus().relayPeerId; }, }, callback: { @@ -123,7 +125,7 @@ describe('Typescript usage suite', () => { }, }); - anotherPeer.internals.initiateParticle(particle, handleTimeout(reject)); + peer.internals.initiateParticle(particle, handleTimeout(reject)); }); // assert @@ -132,17 +134,17 @@ describe('Typescript usage suite', () => { }); it('check connection should work', async function () { - await anotherPeer.start({ connectTo: nodes[0] }); + await peer.start({ connectTo: nodes[0] }); - let isConnected = await checkConnection(anotherPeer); + let isConnected = await checkConnection(peer); expect(isConnected).toEqual(true); }); it('check connection should work with ttl', async function () { - await anotherPeer.start({ connectTo: nodes[0] }); + await peer.start({ connectTo: nodes[0] }); - let isConnected = await checkConnection(anotherPeer, 10000); + let isConnected = await checkConnection(peer, 10000); expect(isConnected).toEqual(true); }); @@ -184,8 +186,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -196,8 +198,8 @@ describe('Typescript usage suite', () => { const addr = new Multiaddr(nodes[0].multiaddr); // act - await anotherPeer.start({ connectTo: addr }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -208,8 +210,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -220,8 +222,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -232,8 +234,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -244,8 +246,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr, dialTimeoutMs: 100000 }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr, dialTimeoutMs: 100000 }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -256,8 +258,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr, skipCheckConnection: true }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr, skipCheckConnection: true }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -268,8 +270,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr, checkConnectionTimeoutMs: 1000 }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr, checkConnectionTimeoutMs: 1000 }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeTruthy(); @@ -280,8 +282,8 @@ describe('Typescript usage suite', () => { const addr = nodes[0]; // act - await anotherPeer.start({ connectTo: addr, defaultTtlMs: 1 }); - const isConnected = await checkConnection(anotherPeer); + await peer.start({ connectTo: addr, defaultTtlMs: 1 }); + const isConnected = await checkConnection(peer); // assert expect(isConnected).toBeFalsy(); @@ -290,7 +292,7 @@ describe('Typescript usage suite', () => { it('Should successfully call identity on local peer', async function () { // arrange - await anotherPeer.start(); + await peer.start(); // act const promise = new Promise((resolve, reject) => { @@ -301,7 +303,7 @@ describe('Typescript usage suite', () => { ) `; const particle = Particle.createNew(script); - registerHandlersHelper(anotherPeer, particle, { + registerHandlersHelper(peer, particle, { callback: { callback: async (args) => { const [res] = args; @@ -310,7 +312,7 @@ describe('Typescript usage suite', () => { }, }); - anotherPeer.internals.initiateParticle(particle, handleTimeout(reject)); + peer.internals.initiateParticle(particle, handleTimeout(reject)); }); // assert @@ -320,10 +322,10 @@ describe('Typescript usage suite', () => { it('Should throw correct message when calling non existing local service', async function () { // arrange - await anotherPeer.start({ connectTo: nodes[0] }); + await peer.start({ connectTo: nodes[0] }); // act - const res = callIncorrectService(anotherPeer); + const res = callIncorrectService(peer); // assert await expect(res).rejects.toMatchObject({ @@ -336,7 +338,7 @@ describe('Typescript usage suite', () => { it('Should not crash if undefined is passed as a variable', async () => { // arrange; - await anotherPeer.start(); + await peer.start(); // act const promise = new Promise((resolve, reject) => { @@ -350,7 +352,7 @@ describe('Typescript usage suite', () => { )`; const particle = Particle.createNew(script); - registerHandlersHelper(anotherPeer, particle, { + registerHandlersHelper(peer, particle, { load: { arg: (args) => { return undefined; @@ -368,7 +370,7 @@ describe('Typescript usage suite', () => { }, }); - anotherPeer.internals.initiateParticle(particle, handleTimeout(reject)); + peer.internals.initiateParticle(particle, handleTimeout(reject)); }); // assert @@ -378,7 +380,7 @@ describe('Typescript usage suite', () => { it('Should not crash if an error ocurred in user-defined handler', async () => { // arrange; - await anotherPeer.start(); + await peer.start(); // act const promise = new Promise((resolve, reject) => { @@ -389,7 +391,7 @@ describe('Typescript usage suite', () => { )`; const particle = Particle.createNew(script); - registerHandlersHelper(anotherPeer, particle, { + registerHandlersHelper(peer, particle, { load: { arg: (args) => { throw 'my super custom error message'; @@ -403,7 +405,7 @@ describe('Typescript usage suite', () => { }, }); - anotherPeer.internals.initiateParticle(particle, handleTimeout(reject)); + peer.internals.initiateParticle(particle, handleTimeout(reject)); }); // assert @@ -430,7 +432,7 @@ describe('Typescript usage suite', () => { it.skip('Should throw correct error when the client tries to send a particle not to the relay', async () => { // arrange; - await anotherPeer.start({ connectTo: nodes[0] }); + await peer.start({ connectTo: nodes[0] }); // act const promise = new Promise((resolve, reject) => { @@ -441,7 +443,7 @@ describe('Typescript usage suite', () => { )`; const particle = Particle.createNew(script); - registerHandlersHelper(anotherPeer, particle, { + registerHandlersHelper(peer, particle, { callback: { error: (args) => { const [error] = args; @@ -450,7 +452,7 @@ describe('Typescript usage suite', () => { }, }); - anotherPeer.internals.initiateParticle(particle, doNothing); + peer.internals.initiateParticle(particle, doNothing); }); // assert diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index c3dc2dd1e..fb68554f0 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -222,6 +222,7 @@ export class FluencePeer { * and disconnects from the Fluence network */ async stop() { + this._keyPair = undefined; this._relayPeerId = null; this._stopParticleProcessing(); await this._disconnect(); @@ -393,8 +394,8 @@ export class FluencePeer { }); this._outgoingParticles.subscribe(async (item) => { - if (this.getStatus().isInitialized) { - return null; + if (!this.getStatus().isInitialized) { + return; } if (!this._connection) { @@ -429,7 +430,7 @@ export class FluencePeer { filterExpiredParticles(this._expireParticle.bind(this)), concatMap(async (item) => { - if (this.getStatus().isInitialized) { + if (!this.getStatus().isInitialized) { return null; } @@ -455,7 +456,7 @@ export class FluencePeer { }), ) .subscribe(async (item) => { - if (this.getStatus().isInitialized) { + if (!this.getStatus().isInitialized) { return; } From 281f7d2500a030b78ffdf0cd6d35609d693b8b72 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 14:40:19 +0300 Subject: [PATCH 18/23] Add some more comments --- src/internal/FluencePeer.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/internal/FluencePeer.ts b/src/internal/FluencePeer.ts index fb68554f0..a5a9029a7 100644 --- a/src/internal/FluencePeer.ts +++ b/src/internal/FluencePeer.ts @@ -156,6 +156,7 @@ export class FluencePeer { getStatus(): PeerStatus { const hasKeyPair = this._keyPair !== undefined; return { + // TODO:: use explicit mechanism for peer's state isInitialized: hasKeyPair, isConnected: this._connection !== undefined, peerId: this._keyPair?.Libp2pPeerId?.toB58String() || null, @@ -222,7 +223,7 @@ export class FluencePeer { * and disconnects from the Fluence network */ async stop() { - this._keyPair = undefined; + this._keyPair = undefined; // This will set peer to non-initialized state and stop particle processing this._relayPeerId = null; this._stopParticleProcessing(); await this._disconnect(); @@ -394,6 +395,7 @@ export class FluencePeer { }); this._outgoingParticles.subscribe(async (item) => { + // Do not send particle after the peer has been stopped if (!this.getStatus().isInitialized) { return; } @@ -430,6 +432,7 @@ export class FluencePeer { filterExpiredParticles(this._expireParticle.bind(this)), concatMap(async (item) => { + // Is `.stop()` was called we need to stop particle processing immediately if (!this.getStatus().isInitialized) { return null; } @@ -456,6 +459,7 @@ export class FluencePeer { }), ) .subscribe(async (item) => { + // Is `.stop()` was called we need to stop particle processing immediately if (!this.getStatus().isInitialized) { return; } From 56f9832fa5807d0480a3e95585ccdc3ee2c63f79 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 18:47:07 +0300 Subject: [PATCH 19/23] Update packages --- package-lock.json | 30 +++++++++++++-------------- package.json | 4 ++-- src/__test__/integration/peer.spec.ts | 8 ++++--- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88116ad90..b8900b2c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "license": "Apache-2.0", "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", - "@fluencelabs/avm-runner-background": "0.0.2-init-7.0", + "@fluencelabs/avm": "0.19.6", + "@fluencelabs/avm-runner-background": "0.0.2-init-10.0", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", @@ -651,17 +651,17 @@ } }, "node_modules/@fluencelabs/avm": { - "version": "0.19.0-dynamic-import-wasm.3", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.0-dynamic-import-wasm.3.tgz", - "integrity": "sha512-eYNKI9G3E+qKwVNjrJKVzL5v6XZgWMkGvrhulibiuxnYq361yjCxvMQYJDhoQ1tKHZYjsXqtPje6Nk3d7Ldczg==", + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.6.tgz", + "integrity": "sha512-T6UQsIuGVltf13Wc3bFmuCYmQzu/00Y4lPS7atBauQ2R4+BqhRg1dc5reSZ+MbAW3Vy+NmJY1EEYOFRpLCGBwg==", "bin": { - "avm": "dist/copyAvm.js" + "copy-avm": "dist/copyAvm.js" } }, "node_modules/@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-7.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-7.0.tgz", - "integrity": "sha512-FmYyPdMv4cDKzqxdo3oUwVhEHKgc+1/cA4wQ1KJ+4/nUtclG1cPGZHbTUvv4gL3pgLGLncodRVN0NQuZ0gpE2Q==", + "version": "0.0.2-init-10.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-10.0.tgz", + "integrity": "sha512-Bf3V6YpQEGqZr7/Wa6CtPTkLI+Pj/YRiUFVwYKjLa+JUE758zqYf9wmNBV7kTPbF9n95ABKDpadWsopS0dlg/Q==", "dependencies": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", @@ -8771,14 +8771,14 @@ } }, "@fluencelabs/avm": { - "version": "0.19.0-dynamic-import-wasm.3", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.0-dynamic-import-wasm.3.tgz", - "integrity": "sha512-eYNKI9G3E+qKwVNjrJKVzL5v6XZgWMkGvrhulibiuxnYq361yjCxvMQYJDhoQ1tKHZYjsXqtPje6Nk3d7Ldczg==" + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.19.6.tgz", + "integrity": "sha512-T6UQsIuGVltf13Wc3bFmuCYmQzu/00Y4lPS7atBauQ2R4+BqhRg1dc5reSZ+MbAW3Vy+NmJY1EEYOFRpLCGBwg==" }, "@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-7.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-7.0.tgz", - "integrity": "sha512-FmYyPdMv4cDKzqxdo3oUwVhEHKgc+1/cA4wQ1KJ+4/nUtclG1cPGZHbTUvv4gL3pgLGLncodRVN0NQuZ0gpE2Q==", + "version": "0.0.2-init-10.0", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-10.0.tgz", + "integrity": "sha512-Bf3V6YpQEGqZr7/Wa6CtPTkLI+Pj/YRiUFVwYKjLa+JUE758zqYf9wmNBV7kTPbF9n95ABKDpadWsopS0dlg/Q==", "requires": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", diff --git a/package.json b/package.json index 9eff75213..83d0d5c11 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ }, "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-runner-background": "0.0.2-init-7.0", - "@fluencelabs/avm": "0.19.0-dynamic-import-wasm.3", + "@fluencelabs/avm-runner-background": "0.0.2-init-10.0", + "@fluencelabs/avm": "0.19.6", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", diff --git a/src/__test__/integration/peer.spec.ts b/src/__test__/integration/peer.spec.ts index fc5d03e3e..77f292e82 100644 --- a/src/__test__/integration/peer.spec.ts +++ b/src/__test__/integration/peer.spec.ts @@ -327,12 +327,14 @@ describe('Typescript usage suite', () => { // act const res = callIncorrectService(peer); + // console.log(await res); + // assert await expect(res).rejects.toMatchObject({ - msg: expect.stringContaining( + message: expect.stringContaining( `No handler has been registered for serviceId='incorrect' fnName='incorrect' args='[]'\"'`, ), - instruction: 'call %init_peer_id% ("incorrect" "incorrect") [] res', + // instruction: 'call %init_peer_id% ("incorrect" "incorrect") [] res', }); }); @@ -410,7 +412,7 @@ describe('Typescript usage suite', () => { // assert await expect(promise).rejects.toMatchObject({ - msg: expect.stringContaining('my super custom error message'), + message: expect.stringContaining('my super custom error message'), }); }); From 959134940b6c9d68c3511609039203384f280860 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 19:18:40 +0300 Subject: [PATCH 20/23] Use release avm-runner-background version --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8900b2c5..dd739d626 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", "@fluencelabs/avm": "0.19.6", - "@fluencelabs/avm-runner-background": "0.0.2-init-10.0", + "@fluencelabs/avm-runner-background": "0.1.1", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", "bs58": "4.0.1", @@ -659,9 +659,9 @@ } }, "node_modules/@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-10.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-10.0.tgz", - "integrity": "sha512-Bf3V6YpQEGqZr7/Wa6CtPTkLI+Pj/YRiUFVwYKjLa+JUE758zqYf9wmNBV7kTPbF9n95ABKDpadWsopS0dlg/Q==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.1.1.tgz", + "integrity": "sha512-XUnw3eUakBDngLZMIhTUXIT3Oz6N+6aclo7p2YIvjRHqhUUnL5/VEZcbuxLdkdzMdSdbQE7C/btKNVTO2kWJBw==", "dependencies": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", @@ -8776,9 +8776,9 @@ "integrity": "sha512-T6UQsIuGVltf13Wc3bFmuCYmQzu/00Y4lPS7atBauQ2R4+BqhRg1dc5reSZ+MbAW3Vy+NmJY1EEYOFRpLCGBwg==" }, "@fluencelabs/avm-runner-background": { - "version": "0.0.2-init-10.0", - "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.0.2-init-10.0.tgz", - "integrity": "sha512-Bf3V6YpQEGqZr7/Wa6CtPTkLI+Pj/YRiUFVwYKjLa+JUE758zqYf9wmNBV7kTPbF9n95ABKDpadWsopS0dlg/Q==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fluencelabs/avm-runner-background/-/avm-runner-background-0.1.1.tgz", + "integrity": "sha512-XUnw3eUakBDngLZMIhTUXIT3Oz6N+6aclo7p2YIvjRHqhUUnL5/VEZcbuxLdkdzMdSdbQE7C/btKNVTO2kWJBw==", "requires": { "@fluencelabs/avm-runner-interface": "^0.2.0", "browser-or-node": "^2.0.0", diff --git a/package.json b/package.json index 83d0d5c11..73510a79c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", - "@fluencelabs/avm-runner-background": "0.0.2-init-10.0", + "@fluencelabs/avm-runner-background": "0.1.1", "@fluencelabs/avm": "0.19.6", "@fluencelabs/avm-runner-interface": "^0.2.0", "async": "3.2.0", From dc3200399f44a2de0f0cae631464262f579ec29f Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 19:28:58 +0300 Subject: [PATCH 21/23] fix script path --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 73510a79c..6dbcb17dc 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "author": "Fluence Labs", "license": "Apache-2.0", "bin": { - "copy-avm-public": "dist/tools/copyAvmPublic" + "copy-avm-public": "dist/tools/copyAvmPublic.js" }, "dependencies": { "@chainsafe/libp2p-noise": "4.0.0", From c3512fd8209cffe37ba04a1b2f2669bdfd7a1cc2 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 20:44:10 +0300 Subject: [PATCH 22/23] those pesky CI scripts --- .github/workflows/js_sdk_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/js_sdk_ci.yml b/.github/workflows/js_sdk_ci.yml index 39f63ed03..e20a0802a 100644 --- a/.github/workflows/js_sdk_ci.yml +++ b/.github/workflows/js_sdk_ci.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [16.x, 17.x] + node-version: [14.x, 15.x, 16.x, 17.x] steps: - uses: actions/checkout@v2 From 14fa1d3b38b184ae43e7271042a12c5d7e9bf28e Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Tue, 28 Dec 2021 20:51:02 +0300 Subject: [PATCH 23/23] Update docs for the last time --- docs/classes/FluencePeer.html | 12 ++++++------ docs/classes/KeyPair.html | 14 +++++++------- docs/interfaces/CallParams.html | 12 ++++++------ docs/interfaces/PeerConfig.html | 18 +++++++++--------- docs/interfaces/PeerStatus.html | 8 ++++---- docs/modules.html | 8 ++++---- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/docs/classes/FluencePeer.html b/docs/classes/FluencePeer.html index 4a434cde0..86ca9cb01 100644 --- a/docs/classes/FluencePeer.html +++ b/docs/classes/FluencePeer.html @@ -121,7 +121,7 @@

    constructor

  • @@ -146,7 +146,7 @@

    internals

  • @@ -325,7 +325,7 @@

    getStatus

  • @@ -347,7 +347,7 @@

    start

  • @@ -379,7 +379,7 @@

    stop

  • @@ -402,7 +402,7 @@

    Static isInstance

  • diff --git a/docs/classes/KeyPair.html b/docs/classes/KeyPair.html index fe68312a1..39bbd1f84 100644 --- a/docs/classes/KeyPair.html +++ b/docs/classes/KeyPair.html @@ -114,7 +114,7 @@

    constructor

  • Parameters

    @@ -136,7 +136,7 @@

    Libp2pPeerId

    Libp2pPeerId: PeerId
    @@ -158,7 +158,7 @@

    signBytes

  • Parameters

    @@ -181,7 +181,7 @@

    toEd25519PrivateKey

  • Returns Uint8Array

    @@ -199,7 +199,7 @@

    verify

  • Parameters

    @@ -225,7 +225,7 @@

    Static fromEd25519SK

  • @@ -256,7 +256,7 @@

    Static randomEd25519

  • diff --git a/docs/interfaces/CallParams.html b/docs/interfaces/CallParams.html index 427161047..79307b7b9 100644 --- a/docs/interfaces/CallParams.html +++ b/docs/interfaces/CallParams.html @@ -118,7 +118,7 @@

    initPeerId

    initPeerId: string
    @@ -133,7 +133,7 @@

    particleId

    particleId: string
    @@ -148,7 +148,7 @@

    signature

    signature: string
    @@ -163,7 +163,7 @@

    tetraplets

    tetraplets: {[ key in string]: SecurityTetraplet[] }
    @@ -178,7 +178,7 @@

    timestamp

    timestamp: number
    @@ -193,7 +193,7 @@

    ttl

    ttl: number
    diff --git a/docs/interfaces/PeerConfig.html b/docs/interfaces/PeerConfig.html index b147dee9c..502a910f3 100644 --- a/docs/interfaces/PeerConfig.html +++ b/docs/interfaces/PeerConfig.html @@ -108,7 +108,7 @@

    Optional KeyPair

    KeyPair: KeyPair
    @@ -124,7 +124,7 @@

    Optional avmLogLevel
    avmLogLevel: LogLevel
    @@ -139,12 +139,12 @@

    Optional avmRunner

    avmRunner: AvmRunner
    -

    Plugable AVM runner implementation. If no specified a single-thread, ui-blocking runner will be used.

    +

    Plugable AVM runner implementation. If not specified AvmBackgroundRunner will be used

    @@ -154,7 +154,7 @@

    Optional checkConnection<
    checkConnectionTimeoutMs: number
    @@ -171,7 +171,7 @@

    Optional connectTo

    connectTo: string | Multiaddr | Node
    @@ -193,7 +193,7 @@

    Optional defaultTtlM
    defaultTtlMs: number
    @@ -210,7 +210,7 @@

    Optional dialTimeout
    dialTimeoutMs: number
    @@ -225,7 +225,7 @@

    Optional skipCheckCo
    skipCheckConnection: boolean
    diff --git a/docs/interfaces/PeerStatus.html b/docs/interfaces/PeerStatus.html index 263dc4988..1b14c80fc 100644 --- a/docs/interfaces/PeerStatus.html +++ b/docs/interfaces/PeerStatus.html @@ -104,7 +104,7 @@

    isConnected

    isConnected: Boolean
    @@ -119,7 +119,7 @@

    isInitialized

    isInitialized: Boolean
    @@ -134,7 +134,7 @@

    peerId

    peerId: string
    @@ -149,7 +149,7 @@

    relayPeerId

    relayPeerId: string
    diff --git a/docs/modules.html b/docs/modules.html index 8698073cf..01cab4ed8 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -106,7 +106,7 @@

    AvmLoglevel

    AvmLoglevel: LogLevel
    @@ -122,7 +122,7 @@

    PeerIdB58

    PeerIdB58: string
    @@ -140,7 +140,7 @@

    Const Fluence

    Fluence: { getPeer: () => FluencePeer; getStatus: () => PeerStatus; start: (config?: PeerConfig) => Promise<void>; stop: () => Promise<void> } = ...
    @@ -260,7 +260,7 @@

    Const setLogLevel

  • Parameters