Skip to content

Commit 4109373

Browse files
committed
Merge pull request #2074 from aeternity/hc-poll-interval
Set correct poll interval on hyperchain
2 parents 2c45259 + 1225ece commit 4109373

File tree

6 files changed

+91
-42
lines changed

6 files changed

+91
-42
lines changed

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
services:
22
node:
33
# TODO: switch to master after merging https://github.com/aeternity/aeternity/pull/4303
4-
image: aeternity/aeternity:v7.3.0-rc2-bundle
4+
image: aeternity/aeternity:v7.3.0-rc5-bundle
55
# TODO: remove 3313 port after merging https://github.com/aeternity/aeternity/pull/4303
66
ports: [3013:3013, 3113:3113, 3014:3014, 3313:3313]
77
# TODO: remove after releasing https://github.com/aeternity/aeternity/pull/4292

src/Node.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ export default class Node extends NodeApi {
9191
return promise;
9292
}
9393

94+
#isHyperchainPromise?: Promise<boolean>;
95+
96+
async _isHyperchain(): Promise<boolean> {
97+
if (this.#isHyperchainPromise != null) return this.#isHyperchainPromise;
98+
this.#isHyperchainPromise = this.getHyperchainContractPubkeys({
99+
requestOptions: { customHeaders: { '__no-retry': 'true' } },
100+
}).then(
101+
() => true,
102+
(error) => {
103+
if (error.message !== 'v3/hyperchain/contracts error: 404 status code') throw error;
104+
return false;
105+
},
106+
);
107+
return this.#isHyperchainPromise;
108+
}
109+
94110
/**
95111
* Returns network ID provided by node.
96112
* This method won't do extra requests on subsequent calls.

src/chain.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,37 +15,35 @@ import Node from './Node.js';
1515
import { DryRunResult, DryRunResults, SignedTx } from './apis/node/index.js';
1616
import { decode, encode, Encoded, Encoding } from './utils/encoder.js';
1717

18-
/**
19-
* @category chain
20-
* @param type - Type
21-
* @param options - Options
22-
*/
23-
export async function _getPollInterval(
18+
async function getEventInterval(
2419
type: 'key-block' | 'micro-block',
2520
{
2621
_expectedMineRate,
2722
_microBlockCycle,
2823
onNode,
2924
}: { _expectedMineRate?: number; _microBlockCycle?: number; onNode: Node },
3025
): Promise<number> {
31-
const getVal = async (
32-
t: string,
33-
val: number | undefined,
34-
devModeDef: number,
35-
def: number,
36-
): Promise<number | null> => {
37-
if (t !== type) return null;
38-
if (val != null) return val;
39-
return (await onNode?.getNetworkId()) === 'ae_dev' ? devModeDef : def;
40-
};
26+
if (_expectedMineRate != null && type === 'key-block') return _expectedMineRate;
27+
if (_microBlockCycle != null && type === 'micro-block') return _microBlockCycle;
28+
29+
const networkId = await onNode.getNetworkId();
30+
if (networkId === 'ae_dev') return 0;
31+
if (!['ae_mainnet', 'ae_uat'].includes(networkId) && (await onNode._isHyperchain())) return 3000;
32+
33+
if (type === 'key-block') return 180000;
34+
else return 3000;
35+
}
4136

42-
const base =
43-
(await getVal('key-block', _expectedMineRate, 0, 180000)) ??
44-
(await getVal('micro-block', _microBlockCycle, 0, 3000)) ??
45-
(() => {
46-
throw new InternalError(`Unknown type: ${type}`);
47-
})();
48-
return Math.floor(base / 3);
37+
/**
38+
* @category chain
39+
* @param type - Type
40+
* @param options - Options
41+
*/
42+
export async function _getPollInterval(
43+
type: Parameters<typeof getEventInterval>[0],
44+
options: Parameters<typeof getEventInterval>[1],
45+
): Promise<number> {
46+
return Math.floor((await getEventInterval(type, options)) / 3);
4947
}
5048

5149
const heightCache: WeakMap<Node, { time: number; height: number }> = new WeakMap();

src/utils/autorest.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ export const genRetryOnFailurePolicy = (
220220
policy: {
221221
name: 'retry-on-failure',
222222
async sendRequest(request, next) {
223+
if (request.headers.get('__no-retry') != null) {
224+
request.headers.delete('__no-retry');
225+
return next(request);
226+
}
227+
223228
const retryCode = request.headers.get('__retry-code') ?? NaN;
224229
request.headers.delete('__retry-code');
225230
const statusesToNotRetry = [200, 400, 403, 410, 500].filter((c) => c !== +retryCode);

test/integration/AeSdk.ts

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, it } from 'mocha';
22
import { expect } from 'chai';
3-
import { getSdk, networkId } from '.';
3+
import { getSdk } from '.';
4+
import { Node } from '../../src';
45

56
describe('AeSdk', () => {
67
describe('_getPollInterval', () => {
@@ -12,13 +13,50 @@ describe('AeSdk', () => {
1213
expect(await aeSdk._getPollInterval('micro-block')).to.equal(100);
1314
});
1415

15-
it('returns correct value', async () => {
16-
const aeSdk = await getSdk(0);
17-
delete aeSdk._options._expectedMineRate;
18-
delete aeSdk._options._microBlockCycle;
19-
const [kb, mb] = networkId === 'ae_dev' ? [0, 0] : [60000, 1000];
20-
expect(await aeSdk._getPollInterval('key-block')).to.equal(kb);
21-
expect(await aeSdk._getPollInterval('micro-block')).to.equal(mb);
22-
});
16+
(
17+
[
18+
[
19+
'devnet',
20+
0,
21+
0,
22+
(node: Node) => (node.getNetworkId = async () => Promise.resolve('ae_dev')),
23+
],
24+
[
25+
'hyperchains',
26+
1000,
27+
1000,
28+
(node: Node) => {
29+
node.getNetworkId = async () => Promise.resolve('ae_random');
30+
node._isHyperchain = async () => Promise.resolve(true);
31+
},
32+
],
33+
[
34+
'mainnet',
35+
60000,
36+
1000,
37+
(node: Node) => {
38+
node.getNetworkId = async () => Promise.resolve('ae_mainnet');
39+
node._isHyperchain = () => {
40+
throw new Error("Shouldn't be called");
41+
};
42+
},
43+
],
44+
[
45+
'default case',
46+
60000,
47+
1000,
48+
(node: Node) => (node.getNetworkId = async () => Promise.resolve('ae_random')),
49+
],
50+
] as const
51+
).forEach(([name, kb, mb, cb]) =>
52+
it(`handles ${name}`, async () => {
53+
const aeSdk = await getSdk(0);
54+
cb(aeSdk.api);
55+
delete aeSdk._options._expectedMineRate;
56+
delete aeSdk._options._microBlockCycle;
57+
expect(await aeSdk._getPollInterval('key-block')).to.equal(kb);
58+
expect(await aeSdk._getPollInterval('micro-block')).to.equal(mb);
59+
}),
60+
);
2361
});
2462
});

tooling/autorest/node.yaml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,6 @@ directive:
134134
Convert time as milliseconds to dates
135135
https://github.com/aeternity/aeternity/issues/4386
136136
137-
- from: openapi-document
138-
where: $.components.schemas.AuctionEntry
139-
transform: >
140-
$.required.push('started_at');
141-
reason: >
142-
marks additional fields as required
143-
remove after fixing https://github.com/aeternity/aeternity/pull/4537
144-
145137
- from: openapi-document
146138
where: $.components.schemas
147139
transform: >
@@ -160,7 +152,7 @@ version: ^3.7.1
160152
use-extension:
161153
'@autorest/typescript': ^6.0.23
162154
'@autorest/modelerfour': ^4.27.0
163-
input-file: https://raw.githubusercontent.com/aeternity/aeternity/v7.3.0-rc2/apps/aehttp/priv/oas3.yaml
155+
input-file: https://raw.githubusercontent.com/aeternity/aeternity/v7.3.0-rc5/apps/aehttp/priv/oas3.yaml
164156
output-folder: ../../src/apis/node
165157
source-code-folder-path: .
166158
generator: typescript

0 commit comments

Comments
 (0)