Skip to content

Commit

Permalink
Merge remote-tracking branch 'ArkEcosystem/core/develop' into fix-par…
Browse files Browse the repository at this point in the history
…allel-download

* ArkEcosystem/core/develop:
  refactor(core-api): sort peers by height, latency (#3078)
  fix: use strict comparison to decide if a transaction should be enabled (#3087)
  • Loading branch information
vasild committed Oct 21, 2019
2 parents 475b478 + 03fdf01 commit 3f712a3
Show file tree
Hide file tree
Showing 15 changed files with 106 additions and 38 deletions.
3 changes: 3 additions & 0 deletions __tests__/integration/core-api/__support__/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Utils } from "@arkecosystem/crypto";
import delay from "delay";
import { defaults } from "../../../../packages/core-api/src/defaults";
import { plugin } from "../../../../packages/core-api/src/plugin";
import { defaults as defaultsPeer } from "../../../../packages/core-p2p/src/defaults";
import { registerWithContainer, setUpContainer } from "../../../utils/helpers/container";

import { delegates } from "../../../utils/fixtures";
Expand Down Expand Up @@ -36,6 +37,8 @@ const setUp = async () => {
],
});

app.register("pkg.p2p.opts", asValue(defaultsPeer));

const databaseService = app.resolvePlugin<Database.IDatabaseService>("database");
await databaseService.buildWallets();
await databaseService.saveRound(round);
Expand Down
66 changes: 55 additions & 11 deletions __tests__/integration/core-api/handlers/peers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,37 @@ import { utils } from "../utils";
const peers = [
{
ip: "1.0.0.99",
port: 4000,
port: 4002,
version: "2.4.0-next.3",
state: {
height: 2,
},
latency: 2,
},
{
ip: "1.0.0.98",
port: 4000,
port: 4002,
version: "2.4.0-next.1",
state: {
height: 1,
},
latency: 1,
},
];

beforeAll(async () => {
await setUp();

const peerMocks = peers
.map(mock => {
const peerMock = new Peer(mock.ip);
(peerMock as any).port = mock.port;
peerMock.version = mock.version;
return peerMock;
})
.reduce((result, mock) => ({ ...result, [mock.ip]: mock }), {});
const peerMocks = JSON.parse(JSON.stringify(peers)).map(mock => {
const peer = new Peer(mock.ip);
(peer as any).port = mock.port;

for (const peerMock of Object.values(peerMocks)) {
delete mock.port;

return Object.assign(peer, mock);
});

for (const peerMock of peerMocks) {
app.resolvePlugin("p2p")
.getStorage()
.setPeer(peerMock);
Expand Down Expand Up @@ -65,6 +73,42 @@ describe("API 2.0 - Peers", () => {
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});

it("should GET all the peers sorted by height,asc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "height:asc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[1].ip);
expect(response.data.data[1].ip).toBe(peers[0].ip);
});

it("should GET all the peers sorted by height,desc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "height:desc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});

it("should GET all the peers sorted by latency,asc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "latency:asc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[1].ip);
expect(response.data.data[1].ip).toBe(peers[0].ip);
});

it("should GET all the peers sorted by latency,desc", async () => {
const response = await utils.request("GET", "peers", { orderBy: "latency:desc" });
expect(response).toBeSuccessfulResponse();
expect(response.data.data).toBeArrayOfSize(peers.length);
expect(response.data.data[0]).toBeObject();
expect(response.data.data[0].ip).toBe(peers[0].ip);
expect(response.data.data[1].ip).toBe(peers[1].ip);
});
});

