From d6daaf05f1023fd14481c7776dcc4ae26c8eca38 Mon Sep 17 00:00:00 2001 From: Pavel Murygin Date: Wed, 1 Dec 2021 17:19:28 +0300 Subject: [PATCH] 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 | 39 ++++++++++----------- 8 files changed, 89 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e245613..d7566bd8 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 df976bf1..d61b8261 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 401ec7d7..46f1124a 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 dba8747d..441b286b 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 02d2e92d..31b35bd5 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 6150f93c..5e7a9096 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 b33c45a3..39ec7f77 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 2146dc6b..41828343 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'; +import { LogLevel as AvmLoglevel } from '@fluencelabs/avm-worker-common'; -export const createInterpreter = (logLevel: AvmLoglevel): Promise => { - const logFn = (level: AvmLogLevel, msg: string) => { - switch (level) { - case 'error': - log.error(msg); - break; +export const avmLogFunction = (level: AvmLoglevel, msg: string) => { + switch (level) { + case 'error': + log.error(msg); + break; - case 'warn': - log.warn(msg); - break; + case 'warn': + log.warn(msg); + break; - case 'info': - log.info(msg); - break; + case 'info': + log.info(msg); + break; - case 'debug': - case 'trace': - log.log(msg); - break; - } - }; - return AirInterpreter.create(logLevel, logFn); + case 'debug': + case 'trace': + log.log(msg); + break; + } }; export const MakeServiceCall = (fn: (args: any[]) => CallServiceResultType) => {