@welshman/net 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +20 -0
  2. package/build/Connection.cjs +89 -0
  3. package/build/Connection.cjs.map +1 -0
  4. package/build/Connection.d.ts +26 -0
  5. package/build/Connection.mjs +85 -0
  6. package/build/Connection.mjs.map +1 -0
  7. package/build/ConnectionMeta.cjs +162 -0
  8. package/build/ConnectionMeta.cjs.map +1 -0
  9. package/build/ConnectionMeta.d.ts +57 -0
  10. package/build/ConnectionMeta.mjs +158 -0
  11. package/build/ConnectionMeta.mjs.map +1 -0
  12. package/build/Context.cjs +27 -0
  13. package/build/Context.cjs.map +1 -0
  14. package/build/Context.d.ts +16 -0
  15. package/build/Context.mjs +23 -0
  16. package/build/Context.mjs.map +1 -0
  17. package/build/Executor.cjs +64 -0
  18. package/build/Executor.cjs.map +1 -0
  19. package/build/Executor.d.ts +33 -0
  20. package/build/Executor.mjs +60 -0
  21. package/build/Executor.mjs.map +1 -0
  22. package/build/Pool.cjs +44 -0
  23. package/build/Pool.cjs.map +1 -0
  24. package/build/Pool.d.ts +13 -0
  25. package/build/Pool.mjs +40 -0
  26. package/build/Pool.mjs.map +1 -0
  27. package/build/Publish.cjs +70 -0
  28. package/build/Publish.cjs.map +1 -0
  29. package/build/Publish.d.ts +40 -0
  30. package/build/Publish.mjs +65 -0
  31. package/build/Publish.mjs.map +1 -0
  32. package/build/Socket.cjs +98 -0
  33. package/build/Socket.cjs.map +1 -0
  34. package/build/Socket.d.ts +37 -0
  35. package/build/Socket.mjs +89 -0
  36. package/build/Socket.mjs.map +1 -0
  37. package/build/Subscribe.cjs +215 -0
  38. package/build/Subscribe.cjs.map +1 -0
  39. package/build/Subscribe.d.ts +52 -0
  40. package/build/Subscribe.mjs +206 -0
  41. package/build/Subscribe.mjs.map +1 -0
  42. package/build/Tracker.cjs +45 -0
  43. package/build/Tracker.cjs.map +1 -0
  44. package/build/Tracker.d.ts +9 -0
  45. package/build/Tracker.mjs +41 -0
  46. package/build/Tracker.mjs.map +1 -0
  47. package/build/index.cjs +30 -0
  48. package/build/index.cjs.map +1 -0
  49. package/build/index.d.ts +13 -0
  50. package/build/index.mjs +14 -0
  51. package/build/index.mjs.map +1 -0
  52. package/build/target/Multi.cjs +25 -0
  53. package/build/target/Multi.cjs.map +1 -0
  54. package/build/target/Multi.d.ts +10 -0
  55. package/build/target/Multi.mjs +21 -0
  56. package/build/target/Multi.mjs.map +1 -0
  57. package/build/target/Plex.cjs +27 -0
  58. package/build/target/Plex.cjs.map +1 -0
  59. package/build/target/Plex.d.ts +12 -0
  60. package/build/target/Plex.mjs +23 -0
  61. package/build/target/Plex.mjs.map +1 -0
  62. package/build/target/Relay.cjs +26 -0
  63. package/build/target/Relay.cjs.map +1 -0
  64. package/build/target/Relay.d.ts +11 -0
  65. package/build/target/Relay.mjs +22 -0
  66. package/build/target/Relay.mjs.map +1 -0
  67. package/build/target/Relays.cjs +29 -0
  68. package/build/target/Relays.cjs.map +1 -0
  69. package/build/target/Relays.d.ts +10 -0
  70. package/build/target/Relays.mjs +25 -0
  71. package/build/target/Relays.mjs.map +1 -0
  72. package/package.json +40 -0
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NetworkContext = exports.defaultGetExecutor = exports.defaultPool = void 0;
4
+ const util_1 = require("@welshman/util");
5
+ const Pool_1 = require("./Pool.cjs");
6
+ const Executor_1 = require("./Executor.cjs");
7
+ const Relays_1 = require("./target/Relays.cjs");
8
+ exports.defaultPool = new Pool_1.Pool();
9
+ const defaultGetExecutor = (relays) => new Executor_1.Executor(new Relays_1.Relays(relays.map((relay) => exports.NetworkContext.pool.get(relay))));
10
+ exports.defaultGetExecutor = defaultGetExecutor;
11
+ const defaultOnEvent = (url, event) => null;
12
+ const defaultOnAuth = (url, challenge) => null;
13
+ const defaultOnOk = (url, id, ok, message) => null;
14
+ const defaultIsDeleted = (url, event) => false;
15
+ const defaultHasValidSignature = (url, event) => (0, util_1.hasValidSignature)(event);
16
+ const defaultMatchFilters = (url, filters, event) => (0, util_1.matchFilters)(filters, event);
17
+ exports.NetworkContext = {
18
+ pool: exports.defaultPool,
19
+ getExecutor: exports.defaultGetExecutor,
20
+ onEvent: defaultOnEvent,
21
+ onAuth: defaultOnAuth,
22
+ onOk: defaultOnOk,
23
+ isDeleted: defaultIsDeleted,
24
+ hasValidSignature: defaultHasValidSignature,
25
+ matchFilters: defaultMatchFilters,
26
+ };
27
+ //# sourceMappingURL=Context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.cjs","sourceRoot":"","sources":["../Context.ts"],"names":[],"mappings":";;;AACA,yCAA8D;AAE9D,qCAA2B;AAC3B,6CAAmC;AACnC,gDAAsC;AAEzB,QAAA,WAAW,GAAG,IAAI,WAAI,EAAE,CAAA;AAE9B,MAAM,kBAAkB,GAAG,CAAC,MAAgB,EAAE,EAAE,CACrD,IAAI,mBAAQ,CAAC,IAAI,eAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAD5E,QAAA,kBAAkB,sBAC0D;AAEzF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,IAAI,CAAA;AAE1D,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAA;AAE9D,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAU,EAAE,EAAW,EAAE,OAAe,EAAE,EAAE,CAAC,IAAI,CAAA;AAEnF,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,KAAK,CAAA;AAE7D,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,IAAA,wBAAiB,EAAC,KAAK,CAAC,CAAA;AAExF,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,OAAiB,EAAE,KAAY,EAAE,EAAE,CAAC,IAAA,mBAAY,EAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AAE7F,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,mBAAW;IACjB,WAAW,EAAE,0BAAkB;IAC/B,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,gBAAgB;IAC3B,iBAAiB,EAAE,wBAAwB;IAC3C,YAAY,EAAE,mBAAmB;CAClC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { Event } from 'nostr-tools';
2
+ import type { Filter } from '@welshman/util';
3
+ import { Pool } from "./Pool";
4
+ import { Executor } from "./Executor";
5
+ export declare const defaultPool: Pool;
6
+ export declare const defaultGetExecutor: (relays: string[]) => Executor;
7
+ export declare const NetworkContext: {
8
+ pool: Pool;
9
+ getExecutor: (relays: string[]) => Executor;
10
+ onEvent: (url: string, event: Event) => null;
11
+ onAuth: (url: string, challenge: string) => null;
12
+ onOk: (url: string, id: string, ok: boolean, message: string) => null;
13
+ isDeleted: (url: string, event: Event) => boolean;
14
+ hasValidSignature: (url: string, event: Event) => boolean;
15
+ matchFilters: (url: string, filters: Filter[], event: Event) => boolean;
16
+ };
@@ -0,0 +1,23 @@
1
+ import { matchFilters, hasValidSignature } from '@welshman/util';
2
+ import { Pool } from "./Pool.mjs";
3
+ import { Executor } from "./Executor.mjs";
4
+ import { Relays } from "./target/Relays.mjs";
5
+ export const defaultPool = new Pool();
6
+ export const defaultGetExecutor = (relays) => new Executor(new Relays(relays.map((relay) => NetworkContext.pool.get(relay))));
7
+ const defaultOnEvent = (url, event) => null;
8
+ const defaultOnAuth = (url, challenge) => null;
9
+ const defaultOnOk = (url, id, ok, message) => null;
10
+ const defaultIsDeleted = (url, event) => false;
11
+ const defaultHasValidSignature = (url, event) => hasValidSignature(event);
12
+ const defaultMatchFilters = (url, filters, event) => matchFilters(filters, event);
13
+ export const NetworkContext = {
14
+ pool: defaultPool,
15
+ getExecutor: defaultGetExecutor,
16
+ onEvent: defaultOnEvent,
17
+ onAuth: defaultOnAuth,
18
+ onOk: defaultOnOk,
19
+ isDeleted: defaultIsDeleted,
20
+ hasValidSignature: defaultHasValidSignature,
21
+ matchFilters: defaultMatchFilters,
22
+ };
23
+ //# sourceMappingURL=Context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.mjs","sourceRoot":"","sources":["../Context.ts"],"names":[],"mappings":"OACO,EAAC,YAAY,EAAE,iBAAiB,EAAC,MAAM,gBAAgB;OAEvD,EAAC,IAAI,EAAC;OACN,EAAC,QAAQ,EAAC;OACV,EAAC,MAAM,EAAC;AAEf,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAA;AAErC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAgB,EAAE,EAAE,CACrD,IAAI,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,IAAI,CAAA;AAE1D,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAA;AAE9D,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAU,EAAE,EAAW,EAAE,OAAe,EAAE,EAAE,CAAC,IAAI,CAAA;AAEnF,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,KAAK,CAAA;AAE7D,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;AAExF,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,OAAiB,EAAE,KAAY,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AAE1G,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,gBAAgB;IAC3B,iBAAiB,EAAE,wBAAwB;IAC3C,YAAY,EAAE,mBAAmB;CAClC,CAAA"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Executor = void 0;
4
+ const Context_1 = require("./Context.cjs");
5
+ const createSubId = (prefix) => [prefix, Math.random().toString().slice(2, 10)].join('-');
6
+ class Executor {
7
+ constructor(target) {
8
+ this.target = target;
9
+ target.on('AUTH', Context_1.NetworkContext.onAuth);
10
+ target.on('OK', Context_1.NetworkContext.onOk);
11
+ }
12
+ subscribe(filters, { onEvent, onEose } = {}) {
13
+ let closed = false;
14
+ const id = createSubId('REQ');
15
+ const eventListener = (url, subid, e) => {
16
+ if (subid === id) {
17
+ Context_1.NetworkContext.onEvent(url, e);
18
+ onEvent === null || onEvent === void 0 ? void 0 : onEvent(url, e);
19
+ }
20
+ };
21
+ const eoseListener = (url, subid) => {
22
+ if (subid === id) {
23
+ onEose === null || onEose === void 0 ? void 0 : onEose(url);
24
+ }
25
+ };
26
+ this.target.on('EVENT', eventListener);
27
+ this.target.on('EOSE', eoseListener);
28
+ this.target.send("REQ", id, ...filters);
29
+ return {
30
+ unsubscribe: () => {
31
+ if (!closed) {
32
+ this.target.send("CLOSE", id);
33
+ this.target.off('EVENT', eventListener);
34
+ this.target.off('EOSE', eoseListener);
35
+ }
36
+ closed = true;
37
+ },
38
+ };
39
+ }
40
+ publish(event, { verb = 'EVENT', onOk, onError } = {}) {
41
+ const okListener = (url, id, ...payload) => {
42
+ if (id === event.id) {
43
+ Context_1.NetworkContext.onEvent(url, event);
44
+ onOk === null || onOk === void 0 ? void 0 : onOk(url, id, ...payload);
45
+ }
46
+ };
47
+ const errorListener = (url, id, ...payload) => {
48
+ if (id === event.id) {
49
+ onError === null || onError === void 0 ? void 0 : onError(url, id, ...payload);
50
+ }
51
+ };
52
+ this.target.on('OK', okListener);
53
+ this.target.on('ERROR', errorListener);
54
+ this.target.send(verb, event);
55
+ return {
56
+ unsubscribe: () => {
57
+ this.target.off('OK', okListener);
58
+ this.target.off('ERROR', errorListener);
59
+ }
60
+ };
61
+ }
62
+ }
63
+ exports.Executor = Executor;
64
+ //# sourceMappingURL=Executor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Executor.cjs","sourceRoot":"","sources":["../Executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Event, Filter } from 'nostr-tools';
2
+ import type { Emitter } from '@welshman/lib';
3
+ import type { Message } from '@welshman/util';
4
+ import type { Connection } from './Connection';
5
+ export type Target = Emitter & {
6
+ connections: Connection[];
7
+ send: (...args: Message) => void;
8
+ cleanup: () => void;
9
+ };
10
+ type EventCallback = (url: string, event: Event) => void;
11
+ type EoseCallback = (url: string) => void;
12
+ type OkCallback = (url: string, id: string, ...extra: any[]) => void;
13
+ type ErrorCallback = (url: string, id: string, ...extra: any[]) => void;
14
+ type SubscribeOpts = {
15
+ onEvent?: EventCallback;
16
+ onEose?: EoseCallback;
17
+ };
18
+ type PublishOpts = {
19
+ verb?: string;
20
+ onOk?: OkCallback;
21
+ onError?: ErrorCallback;
22
+ };
23
+ export declare class Executor {
24
+ readonly target: Target;
25
+ constructor(target: Target);
26
+ subscribe(filters: Filter[], { onEvent, onEose }?: SubscribeOpts): {
27
+ unsubscribe: () => void;
28
+ };
29
+ publish(event: Event, { verb, onOk, onError }?: PublishOpts): {
30
+ unsubscribe: () => void;
31
+ };
32
+ }
33
+ export {};
@@ -0,0 +1,60 @@
1
+ import { NetworkContext } from "./Context.mjs";
2
+ const createSubId = (prefix) => [prefix, Math.random().toString().slice(2, 10)].join('-');
3
+ export class Executor {
4
+ constructor(target) {
5
+ this.target = target;
6
+ target.on('AUTH', NetworkContext.onAuth);
7
+ target.on('OK', NetworkContext.onOk);
8
+ }
9
+ subscribe(filters, { onEvent, onEose } = {}) {
10
+ let closed = false;
11
+ const id = createSubId('REQ');
12
+ const eventListener = (url, subid, e) => {
13
+ if (subid === id) {
14
+ NetworkContext.onEvent(url, e);
15
+ onEvent === null || onEvent === void 0 ? void 0 : onEvent(url, e);
16
+ }
17
+ };
18
+ const eoseListener = (url, subid) => {
19
+ if (subid === id) {
20
+ onEose === null || onEose === void 0 ? void 0 : onEose(url);
21
+ }
22
+ };
23
+ this.target.on('EVENT', eventListener);
24
+ this.target.on('EOSE', eoseListener);
25
+ this.target.send("REQ", id, ...filters);
26
+ return {
27
+ unsubscribe: () => {
28
+ if (!closed) {
29
+ this.target.send("CLOSE", id);
30
+ this.target.off('EVENT', eventListener);
31
+ this.target.off('EOSE', eoseListener);
32
+ }
33
+ closed = true;
34
+ },
35
+ };
36
+ }
37
+ publish(event, { verb = 'EVENT', onOk, onError } = {}) {
38
+ const okListener = (url, id, ...payload) => {
39
+ if (id === event.id) {
40
+ NetworkContext.onEvent(url, event);
41
+ onOk === null || onOk === void 0 ? void 0 : onOk(url, id, ...payload);
42
+ }
43
+ };
44
+ const errorListener = (url, id, ...payload) => {
45
+ if (id === event.id) {
46
+ onError === null || onError === void 0 ? void 0 : onError(url, id, ...payload);
47
+ }
48
+ };
49
+ this.target.on('OK', okListener);
50
+ this.target.on('ERROR', errorListener);
51
+ this.target.send(verb, event);
52
+ return {
53
+ unsubscribe: () => {
54
+ this.target.off('OK', okListener);
55
+ this.target.off('ERROR', errorListener);
56
+ }
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=Executor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Executor.mjs","sourceRoot":"","sources":["../Executor.ts"],"names":[],"mappings":"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"}
package/build/Pool.cjs ADDED
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Pool = void 0;
4
+ const lib_1 = require("@welshman/lib");
5
+ const Connection_1 = require("./Connection.cjs");
6
+ class Pool extends lib_1.Emitter {
7
+ constructor() {
8
+ super();
9
+ this.data = new Map();
10
+ }
11
+ has(url) {
12
+ return this.data.has(url);
13
+ }
14
+ get(url, { autoConnect = true, reconnectAfter = 3000 } = {}) {
15
+ let connection = this.data.get(url);
16
+ if (autoConnect) {
17
+ if (!connection) {
18
+ connection = new Connection_1.Connection(url);
19
+ this.data.set(url, connection);
20
+ this.emit('init', connection);
21
+ connection.on('open', () => this.emit('open', connection));
22
+ connection.on('close', () => this.emit('close', connection));
23
+ }
24
+ connection.ensureConnected({
25
+ shouldReconnect: connection.meta.lastClose < Date.now() - reconnectAfter,
26
+ });
27
+ }
28
+ return connection;
29
+ }
30
+ remove(url) {
31
+ const connection = this.data.get(url);
32
+ if (connection) {
33
+ connection.destroy();
34
+ this.data.delete(url);
35
+ }
36
+ }
37
+ clear() {
38
+ for (const url of this.data.keys()) {
39
+ this.remove(url);
40
+ }
41
+ }
42
+ }
43
+ exports.Pool = Pool;
44
+ //# sourceMappingURL=Pool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pool.cjs","sourceRoot":"","sources":["../Pool.ts"],"names":[],"mappings":";;;AAAA,uCAAqC;AACrC,iDAAuC;AAEvC,MAAa,IAAK,SAAQ,aAAO;IAE/B;QACE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAA;IACvB,CAAC;IACD,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,GAAG,CAAC,GAAW,EAAE,EAAC,WAAW,GAAG,IAAI,EAAE,cAAc,GAAG,IAAI,EAAC,GAAG,EAAE;QAC/D,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEnC,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,UAAU,EAAE;gBACf,UAAU,GAAG,IAAI,uBAAU,CAAC,GAAG,CAAC,CAAA;gBAEhC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;gBAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;gBAE7B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;gBAC1D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;aAC7D;YAED,UAAU,CAAC,eAAe,CAAC;gBACzB,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;aACzE,CAAC,CAAA;SACH;QAED,OAAO,UAAW,CAAA;IACpB,CAAC;IACD,MAAM,CAAC,GAAW;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErC,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,OAAO,EAAE,CAAA;YAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACtB;IACH,CAAC;IACD,KAAK;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACjB;IACH,CAAC;CACF;AA7CD,oBA6CC"}
@@ -0,0 +1,13 @@
1
+ import { Emitter } from '@welshman/lib';
2
+ import { Connection } from "./Connection";
3
+ export declare class Pool extends Emitter {
4
+ data: Map<string, Connection>;
5
+ constructor();
6
+ has(url: string): boolean;
7
+ get(url: string, { autoConnect, reconnectAfter }?: {
8
+ autoConnect?: boolean | undefined;
9
+ reconnectAfter?: number | undefined;
10
+ }): Connection;
11
+ remove(url: string): void;
12
+ clear(): void;
13
+ }
package/build/Pool.mjs ADDED
@@ -0,0 +1,40 @@
1
+ import { Emitter } from '@welshman/lib';
2
+ import { Connection } from "./Connection.mjs";
3
+ export class Pool extends Emitter {
4
+ constructor() {
5
+ super();
6
+ this.data = new Map();
7
+ }
8
+ has(url) {
9
+ return this.data.has(url);
10
+ }
11
+ get(url, { autoConnect = true, reconnectAfter = 3000 } = {}) {
12
+ let connection = this.data.get(url);
13
+ if (autoConnect) {
14
+ if (!connection) {
15
+ connection = new Connection(url);
16
+ this.data.set(url, connection);
17
+ this.emit('init', connection);
18
+ connection.on('open', () => this.emit('open', connection));
19
+ connection.on('close', () => this.emit('close', connection));
20
+ }
21
+ connection.ensureConnected({
22
+ shouldReconnect: connection.meta.lastClose < Date.now() - reconnectAfter,
23
+ });
24
+ }
25
+ return connection;
26
+ }
27
+ remove(url) {
28
+ const connection = this.data.get(url);
29
+ if (connection) {
30
+ connection.destroy();
31
+ this.data.delete(url);
32
+ }
33
+ }
34
+ clear() {
35
+ for (const url of this.data.keys()) {
36
+ this.remove(url);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=Pool.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pool.mjs","sourceRoot":"","sources":["../Pool.ts"],"names":[],"mappings":"OAAO,EAAC,OAAO,EAAC,MAAM,eAAe;OAC9B,EAAC,UAAU,EAAC;AAEnB,MAAM,OAAO,IAAK,SAAQ,OAAO;IAE/B;QACE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAA;IACvB,CAAC;IACD,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,GAAG,CAAC,GAAW,EAAE,EAAC,WAAW,GAAG,IAAI,EAAE,cAAc,GAAG,IAAI,EAAC,GAAG,EAAE;QAC/D,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEnC,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,UAAU,EAAE;gBACf,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;gBAEhC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;gBAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;gBAE7B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;gBAC1D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;aAC7D;YAED,UAAU,CAAC,eAAe,CAAC;gBACzB,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc;aACzE,CAAC,CAAA;SACH;QAED,OAAO,UAAW,CAAA;IACpB,CAAC;IACD,MAAM,CAAC,GAAW;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErC,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,OAAO,EAAE,CAAA;YAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACtB;IACH,CAAC;IACD,KAAK;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;SACjB;IACH,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publish = exports.makePublish = exports.PublishStatus = void 0;
4
+ const lib_1 = require("@welshman/lib");
5
+ const util_1 = require("@welshman/util");
6
+ const Context_1 = require("./Context.cjs");
7
+ var PublishStatus;
8
+ (function (PublishStatus) {
9
+ PublishStatus["Pending"] = "pending";
10
+ PublishStatus["Success"] = "success";
11
+ PublishStatus["Failure"] = "failure";
12
+ PublishStatus["Timeout"] = "timeout";
13
+ })(PublishStatus || (exports.PublishStatus = PublishStatus = {}));
14
+ const makePublish = (request) => {
15
+ const id = (0, lib_1.randomId)();
16
+ const created_at = (0, lib_1.now)();
17
+ const emitter = new lib_1.Emitter();
18
+ const result = (0, lib_1.defer)();
19
+ const status = new Map();
20
+ return { id, created_at, request, emitter, result, status };
21
+ };
22
+ exports.makePublish = makePublish;
23
+ const publish = (request) => {
24
+ const pub = (0, exports.makePublish)(request);
25
+ const event = (0, util_1.asEvent)(request.event);
26
+ const executor = Context_1.NetworkContext.getExecutor(request.relays);
27
+ // Listen to updates and keep status up to date. Every time there's an update, check to
28
+ // see if we're done. If we are, clear our timeout, executor, etc.
29
+ pub.emitter.on("*", (status, url) => {
30
+ pub.status.set(url, status);
31
+ if (Array.from(pub.status.values()).every((s) => s !== PublishStatus.Pending)) {
32
+ clearTimeout(timeout);
33
+ executorSub.unsubscribe();
34
+ executor.target.cleanup();
35
+ pub.result.resolve(pub.status);
36
+ }
37
+ });
38
+ // Start everything off as pending
39
+ setTimeout(() => {
40
+ for (const relay of request.relays) {
41
+ pub.emitter.emit(PublishStatus.Pending, relay);
42
+ }
43
+ });
44
+ // Set a timeout
45
+ const timeout = setTimeout(() => {
46
+ for (const [url, status] of pub.status.entries()) {
47
+ if (status === PublishStatus.Pending) {
48
+ pub.emitter.emit(PublishStatus.Timeout, url);
49
+ }
50
+ }
51
+ }, request.timeout || 10000);
52
+ // Delegate to our executor
53
+ const executorSub = executor.publish(event, {
54
+ verb: request.verb || "EVENT",
55
+ onOk: (url, eventId, ok) => {
56
+ if (ok) {
57
+ pub.emitter.emit(PublishStatus.Success, url);
58
+ }
59
+ else {
60
+ pub.emitter.emit(PublishStatus.Failure, url);
61
+ }
62
+ },
63
+ onError: (url) => {
64
+ pub.emitter.emit(PublishStatus.Failure, url);
65
+ },
66
+ });
67
+ return pub;
68
+ };
69
+ exports.publish = publish;
70
+ //# sourceMappingURL=Publish.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Publish.cjs","sourceRoot":"","sources":["../Publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Event } from 'nostr-tools';
2
+ import { Emitter } from '@welshman/lib';
3
+ import type { Deferred } from '@welshman/lib';
4
+ export declare enum PublishStatus {
5
+ Pending = "pending",
6
+ Success = "success",
7
+ Failure = "failure",
8
+ Timeout = "timeout"
9
+ }
10
+ export type PublishStatusMap = Map<string, PublishStatus>;
11
+ export type PublishRequest = {
12
+ event: Event;
13
+ relays: string[];
14
+ timeout?: number;
15
+ verb?: "EVENT" | "AUTH";
16
+ };
17
+ export type Publish = {
18
+ id: string;
19
+ created_at: number;
20
+ emitter: Emitter;
21
+ request: PublishRequest;
22
+ status: PublishStatusMap;
23
+ result: Deferred<PublishStatusMap>;
24
+ };
25
+ export declare const makePublish: (request: PublishRequest) => {
26
+ id: string;
27
+ created_at: number;
28
+ request: PublishRequest;
29
+ emitter: Emitter;
30
+ result: Deferred<PublishStatusMap>;
31
+ status: PublishStatusMap;
32
+ };
33
+ export declare const publish: (request: PublishRequest) => {
34
+ id: string;
35
+ created_at: number;
36
+ request: PublishRequest;
37
+ emitter: Emitter;
38
+ result: Deferred<PublishStatusMap>;
39
+ status: PublishStatusMap;
40
+ };
@@ -0,0 +1,65 @@
1
+ import { Emitter, now, randomId, defer } from '@welshman/lib';
2
+ import { asEvent, } from '@welshman/util';
3
+ import { NetworkContext } from "./Context.mjs";
4
+ export var PublishStatus;
5
+ (function (PublishStatus) {
6
+ PublishStatus["Pending"] = "pending";
7
+ PublishStatus["Success"] = "success";
8
+ PublishStatus["Failure"] = "failure";
9
+ PublishStatus["Timeout"] = "timeout";
10
+ })(PublishStatus || (PublishStatus = {}));
11
+ export const makePublish = (request) => {
12
+ const id = randomId();
13
+ const created_at = now();
14
+ const emitter = new Emitter();
15
+ const result = defer();
16
+ const status = new Map();
17
+ return { id, created_at, request, emitter, result, status };
18
+ };
19
+ export const publish = (request) => {
20
+ const pub = makePublish(request);
21
+ const event = asEvent(request.event);
22
+ const executor = NetworkContext.getExecutor(request.relays);
23
+ // Listen to updates and keep status up to date. Every time there's an update, check to
24
+ // see if we're done. If we are, clear our timeout, executor, etc.
25
+ pub.emitter.on("*", (status, url) => {
26
+ pub.status.set(url, status);
27
+ if (Array.from(pub.status.values()).every((s) => s !== PublishStatus.Pending)) {
28
+ clearTimeout(timeout);
29
+ executorSub.unsubscribe();
30
+ executor.target.cleanup();
31
+ pub.result.resolve(pub.status);
32
+ }
33
+ });
34
+ // Start everything off as pending
35
+ setTimeout(() => {
36
+ for (const relay of request.relays) {
37
+ pub.emitter.emit(PublishStatus.Pending, relay);
38
+ }
39
+ });
40
+ // Set a timeout
41
+ const timeout = setTimeout(() => {
42
+ for (const [url, status] of pub.status.entries()) {
43
+ if (status === PublishStatus.Pending) {
44
+ pub.emitter.emit(PublishStatus.Timeout, url);
45
+ }
46
+ }
47
+ }, request.timeout || 10000);
48
+ // Delegate to our executor
49
+ const executorSub = executor.publish(event, {
50
+ verb: request.verb || "EVENT",
51
+ onOk: (url, eventId, ok) => {
52
+ if (ok) {
53
+ pub.emitter.emit(PublishStatus.Success, url);
54
+ }
55
+ else {
56
+ pub.emitter.emit(PublishStatus.Failure, url);
57
+ }
58
+ },
59
+ onError: (url) => {
60
+ pub.emitter.emit(PublishStatus.Failure, url);
61
+ },
62
+ });
63
+ return pub;
64
+ };
65
+ //# sourceMappingURL=Publish.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Publish.mjs","sourceRoot":"","sources":["../Publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Socket = exports.asMessage = exports.isMessage = void 0;
7
+ const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
8
+ const lib_1 = require("@welshman/lib");
9
+ const isMessage = (m) => typeof m[0] === 'string';
10
+ exports.isMessage = isMessage;
11
+ const asMessage = (m) => (0, exports.isMessage)(m) ? m : m[1];
12
+ exports.asMessage = asMessage;
13
+ class Socket {
14
+ constructor(url, opts) {
15
+ this.opts = opts;
16
+ this.failedToConnect = false;
17
+ this.onOpen = () => {
18
+ this.ready.resolve(true);
19
+ this.opts.onOpen();
20
+ };
21
+ this.onError = () => {
22
+ this.opts.onError();
23
+ this.disconnect();
24
+ };
25
+ this.onMessage = (event) => {
26
+ try {
27
+ const message = JSON.parse(event.data);
28
+ if (Array.isArray(message)) {
29
+ this.opts.onMessage(message);
30
+ }
31
+ else {
32
+ console.warn("Invalid messages received:", message);
33
+ }
34
+ }
35
+ catch (e) {
36
+ // pass
37
+ }
38
+ };
39
+ this.send = (message) => {
40
+ if (!this.ws) {
41
+ throw new Error('Send attempted before socket was opened');
42
+ }
43
+ this.ws.send(JSON.stringify(message));
44
+ };
45
+ this.connect = () => {
46
+ if (this.ws) {
47
+ throw new Error(`Already attempted connection for ${this.url}`);
48
+ }
49
+ try {
50
+ this.ws = new isomorphic_ws_1.default(this.url);
51
+ this.ws.onopen = this.onOpen;
52
+ this.ws.onerror = this.onError;
53
+ this.ws.onmessage = this.onMessage;
54
+ this.ws.onclose = this.disconnect;
55
+ }
56
+ catch (e) {
57
+ this.failedToConnect = true;
58
+ }
59
+ };
60
+ this.disconnect = () => {
61
+ if (this.ws) {
62
+ const currentWs = this.ws;
63
+ this.ready.then(() => currentWs.close());
64
+ this.ready = (0, lib_1.defer)();
65
+ this.opts.onClose();
66
+ this.ws = undefined;
67
+ // Resolve a different instance of the promise
68
+ this.ready.resolve(false);
69
+ }
70
+ };
71
+ this.url = url;
72
+ this.ready = (0, lib_1.defer)();
73
+ }
74
+ isPending() {
75
+ return !this.ws && !this.failedToConnect;
76
+ }
77
+ isConnecting() {
78
+ var _a;
79
+ return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === isomorphic_ws_1.default.CONNECTING;
80
+ }
81
+ isReady() {
82
+ var _a;
83
+ return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === isomorphic_ws_1.default.OPEN;
84
+ }
85
+ isClosing() {
86
+ var _a;
87
+ return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === isomorphic_ws_1.default.CLOSING;
88
+ }
89
+ isClosed() {
90
+ var _a;
91
+ return ((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === isomorphic_ws_1.default.CLOSED;
92
+ }
93
+ isHealthy() {
94
+ return this.isPending() || this.isConnecting() || this.isReady();
95
+ }
96
+ }
97
+ exports.Socket = Socket;
98
+ //# sourceMappingURL=Socket.cjs.map