Fix issue with avm logs not being displayed (#54)

This commit is contained in:
Pavel 2021-06-08 11:08:07 +03:00 committed by GitHub
parent 2e016e9b7a
commit 67a1f91961
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 77 additions and 33 deletions

6
package-lock.json generated
View File

@ -435,9 +435,9 @@
} }
}, },
"@fluencelabs/avm": { "@fluencelabs/avm": {
"version": "0.9.12", "version": "0.10.2",
"resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.9.12.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/avm/-/avm-0.10.2.tgz",
"integrity": "sha512-NCRGJafLa1Zs98IIOIALrPUoOEjesITsB9of2/r+IDgGKunf0NjI2/tqU5pK+37ye/qro5W+FJsHyseDh7zSDQ==", "integrity": "sha512-8FlCx3eTY5Xq5PdE1Fa1rrjrw8oNIdNSnjAxl1MYKL4IEurtRmzQbvFa7s06uX8nU0CRh7UTf9B5xqGOHWGBpA==",
"requires": { "requires": {
"base64-js": "1.5.1" "base64-js": "1.5.1"
}, },

View File

@ -19,7 +19,7 @@
"author": "Fluence Labs", "author": "Fluence Labs",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@fluencelabs/avm": "0.9.12", "@fluencelabs/avm": "0.10.2",
"async": "3.2.0", "async": "3.2.0",
"base64-js": "1.3.1", "base64-js": "1.3.1",
"bs58": "4.0.1", "bs58": "4.0.1",

View File

@ -85,7 +85,7 @@ describe('Builtins usage suite', () => {
let promise = createService(client, 'test_broken_blueprint'); let promise = createService(client, 'test_broken_blueprint');
await expect(promise).rejects.toMatchObject({ await expect(promise).rejects.toMatchObject({
error: expect.stringContaining("Blueprint 'test_broken_blueprint' wasn't found"), msg: expect.stringContaining("Blueprint 'test_broken_blueprint' wasn't found"),
instruction: expect.stringContaining('blueprint_id'), instruction: expect.stringContaining('blueprint_id'),
}); });
}); });

View File

@ -2,7 +2,6 @@ import { checkConnection, createClient, FluenceClient } from '../../FluenceClien
import Multiaddr from 'multiaddr'; import Multiaddr from 'multiaddr';
import { nodes } from '../connection'; import { nodes } from '../connection';
import { RequestFlowBuilder } from '../../internal/RequestFlowBuilder'; import { RequestFlowBuilder } from '../../internal/RequestFlowBuilder';
import { error } from 'loglevel';
let client: FluenceClient; let client: FluenceClient;
@ -203,7 +202,7 @@ describe('Typescript usage suite', () => {
// assert // assert
await expect(promise).rejects.toMatchObject({ await expect(promise).rejects.toMatchObject({
error: expect.stringContaining("Service with id 'incorrect' not found"), msg: expect.stringContaining("Service with id 'incorrect' not found"),
instruction: expect.stringContaining('incorrect'), instruction: expect.stringContaining('incorrect'),
}); });
}); });
@ -241,7 +240,7 @@ describe('Typescript usage suite', () => {
// assert // assert
await expect(res).rejects.toMatchObject({ await expect(res).rejects.toMatchObject({
error: "Local service error: ret_code is 1024, error message is '\"The handler did not set any result. Make sure you are calling the right peer and the handler has been registered. Original request data was: serviceId='peer' fnName='identify' args=''\"'", msg: "Local service error: ret_code is 1024, error message is '\"The handler did not set any result. Make sure you are calling the right peer and the handler has been registered. Original request data was: serviceId='peer' fnName='identify' args=''\"'",
instruction: 'call %init_peer_id% ("peer" "identify") [] res', instruction: 'call %init_peer_id% ("peer" "identify") [] res',
}); });
}); });

View File

@ -46,7 +46,7 @@ describe('Legacy api suite', () => {
}); });
await expect(promise).rejects.toMatchObject({ await expect(promise).rejects.toMatchObject({
error: expect.stringContaining("Service with id 'incorrect' not found"), msg: expect.stringContaining("Service with id 'incorrect' not found"),
instruction: expect.stringContaining('incorrect'), instruction: expect.stringContaining('incorrect'),
}); });
}); });
@ -78,7 +78,7 @@ describe('Legacy api suite', () => {
const promise = sendParticleAsFetch<[string]>(client, new Particle(script), 'fn', 'service'); const promise = sendParticleAsFetch<[string]>(client, new Particle(script), 'fn', 'service');
await expect(promise).rejects.toMatchObject({ await expect(promise).rejects.toMatchObject({
error: expect.stringContaining("Service with id 'incorrect' not found"), msg: expect.stringContaining("Service with id 'incorrect' not found"),
instruction: expect.stringContaining('incorrect'), instruction: expect.stringContaining('incorrect'),
}); });
}); });

View File

