From 0216b0d7bac0fbf11d23a4a0f085732fc9403d94 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Sat, 18 Mar 2023 12:11:41 -0400 Subject: [PATCH] *update dist --- dist/error.d.ts | 2 - dist/error.d.ts.map | 2 +- dist/error.js | 2 - dist/network.d.ts | 23 ++++---- dist/network.d.ts.map | 2 +- dist/network.js | 95 ++++++++++++++++++++++++---------- dist/query/base.d.ts | 14 +++-- dist/query/base.d.ts.map | 2 +- dist/query/base.js | 2 +- dist/query/clearCache.d.ts | 17 +++--- dist/query/clearCache.d.ts.map | 2 +- dist/query/clearCache.js | 8 ++- dist/query/index.d.ts | 10 +--- dist/query/index.d.ts.map | 2 +- dist/query/index.js | 29 ++++++----- dist/query/simple.d.ts | 19 ++++--- dist/query/simple.d.ts.map | 2 +- dist/query/simple.js | 41 +++++++++------ dist/util.d.ts | 1 + dist/util.d.ts.map | 2 +- dist/util.js | 9 +++- 21 files changed, 175 insertions(+), 111 deletions(-) diff --git a/dist/error.d.ts b/dist/error.d.ts index 39707f5..acbcc0a 100644 --- a/dist/error.d.ts +++ b/dist/error.d.ts @@ -1,4 +1,2 @@ -export declare const ERR_MAX_TRIES_HIT = "ERR_MAX_TRIES_HIT"; export declare const ERR_INVALID_SIGNATURE = "INVALID_SIGNATURE"; -export declare const ERR_NO_RELAYS = "NO_RELAYS"; //# sourceMappingURL=error.d.ts.map diff --git a/dist/error.d.ts.map b/dist/error.d.ts.map index 47b4c03..b2b10e7 100644 --- a/dist/error.d.ts.map +++ b/dist/error.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AACzD,eAAO,MAAM,aAAa,cAAc,CAAC"} \ No newline at end of file +{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,sBAAsB,CAAC"} \ No newline at end of file diff --git a/dist/error.js b/dist/error.js index 35daffb..3a15776 100644 --- a/dist/error.js +++ b/dist/error.js @@ -1,3 +1 @@ -export const ERR_MAX_TRIES_HIT = "ERR_MAX_TRIES_HIT"; export const ERR_INVALID_SIGNATURE = "INVALID_SIGNATURE"; -export const ERR_NO_RELAYS = "NO_RELAYS"; diff --git a/dist/network.d.ts b/dist/network.d.ts index f579d48..1bf6b37 100644 --- a/dist/network.d.ts +++ b/dist/network.d.ts @@ -1,10 +1,14 @@ import RpcNetworkQueryFactory from "./query/index.js"; export default class RpcNetwork { - constructor(dht?: any); + private _relaysAvailablePromise?; + private _relaysAvailableResolve?; + constructor(swarm?: any); + private _methods; + get methods(): Map>; private _factory; get factory(): RpcNetworkQueryFactory; - private _dht; - get dht(): any; + private _swarm; + get swarm(): any; private _majorityThreshold; get majorityThreshold(): number; set majorityThreshold(value: number); @@ -15,17 +19,16 @@ export default class RpcNetwork { get relayTimeout(): number; set relayTimeout(value: number); private _relays; - get relays(): string[]; + get relays(): Map; private _ready?; get ready(): Promise; + get readyWithRelays(): Promise; private _bypassCache; get bypassCache(): boolean; set bypassCache(value: boolean); - private _maxRelays; - get maxRelays(): number; - set maxRelays(value: number); - addRelay(pubkey: string): void; - removeRelay(pubkey: string): boolean; - clearRelays(): void; + getAvailableRelay(module: string, method: string): string; + getRelay(pubkey: string): any; + private init; + private setupRelayPromise; } //# sourceMappingURL=network.d.ts.map diff --git a/dist/network.d.ts.map b/dist/network.d.ts.map index 1429fa1..84eb070 100644 --- a/dist/network.d.ts.map +++ b/dist/network.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAUA,OAAO,sBAAsB,MAAM,kBAAkB,CAAC;AAEtD,MAAM,CAAC,OAAO,OAAO,UAAU;gBACjB,GAAG,MAAY;IAI3B,OAAO,CAAC,QAAQ,CAAoC;IAEpD,IAAI,OAAO,IAAI,sBAAsB,CAEpC;IAED,OAAO,CAAC,IAAI,CAAa;IAEzB,IAAI,GAAG,QAEN;IAED,OAAO,CAAC,kBAAkB,CAAQ;IAElC,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAElC;IAED,OAAO,CAAC,aAAa,CAAM;IAE3B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,OAAO,CAAC,aAAa,CAAK;IAE1B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,OAAO,CAAC,OAAO,CAAgB;IAE/B,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,OAAO,CAAC,MAAM,CAAC,CAAgB;IAE/B,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED,OAAO,CAAC,YAAY,CAAkB;IAEtC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,EAE7B;IAED,OAAO,CAAC,UAAU,CAAa;IAE/B,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAE1B;IAEM,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAWpC,WAAW,IAAI,IAAI;CAG3B"} \ No newline at end of file +{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAEA,OAAO,sBAAsB,MAAM,kBAAkB,CAAC;AAItD,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,uBAAuB,CAAC,CAAgB;IAChD,OAAO,CAAC,uBAAuB,CAAC,CAAW;gBAC/B,KAAK,MAAmB;IAKpC,OAAO,CAAC,QAAQ,CAA4D;IAE5E,IAAI,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAEtC;IAED,OAAO,CAAC,QAAQ,CAAoC;IAEpD,IAAI,OAAO,IAAI,sBAAsB,CAEpC;IAED,OAAO,CAAC,MAAM,CAAoB;IAElC,IAAI,KAAK,QAER;IAED,OAAO,CAAC,kBAAkB,CAAQ;IAElC,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAElC;IAED,OAAO,CAAC,aAAa,CAAM;IAE3B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,OAAO,CAAC,aAAa,CAAK;IAE1B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAE7B;IAED,OAAO,CAAC,OAAO,CAAiD;IAEhE,IAAI,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAElC;IAED,OAAO,CAAC,MAAM,CAAC,CAAgB;IAE/B,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED,IAAI,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnC;IAED,OAAO,CAAC,YAAY,CAAkB;IAEtC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,EAE7B;IAEM,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAYhD,QAAQ,CAAC,MAAM,EAAE,MAAM;IAQ9B,OAAO,CAAC,IAAI;IAyCZ,OAAO,CAAC,iBAAiB;CAK1B"} \ No newline at end of file diff --git a/dist/network.js b/dist/network.js index c932978..ccfa674 100644 --- a/dist/network.js +++ b/dist/network.js @@ -1,17 +1,26 @@ // @ts-ignore -import DHT from "@hyperswarm/dht"; +import Hyperswarm from "hyperswarm"; import RpcNetworkQueryFactory from "./query/index.js"; +import b4a from "b4a"; +import { createHash } from "./util.js"; export default class RpcNetwork { - constructor(dht = new DHT()) { - this._dht = dht; + _relaysAvailablePromise; + _relaysAvailableResolve; + constructor(swarm = new Hyperswarm()) { + this._swarm = swarm; + this.init(); + } + _methods = new Map(); + get methods() { + return this._methods; } _factory = new RpcNetworkQueryFactory(this); get factory() { return this._factory; } - _dht; - get dht() { - return this._dht; + _swarm; + get swarm() { + return this._swarm; } _majorityThreshold = 0.75; get majorityThreshold() { @@ -34,17 +43,20 @@ export default class RpcNetwork { set relayTimeout(value) { this._relayTimeout = value; } - _relays = []; + _relays = new Map(); get relays() { return this._relays; } _ready; get ready() { if (!this._ready) { - this._ready = this._dht.ready(); + this._ready = this._swarm.dht.ready(); } return this._ready; } + get readyWithRelays() { + return this.ready.then(() => this._relaysAvailablePromise); + } _bypassCache = false; get bypassCache() { return this._bypassCache; @@ -52,26 +64,55 @@ export default class RpcNetwork { set bypassCache(value) { this._bypassCache = value; } - _maxRelays = 0; - get maxRelays() { - return this._maxRelays; - } - set maxRelays(value) { - this._maxRelays = value; - } - addRelay(pubkey) { - this._relays.push(pubkey); - this._relays = [...new Set(this._relays)]; - } - removeRelay(pubkey) { - if (!this._relays.includes(pubkey)) { - return false; + getAvailableRelay(module, method) { + method = `${module}.${method}`; + let relays = this._methods.get(method) ?? new Set(); + if (!relays.size) { + throw Error("no available relay"); } - delete this._relays[this._relays.indexOf(pubkey)]; - this._relays = Object.values(this._relays); - return true; + return Array.from(relays)[Math.floor(Math.random() * relays.size)]; } - clearRelays() { - this._relays = []; + getRelay(pubkey) { + if (this._relays.has(pubkey)) { + return this._relays.get(pubkey); + } + return undefined; + } + init() { + this._swarm.join(createHash("lumeweb")); + this.setupRelayPromise(); + this._swarm.on("connection", async (relay) => { + const query = this._factory.simple({ + relay, + query: { module: "core", method: "get_methods", data: null }, + }); + const resp = await query.result; + const pubkey = b4a.from(relay.remotePublicKey).toString("hex"); + if (resp.data) { + this._relays.set(pubkey, relay); + resp.data.forEach((item) => { + const methods = this._methods.get(item) ?? new Set(); + methods.add(pubkey); + this._methods.set(item, methods); + }); + this._relaysAvailableResolve?.(); + } + relay.on("close", () => { + this._methods.forEach((item) => { + if (item.has(pubkey)) { + item.delete(pubkey); + } + }); + this.relays.delete(pubkey); + if (!this._relays.size) { + this.setupRelayPromise(); + } + }); + }); + } + setupRelayPromise() { + this._relaysAvailablePromise = new Promise((resolve) => { + this._relaysAvailableResolve = resolve; + }); } } diff --git a/dist/query/base.d.ts b/dist/query/base.d.ts index 4a7d565..b2b1f84 100644 --- a/dist/query/base.d.ts +++ b/dist/query/base.d.ts @@ -17,11 +17,15 @@ export default abstract class RpcQueryBase { protected _response?: RPCResponse; protected _error?: string; protected _promiseResolve?: (data: any) => void; - constructor( - network: RpcNetwork, - query: ClientRPCRequest | RPCRequest, - options?: RpcQueryOptions - ); + constructor({ + network, + query, + options, + }: { + network: RpcNetwork; + query: ClientRPCRequest | RPCRequest; + options: RpcQueryOptions; + }); get result(): Promise; protected handeTimeout(): void; protected resolve(data?: RPCResponse, timeout?: boolean): void; diff --git a/dist/query/base.d.ts.map b/dist/query/base.d.ts.map index 11a2160..e7fd4b0 100644 --- a/dist/query/base.d.ts.map +++ b/dist/query/base.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/query/base.ts"],"names":[],"mappings":";AAIA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAI9B,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,YAAY;IACxC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEpC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,SAAS,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IACpC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAS;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;gBAG9C,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,gBAAgB,GAAG,UAAU,EACpC,OAAO,GAAE,eAAoB;IAO/B,IAAI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,CAEjC;IAED,SAAS,CAAC,YAAY;IAItB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAc9D,GAAG,IAAI,IAAI;YAmBJ,MAAM;IASpB,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,OAAO;IAO7D,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;cAEf,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU;CAyBvD"} \ No newline at end of file +{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/query/base.ts"],"names":[],"mappings":";AACA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAE9B,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,YAAY;IACxC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEpC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,SAAS,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IACpC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAS;IACtC,SAAS,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;gBAEpC,EACV,OAAO,EACP,KAAK,EACL,OAAY,GACb,EAAE;QACD,OAAO,EAAE,UAAU,CAAC;QACpB,KAAK,EAAE,gBAAgB,GAAG,UAAU,CAAC;QACrC,OAAO,EAAE,eAAe,CAAC;KAC1B;IAMD,IAAI,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,CAEjC;IAED,SAAS,CAAC,YAAY;IAItB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAc9D,GAAG,IAAI,IAAI;YAmBJ,MAAM;IASpB,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC,OAAO;IAO7D,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;cAEf,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU;CAyBvD"} \ No newline at end of file diff --git a/dist/query/base.js b/dist/query/base.js index 8f937e1..9b2e261 100644 --- a/dist/query/base.js +++ b/dist/query/base.js @@ -10,7 +10,7 @@ export default class RpcQueryBase { _response; _error; _promiseResolve; - constructor(network, query, options = {}) { + constructor({ network, query, options = {}, }) { this._network = network; this._query = query; this._options = options; diff --git a/dist/query/clearCache.d.ts b/dist/query/clearCache.d.ts index a9577c4..2626703 100644 --- a/dist/query/clearCache.d.ts +++ b/dist/query/clearCache.d.ts @@ -4,12 +4,17 @@ import { RpcQueryOptions } from "../types.js"; import SimpleRpcQuery from "./simple.js"; export default class ClearCacheRpcQuery extends SimpleRpcQuery { protected _relays: string[]; - constructor( - network: RpcNetwork, - relays: string[], - query: RPCRequest, - options: RpcQueryOptions - ); + constructor({ + network, + relays, + query, + options, + }: { + network: RpcNetwork; + relays: string[]; + query: RPCRequest; + options: RpcQueryOptions; + }); protected _run(): Promise; protected queryRelay(): Promise; } diff --git a/dist/query/clearCache.d.ts.map b/dist/query/clearCache.d.ts.map index 5ff71b2..236bd35 100644 --- a/dist/query/clearCache.d.ts.map +++ b/dist/query/clearCache.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"clearCache.d.ts","sourceRoot":"","sources":["../../src/query/clearCache.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAuB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,cAAc,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,cAAc;IAC5D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAG1B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,eAAe;cAMV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAQrB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;CAc3C"} \ No newline at end of file +{"version":3,"file":"clearCache.d.ts","sourceRoot":"","sources":["../../src/query/clearCache.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAuB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,cAAc,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,cAAc;IAC5D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEhB,EACV,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,GACR,EAAE;QACD,OAAO,EAAE,UAAU,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,EAAE,eAAe,CAAC;KAC1B;cAKe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAOrB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;CAiB3C"} \ No newline at end of file diff --git a/dist/query/clearCache.js b/dist/query/clearCache.js index 84852a7..2c49b26 100644 --- a/dist/query/clearCache.js +++ b/dist/query/clearCache.js @@ -1,21 +1,19 @@ import { hashQuery } from "../util.js"; -import { getActiveRelay, setupRelay } from "../sharedRelay.js"; import SimpleRpcQuery from "./simple.js"; export default class ClearCacheRpcQuery extends SimpleRpcQuery { _relays; - constructor(network, relays, query, options) { - super(network, "", query, options); + constructor({ network, relays, query, options, }) { + super({ network, relay: "", query, options }); this._relays = relays; } async _run() { - await setupRelay(this._network); // @ts-ignore this._relay = getActiveRelay().stream.remotePublicKey; await this.queryRelay(); await this.checkResponses(); } async queryRelay() { - return this.queryRpc(getActiveRelay(), { + return this.queryRpc(this._network.getAvailableRelay("rpc", "broadcast_request"), { module: "rpc", method: "broadcast_request", data: { diff --git a/dist/query/index.d.ts b/dist/query/index.d.ts index 78142d4..fda46ae 100644 --- a/dist/query/index.d.ts +++ b/dist/query/index.d.ts @@ -1,6 +1,5 @@ import { ClientRPCRequest, RPCRequest } from "@lumeweb/relay-types"; import { RpcQueryOptions } from "../types.js"; -import WisdomRpcQuery from "./wisdom.js"; import SimpleRpcQuery from "./simple.js"; import ClearCacheRpcQuery from "./clearCache.js"; import RpcNetwork from "../network.js"; @@ -8,13 +7,6 @@ import RpcQueryBase from "./base.js"; export default class RpcNetworkQueryFactory { private _network; constructor(network: RpcNetwork); - wisdom({ - query, - options, - }: { - query: ClientRPCRequest; - options?: RpcQueryOptions; - }): WisdomRpcQuery; simple({ relay, query, @@ -34,5 +26,5 @@ export default class RpcNetworkQueryFactory { options?: RpcQueryOptions; }): ClearCacheRpcQuery; } -export { RpcNetwork, RpcQueryBase, SimpleRpcQuery, WisdomRpcQuery }; +export { RpcNetwork, RpcQueryBase, SimpleRpcQuery }; //# sourceMappingURL=index.d.ts.map diff --git a/dist/query/index.d.ts.map b/dist/query/index.d.ts.map index 14c6515..c753268 100644 --- a/dist/query/index.d.ts.map +++ b/dist/query/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,cAAc,MAAM,aAAa,CAAC;AACzC,OAAO,cAAc,MAAM,aAAa,CAAC;AACzC,OAAO,kBAAkB,MAAM,iBAAiB,CAAC;AACjD,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,YAAY,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,OAAO,EAAE,UAAU;IAI/B,MAAM,CAAC,EACL,KAAK,EACL,OAAY,GACb,EAAE;QACD,KAAK,EAAE,gBAAgB,CAAC;QACxB,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B,GAAG,cAAc;IAWlB,MAAM,CAAC,EACL,KAAK,EACL,KAAK,EACL,OAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,gBAAgB,CAAC;QACxB,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B,GAAG,cAAc;IAYlB,UAAU,CAAC,EACT,MAAM,EACN,KAAK,EACL,OAAY,GACb,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B,GAAG,kBAAkB;CAGvB;AAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,cAAc,MAAM,aAAa,CAAC;AACzC,OAAO,kBAAkB,MAAM,iBAAiB,CAAC;AACjD,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,YAAY,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,OAAO,EAAE,UAAU;IAI/B,MAAM,CAAC,EACL,KAAK,EACL,KAAK,EACL,OAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,gBAAgB,CAAC;QACxB,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B,GAAG,cAAc;IAYlB,UAAU,CAAC,EACT,MAAM,EACN,KAAK,EACL,OAAY,GACb,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,UAAU,CAAC;QAClB,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B,GAAG,kBAAkB;CAQvB;AAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/query/index.js b/dist/query/index.js index 8b7bda4..32ae0fb 100644 --- a/dist/query/index.js +++ b/dist/query/index.js @@ -1,4 +1,3 @@ -import WisdomRpcQuery from "./wisdom.js"; import SimpleRpcQuery from "./simple.js"; import ClearCacheRpcQuery from "./clearCache.js"; import RpcNetwork from "../network.js"; @@ -8,20 +7,24 @@ export default class RpcNetworkQueryFactory { constructor(network) { this._network = network; } - wisdom({ query, options = {}, }) { - return new WisdomRpcQuery(this._network, { - ...query, - bypassCache: query.bypassCache || this._network.bypassCache, - }, options).run(); - } simple({ relay, query, options = {}, }) { - return new SimpleRpcQuery(this._network, relay, { - ...query, - bypassCache: query.bypassCache || this._network.bypassCache, - }, options).run(); + return new SimpleRpcQuery({ + network: this._network, + relay, + query: { + ...query, + bypassCache: query?.bypassCache || this._network.bypassCache, + }, + options, + }).run(); } clearCache({ relays, query, options = {}, }) { - return new ClearCacheRpcQuery(this._network, relays, query, options).run(); + return new ClearCacheRpcQuery({ + network: this._network, + query, + relays, + options, + }).run(); } } -export { RpcNetwork, RpcQueryBase, SimpleRpcQuery, WisdomRpcQuery }; +export { RpcNetwork, RpcQueryBase, SimpleRpcQuery }; diff --git a/dist/query/simple.d.ts b/dist/query/simple.d.ts index f7fed53..105756b 100644 --- a/dist/query/simple.d.ts +++ b/dist/query/simple.d.ts @@ -3,14 +3,19 @@ import { ClientRPCRequest } from "@lumeweb/relay-types"; import { RpcQueryOptions } from "../types.js"; import RpcQueryBase from "./base.js"; export default class SimpleRpcQuery extends RpcQueryBase { - protected _relay: string; + protected _relay?: string | any; protected _query: ClientRPCRequest; - constructor( - network: RpcNetwork, - relay: string, - query: ClientRPCRequest, - options: RpcQueryOptions - ); + constructor({ + network, + relay, + query, + options, + }: { + network: RpcNetwork; + relay?: string | any; + query: ClientRPCRequest; + options: RpcQueryOptions; + }); protected _run(): Promise; protected queryRelay(): Promise; protected checkResponses(): Promise; diff --git a/dist/query/simple.d.ts.map b/dist/query/simple.d.ts.map index 762d2a1..7438aba 100644 --- a/dist/query/simple.d.ts.map +++ b/dist/query/simple.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/query/simple.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EACL,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAW9C,OAAO,YAAY,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY;IACtD,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,UAAkB,MAAM,EAAE,gBAAgB,CAAC;gBAGzC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,eAAe;cAMV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAKrB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;cAwC1B,cAAc;CAmB/B"} \ No newline at end of file +{"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../../src/query/simple.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,YAAY,MAAM,WAAW,CAAC;AAGrC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY;IACtD,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC,UAAkB,MAAM,EAAE,gBAAgB,CAAC;gBAE/B,EACV,OAAO,EACP,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE;QACD,OAAO,EAAE,UAAU,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;QACrB,KAAK,EAAE,gBAAgB,CAAC;QACxB,OAAO,EAAE,eAAe,CAAC;KAC1B;cAKe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAKrB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;cAwD1B,cAAc;CAmB/B"} \ No newline at end of file diff --git a/dist/query/simple.js b/dist/query/simple.js index 0249dfc..66755e2 100644 --- a/dist/query/simple.js +++ b/dist/query/simple.js @@ -1,12 +1,12 @@ import b4a from "b4a"; -import { hashQuery, isPromise, validateTimestampedResponse, } from "../util.js"; +import { hashQuery, isPromise, validateTimestampedResponse } from "../util.js"; import RPC from "@lumeweb/rpc"; import { ERR_INVALID_SIGNATURE } from "../error.js"; import RpcQueryBase from "./base.js"; export default class SimpleRpcQuery extends RpcQueryBase { _relay; - constructor(network, relay, query, options) { - super(network, query, options); + constructor({ network, relay, query, options, }) { + super({ network, query, options }); this._relay = relay; } async _run() { @@ -14,16 +14,31 @@ export default class SimpleRpcQuery extends RpcQueryBase { await this.checkResponses(); } async queryRelay() { - let socket; - try { - socket = this._network.dht.connect(b4a.from(this._relay, "hex")); - if (isPromise(socket)) { - socket = await socket; + let socket = this._relay; + if (socket) { + if (socket === "string") { + try { + const relay = this._network.getRelay(socket); + if (this._network.getRelay(socket)) { + socket = relay; + } + } + catch { } + } + if (socket === "string") { + try { + socket = this._network.swarm.connect(b4a.from(this._relay, "hex")); + if (isPromise(socket)) { + socket = await socket; + } + } + catch { } } } - catch (e) { - return; + if (!socket) { + socket = this._network.getAvailableRelay(this._query.module, this._query.method); } + this._relay = socket; await socket.opened; const rpc = new RPC(socket); if (this._query.bypassCache) { @@ -41,12 +56,8 @@ export default class SimpleRpcQuery extends RpcQueryBase { await this.queryRpc(rpc, this._query); } catch (e) { - // @ts-ignore - rpc.end(); throw e; } - // @ts-ignore - rpc.end(); } async checkResponses() { let response = this._response; @@ -54,7 +65,7 @@ export default class SimpleRpcQuery extends RpcQueryBase { response = { error: this._error }; } if (!response.error && - !validateTimestampedResponse(b4a.from(this._relay, "hex"), response)) { + !validateTimestampedResponse(b4a.from(this._relay.remotePublicKey, "hex"), response)) { response = { error: ERR_INVALID_SIGNATURE }; } this.resolve(response); diff --git a/dist/util.d.ts b/dist/util.d.ts index 64398e3..ef21ada 100644 --- a/dist/util.d.ts +++ b/dist/util.d.ts @@ -12,4 +12,5 @@ export declare function validateTimestampedResponse( response: RPCResponse ): boolean; export declare function hashQuery(query: RPCRequest): string; +export declare function createHash(data: string): Buffer; //# sourceMappingURL=util.d.ts.map diff --git a/dist/util.d.ts.map b/dist/util.d.ts.map index 71f0d25..4ec7187 100644 --- a/dist/util.d.ts.map +++ b/dist/util.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOpE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,WAM1C;AAKD,wBAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ,GAAG,GAAG,EAAE,CA0C1D;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,EACrB,WAAW,UAAQ,GAClB,OAAO,CAmBT;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAET;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAUnD"} \ No newline at end of file +{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOpE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,WAM1C;AAKD,wBAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAE,GAAQ,GAAG,GAAG,EAAE,CA0C1D;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,EACrB,WAAW,UAAQ,GAClB,OAAO,CAkBT;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,GACpB,OAAO,CAET;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAUnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C"} \ No newline at end of file diff --git a/dist/util.js b/dist/util.js index fab8a9c..53f20dc 100644 --- a/dist/util.js +++ b/dist/util.js @@ -49,8 +49,7 @@ export function flatten(target, opts = {}) { export function validateResponse(relay, response, timestamped = false) { const field = response.signedField || "data"; // @ts-ignore - const data = response[field]; - let json = data; + let json = response[field]; if (typeof json !== "string") { json = stringify(json); } @@ -73,3 +72,9 @@ export function hashQuery(query) { sodium.crypto_generichash(queryHash, Buffer.from(stringify(clonedQuery))); return queryHash.toString("hex"); } +export function createHash(data) { + const buffer = b4a.from(data); + let hash = b4a.allocUnsafe(32); + sodium.crypto_generichash(hash, buffer); + return hash; +}