diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f451d2f4..e991e712 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,8 +37,8 @@ jobs: strategy: matrix: node-version: - - 16.x - 18.x + # - 20.x steps: - name: Import secrets diff --git a/packages/client/api/package.json b/packages/client/api/package.json index 897043a5..ba2aafee 100644 --- a/packages/client/api/package.json +++ b/packages/client/api/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@fluencelabs/avm": "0.43.1", - "@fluencelabs/marine-js": "0.3.45", + "@fluencelabs/marine-js": "0.7.2", "microbundle": "0.15.1", "dts-bundle-generator": "7.2.0" } diff --git a/packages/client/js-client.node/package.json b/packages/client/js-client.node/package.json index 402e9729..e57ed1a2 100644 --- a/packages/client/js-client.node/package.json +++ b/packages/client/js-client.node/package.json @@ -25,7 +25,7 @@ "@fluencelabs/js-peer": "0.9.1", "@fluencelabs/interfaces": "0.8.1", "@fluencelabs/avm": "0.43.1", - "@fluencelabs/marine-js": "0.3.45", + "@fluencelabs/marine-js": "0.7.2", "platform": "1.3.6" }, "devDependencies": { diff --git a/packages/client/js-client.web.standalone/package.json b/packages/client/js-client.web.standalone/package.json index 45148a38..abcd0275 100644 --- a/packages/client/js-client.web.standalone/package.json +++ b/packages/client/js-client.web.standalone/package.json @@ -23,7 +23,7 @@ }, "devDependencies": { "@fluencelabs/avm": "0.43.1", - "@fluencelabs/marine-js": "0.3.45", + "@fluencelabs/marine-js": "0.7.2", "@types/node": "16.11.59", "@types/jest": "28.1.0", "jest": "28.1.0", diff --git a/packages/core/interfaces/package.json b/packages/core/interfaces/package.json index 75024eba..25ea3e26 100644 --- a/packages/core/interfaces/package.json +++ b/packages/core/interfaces/package.json @@ -51,6 +51,6 @@ "devDependencies": { "@multiformats/multiaddr": "11.3.0", "@fluencelabs/avm": "0.43.1", - "@fluencelabs/marine-js": "0.3.45" + "@fluencelabs/marine-js": "0.7.2" } } diff --git a/packages/core/js-peer/package.json b/packages/core/js-peer/package.json index 1214241d..e146eafb 100644 --- a/packages/core/js-peer/package.json +++ b/packages/core/js-peer/package.json @@ -19,7 +19,7 @@ "dependencies": { "@fluencelabs/interfaces": "0.8.1", "@fluencelabs/avm": "0.43.1", - "@fluencelabs/marine-js": "0.3.45", + "@fluencelabs/marine-js": "0.7.2", "multiformats": "11.0.1", "debug": "4.3.4", "async": "3.2.4", diff --git a/packages/core/js-peer/src/jsPeer/FluencePeer.ts b/packages/core/js-peer/src/jsPeer/FluencePeer.ts index eedf9791..f6af5f16 100644 --- a/packages/core/js-peer/src/jsPeer/FluencePeer.ts +++ b/packages/core/js-peer/src/jsPeer/FluencePeer.ts @@ -25,6 +25,7 @@ import { ParticleExecutionStage, ParticleQueueItem, } from '../particle/Particle.js'; +import { defaultCallParameters } from "@fluencelabs/marine-js/dist/types" import { jsonify, isString } from '../util/utils.js'; import { concatMap, filter, pipe, Subject, tap, Unsubscribable } from 'rxjs'; import { defaultSigGuard, Sig } from '../services/Sig.js'; @@ -184,7 +185,7 @@ export abstract class FluencePeer { new Error("Can't use avm: peer is not initialized"); } - const res = await this.marineHost.callService('avm', 'ast', [air], undefined); + const res = await this.marineHost.callService('avm', 'ast', [air], defaultCallParameters); if (!isString(res)) { throw new Error(`Call to avm:ast expected to return string. Actual return: ${res}`); } @@ -521,7 +522,8 @@ export abstract class FluencePeer { log_particle.trace('id %s. executing call service handler %j', particleId, req); if (this.marineHost && this.marineHost.hasService(req.serviceId)) { - const result = await this.marineHost.callService(req.serviceId, req.fnName, req.args, undefined); + // TODO build correct CallParameters instead of default ones + const result = await this.marineHost.callService(req.serviceId, req.fnName, req.args, defaultCallParameters); return { retCode: ResultCodes.success, diff --git a/packages/core/js-peer/src/jsPeer/avm.ts b/packages/core/js-peer/src/jsPeer/avm.ts index d9b4c578..d351b084 100644 --- a/packages/core/js-peer/src/jsPeer/avm.ts +++ b/packages/core/js-peer/src/jsPeer/avm.ts @@ -16,6 +16,7 @@ import type { CallResultsArray, InterpreterResult, RunParameters } from '@fluencelabs/avm'; import { deserializeAvmResult, serializeAvmArgs } from '@fluencelabs/avm'; import { IAvmRunner, IMarineHost, IWasmLoader } from '../marine/interfaces.js'; +import { defaultCallParameters } from "@fluencelabs/marine-js/dist/types" export class MarineBasedAvmRunner implements IAvmRunner { constructor(private marine: IMarineHost, private avmWasmLoader: IWasmLoader) {} @@ -31,7 +32,7 @@ export class MarineBasedAvmRunner implements IAvmRunner { let avmCallResult: InterpreterResult | Error; try { - const res = await this.marine.callService('avm', 'invoke', args, undefined); + const res = await this.marine.callService('avm', 'invoke', args, defaultCallParameters); avmCallResult = deserializeAvmResult(res); } catch (e) { avmCallResult = e instanceof Error ? e : new Error((e as any).toString()); diff --git a/packages/core/js-peer/src/marine/interfaces.ts b/packages/core/js-peer/src/marine/interfaces.ts index 3789ed8f..a9b0828e 100644 --- a/packages/core/js-peer/src/marine/interfaces.ts +++ b/packages/core/js-peer/src/marine/interfaces.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { CallResultsArray, InterpreterResult, RunParameters } from '@fluencelabs/avm'; -import { IStartable, JSONArray, JSONObject } from '../util/commonTypes.js'; +import { IStartable, JSONArray, JSONObject, CallParameters } from '../util/commonTypes.js'; import { Buffer } from 'buffer'; // @ts-ignore import type { WorkerImplementation } from 'threads/dist/types/master'; @@ -45,7 +45,7 @@ export interface IMarineHost extends IStartable { serviceId: string, functionName: string, args: JSONArray | JSONObject, - callParams: any, + callParams: CallParameters, ): Promise; } diff --git a/packages/core/js-peer/src/marine/worker-script/index.ts b/packages/core/js-peer/src/marine/worker-script/index.ts index 8bfa6242..b01ea0e0 100644 --- a/packages/core/js-peer/src/marine/worker-script/index.ts +++ b/packages/core/js-peer/src/marine/worker-script/index.ts @@ -15,8 +15,8 @@ */ import { MarineService } from '@fluencelabs/marine-js/dist/MarineService'; -import type { Env, MarineServiceConfig } from '@fluencelabs/marine-js/dist/config'; -import type { JSONArray, JSONObject, LogMessage } from '@fluencelabs/marine-js/dist/types'; +import type { Env, MarineModuleConfig, MarineServiceConfig, ModuleDescriptor } from '@fluencelabs/marine-js/dist/config' +import type { JSONArray, JSONObject, LogMessage, CallParameters } from '@fluencelabs/marine-js/dist/types'; import { Buffer } from 'buffer'; // @ts-ignore import { Observable, Subject } from 'threads/observable'; @@ -26,6 +26,26 @@ import { expose } from 'threads/worker'; let marineServices = new Map(); let controlModule: WebAssembly.Module | undefined; +const createSimpleModuleDescriptor = (name: string, envs?: Env): ModuleDescriptor => { + return { + import_name: name, + config: { + logger_enabled: true, + logging_mask: 0, + wasi: { + envs: {...envs}, + preopened_files: new Set(), + mapped_dirs: new Map, + } + } + } +} +const createSimpleMarineService = (name: string, env? : Env): MarineServiceConfig => { + return { + modules_config: [createSimpleModuleDescriptor(name, env)], + } +} + const onLogMessage = new Subject(); const asArray = (buf: SharedArrayBuffer | Buffer) => { @@ -40,20 +60,20 @@ const toExpose = { createService: async ( wasm: SharedArrayBuffer | Buffer, serviceId: string, - marineConfig?: MarineServiceConfig, envs?: Env, ): Promise => { if (!controlModule) { throw new Error('MarineJS is not initialized. To initialize call `init` function'); } - const service = await WebAssembly.compile(asArray(wasm)); + const marineConfig = createSimpleMarineService(serviceId, envs); + const modules = {[serviceId]: new Uint8Array(wasm)} const srv = new MarineService( controlModule, - service, serviceId, onLogMessage.next.bind(onLogMessage), marineConfig, + modules, envs, ); await srv.init(); @@ -67,7 +87,7 @@ const toExpose = { onLogMessage.complete(); }, - callService: (serviceId: string, functionName: string, args: JSONArray | JSONObject, callParams: any): unknown => { + callService: (serviceId: string, functionName: string, args: JSONArray | JSONObject, callParams: CallParameters): unknown => { const srv = marineServices.get(serviceId); if (!srv) { throw new Error(`service with id=${serviceId} not found`); diff --git a/packages/core/js-peer/src/marine/worker/index.ts b/packages/core/js-peer/src/marine/worker/index.ts index f793226c..31c32879 100644 --- a/packages/core/js-peer/src/marine/worker/index.ts +++ b/packages/core/js-peer/src/marine/worker/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { JSONArray, JSONObject } from '@fluencelabs/marine-js/dist/types'; +import type { JSONArray, JSONObject, CallParameters } from '@fluencelabs/marine-js/dist/types'; import { LogFunction, logLevelToEnv } from '@fluencelabs/marine-js/dist/types'; import type { MarineBackgroundInterface } from '../worker-script/index.js'; // @ts-ignore @@ -73,7 +73,7 @@ export class MarineBackgroundRunner implements IMarineHost { // We enable all possible log levels passing the control for exact printouts to the logger const env = logLevelToEnv('trace'); this.loggers.set(serviceId, marineLogger(serviceId)); - await this.workerThread.createService(serviceModule, serviceId, undefined, env); + await this.workerThread.createService(serviceModule, serviceId, env); this.marineServices.add(serviceId); } @@ -81,7 +81,7 @@ export class MarineBackgroundRunner implements IMarineHost { serviceId: string, functionName: string, args: JSONArray | JSONObject, - callParams: any, + callParams: CallParameters, ): Promise { if (!this.workerThread) { throw 'Worker is not initialized'; diff --git a/packages/core/js-peer/src/util/commonTypes.ts b/packages/core/js-peer/src/util/commonTypes.ts index 7a34d6a6..bdbd5017 100644 --- a/packages/core/js-peer/src/util/commonTypes.ts +++ b/packages/core/js-peer/src/util/commonTypes.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +export { CallParameters} from "@fluencelabs/marine-js/dist/types"; + export interface IStartable { start(): Promise; stop(): Promise; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f00195be..3f6efdd1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,8 +148,8 @@ importers: specifier: 0.43.1 version: 0.43.1 '@fluencelabs/marine-js': - specifier: 0.3.45 - version: 0.3.45 + specifier: 0.7.2 + version: 0.7.2 dts-bundle-generator: specifier: 7.2.0 version: 7.2.0 @@ -169,8 +169,8 @@ importers: specifier: 0.9.1 version: link:../../core/js-peer '@fluencelabs/marine-js': - specifier: 0.3.45 - version: 0.3.45 + specifier: 0.7.2 + version: 0.7.2 platform: specifier: 1.3.6 version: 1.3.6 @@ -220,8 +220,8 @@ importers: specifier: 0.43.1 version: 0.43.1 '@fluencelabs/marine-js': - specifier: 0.3.45 - version: 0.3.45 + specifier: 0.7.2 + version: 0.7.2 '@rollup/plugin-inject': specifier: 5.0.3 version: 5.0.3 @@ -262,8 +262,8 @@ importers: specifier: 0.43.1 version: 0.43.1 '@fluencelabs/marine-js': - specifier: 0.3.45 - version: 0.3.45 + specifier: 0.7.2 + version: 0.7.2 '@multiformats/multiaddr': specifier: 11.3.0 version: 11.3.0 @@ -280,8 +280,8 @@ importers: specifier: 0.8.1 version: link:../interfaces '@fluencelabs/marine-js': - specifier: 0.3.45 - version: 0.3.45 + specifier: 0.7.2 + version: 0.7.2 '@libp2p/crypto': specifier: 1.0.8 version: 1.0.8(uint8arraylist@2.4.3) @@ -2999,8 +2999,8 @@ packages: - typescript dev: true - /@fluencelabs/marine-js@0.3.45: - resolution: {integrity: sha512-GmeTvaC9n6zM6FPPyoHXwe2I8F9mEeE9DKzJcqy4FkUmpI11Fu4HrTvKgJyTURJkZSu8cfrjA7ZVeYuDGHeimQ==} + /@fluencelabs/marine-js@0.7.2: + resolution: {integrity: sha512-etjbXDgzyZkK82UZvtuIU3bfy5f52siDUy1m+T5Y5r70k82xYdZZ8vgWVgB6ivi2f3aDyQjgNTfzWQjKFpAReQ==} dependencies: '@wasmer/wasi': 0.12.0 '@wasmer/wasmfs': 0.12.0