@ -25,9 +25,60 @@ import { CallServiceHandler } from './CallServiceHandler';
import { loadRelayFn, loadVariablesService } from './RequestFlowBuilder'; import { loadRelayFn, loadVariablesService } from './RequestFlowBuilder';
import { logParticle, Particle } from './particle'; import { logParticle, Particle } from './particle';
import log from 'loglevel'; import log from 'loglevel';
import { AirInterpreter, ParticleHandler, SecurityTetraplet, CallServiceResult } from '@fluencelabs/avm'; import {
AirInterpreter,
ParticleHandler,
SecurityTetraplet,
CallServiceResult,
LogLevel as AvmLogLevel,
} from '@fluencelabs/avm';
import makeDefaultClientHandler from './defaultClientHandler'; import makeDefaultClientHandler from './defaultClientHandler';
const createClient = (handler, peerId): Promise<AirInterpreter> => {
let logLevel: AvmLogLevel = 'off';
switch (log.getLevel()) {
case 0: // 'TRACE'
logLevel = 'trace';
break;
case 1: // 'DEBUG'
logLevel = 'debug';
break;
case 2: // 'INFO'
logLevel = 'info';
break;
case 3: // 'WARN'
logLevel = 'warn';
break;
case 4: // 'ERROR'
logLevel = 'error';
break;
case 5: // 'SILENT'
logLevel = 'off';
break;
}
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(handler, peerId, logLevel, logFn);
};
export class ClientImpl implements FluenceClient { export class ClientImpl implements FluenceClient {
readonly selfPeerIdFull: PeerId; readonly selfPeerIdFull: PeerId;
@ -68,12 +119,7 @@ export class ClientImpl implements FluenceClient {
} }
async initAirInterpreter(): Promise<void> { async initAirInterpreter(): Promise<void> {
this.interpreter = await AirInterpreter.create( this.interpreter = await createClient(this.interpreterCallback.bind(this), this.selfPeerId);
this.interpreterCallback.bind(this),
this.selfPeerId,
'trace',
log.log,
);
} }
async connect(multiaddr: string | Multiaddr, options?: FluenceConnectionOptions): Promise<void> { async connect(multiaddr: string | Multiaddr, options?: FluenceConnectionOptions): Promise<void> {

View File

@ -20,7 +20,7 @@ import Peer from 'libp2p';
import { decode, encode } from 'it-length-prefixed'; import { decode, encode } from 'it-length-prefixed';
import pipe from 'it-pipe'; import pipe from 'it-pipe';
import * as log from 'loglevel'; import * as log from 'loglevel';
import { parseParticle, Particle, toPayload } from './particle'; import { logParticle, parseParticle, Particle, toPayload } from './particle';
import { NOISE } from 'libp2p-noise'; import { NOISE } from 'libp2p-noise';
import PeerId from 'peer-id'; import PeerId from 'peer-id';
import Multiaddr from 'multiaddr'; import Multiaddr from 'multiaddr';
@ -114,7 +114,7 @@ export class FluenceConnection {
if (this.status === Status.Initializing) { if (this.status === Status.Initializing) {
await this.node.start(); await this.node.start();
log.trace(`dialing to the node with client's address: ` + this.node.peerId.toB58String()); log.debug(`dialing to the node with client's address: ` + this.node.peerId.toB58String());
try { try {
await this.node.dial(this.address); await this.node.dial(this.address);
@ -127,15 +127,13 @@ export class FluenceConnection {
} }
} }
let _this = this;
this.node.handle([PROTOCOL_NAME], async ({ connection, stream }) => { this.node.handle([PROTOCOL_NAME], async ({ connection, stream }) => {
pipe(stream.source, decode(), async function (source: AsyncIterable<string>) { pipe(stream.source, decode(), async (source: AsyncIterable<string>) => {
for await (const msg of source) { for await (const msg of source) {
try { try {
let particle = parseParticle(msg); const particle = parseParticle(msg);
log.trace('Particle is received:', JSON.stringify(particle, undefined, 2)); logParticle(log.debug, 'Particle is received:', particle);
_this.handleParticle(particle); this.handleParticle(particle);
} catch (e) { } catch (e) {
log.error('error on handling a new incoming message: ' + e); log.error('error on handling a new incoming message: ' + e);
} }
@ -165,7 +163,7 @@ export class FluenceConnection {
let action = toPayload(particle); let action = toPayload(particle);
let particleStr = JSON.stringify(action); let particleStr = JSON.stringify(action);
log.debug('send particle: \n' + JSON.stringify(action, undefined, 2)); logParticle(log.debug, 'send particle: \n', particle);
// create outgoing substream // create outgoing substream
const conn = (await this.node.dialProtocol(this.address, PROTOCOL_NAME)) as { const conn = (await this.node.dialProtocol(this.address, PROTOCOL_NAME)) as {

View File

@ -195,15 +195,14 @@ export class RequestFlowBuilder {
this.configHandler((h, request) => { this.configHandler((h, request) => {
h.onEvent(xorHandleService, xorHandleFn, (args) => { h.onEvent(xorHandleService, xorHandleFn, (args) => {
let msg; if (args[0] === undefined) {
try { log.error(
msg = JSON.parse(args[0]); 'Request flow error handler recieved unexpected argument, value of %last_error% is undefined',
} catch (e) { );
msg = e;
} }
try { try {
request.raiseError(msg); request.raiseError(args[0]);
} catch (e) { } catch (e) {
log.error('Error handling script executed with error', e); log.error('Error handling script executed with error', e);
} }

View File

@ -32,7 +32,9 @@ export interface Particle {
} }
export const logParticle = (fn: Function, message: string, particle: Particle) => { export const logParticle = (fn: Function, message: string, particle: Particle) => {
fn(message, particle); const toLog = { ...particle };
delete toLog.data;
fn(message, toLog);
}; };
/** /**