Skip to content
This repository was archived by the owner on Jul 10, 2025. It is now read-only.

Commit c10cd19

Browse files
authored
Check if connection is available on creating a client (#23)
Check if connection is available on creating a client
1 parent 78ed8ab commit c10cd19

File tree

4 files changed

+64
-26
lines changed

4 files changed

+64
-26
lines changed

src/__test__/integration/builtins.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
} from '../../internal/builtins';
1313
import { ModuleConfig } from '../../internal/moduleConfig';
1414
import { createConnectedClient } from '../util';
15+
import {checkConnection} from "../../api";
1516

1617
const dev2multiaddr = '/dns4/dev.fluence.dev/tcp/19003/wss/p2p/12D3KooWBUJifCTgaxAUrcM9JysqCcS4CS8tiYH5hExbdWCAoNwb';
1718
const dev3multiaddr = '/dns4/dev.fluence.dev/tcp/19004/wss/p2p/12D3KooWJbJFaZ3k5sNd8DjQgg3aERoKtBAnirEvPV8yp76kEXHB';
@@ -43,6 +44,14 @@ describe('Builtins usage suite', () => {
4344
expect(bpList).not.toBeUndefined;
4445
});
4546

47+
it('check_connection', async function () {
48+
const client = await createConnectedClient(dev2multiaddr);
49+
50+
let isConnected = await checkConnection(client);
51+
52+
expect(isConnected).toEqual(true);
53+
});
54+
4655
it('upload_modules', async function () {
4756
const client = await createConnectedClient(dev2multiaddr);
4857

src/__test__/integration/client.spec.ts

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { encode } from 'bs58';
2-
import { generatePeerId, peerIdToSeed, seedToPeerId } from '../../internal/peerIdUtils';
3-
import { FluenceClientImpl } from '../../internal/FluenceClientImpl';
4-
import { createConnectedClient } from '../util';
1+
import {encode} from 'bs58';
2+
import {generatePeerId, peerIdToSeed, seedToPeerId} from '../../internal/peerIdUtils';
3+
import {FluenceClientImpl} from '../../internal/FluenceClientImpl';
4+
import {createConnectedClient} from '../util';
55
import log from 'loglevel';
6-
import { createClient } from '../../api';
6+
import {createClient} from '../../api';
77
import Multiaddr from 'multiaddr';
88

99
const devNodeAddress = '/dns4/dev.fluence.dev/tcp/19001/wss/p2p/12D3KooWEXNUbCXooUwHrHBbrmjsrpHXoEphPwbjQXEGyzbqKnE9';
@@ -40,8 +40,7 @@ describe('Typescript usage suite', () => {
4040

4141
await client.sendScript(script, data);
4242

43-
const res = await resMakingPromise;
44-
return res;
43+
return await resMakingPromise;
4544
};
4645

4746
it('address as string', async function () {
@@ -198,13 +197,8 @@ describe('Typescript usage suite', () => {
198197

199198
it('two clients should work inside the same time browser', async function () {
200199
// arrange
201-
const pid1 = await generatePeerId();
202-
const client1 = new FluenceClientImpl(pid1);
203-
await client1.connect(devNodeAddress);
204-
205-
const pid2 = await generatePeerId();
206-
const client2 = new FluenceClientImpl(pid2);
207-
await client2.connect(devNodeAddress);
200+
const client1 = await createConnectedClient(devNodeAddress);
201+
const client2 = await createConnectedClient(devNodeAddress);
208202

209203
let resMakingPromise = new Promise((resolve) => {
210204
client2.registerCallback('test', 'test', (args, _) => {
@@ -216,7 +210,7 @@ describe('Typescript usage suite', () => {
216210
let script = `
217211
(seq
218212
(call "${client1.relayPeerId}" ("op" "identity") [])
219-
(call "${pid2.toB58String()}" ("test" "test") [a b c d])
213+
(call "${client2.selfPeerId}" ("test" "test") [a b c d])
220214
)
221215
`;
222216

@@ -234,13 +228,8 @@ describe('Typescript usage suite', () => {
234228

235229
it('event registration should work', async function () {
236230
// arrange
237-
const pid1 = await generatePeerId();
238-
const client1 = new FluenceClientImpl(pid1);
239-
await client1.connect(devNodeAddress);
240-
241-
const pid2 = await generatePeerId();
242-
const client2 = new FluenceClientImpl(pid2);
243-
await client2.connect(devNodeAddress);
231+
const client1 = await createConnectedClient(devNodeAddress);
232+
const client2 = await createConnectedClient(devNodeAddress);
244233

245234
client2.registerEvent('event_stream', 'test');
246235
const resMakingPromise = new Promise((resolve) => {
@@ -249,7 +238,7 @@ describe('Typescript usage suite', () => {
249238

250239
// act
251240
let script = `
252-
(call "${pid2.toB58String()}" ("event_stream" "test") [hello])
241+
(call "${client2.selfPeerId}" ("event_stream" "test") [hello])
253242
`;
254243

255244
let data: Map<string, any> = new Map();

src/__test__/util.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { generatePeerId } from '..';
2-
import { FluenceClientImpl } from '../internal/FluenceClientImpl';
1+
import {generatePeerId} from '..';
2+
import {FluenceClientImpl} from '../internal/FluenceClientImpl';
33

44
export const createLocalClient = async () => {
55
const peerId = await generatePeerId();

src/api.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Multiaddr from 'multiaddr';
55
import PeerId, { isPeerId } from 'peer-id';
66
import { generatePeerId, seedToPeerId } from './internal/peerIdUtils';
77
import { FluenceClientImpl } from './internal/FluenceClientImpl';
8+
import log from "loglevel";
89

910
type Node = {
1011
peerId: string;
@@ -44,6 +45,9 @@ export const createClient = async (
4445
}
4546

4647
await client.connect(theAddress);
48+
if (!await checkConnection(client)) {
49+
throw new Error("Connection check failed. Check if the node is working or try to connect to another node")
50+
}
4751
}
4852

4953
return client;
@@ -147,7 +151,43 @@ export const sendParticleAsFetch = async <T>(
147151
}, particle.ttl);
148152
});
149153

150-
sendParticle(client, particle);
154+
await sendParticle(client, particle);
151155

152156
return promise;
153157
};
158+
159+
export const checkConnection = async (client: FluenceClient): Promise<boolean> => {
160+
let msg = Math.random().toString(36).substring(7);
161+
let callbackFn = "checkConnection"
162+
let callbackService = "_callback"
163+
164+
const particle = new Particle(
165+
`
166+
(seq
167+
(call __relay ("op" "identity") [msg] result)
168+
(call myPeerId ("${callbackService}" "${callbackFn}") [result])
169+
)
170+
`,
171+
{
172+
__relay: client.relayPeerId,
173+
myPeerId: client.selfPeerId,
174+
msg
175+
},
176+
3000
177+
);
178+
179+
if (!client.isConnected) {
180+
return false;
181+
}
182+
183+
try {
184+
let result = await sendParticleAsFetch<string[][]>(client, particle, callbackFn, callbackService)
185+
if (result[0][0] != msg) {
186+
log.warn("unexpected behavior. 'identity' must return arguments the passed arguments.")
187+
}
188+
return true;
189+
} catch (e) {
190+
log.error("Error on establishing connection: ", e)
191+
return false;
192+
}
193+
}

0 commit comments

Comments
 (0)