diff --git a/dist/index.d.ts b/dist/index.d.ts
new file mode 100644
index 0000000..f47ee4e
--- /dev/null
+++ b/dist/index.d.ts
@@ -0,0 +1,21 @@
+///
+///
+import { EventEmitter } from "events";
+import { ErrTuple } from "libskynet";
+import { Buffer } from "buffer";
+export declare class DHT {
+ connect(pubkey: string): Promise;
+ ready(): Promise;
+}
+export declare class Socket extends EventEmitter {
+ private id;
+ private eventUpdates;
+ constructor(id: number);
+ on(eventName: string, listener: (...args: any[]) => void): this;
+ off(type: string, listener: any): this;
+ write(message: string | Buffer): void;
+ end(): void;
+ private ensureEvent;
+ private trackEvent;
+}
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map
new file mode 100644
index 0000000..7f9279d
--- /dev/null
+++ b/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAU,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,qBAAa,GAAG;IACC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ/C,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CAGnC;AAED,qBAAa,MAAO,SAAQ,YAAY;IACpC,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,YAAY,CAAqC;gBAE7C,EAAE,EAAE,MAAM;IAKtB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAkB/D,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI;IAStC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIrC,GAAG,IAAI,IAAI;IAIX,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;CAIrB"}
\ No newline at end of file
diff --git a/dist/index.js b/dist/index.js
new file mode 100644
index 0000000..e29aa8c
--- /dev/null
+++ b/dist/index.js
@@ -0,0 +1,66 @@
+import { callModule as callModuleKernel, connectModule as connectModuleKernel, } from "libkernel";
+import { callModule as callModuleModule, connectModule as connectModuleModule, } from "libkmodule";
+import { EventEmitter } from "events";
+const DHT_MODULE = "AQD1IgE4lTZkq1fqdoYGojKRNrSk0YQ_wrHbRtIiHDrnow";
+let callModule, connectModule;
+if (window.document) {
+ callModule = callModuleKernel;
+ connectModule = connectModuleKernel;
+}
+else {
+ callModule = callModuleModule;
+ connectModule = connectModuleModule;
+}
+export class DHT {
+ async connect(pubkey) {
+ const [resp, err] = await callModule(DHT_MODULE, "connect", { pubkey });
+ if (err) {
+ throw err;
+ }
+ return new Socket(resp.id);
+ }
+ async ready() {
+ return callModule(DHT_MODULE, "ready");
+ }
+}
+export class Socket extends EventEmitter {
+ id;
+ eventUpdates = {};
+ constructor(id) {
+ super();
+ this.id = id;
+ }
+ on(eventName, listener) {
+ const [update, promise] = connectModule(DHT_MODULE, "listenSocketEvent", { id: this.id, event: eventName }, (data) => {
+ this.emit(eventName, data);
+ });
+ this.trackEvent(eventName, update);
+ promise.then(() => {
+ this.off(eventName, listener);
+ });
+ return super.on(eventName, listener);
+ }
+ off(type, listener) {
+ const updates = [...this.eventUpdates[type]];
+ this.eventUpdates[type] = [];
+ for (const func of updates) {
+ func({ action: "off" });
+ }
+ return super.off(type, listener);
+ }
+ write(message) {
+ callModule(DHT_MODULE, "write", { id: this.id, message });
+ }
+ end() {
+ callModule(DHT_MODULE, "close", { id: this.id });
+ }
+ ensureEvent(event) {
+ if (!(event in this.eventUpdates)) {
+ this.eventUpdates[event] = [];
+ }
+ }
+ trackEvent(event, update) {
+ this.ensureEvent(event);
+ this.eventUpdates[event].push(update);
+ }
+}