diff --git a/package-lock.json b/package-lock.json index 22240adf..1ed34914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "fluence", - "version": "0.7.103", + "version": "0.7.106", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a6fa8bfd..d85b1b13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fluence", - "version": "0.7.106", + "version": "0.7.107", "description": "the browser js-libp2p client for the Fluence network", "main": "./dist/fluence.js", "typings": "./dist/fluence.d.ts", diff --git a/src/aqua/index.d.ts b/src/aqua/index.d.ts index a80675aa..d51c0144 100644 --- a/src/aqua/index.d.ts +++ b/src/aqua/index.d.ts @@ -9,7 +9,7 @@ * @param {string} log_level * @returns {string} */ -export function invoke(wasm: any, init_user_id: string, aqua: string, prev_data: string, data: string, log_level: string): string; +export function invoke(wasm: any, init_user_id: string, aqua: string, prev_data: Uint8Array, data: Uint8Array, log_level: string): string; export function ast(wasm: any, script: string): string; export function return_current_peer_id(wasm: any, peerId: string, arg0: any): void; export function return_call_service_result(wasm: any, ret: string, arg0: any): void; diff --git a/src/aqua/index_bg.js b/src/aqua/index_bg.js index 4561bf0e..68c40f49 100644 --- a/src/aqua/index_bg.js +++ b/src/aqua/index_bg.js @@ -91,6 +91,14 @@ cachedTextDecoder.decode(); export function getStringFromWasm0(wasm, ptr, len) { return cachedTextDecoder.decode(getUint8Memory0(wasm).subarray(ptr, ptr + len)); } + +function passArray8ToWasm0(wasm, arg, malloc) { + const ptr = malloc(arg.length * 1); + getUint8Memory0(wasm).set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + /** * @param {any} wasm * @param {string} init_user_id @@ -106,9 +114,9 @@ export function invoke(wasm, init_user_id, aqua, prev_data, data, log_level) { var len0 = WASM_VECTOR_LEN; var ptr1 = passStringToWasm0(wasm, aqua, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len1 = WASM_VECTOR_LEN; - var ptr2 = passStringToWasm0(wasm, prev_data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var ptr2 = passArray8ToWasm0(wasm, prev_data, wasm.__wbindgen_malloc); var len2 = WASM_VECTOR_LEN; - var ptr3 = passStringToWasm0(wasm, data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var ptr3 = passArray8ToWasm0(wasm, data, wasm.__wbindgen_malloc); var len3 = WASM_VECTOR_LEN; var ptr4 = passStringToWasm0(wasm, log_level, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len4 = WASM_VECTOR_LEN; diff --git a/src/fluenceClient.ts b/src/fluenceClient.ts index 64f18205..98960463 100644 --- a/src/fluenceClient.ts +++ b/src/fluenceClient.ts @@ -66,7 +66,7 @@ export class FluenceClient { log.info(`Particle expired. Now: ${now}, ttl: ${particle.ttl}, ts: ${particle.timestamp}`); } else { // if there is no subscription yet, previous data is empty - let prevData = []; + let prevData: Uint8Array = Buffer.from([]); let prevParticle = this.subscriptions.get(particle.id); if (prevParticle) { prevData = prevParticle.data; @@ -79,8 +79,8 @@ export class FluenceClient { let stepperOutcomeStr = this.interpreter( particle.init_peer_id, particle.script, - JSON.stringify(prevData), - JSON.stringify(particle.data), + prevData, + particle.data, ); let stepperOutcome: StepperOutcome = JSON.parse(stepperOutcomeStr); @@ -131,7 +131,7 @@ export class FluenceClient { let _this = this; return async (particle: Particle) => { - let data = particle.data; + let data: any = particle.data; let error: any = data['protocol!error']; if (error !== undefined) { log.error('error in external particle: '); diff --git a/src/fluenceConnection.ts b/src/fluenceConnection.ts index ffb0a658..0cc3f996 100644 --- a/src/fluenceConnection.ts +++ b/src/fluenceConnection.ts @@ -23,7 +23,7 @@ import pipe from 'it-pipe'; import Multiaddr from 'multiaddr'; import PeerId from 'peer-id'; import * as log from 'loglevel'; -import { build, parseParticle, Particle, stringifyParticle } from './particle'; +import { build, parseParticle, Particle, toAction } from './particle'; export const PROTOCOL_NAME = '/fluence/faas/1.0.0'; @@ -121,8 +121,9 @@ export class FluenceConnection { async sendParticle(particle: Particle): Promise { this.checkConnectedOrThrow(); - let particleStr = stringifyParticle(particle); - log.debug('send particle: \n' + JSON.stringify(particle, undefined, 2)); + let action = toAction(particle) + let particleStr = JSON.stringify(action); + log.debug('send particle: \n' + JSON.stringify(action, undefined, 2)); // create outgoing substream const conn = (await this.node.dialProtocol(this.address, PROTOCOL_NAME)) as { diff --git a/src/particle.ts b/src/particle.ts index 699ded67..c3b0a6a1 100644 --- a/src/particle.ts +++ b/src/particle.ts @@ -15,6 +15,7 @@ */ import { v4 as uuidv4 } from 'uuid'; +import { fromByteArray } from 'base64-js'; import PeerId from 'peer-id'; import { encode } from 'bs58'; import { addData } from './dataStorage'; @@ -29,7 +30,21 @@ export interface Particle { script: string; // sign upper fields signature: string; - data: any; + data: Uint8Array; +} + +/** + * Represents particle action to send to a node + */ +interface ParticleAction { + action: 'Particle' + id: string; + init_peer_id: string; + timestamp: number; + ttl: number; + script: string; + signature: number[]; + data: string; } function wrapScript(selfPeerId: string, script: string, fields: string[]): string { @@ -63,7 +78,7 @@ export async function build(peerId: PeerId, script: string, data: Map string; +export type InterpreterInvoke = (init_user_id: string, script: string, prev_data: Uint8Array, data: Uint8Array) => string; type ImportObject = { './aquamarine_client_bg.js': { // fn call_service_impl(service_id: String, fn_name: String, args: String, security_tetraplets: String) -> String; @@ -173,7 +173,7 @@ export async function instantiateInterpreter(peerId: PeerId): Promise { + return (init_user_id: string, script: string, prev_data: Uint8Array, data: Uint8Array) => { let logLevel = log.getLevel(); let logLevelStr = 'info'; if (logLevel === 0) { diff --git a/src/stepperOutcome.ts b/src/stepperOutcome.ts index ae674e69..9109d99e 100644 --- a/src/stepperOutcome.ts +++ b/src/stepperOutcome.ts @@ -16,6 +16,6 @@ export interface StepperOutcome { ret_code: number; - data: number[]; + data: Uint8Array; next_peer_pks: string[]; }