diff --git a/src/index.ts b/src/index.ts index 932ad60..a1f3a8d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,154 +1,156 @@ -import {EventEmitter} from "events"; -import {DataFn, ErrTuple} from "libskynet"; -import {Buffer} from "buffer"; +import { EventEmitter } from "events"; +import { DataFn, ErrTuple } from "libskynet"; +import { Buffer } from "buffer"; const DHT_MODULE = "AQD1IgE4lTZkq1fqdoYGojKRNrSk0YQ_wrHbRtIiHDrnow"; -let callModule: any, - connectModule: any; +let callModule: any, connectModule: any; async function loadLibs() { - if (callModule && connectModule) { - return; - } - if (typeof window !== "undefined" && window?.document) { - const pkg = (await import("libkernel")); - callModule = pkg.callModule; - connectModule = pkg.connectModule; - } else { - const pkg = (await import("libkmodule")); - callModule = pkg.callModule; - connectModule = pkg.connectModule; - } + if (callModule && connectModule) { + return; + } + if (typeof window !== "undefined" && window?.document) { + const pkg = await import("libkernel"); + callModule = pkg.callModule; + connectModule = pkg.connectModule; + } else { + const pkg = await import("libkmodule"); + callModule = pkg.callModule; + connectModule = pkg.connectModule; + } } export class DHT { - private useDefaultDht: boolean; - private id: number; + private useDefaultDht: boolean; + private id: number; - constructor(useDefaultDht = true) { - this.useDefaultDht = useDefaultDht; + constructor(useDefaultDht = true) { + this.useDefaultDht = useDefaultDht; + } + + public async connect(pubkey: string): Promise { + await loadLibs(); + const [resp, err] = await callModule(DHT_MODULE, "connect", { pubkey }); + if (err) { + throw new Error(err); + } + return new Socket(resp.id); + } + + async ready(): Promise { + await loadLibs(); + const dht = !this.useDefaultDht ? this.id : undefined; + return callModule(DHT_MODULE, "ready", { dht }); + } + + public async addRelay(pubkey: string): Promise { + await loadLibs(); + const dht = !this.useDefaultDht ? this.id : undefined; + const [, err] = await callModule(DHT_MODULE, "addRelay", { pubkey, dht }); + if (err) { + throw new Error(err); + } + } + + public async removeRelay(pubkey: string): Promise { + await loadLibs(); + const dht = !this.useDefaultDht ? this.id : undefined; + const [, err] = await callModule(DHT_MODULE, "removeRelay", { + pubkey, + dht, + }); + if (err) { + throw new Error(err); + } + } + + public async clearRelays(): Promise { + await loadLibs(); + const dht = !this.useDefaultDht ? this.id : undefined; + await callModule(DHT_MODULE, "clearRelays", { dht }); + } + + private async create() { + await loadLibs(); + if (this.useDefaultDht) { + return Promise.resolve(); + } + const [dht, err] = await callModule(DHT_MODULE, "openDht"); + if (err) { + throw new Error(err); } - public async connect(pubkey: string): Promise { - await loadLibs(); - const [resp, err] = await callModule(DHT_MODULE, "connect", {pubkey}); - if (err) { - throw new Error(err); - } - return new Socket(resp.id); + this.id = dht; + } + + public async close(): Promise { + await loadLibs(); + + if (this.useDefaultDht) { + return false; + } + const [, err] = await callModule(DHT_MODULE, "closeDht", { dht: this.id }); + if (err) { + throw new Error(err); } - async ready(): Promise { - await loadLibs(); - const dht = !this.useDefaultDht ? this.id : undefined; - return callModule(DHT_MODULE, "ready", {dht}); - } - - public async addRelay(pubkey: string): Promise { - await loadLibs(); - const dht = !this.useDefaultDht ? this.id : undefined; - const [, err] = await callModule(DHT_MODULE, "addRelay", {pubkey, dht}); - if (err) { - throw new Error(err); - } - } - - public async removeRelay(pubkey: string): Promise { - await loadLibs(); - const dht = !this.useDefaultDht ? this.id : undefined; - const [, err] = await callModule(DHT_MODULE, "removeRelay", {pubkey, dht}); - if (err) { - throw new Error(err); - } - } - - public async clearRelays(): Promise { - await loadLibs(); - const dht = !this.useDefaultDht ? this.id : undefined; - await callModule(DHT_MODULE, "clearRelays", {dht}); - } - - private async create() { - await loadLibs(); - if (this.useDefaultDht) { - return Promise.resolve(); - } - const [dht, err] = await callModule(DHT_MODULE, "openDht"); - if (err) { - throw new Error(err); - } - - this.id = dht; - } - - public async close(): Promise { - await loadLibs(); - - if (this.useDefaultDht) { - return false; - } - const [, err] = await callModule(DHT_MODULE, "closeDht", {dht: this.id}); - if (err) { - throw new Error(err); - } - - return true; - } + return true; + } } export class Socket extends EventEmitter { - private id: number; - private eventUpdates: { [event: string]: DataFn[] } = {}; + private id: number; + private eventUpdates: { [event: string]: DataFn[] } = {}; - constructor(id: number) { - super(); - this.id = id; + constructor(id: number) { + super(); + this.id = id; + } + + on(eventName: string, listener: (...args: any[]) => void): this { + const [update, promise] = connectModule( + DHT_MODULE, + "listenSocketEvent", + { id: this.id, event: eventName }, + (data: any) => { + this.emit(eventName, data); + } + ); + this.trackEvent(eventName, update); + + promise.then(() => { + this.off(eventName, listener); + }); + + return super.on(eventName, listener); + } + + off(type: string, listener: any): this { + const updates = [...this.eventUpdates[type]]; + this.eventUpdates[type] = []; + for (const func of updates) { + func({ action: "off" }); } + return super.off(type, listener); + } - on(eventName: string, listener: (...args: any[]) => void): this { - const [update, promise] = connectModule( - DHT_MODULE, - "listenSocketEvent", - {id: this.id, event: eventName}, - (data: any) => { - this.emit(eventName, data); - } - ); - this.trackEvent(eventName, update); + write(message: string | Buffer): void { + callModule(DHT_MODULE, "write", { id: this.id, message }); + } - promise.then(() => { - this.off(eventName, listener); - }); + end(): void { + callModule(DHT_MODULE, "close", { id: this.id }); + } - return super.on(eventName, listener); + private ensureEvent(event: string): void { + if (!(event in this.eventUpdates)) { + this.eventUpdates[event] = []; } + } - off(type: string, listener: any): this { - const updates = [...this.eventUpdates[type]]; - this.eventUpdates[type] = []; - for (const func of updates) { - func({action: "off"}); - } - return super.off(type, listener); - } - - write(message: string | Buffer): void { - callModule(DHT_MODULE, "write", {id: this.id, message}); - } - - end(): void { - callModule(DHT_MODULE, "close", {id: this.id}); - } - - private ensureEvent(event: string): void { - if (!(event in this.eventUpdates)) { - this.eventUpdates[event] = []; - } - } - - private trackEvent(event: string, update: DataFn): void { - this.ensureEvent(event as string); - this.eventUpdates[event].push(update); - } + private trackEvent(event: string, update: DataFn): void { + this.ensureEvent(event as string); + this.eventUpdates[event].push(update); + } }