From 79bf18a2ed5ad961e0d521b8a1e8141f681f6597 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Tue, 19 Jul 2022 14:48:27 -0400 Subject: [PATCH] *Update dist --- dist/rpcNetwork.d.ts.map | 2 +- dist/rpcNetwork.js | 18 ++++++------ dist/rpcQuery.d.ts.map | 2 +- dist/rpcQuery.js | 61 +++++++++++++++++++++++++++++----------- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/dist/rpcNetwork.d.ts.map b/dist/rpcNetwork.d.ts.map index b06f820..0146ea1 100644 --- a/dist/rpcNetwork.d.ts.map +++ b/dist/rpcNetwork.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"rpcNetwork.d.ts","sourceRoot":"","sources":["../src/rpcNetwork.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAMrC,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,GAAG,MAAY;IAK3B,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzB;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,IAAI,GAAG,QAEN;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAEvB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAElC;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAEvB;IAEM,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAWpC,WAAW,IAAI,IAAI;IAInB,KAAK,CACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,GAAG,GAAG,EAAO,EACzB,KAAK,GAAE,OAAe,GACrB,QAAQ;CAQZ"} \ No newline at end of file +{"version":3,"file":"rpcNetwork.d.ts","sourceRoot":"","sources":["../src/rpcNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAIrC,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAkB;gBAEpB,GAAG,MAAY;IAK3B,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzB;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,IAAI,GAAG,QAEN;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAEvB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAElC;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAEvB;IAEM,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAWpC,WAAW,IAAI,IAAI;IAInB,KAAK,CACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,GAAG,GAAG,EAAO,EACzB,KAAK,GAAE,OAAe,GACrB,QAAQ;CAQZ"} \ No newline at end of file diff --git a/dist/rpcNetwork.js b/dist/rpcNetwork.js index 82036e9..65f968e 100644 --- a/dist/rpcNetwork.js +++ b/dist/rpcNetwork.js @@ -1,15 +1,15 @@ -// tslint:disable:no-var-requires -import { createRequire } from "module"; import RpcQuery from "./rpcQuery.js"; -const require = createRequire(import.meta.url); -const DHT = require("@hyperswarm/dht"); +// @ts-ignore +import DHT from "@hyperswarm/dht"; export default class RpcNetwork { + _dht; + _majorityThreshold = 0.75; + _maxTtl = 12 * 60 * 60; + _queryTimeout = 30; + _relays = []; + _ready; + _force = false; constructor(dht = new DHT()) { - this._majorityThreshold = 0.75; - this._maxTtl = 12 * 60 * 60; - this._queryTimeout = 30; - this._relays = []; - this._force = false; this._dht = dht; this._ready = this._dht.ready(); } diff --git a/dist/rpcQuery.d.ts.map b/dist/rpcQuery.d.ts.map index f238a8f..a1e3167 100644 --- a/dist/rpcQuery.d.ts.map +++ b/dist/rpcQuery.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"rpcQuery.d.ts","sourceRoot":"","sources":["../src/rpcQuery.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,QAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,aAAa,CAAC,CAAM;IAC5B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,eAAe,CAAC,CAAsB;gBAElC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAMlD,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAE1B;IAED,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;YAQD,IAAI;YA2BJ,UAAU;IAiBxB,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,KAAK;CASd"} \ No newline at end of file +{"version":3,"file":"rpcQuery.d.ts","sourceRoot":"","sources":["../src/rpcQuery.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AAIlD,MAAM,CAAC,OAAO,OAAO,QAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,aAAa,CAAC,CAAM;IAC5B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,eAAe,CAAC,CAAsB;gBAElC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAMlD,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAE1B;IAED,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;YAQD,IAAI;YA2BJ,UAAU;IA0BxB,OAAO,CAAC,cAAc;IA0CtB,OAAO,CAAC,KAAK;CASd"} \ No newline at end of file diff --git a/dist/rpcQuery.js b/dist/rpcQuery.js index a55761a..c378403 100644 --- a/dist/rpcQuery.js +++ b/dist/rpcQuery.js @@ -1,10 +1,17 @@ import { clearTimeout, setTimeout } from "timers"; import { pack, unpack } from "msgpackr"; +import { Buffer } from "buffer"; +import { blake2b } from "libskynet"; export default class RpcQuery { + _network; + _query; + _promise; + _timeoutTimer; + _timeout = false; + _completed = false; + _responses = {}; + _promiseResolve; constructor(network, query) { - this._timeout = false; - this._completed = false; - this._responses = {}; this._network = network; this._query = query; this.init(); @@ -41,7 +48,16 @@ export default class RpcQuery { this.checkResponses(); } async queryRelay(relay) { - const socket = this._network.dht.connect(Buffer.from(relay, "hex")); + let socket; + try { + socket = this._network.dht.connect(Buffer.from(relay, "hex")); + if (isPromise(socket)) { + socket = await socket; + } + } + catch (e) { + return; + } return new Promise((resolve, reject) => { socket.on("data", (res) => { socket.end(); @@ -57,25 +73,31 @@ export default class RpcQuery { }); } checkResponses() { - const responses = {}; const responseStore = this._responses; - const responseStoreKeys = Object.keys(responseStore); - // tslint:disable-next-line:forin - for (const peer in responseStore) { - const responseIndex = responseStoreKeys.indexOf(peer); - responses[responseIndex] = responses[responseIndex] ?? 0; - responses[responseIndex]++; - } - for (const responseIndex in responses) { - if (responses[responseIndex] / responseStoreKeys.length >= + const responseStoreData = Object.values(responseStore); + const responseObjects = responseStoreData.reduce((output, item) => { + const hash = Buffer.from(blake2b(Buffer.from(JSON.stringify(item?.data)))).toString("hex"); + output[hash] = item?.data; + return output; + }, {}); + const responses = responseStoreData.reduce((output, item) => { + const hash = Buffer.from(blake2b(Buffer.from(JSON.stringify(item?.data)))).toString("hex"); + output[hash] = output[hash] ?? 0; + output[hash]++; + return output; + }, {}); + for (const responseHash in responses) { + if (responses[responseHash] / responseStoreData.length >= this._network.majorityThreshold) { - const response = responseStore[responseStoreKeys[parseInt(responseIndex, 10)]]; // @ts-ignore - if (null === response || null === response?.data) { + const response = responseObjects[responseHash]; + // @ts-ignore + if (null === response) { this.retry(); return; } - this.resolve(response?.data); + this.resolve(response); + break; } } } @@ -87,3 +109,8 @@ export default class RpcQuery { this.init(); } } +function isPromise(obj) { + return (!!obj && + (typeof obj === "object" || typeof obj === "function") && + typeof obj.then === "function"); +}