*Add ready property

This commit is contained in:
Derrick Hammer 2023-02-17 08:04:16 -05:00
parent 343fda1172
commit 439bd9f022
Signed by: pcfreak30
GPG Key ID: C997C339BE476FF2
1 changed files with 111 additions and 91 deletions

View File

@ -17,12 +17,10 @@ import { Mutex } from "async-mutex";
export default class HyperswarmWeb extends EventEmitter { export default class HyperswarmWeb extends EventEmitter {
private _options: any; private _options: any;
private _relays: Set<string> = new Set();
private _activeRelay: Hyperswarm;
private _discovery: PeerDiscoveryClient; private _discovery: PeerDiscoveryClient;
private _queuedEmActions: [string, any][] = []; private _queuedEmActions: [string, any][] = [];
private _connectionMutex: Mutex = new Mutex(); private _connectionMutex: Mutex = new Mutex();
constructor(opts: any = {}) { constructor(opts: any = {}) {
super(); super();
opts.custodial = false; opts.custodial = false;
@ -30,14 +28,122 @@ export default class HyperswarmWeb extends EventEmitter {
this._discovery = createClient(); this._discovery = createClient();
} }
private _relays: Set<string> = new Set();
get relays(): string[] {
return [...this._relays.values()];
}
private _activeRelay: Hyperswarm;
get activeRelay(): Hyperswarm { get activeRelay(): Hyperswarm {
return this._activeRelay; return this._activeRelay;
} }
private _ready = false;
get ready(): boolean {
return this._ready;
}
init(): Promise<void> { init(): Promise<void> {
return this.ensureConnection(); return this.ensureConnection();
} }
async connect(pubkey: string, options = {}): Promise<DhtNode> {
if (!this._activeRelay) {
await this.ensureConnection();
}
return this._activeRelay.connect(pubkey, options);
}
public async addRelay(pubkey: string): Promise<void> {
this._relays.add(pubkey);
}
public removeRelay(pubkey: string): boolean {
if (!this._relays.has(pubkey)) {
return false;
}
this._relays.delete(pubkey);
return true;
}
public clearRelays(): void {
this._relays.clear();
}
on(
eventName: string | symbol,
listener: (...args: any[]) => void
): Hyperswarm {
return this._processOrQueueAction("on", ...arguments);
}
addListener(
eventName: string | symbol,
listener: (...args: any[]) => void
): this {
return this.on(eventName, listener);
}
off(
eventName: string | symbol,
listener: (...args: any[]) => void
): Hyperswarm {
return this._processOrQueueAction("off", ...arguments);
}
removeListener(
eventName: string | symbol,
listener: (...args: any[]) => void
): this {
return this.off(eventName, listener);
}
emit(eventName: string | symbol, ...args: any[]): boolean {
return this._processOrQueueAction("emit", ...arguments);
}
once(eventName: string | symbol, listener: (...args: any[]) => void): this {
return this._processOrQueueAction("once", ...arguments);
}
public join(topic: Uint8Array, opts = {}): void {
return this._processOrQueueAction("join", ...arguments);
}
public joinPeer(publicKey: Uint8Array): void {
return this._processOrQueueAction("joinPeer", ...arguments);
}
public leave(topic: Uint8Array): void {
return this._processOrQueueAction("leave", ...arguments);
}
public leavePeer(publicKey: Uint8Array): void {
return this._processOrQueueAction("leavePeer", ...arguments);
}
public status(publicKey: Uint8Array) {
return this._activeRelay?.status(publicKey);
}
public topics(): string[] {
return this._activeRelay?.topics();
}
public async flush(): Promise<any> {
return this._activeRelay?.flush();
}
public async clear(): Promise<any> {
return this._activeRelay?.clear();
}
private async ensureConnection(): Promise<any> { private async ensureConnection(): Promise<any> {
const logErr = (await load()).logErr; const logErr = (await load()).logErr;
@ -89,6 +195,7 @@ export default class HyperswarmWeb extends EventEmitter {
this._activeRelay.on("close", () => { this._activeRelay.on("close", () => {
this._activeRelay = undefined; this._activeRelay = undefined;
this._ready = false;
}); });
} while (relays.length > 0 && !this._activeRelay); } while (relays.length > 0 && !this._activeRelay);
} }
@ -102,6 +209,7 @@ export default class HyperswarmWeb extends EventEmitter {
await this._activeRelay.dht.ready(); await this._activeRelay.dht.ready();
this._connectionMutex.release(); this._connectionMutex.release();
this._ready = true;
this.emit("ready"); this.emit("ready");
} }
@ -117,69 +225,6 @@ export default class HyperswarmWeb extends EventEmitter {
}); });
}); });
} }
async connect(pubkey: string, options = {}): Promise<DhtNode> {
if (!this._activeRelay) {
await this.ensureConnection();
}
return this._activeRelay.connect(pubkey, options);
}
get relays(): string[] {
return [...this._relays.values()];
}
public async addRelay(pubkey: string): Promise<void> {
this._relays.add(pubkey);
}
public removeRelay(pubkey: string): boolean {
if (!this._relays.has(pubkey)) {
return false;
}
this._relays.delete(pubkey);
return true;
}
public clearRelays(): void {
this._relays.clear();
}
on(
eventName: string | symbol,
listener: (...args: any[]) => void
): Hyperswarm {
return this._processOrQueueAction("on", ...arguments);
}
addListener(
eventName: string | symbol,
listener: (...args: any[]) => void
): this {
return this.on(eventName, listener);
}
off(
eventName: string | symbol,
listener: (...args: any[]) => void
): Hyperswarm {
return this._processOrQueueAction("off", ...arguments);
}
removeListener(
eventName: string | symbol,
listener: (...args: any[]) => void
): this {
return this.off(eventName, listener);
}
emit(eventName: string | symbol, ...args: any[]): boolean {
return this._processOrQueueAction("emit", ...arguments);
}
once(eventName: string | symbol, listener: (...args: any[]) => void): this {
return this._processOrQueueAction("once", ...arguments);
}
private _processOrQueueAction(method: string, ...args: any[]) { private _processOrQueueAction(method: string, ...args: any[]) {
if (this._activeRelay) { if (this._activeRelay) {
@ -197,29 +242,4 @@ export default class HyperswarmWeb extends EventEmitter {
this._queuedEmActions = []; this._queuedEmActions = [];
} }
public join(topic: Uint8Array, opts = {}): void {
return this._processOrQueueAction("join", ...arguments);
}
public joinPeer(publicKey: Uint8Array): void {
return this._processOrQueueAction("joinPeer", ...arguments);
}
public leave(topic: Uint8Array): void {
return this._processOrQueueAction("leave", ...arguments);
}
public leavePeer(publicKey: Uint8Array): void {
return this._processOrQueueAction("leavePeer", ...arguments);
}
public status(publicKey: Uint8Array) {
return this._activeRelay?.status(publicKey);
}
public topics(): string[] {
return this._activeRelay?.topics();
}
public async flush(): Promise<any> {
return this._activeRelay?.flush();
}
public async clear(): Promise<any> {
return this._activeRelay?.clear();
}
} }