2020-05-14 15:20:39 +03:00
|
|
|
/*
|
2020-05-14 17:30:17 +03:00
|
|
|
* Copyright 2020 Fluence Labs Limited
|
2020-05-14 15:20:39 +03:00
|
|
|
*
|
2020-05-14 17:30:17 +03:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2020-05-14 15:20:39 +03:00
|
|
|
*
|
2020-05-14 17:30:17 +03:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2020-05-14 15:20:39 +03:00
|
|
|
*
|
2020-05-14 17:30:17 +03:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
2020-05-14 15:20:39 +03:00
|
|
|
*/
|
|
|
|
|
2020-09-28 17:01:49 +03:00
|
|
|
|
|
|
|
import {Particle} from "./particle";
|
2020-05-14 15:20:39 +03:00
|
|
|
import * as PeerId from "peer-id";
|
|
|
|
import Multiaddr from "multiaddr"
|
2020-08-20 20:28:32 +03:00
|
|
|
import {FluenceConnection} from "./fluenceConnection";
|
2020-09-28 17:01:49 +03:00
|
|
|
import {Subscriptions} from "./subscriptions";
|
2020-07-27 16:39:54 +03:00
|
|
|
|
2020-05-14 15:20:39 +03:00
|
|
|
export class FluenceClient {
|
2020-08-26 18:48:17 +03:00
|
|
|
readonly selfPeerId: PeerId;
|
2020-05-14 15:20:39 +03:00
|
|
|
readonly selfPeerIdStr: string;
|
2020-09-28 17:01:49 +03:00
|
|
|
|
2020-07-27 16:39:54 +03:00
|
|
|
private nodePeerIdStr: string;
|
2020-09-28 17:01:49 +03:00
|
|
|
private subscriptions = new Subscriptions();
|
2020-05-14 15:20:39 +03:00
|
|
|
|
2020-09-21 16:42:53 +03:00
|
|
|
connection: FluenceConnection;
|
2020-05-14 15:20:39 +03:00
|
|
|
|
2020-08-26 18:48:17 +03:00
|
|
|
constructor(selfPeerId: PeerId) {
|
|
|
|
this.selfPeerId = selfPeerId;
|
|
|
|
this.selfPeerIdStr = selfPeerId.toB58String();
|
2020-05-14 15:20:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Waits a response that match the predicate.
|
|
|
|
*
|
2020-09-28 17:01:49 +03:00
|
|
|
* @param id
|
|
|
|
* @param ttl
|
2020-05-14 15:20:39 +03:00
|
|
|
*/
|
2020-09-28 17:01:49 +03:00
|
|
|
waitResponse(id: string, ttl: number): Promise<Particle> {
|
2020-07-27 16:39:54 +03:00
|
|
|
return new Promise((resolve, reject) => {
|
2020-05-14 15:20:39 +03:00
|
|
|
// subscribe for responses, to handle response
|
|
|
|
// TODO if there's no conn, reject
|
2020-09-28 17:01:49 +03:00
|
|
|
this.subscriptions.subscribe(id, (particle: Particle) => {
|
|
|
|
resolve(particle);
|
|
|
|
}, ttl);
|
|
|
|
})
|
2020-08-20 20:28:32 +03:00
|
|
|
}
|
|
|
|
|
2020-05-14 15:20:39 +03:00
|
|
|
/**
|
|
|
|
* Handle incoming call.
|
|
|
|
* If FunctionCall returns - we should send it as a response.
|
|
|
|
*/
|
2020-09-28 17:01:49 +03:00
|
|
|
handleParticle(): (particle: Particle) => void {
|
2020-05-14 15:20:39 +03:00
|
|
|
|
|
|
|
let _this = this;
|
|
|
|
|
2020-09-28 17:01:49 +03:00
|
|
|
return (particle: Particle) => {
|
2020-05-14 15:20:39 +03:00
|
|
|
// call all subscriptions for a new call
|
2020-09-28 17:01:49 +03:00
|
|
|
_this.subscriptions.applyToSubscriptions(particle);
|
2020-05-14 15:20:39 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-28 20:19:26 +03:00
|
|
|
async disconnect(): Promise<void> {
|
|
|
|
return this.connection.disconnect();
|
|
|
|
}
|
|
|
|
|
2020-05-14 15:20:39 +03:00
|
|
|
/**
|
|
|
|
* Establish a connection to the node. If the connection is already established, disconnect and reregister all services in a new connection.
|
|
|
|
*
|
|
|
|
* @param multiaddr
|
|
|
|
*/
|
|
|
|
async connect(multiaddr: string | Multiaddr): Promise<void> {
|
|
|
|
|
|
|
|
multiaddr = Multiaddr(multiaddr);
|
|
|
|
|
|
|
|
let nodePeerId = multiaddr.getPeerId();
|
2020-07-27 16:39:54 +03:00
|
|
|
this.nodePeerIdStr = nodePeerId;
|
2020-05-14 15:20:39 +03:00
|
|
|
|
|
|
|
if (!nodePeerId) {
|
|
|
|
throw Error("'multiaddr' did not contain a valid peer id")
|
|
|
|
}
|
|
|
|
|
|
|
|
let firstConnection: boolean = true;
|
|
|
|
if (this.connection) {
|
|
|
|
firstConnection = false;
|
|
|
|
await this.connection.disconnect();
|
|
|
|
}
|
|
|
|
|
|
|
|
let peerId = PeerId.createFromB58String(nodePeerId);
|
2020-09-28 17:01:49 +03:00
|
|
|
let connection = new FluenceConnection(multiaddr, peerId, this.selfPeerId, this.handleParticle());
|
2020-05-14 15:20:39 +03:00
|
|
|
|
|
|
|
await connection.connect();
|
|
|
|
|
|
|
|
this.connection = connection;
|
2020-09-28 17:01:49 +03:00
|
|
|
}
|
2020-05-14 15:20:39 +03:00
|
|
|
|
2020-09-28 17:01:49 +03:00
|
|
|
async sendParticle(particle: Particle): Promise<Particle> {
|
|
|
|
await this.connection.sendParticle(particle);
|
|
|
|
return this.waitResponse(particle.id, particle.ttl);
|
2020-05-14 15:20:39 +03:00
|
|
|
}
|
|
|
|
}
|