UNPKG

6.72 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11var __generator = (this && this.__generator) || function (thisArg, body) {
12 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14 function verb(n) { return function (v) { return step([n, v]); }; }
15 function step(op) {
16 if (f) throw new TypeError("Generator is already executing.");
17 while (_) try {
18 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19 if (y = 0, t) op = [op[0] & 2, t.value];
20 switch (op[0]) {
21 case 0: case 1: t = op; break;
22 case 4: _.label++; return { value: op[1], done: false };
23 case 5: _.label++; y = op[1]; op = [0]; continue;
24 case 7: op = _.ops.pop(); _.trys.pop(); continue;
25 default:
26 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30 if (t[2]) _.ops.pop();
31 _.trys.pop(); continue;
32 }
33 op = body.call(thisArg, _);
34 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36 }
37};
38var __importDefault = (this && this.__importDefault) || function (mod) {
39 return (mod && mod.__esModule) ? mod : { "default": mod };
40};
41Object.defineProperty(exports, "__esModule", { value: true });
42var url_1 = __importDefault(require("url"));
43var cyclon_p2p_common_1 = require("cyclon.p2p-common");
44var PromiseTools_1 = require("./PromiseTools");
45var API_PATH = './api/peers';
46var SignallingServerBootstrap = /** @class */ (function () {
47 function SignallingServerBootstrap(signallingSocket, httpRequestService, roomsToBootstrapFrom) {
48 this.signallingSocket = signallingSocket;
49 this.httpRequestService = httpRequestService;
50 this.roomsToBootstrapFrom = roomsToBootstrapFrom;
51 if (!(roomsToBootstrapFrom && roomsToBootstrapFrom.length > 0)) {
52 throw new Error('Must specify at least one room to bootstrap from');
53 }
54 }
55 /**
56 * Fetch a list of registered peers from the server
57 */
58 SignallingServerBootstrap.prototype.getInitialPeerSet = function (cyclonNode, limit) {
59 var _this = this;
60 var serverSpecs = this.signallingSocket.getCurrentServerSpecs();
61 if (serverSpecs.length > 0) {
62 var roomToSampleFrom_1 = this.roomsToBootstrapFrom[Math.floor(Math.random() * this.roomsToBootstrapFrom.length)];
63 var specPromises = serverSpecs.map(function (serverSpec) {
64 return _this.getInitialPeerSetFromServer(cyclonNode, serverSpec, limit, roomToSampleFrom_1);
65 });
66 return PromiseTools_1.allSettled(specPromises).then(function (results) {
67 var allResults = SignallingServerBootstrap.collateSuccessfulResults(results);
68 return cyclon_p2p_common_1.randomSample(SignallingServerBootstrap.deDuplicatePeerList(allResults), limit);
69 });
70 }
71 return Promise.reject(new Error('Not connected to any signalling servers, can\'t bootstrap'));
72 };
73 SignallingServerBootstrap.collateSuccessfulResults = function (arrayOfPromises) {
74 return arrayOfPromises.reduce(function (current, next) {
75 // @ts-ignore
76 if (next.status === 'fulfilled') {
77 return current.concat(next.value);
78 }
79 else {
80 return current;
81 }
82 }, []);
83 };
84 SignallingServerBootstrap.deDuplicatePeerList = function (arrayOfPeers) {
85 var peerMap = {};
86 arrayOfPeers.forEach(function (peer) {
87 if (peerMap.hasOwnProperty(peer.id)) {
88 if (peerMap[peer.id].seq < peer.seq) {
89 peerMap[peer.id] = peer;
90 }
91 }
92 else {
93 peerMap[peer.id] = peer;
94 }
95 });
96 var uniquePeers = [];
97 for (var nodeId in peerMap) {
98 uniquePeers.push(peerMap[nodeId]);
99 }
100 return uniquePeers;
101 };
102 SignallingServerBootstrap.prototype.getInitialPeerSetFromServer = function (cyclonNode, serverSpec, limit, roomToSampleFrom) {
103 return __awaiter(this, void 0, void 0, function () {
104 var response;
105 return __generator(this, function (_a) {
106 switch (_a.label) {
107 case 0: return [4 /*yield*/, this.httpRequestService.get(SignallingServerBootstrap.generateUrl(serverSpec.signallingApiBase, limit, roomToSampleFrom))];
108 case 1:
109 response = _a.sent();
110 return [2 /*return*/, Object.keys(response).filter(function (peerId) {
111 return peerId !== cyclonNode.getId();
112 }).map(function (peerId) {
113 return response[peerId];
114 })];
115 }
116 });
117 });
118 };
119 SignallingServerBootstrap.generateUrl = function (apiBase, limit, room) {
120 //noinspection JSCheckFunctionSignatures
121 return url_1.default.resolve(apiBase, API_PATH) + ("?room=" + room + "&limit=" + limit + "&nocache=" + new Date().getTime());
122 };
123 return SignallingServerBootstrap;
124}());
125exports.SignallingServerBootstrap = SignallingServerBootstrap;
126//# sourceMappingURL=SignallingServerBootstrap.js.map
\No newline at end of file