@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.
- package/README.md +20 -0
- package/build/Connection.cjs +89 -0
- package/build/Connection.cjs.map +1 -0
- package/build/Connection.d.ts +26 -0
- package/build/Connection.mjs +85 -0
- package/build/Connection.mjs.map +1 -0
- package/build/ConnectionMeta.cjs +162 -0
- package/build/ConnectionMeta.cjs.map +1 -0
- package/build/ConnectionMeta.d.ts +57 -0
- package/build/ConnectionMeta.mjs +158 -0
- package/build/ConnectionMeta.mjs.map +1 -0
- package/build/Context.cjs +27 -0
- package/build/Context.cjs.map +1 -0
- package/build/Context.d.ts +16 -0
- package/build/Context.mjs +23 -0
- package/build/Context.mjs.map +1 -0
- package/build/Executor.cjs +64 -0
- package/build/Executor.cjs.map +1 -0
- package/build/Executor.d.ts +33 -0
- package/build/Executor.mjs +60 -0
- package/build/Executor.mjs.map +1 -0
- package/build/Pool.cjs +44 -0
- package/build/Pool.cjs.map +1 -0
- package/build/Pool.d.ts +13 -0
- package/build/Pool.mjs +40 -0
- package/build/Pool.mjs.map +1 -0
- package/build/Publish.cjs +70 -0
- package/build/Publish.cjs.map +1 -0
- package/build/Publish.d.ts +40 -0
- package/build/Publish.mjs +65 -0
- package/build/Publish.mjs.map +1 -0
- package/build/Socket.cjs +98 -0
- package/build/Socket.cjs.map +1 -0
- package/build/Socket.d.ts +37 -0
- package/build/Socket.mjs +89 -0
- package/build/Socket.mjs.map +1 -0
- package/build/Subscribe.cjs +215 -0
- package/build/Subscribe.cjs.map +1 -0
- package/build/Subscribe.d.ts +52 -0
- package/build/Subscribe.mjs +206 -0
- package/build/Subscribe.mjs.map +1 -0
- package/build/Tracker.cjs +45 -0
- package/build/Tracker.cjs.map +1 -0
- package/build/Tracker.d.ts +9 -0
- package/build/Tracker.mjs +41 -0
- package/build/Tracker.mjs.map +1 -0
- package/build/index.cjs +30 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +13 -0
- package/build/index.mjs +14 -0
- package/build/index.mjs.map +1 -0
- package/build/target/Multi.cjs +25 -0
- package/build/target/Multi.cjs.map +1 -0
- package/build/target/Multi.d.ts +10 -0
- package/build/target/Multi.mjs +21 -0
- package/build/target/Multi.mjs.map +1 -0
- package/build/target/Plex.cjs +27 -0
- package/build/target/Plex.cjs.map +1 -0
- package/build/target/Plex.d.ts +12 -0
- package/build/target/Plex.mjs +23 -0
- package/build/target/Plex.mjs.map +1 -0
- package/build/target/Relay.cjs +26 -0
- package/build/target/Relay.cjs.map +1 -0
- package/build/target/Relay.d.ts +11 -0
- package/build/target/Relay.mjs +22 -0
- package/build/target/Relay.mjs.map +1 -0
- package/build/target/Relays.cjs +29 -0
- package/build/target/Relays.cjs.map +1 -0
- package/build/target/Relays.d.ts +10 -0
- package/build/target/Relays.mjs +25 -0
- package/build/target/Relays.mjs.map +1 -0
- 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"}
|
package/build/Pool.d.ts
ADDED
|
@@ -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":";;;AACA,uCAA2D;AAE3D,yCAAuC;AACvC,2CAAwC;AAExC,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;AACrB,CAAC,EALW,aAAa,6BAAb,aAAa,QAKxB;AAoBM,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAE,EAAE;IACrD,MAAM,EAAE,GAAG,IAAA,cAAQ,GAAE,CAAA;IACrB,MAAM,UAAU,GAAG,IAAA,SAAG,GAAE,CAAA;IACxB,MAAM,OAAO,GAAG,IAAI,aAAO,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAsB,IAAA,WAAK,GAAE,CAAA;IACzC,MAAM,MAAM,GAAsB,IAAI,GAAG,EAAE,CAAA;IAE3C,OAAO,EAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAC,CAAA;AAC3D,CAAC,CAAA;AARY,QAAA,WAAW,eAQvB;AAEM,MAAM,OAAO,GAAG,CAAC,OAAuB,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,wBAAc,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAE3D,uFAAuF;IACvF,kEAAkE;IAClE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAqB,EAAE,GAAW,EAAE,EAAE;QACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAE3B,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,EAAE;YAC5F,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,WAAW,CAAC,WAAW,EAAE,CAAA;YACzB,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACzB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;SAC/B;IACH,CAAC,CAAC,CAAA;IAEF,kCAAkC;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE;YAClC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;SAC/C;IACH,CAAC,CAAC,CAAA;IAEF,gBAAgB;IAChB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE;YAChD,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE;gBACpC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;aAC7C;SACF;IACH,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,KAAM,CAAC,CAAA;IAE7B,2BAA2B;IAC3B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;QAC7B,IAAI,EAAE,CAAC,GAAW,EAAE,OAAe,EAAE,EAAW,EAAE,EAAE;YAClD,IAAI,EAAE,EAAE;gBACN,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;aAC7C;iBAAM;gBACL,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;aAC7C;QACH,CAAC;QACD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE;YACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC9C,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAlDY,QAAA,OAAO,WAkDnB"}
|
|
@@ -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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"}
|
package/build/Socket.cjs
ADDED
|
@@ -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
|