describe("GET /peers/:ip", () => {
Expand Down
47 changes: 34 additions & 13 deletions packages/core-api/src/handlers/peers/controller.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { P2P } from "@arkecosystem/core-interfaces";
import { orderBy } from "@arkecosystem/utils";
import Boom from "@hapi/boom";
import Hapi from "@hapi/hapi";
import { get } from "dottie";
Expand All @@ -7,12 +8,11 @@ import { Controller } from "../shared/controller";

export class PeersController extends Controller {
public async index(request: Hapi.Request, h: Hapi.ResponseToolkit) {
const allPeers: P2P.IPeer[] = this.blockchain.p2p.getStorage().getPeers();
const allPeers: P2P.IPeer[] = [...this.blockchain.p2p.getStorage().getPeers()];

let result = allPeers.sort((a, b) => a.latency - b.latency);
result = request.query.version
? result.filter(peer => peer.version === (request.query as any).version)
: result;
let result = request.query.version
? allPeers.filter(peer => peer.version === (request.query as any).version)
: allPeers;

const count: number = result.length;

Expand All @@ -28,16 +28,37 @@ export class PeersController extends Controller {
offset = 0;
}

const orderBy: string = request.query.orderBy as string;
if (orderBy) {
const order = orderBy.split(":");
const order: string = request.query.orderBy as string;
if (order) {
const orderByMapped = order.split(":").map(p => p.toLowerCase());

if (order[0] === "version") {
result =
order[1].toUpperCase() === "ASC"
? result.sort((a, b) => semver.compare(a[order[0]], b[order[0]]))
: result.sort((a, b) => semver.rcompare(a[order[0]], b[order[0]]));
switch (orderByMapped[0]) {
case "version": {
result =
orderByMapped[1] === "asc"
? result.sort((a, b) => semver.compare(a[orderByMapped[0]], b[orderByMapped[0]]))
: result.sort((a, b) => semver.rcompare(a[orderByMapped[0]], b[orderByMapped[0]]));
break;
}
case "height": {
result = orderBy(
result,
el => el.state[orderByMapped[0]],
orderByMapped[1] === "asc" ? "asc" : "desc",
);
break;
}
case "latency": {
result = orderBy(result, orderByMapped[0], orderByMapped[1] === "asc" ? "asc" : "desc");
break;
}
default: {
result = result.sort((a, b) => a.latency - b.latency);
break;
}
}
} else {
result = result.sort((a, b) => a.latency - b.latency);
}

result = result.slice(offset, offset + limit);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export class BridgechainRegistrationTransactionHandler extends Handlers.Transact
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class BridgechainResignationTransactionHandler extends Handlers.Transacti
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down Expand Up @@ -140,11 +140,11 @@ export class BridgechainResignationTransactionHandler extends Handlers.Transacti
transaction: Interfaces.ITransaction,
walletManager: State.IWalletManager,
// tslint:disable-next-line: no-empty
): Promise<void> { }
): Promise<void> {}

public async revertForRecipient(
transaction: Interfaces.ITransaction,
walletManager: State.IWalletManager,
// tslint:disable-next-line:no-empty
): Promise<void> { }
): Promise<void> {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class BridgechainUpdateTransactionHandler extends Handlers.TransactionHan
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class BusinessRegistrationTransactionHandler extends Handlers.Transaction
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class BusinessResignationTransactionHandler extends Handlers.TransactionH
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class BusinessUpdateTransactionHandler extends Handlers.TransactionHandle
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async bootstrap(connection: Database.IConnection, walletManager: State.IWalletManager): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class DelegateResignationTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async throwIfCannotBeApplied(
Expand Down
2 changes: 1 addition & 1 deletion packages/core-transactions/src/handlers/htlc-claim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class HtlcClaimTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public dynamicFee(
Expand Down
2 changes: 1 addition & 1 deletion packages/core-transactions/src/handlers/htlc-lock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export class HtlcLockTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async throwIfCannotBeApplied(
Expand Down
2 changes: 1 addition & 1 deletion packages/core-transactions/src/handlers/htlc-refund.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class HtlcRefundTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public dynamicFee(
Expand Down
2 changes: 1 addition & 1 deletion packages/core-transactions/src/handlers/ipfs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class IpfsTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async throwIfCannotBeApplied(
Expand Down
2 changes: 1 addition & 1 deletion packages/core-transactions/src/handlers/multi-payment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class MultiPaymentTransactionHandler extends TransactionHandler {
}

public async isActivated(): Promise<boolean> {
return !!Managers.configManager.getMilestone().aip11;
return Managers.configManager.getMilestone().aip11 === true;
}

public async throwIfCannotBeApplied(
Expand Down

0 comments on commit 3f712a3

Please sign in to comment.