@welshman/util 0.0.2 → 0.0.4
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/build/Address.cjs +3 -3
- package/build/Address.cjs.map +1 -1
- package/build/Address.mjs +4 -4
- package/build/Address.mjs.map +1 -1
- package/build/Filters.cjs +36 -4
- package/build/Filters.cjs.map +1 -1
- package/build/Filters.d.ts +3 -2
- package/build/Filters.mjs +33 -2
- package/build/Filters.mjs.map +1 -1
- package/build/Kinds.cjs +78 -75
- package/build/Kinds.cjs.map +1 -1
- package/build/Kinds.d.ts +76 -73
- package/build/Kinds.mjs +77 -73
- package/build/Kinds.mjs.map +1 -1
- package/build/Relay.cjs +14 -117
- package/build/Relay.cjs.map +1 -1
- package/build/Relay.d.ts +6 -16
- package/build/Relay.mjs +15 -118
- package/build/Relay.mjs.map +1 -1
- package/build/Relays.cjs +3 -1
- package/build/Relays.cjs.map +1 -1
- package/build/Relays.d.ts +2 -0
- package/build/Relays.mjs +2 -0
- package/build/Relays.mjs.map +1 -1
- package/build/Repository.cjs +198 -0
- package/build/Repository.cjs.map +1 -0
- package/build/Repository.d.ts +34 -0
- package/build/Repository.mjs +194 -0
- package/build/Repository.mjs.map +1 -0
- package/build/Router.cjs +16 -15
- package/build/Router.cjs.map +1 -1
- package/build/Router.d.ts +56 -10
- package/build/Router.mjs +16 -15
- package/build/Router.mjs.map +1 -1
- package/build/Tags.cjs +14 -14
- package/build/Tags.cjs.map +1 -1
- package/build/Tags.d.ts +1 -6
- package/build/Tags.mjs +16 -16
- package/build/Tags.mjs.map +1 -1
- package/build/index.cjs +1 -0
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.mjs +1 -0
- package/package.json +2 -3
package/build/Kinds.mjs
CHANGED
|
@@ -4,77 +4,81 @@ export const isEphemeralKind = kinds.isEphemeralKind;
|
|
|
4
4
|
export const isPlainReplaceableKind = kinds.isReplaceableKind;
|
|
5
5
|
export const isParameterizedReplaceableKind = kinds.isParameterizedReplaceableKind;
|
|
6
6
|
export const isReplaceableKind = (kind) => isPlainReplaceableKind(kind) || isParameterizedReplaceableKind(kind);
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
7
|
+
export var Kind;
|
|
8
|
+
(function (Kind) {
|
|
9
|
+
Kind[Kind["Profile"] = 0] = "Profile";
|
|
10
|
+
Kind[Kind["Note"] = 1] = "Note";
|
|
11
|
+
Kind[Kind["Relay"] = 2] = "Relay";
|
|
12
|
+
Kind[Kind["DM"] = 4] = "DM";
|
|
13
|
+
Kind[Kind["Delete"] = 5] = "Delete";
|
|
14
|
+
Kind[Kind["Repost"] = 6] = "Repost";
|
|
15
|
+
Kind[Kind["Reaction"] = 7] = "Reaction";
|
|
16
|
+
Kind[Kind["BadgeAward"] = 8] = "BadgeAward";
|
|
17
|
+
Kind[Kind["GenericRepost"] = 16] = "GenericRepost";
|
|
18
|
+
Kind[Kind["ChannelCreation"] = 40] = "ChannelCreation";
|
|
19
|
+
Kind[Kind["ChannelMetadata"] = 41] = "ChannelMetadata";
|
|
20
|
+
Kind[Kind["ChannelMessage"] = 42] = "ChannelMessage";
|
|
21
|
+
Kind[Kind["ChannelHideMessage"] = 43] = "ChannelHideMessage";
|
|
22
|
+
Kind[Kind["ChannelMuteUser"] = 44] = "ChannelMuteUser";
|
|
23
|
+
Kind[Kind["OpenTimestamp"] = 1040] = "OpenTimestamp";
|
|
24
|
+
Kind[Kind["GiftWrap"] = 1059] = "GiftWrap";
|
|
25
|
+
Kind[Kind["FileMetadata"] = 1063] = "FileMetadata";
|
|
26
|
+
Kind[Kind["LiveChatMessage"] = 1311] = "LiveChatMessage";
|
|
27
|
+
Kind[Kind["Remix"] = 1808] = "Remix";
|
|
28
|
+
Kind[Kind["ProblemTracker"] = 1971] = "ProblemTracker";
|
|
29
|
+
Kind[Kind["Report"] = 1984] = "Report";
|
|
30
|
+
Kind[Kind["Label"] = 1985] = "Label";
|
|
31
|
+
Kind[Kind["CommunityPostApproval"] = 4550] = "CommunityPostApproval";
|
|
32
|
+
Kind[Kind["JobRequest"] = 5999] = "JobRequest";
|
|
33
|
+
Kind[Kind["JobResult"] = 6999] = "JobResult";
|
|
34
|
+
Kind[Kind["JobFeedback"] = 7000] = "JobFeedback";
|
|
35
|
+
Kind[Kind["ZapGoal"] = 9041] = "ZapGoal";
|
|
36
|
+
Kind[Kind["ZapRequest"] = 9734] = "ZapRequest";
|
|
37
|
+
Kind[Kind["ZapResponse"] = 9735] = "ZapResponse";
|
|
38
|
+
Kind[Kind["Highlight"] = 9802] = "Highlight";
|
|
39
|
+
Kind[Kind["UserListMutes"] = 10000] = "UserListMutes";
|
|
40
|
+
Kind[Kind["UserListPins"] = 10001] = "UserListPins";
|
|
41
|
+
Kind[Kind["UserListRelays"] = 10002] = "UserListRelays";
|
|
42
|
+
Kind[Kind["UserListBookmarks"] = 10003] = "UserListBookmarks";
|
|
43
|
+
Kind[Kind["UserListCommunities"] = 10004] = "UserListCommunities";
|
|
44
|
+
Kind[Kind["UserListPublicChats"] = 10005] = "UserListPublicChats";
|
|
45
|
+
Kind[Kind["UserListBlockedRelays"] = 10006] = "UserListBlockedRelays";
|
|
46
|
+
Kind[Kind["UserListSearchRelays"] = 10007] = "UserListSearchRelays";
|
|
47
|
+
Kind[Kind["UserListInterests"] = 10015] = "UserListInterests";
|
|
48
|
+
Kind[Kind["UserListEmojis"] = 10030] = "UserListEmojis";
|
|
49
|
+
Kind[Kind["LightningPubRpc"] = 21000] = "LightningPubRpc";
|
|
50
|
+
Kind[Kind["ClientAuth"] = 22242] = "ClientAuth";
|
|
51
|
+
Kind[Kind["NWCInfo"] = 13194] = "NWCInfo";
|
|
52
|
+
Kind[Kind["NWCRequest"] = 23194] = "NWCRequest";
|
|
53
|
+
Kind[Kind["NWCResponse"] = 23195] = "NWCResponse";
|
|
54
|
+
Kind[Kind["NostrConnect"] = 24133] = "NostrConnect";
|
|
55
|
+
Kind[Kind["HttpAuth"] = 27235] = "HttpAuth";
|
|
56
|
+
Kind[Kind["ListFollows"] = 3] = "ListFollows";
|
|
57
|
+
Kind[Kind["ListPeople"] = 30000] = "ListPeople";
|
|
58
|
+
Kind[Kind["ListGeneric"] = 30001] = "ListGeneric";
|
|
59
|
+
Kind[Kind["ListRelays"] = 30002] = "ListRelays";
|
|
60
|
+
Kind[Kind["ListBookmarks"] = 30003] = "ListBookmarks";
|
|
61
|
+
Kind[Kind["ListCurations"] = 30004] = "ListCurations";
|
|
62
|
+
Kind[Kind["ProfileBadges"] = 30008] = "ProfileBadges";
|
|
63
|
+
Kind[Kind["BadgeDefinition"] = 30009] = "BadgeDefinition";
|
|
64
|
+
Kind[Kind["ListEmojis"] = 30030] = "ListEmojis";
|
|
65
|
+
Kind[Kind["ListInterests"] = 30015] = "ListInterests";
|
|
66
|
+
Kind[Kind["LongFormArticle"] = 30023] = "LongFormArticle";
|
|
67
|
+
Kind[Kind["LongFormArticleDraft"] = 30024] = "LongFormArticleDraft";
|
|
68
|
+
Kind[Kind["Application"] = 30078] = "Application";
|
|
69
|
+
Kind[Kind["LiveEvent"] = 30311] = "LiveEvent";
|
|
70
|
+
Kind[Kind["UserStatuses"] = 30315] = "UserStatuses";
|
|
71
|
+
Kind[Kind["ClassifiedListing"] = 30402] = "ClassifiedListing";
|
|
72
|
+
Kind[Kind["DraftClassifiedListing"] = 30403] = "DraftClassifiedListing";
|
|
73
|
+
Kind[Kind["Audio"] = 31337] = "Audio";
|
|
74
|
+
Kind[Kind["Feed"] = 31890] = "Feed";
|
|
75
|
+
Kind[Kind["Calendar"] = 31924] = "Calendar";
|
|
76
|
+
Kind[Kind["CalendarEventDate"] = 31922] = "CalendarEventDate";
|
|
77
|
+
Kind[Kind["CalendarEventTime"] = 31923] = "CalendarEventTime";
|
|
78
|
+
Kind[Kind["CalendarEventRsvp"] = 31925] = "CalendarEventRsvp";
|
|
79
|
+
Kind[Kind["HandlerRecommendation"] = 31989] = "HandlerRecommendation";
|
|
80
|
+
Kind[Kind["HandlerInformation"] = 31990] = "HandlerInformation";
|
|
81
|
+
Kind[Kind["CommunityDefinition"] = 34550] = "CommunityDefinition";
|
|
82
|
+
Kind[Kind["GroupDefinition"] = 35834] = "GroupDefinition";
|
|
83
|
+
})(Kind || (Kind = {}));
|
|
80
84
|
//# sourceMappingURL=Kinds.mjs.map
|
package/build/Kinds.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kinds.mjs","sourceRoot":"","sources":["../Kinds.ts"],"names":[],"mappings":"OAAO,EAAC,KAAK,EAAC,MAAM,aAAa;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAA;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAA;AAC7D,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAC,8BAA8B,CAAA;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE,CAChD,sBAAsB,CAAC,IAAI,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAA;AAEtE,MAAM,
|
|
1
|
+
{"version":3,"file":"Kinds.mjs","sourceRoot":"","sources":["../Kinds.ts"],"names":[],"mappings":"OAAO,EAAC,KAAK,EAAC,MAAM,aAAa;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAA;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC,iBAAiB,CAAA;AAC7D,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAC,8BAA8B,CAAA;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE,CAChD,sBAAsB,CAAC,IAAI,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAA;AAEtE,MAAM,CAAN,IAAY,IA2EX;AA3ED,WAAY,IAAI;IACd,qCAAW,CAAA;IACX,+BAAQ,CAAA;IACR,iCAAS,CAAA;IACT,2BAAM,CAAA;IACN,mCAAU,CAAA;IACV,mCAAU,CAAA;IACV,uCAAY,CAAA;IACZ,2CAAc,CAAA;IACd,kDAAkB,CAAA;IAClB,sDAAoB,CAAA;IACpB,sDAAoB,CAAA;IACpB,oDAAmB,CAAA;IACnB,4DAAuB,CAAA;IACvB,sDAAoB,CAAA;IACpB,oDAAoB,CAAA;IACpB,0CAAe,CAAA;IACf,kDAAmB,CAAA;IACnB,wDAAsB,CAAA;IACtB,oCAAY,CAAA;IACZ,sDAAqB,CAAA;IACrB,sCAAa,CAAA;IACb,oCAAY,CAAA;IACZ,oEAA4B,CAAA;IAC5B,8CAAiB,CAAA;IACjB,4CAAgB,CAAA;IAChB,gDAAkB,CAAA;IAClB,wCAAc,CAAA;IACd,8CAAiB,CAAA;IACjB,gDAAkB,CAAA;IAClB,4CAAgB,CAAA;IAChB,qDAAqB,CAAA;IACrB,mDAAoB,CAAA;IACpB,uDAAsB,CAAA;IACtB,6DAAyB,CAAA;IACzB,iEAA2B,CAAA;IAC3B,iEAA2B,CAAA;IAC3B,qEAA6B,CAAA;IAC7B,mEAA4B,CAAA;IAC5B,6DAAyB,CAAA;IACzB,uDAAsB,CAAA;IACtB,yDAAuB,CAAA;IACvB,+CAAkB,CAAA;IAClB,yCAAe,CAAA;IACf,+CAAkB,CAAA;IAClB,iDAAmB,CAAA;IACnB,mDAAoB,CAAA;IACpB,2CAAgB,CAAA;IAChB,6CAAe,CAAA;IACf,+CAAkB,CAAA;IAClB,iDAAmB,CAAA;IACnB,+CAAkB,CAAA;IAClB,qDAAqB,CAAA;IACrB,qDAAqB,CAAA;IACrB,qDAAqB,CAAA;IACrB,yDAAuB,CAAA;IACvB,+CAAkB,CAAA;IAClB,qDAAqB,CAAA;IACrB,yDAAuB,CAAA;IACvB,mEAA4B,CAAA;IAC5B,iDAAmB,CAAA;IACnB,6CAAiB,CAAA;IACjB,mDAAoB,CAAA;IACpB,6DAAyB,CAAA;IACzB,uEAA8B,CAAA;IAC9B,qCAAa,CAAA;IACb,mCAAY,CAAA;IACZ,2CAAgB,CAAA;IAChB,6DAAyB,CAAA;IACzB,6DAAyB,CAAA;IACzB,6DAAyB,CAAA;IACzB,qEAA6B,CAAA;IAC7B,+DAA0B,CAAA;IAC1B,iEAA2B,CAAA;IAC3B,yDAAuB,CAAA;AACzB,CAAC,EA3EW,IAAI,KAAJ,IAAI,QA2Ef"}
|
package/build/Relay.cjs
CHANGED
|
@@ -1,44 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Relay =
|
|
3
|
+
exports.Relay = void 0;
|
|
4
4
|
const lib_1 = require("@welshman/lib");
|
|
5
5
|
const Filters_1 = require("./Filters.cjs");
|
|
6
|
-
const Address_1 = require("./Address.cjs");
|
|
7
|
-
const Events_1 = require("./Events.cjs");
|
|
8
|
-
exports.DAY = 86400;
|
|
9
|
-
const getDay = (ts) => Math.floor(ts / exports.DAY);
|
|
10
6
|
class Relay extends lib_1.Emitter {
|
|
11
|
-
constructor() {
|
|
12
|
-
super(
|
|
13
|
-
this.
|
|
14
|
-
this.eventsByAddress = new Map();
|
|
15
|
-
this.eventsByTag = new Map();
|
|
16
|
-
this.eventsByDay = new Map();
|
|
17
|
-
this.eventsByAuthor = new Map();
|
|
7
|
+
constructor(repository) {
|
|
8
|
+
super();
|
|
9
|
+
this.repository = repository;
|
|
18
10
|
this.subs = new Map();
|
|
19
|
-
this.deletes = new Map();
|
|
20
|
-
}
|
|
21
|
-
dump() {
|
|
22
|
-
return Array.from(this.eventsById.values());
|
|
23
|
-
}
|
|
24
|
-
async load(events, chunkSize = 1000) {
|
|
25
|
-
for (const eventsChunk of (0, lib_1.chunk)(chunkSize, events)) {
|
|
26
|
-
for (const event of eventsChunk) {
|
|
27
|
-
this._addEvent(event);
|
|
28
|
-
}
|
|
29
|
-
if (eventsChunk.length === chunkSize) {
|
|
30
|
-
await (0, lib_1.sleep)(1);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
11
|
}
|
|
34
12
|
send(type, ...message) {
|
|
35
13
|
switch (type) {
|
|
36
|
-
case 'EVENT': return this.
|
|
37
|
-
case 'CLOSE': return this.
|
|
38
|
-
case 'REQ': return this.
|
|
14
|
+
case 'EVENT': return this.handleEVENT(message);
|
|
15
|
+
case 'CLOSE': return this.handleCLOSE(message);
|
|
16
|
+
case 'REQ': return this.handleREQ(message);
|
|
39
17
|
}
|
|
40
18
|
}
|
|
41
|
-
|
|
19
|
+
handleEVENT([json]) {
|
|
42
20
|
let event;
|
|
43
21
|
try {
|
|
44
22
|
event = JSON.parse(json);
|
|
@@ -46,19 +24,10 @@ class Relay extends lib_1.Emitter {
|
|
|
46
24
|
catch (e) {
|
|
47
25
|
return;
|
|
48
26
|
}
|
|
49
|
-
|
|
50
|
-
if (duplicateById) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const hasAddress = (0, Events_1.isReplaceable)(event);
|
|
54
|
-
const address = (0, Address_1.encodeAddress)((0, Address_1.addressFromEvent)(event));
|
|
55
|
-
const duplicateByAddress = hasAddress ? this.eventsByAddress.get(address) : undefined;
|
|
56
|
-
if (duplicateByAddress && duplicateByAddress.created_at >= event.created_at) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
this._addEvent(event, duplicateByAddress);
|
|
27
|
+
this.repository.publish(event);
|
|
60
28
|
this.emit('OK', event.id, true, "");
|
|
61
|
-
if (!this.
|
|
29
|
+
if (!this.repository.isDeleted(event)) {
|
|
30
|
+
const json = JSON.stringify(event);
|
|
62
31
|
for (const [subId, filters] of this.subs.entries()) {
|
|
63
32
|
if ((0, Filters_1.matchFilters)(filters, event)) {
|
|
64
33
|
this.emit('EVENT', subId, json);
|
|
@@ -66,88 +35,16 @@ class Relay extends lib_1.Emitter {
|
|
|
66
35
|
}
|
|
67
36
|
}
|
|
68
37
|
}
|
|
69
|
-
|
|
38
|
+
handleCLOSE([subId]) {
|
|
70
39
|
this.subs.delete(subId);
|
|
71
40
|
}
|
|
72
|
-
|
|
41
|
+
handleREQ([subId, ...filters]) {
|
|
73
42
|
this.subs.set(subId, filters);
|
|
74
|
-
const
|
|
75
|
-
for (let filter of filters) {
|
|
76
|
-
let events = this.eventsById.values();
|
|
77
|
-
if (filter.ids) {
|
|
78
|
-
filter = (0, lib_1.omit)(['ids'], filter);
|
|
79
|
-
events = filter.ids.map(id => this.eventsById.get(id)).filter(lib_1.identity);
|
|
80
|
-
}
|
|
81
|
-
else if (filter.authors) {
|
|
82
|
-
filter = (0, lib_1.omit)(['authors'], filter);
|
|
83
|
-
events = (0, lib_1.uniq)(filter.authors.flatMap(pubkey => this.eventsByAuthor.get(pubkey) || []));
|
|
84
|
-
}
|
|
85
|
-
else if (filter.since || filter.until) {
|
|
86
|
-
const sinceDay = getDay(filter.since || 0);
|
|
87
|
-
const untilDay = getDay(filter.since || (0, lib_1.now)());
|
|
88
|
-
filter = (0, lib_1.omit)(['since', 'until'], filter);
|
|
89
|
-
events = (0, lib_1.uniq)(Array.from((0, lib_1.range)(sinceDay, untilDay))
|
|
90
|
-
.flatMap((day) => this.eventsByDay.get(day) || []));
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
for (const [k, values] of Object.entries(filter)) {
|
|
94
|
-
if (!k.startsWith('#') || k.length !== 2) {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
filter = (0, lib_1.omit)([k], filter);
|
|
98
|
-
events = (0, lib_1.uniq)(values.flatMap(v => this.eventsByTag.get(`${k[1]}:${v}`) || []));
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
for (const event of events) {
|
|
103
|
-
if (!this._isDeleted(event) && (0, Filters_1.matchFilter)(filter, event)) {
|
|
104
|
-
result.add(event);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
for (const event of result) {
|
|
43
|
+
for (const event of this.repository.query(filters)) {
|
|
109
44
|
this.emit('EVENT', subId, JSON.stringify(event));
|
|
110
45
|
}
|
|
111
46
|
this.emit('EOSE', subId);
|
|
112
47
|
}
|
|
113
|
-
_isDeleted(event) {
|
|
114
|
-
const idDeletedAt = this.deletes.get(event.id) || 0;
|
|
115
|
-
if (idDeletedAt > event.created_at) {
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
if ((0, Events_1.isReplaceable)(event)) {
|
|
119
|
-
const address = (0, Address_1.encodeAddress)((0, Address_1.addressFromEvent)(event));
|
|
120
|
-
const addressDeletedAt = this.deletes.get(address) || 0;
|
|
121
|
-
if (addressDeletedAt > event.created_at) {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
_addEvent(event, duplicate) {
|
|
128
|
-
this.eventsById.set(event.id, event);
|
|
129
|
-
if ((0, Events_1.isReplaceable)(event)) {
|
|
130
|
-
this.eventsByAddress.set((0, Address_1.encodeAddress)((0, Address_1.addressFromEvent)(event)), event);
|
|
131
|
-
}
|
|
132
|
-
this._updateIndex(this.eventsByDay, getDay(event.created_at), event, duplicate);
|
|
133
|
-
this._updateIndex(this.eventsByAuthor, event.pubkey, event, duplicate);
|
|
134
|
-
for (const tag of event.tags) {
|
|
135
|
-
if (tag[0].length === 1) {
|
|
136
|
-
this._updateIndex(this.eventsByTag, tag.slice(0, 2).join(':'), event, duplicate);
|
|
137
|
-
if (event.kind === 5) {
|
|
138
|
-
this.deletes.set(tag[1], Math.max(event.created_at, this.deletes.get(tag[1]) || 0));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
_updateIndex(m, k, e, duplicate) {
|
|
144
|
-
let a = m.get(k) || [];
|
|
145
|
-
if (duplicate) {
|
|
146
|
-
a = a.filter((x) => x !== duplicate);
|
|
147
|
-
}
|
|
148
|
-
a.push(e);
|
|
149
|
-
m.set(k, a);
|
|
150
|
-
}
|
|
151
48
|
}
|
|
152
49
|
exports.Relay = Relay;
|
|
153
50
|
//# sourceMappingURL=Relay.cjs.map
|
package/build/Relay.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Relay.cjs","sourceRoot":"","sources":["../Relay.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"Relay.cjs","sourceRoot":"","sources":["../Relay.ts"],"names":[],"mappings":";;;AAAA,uCAAqC;AACrC,2CAAsC;AAKtC,MAAa,KAAuB,SAAQ,aAAO;IAGjD,YAAqB,UAAyB;QAC5C,KAAK,EAAE,CAAA;QADY,eAAU,GAAV,UAAU,CAAe;QAF9C,SAAI,GAAG,IAAI,GAAG,EAAoB,CAAA;IAIlC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,GAAG,OAAc;QAClC,QAAO,IAAI,EAAE;YACX,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAmB,CAAC,CAAA;YAC1D,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAmB,CAAC,CAAA;YAC1D,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAgC,CAAC,CAAA;SACpE;IACH,CAAC;IAED,WAAW,CAAC,CAAC,IAAI,CAAW;QAC1B,IAAI,KAAQ,CAAA;QACZ,IAAI;YACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;SACzB;QAAC,OAAO,CAAC,EAAE;YACV,OAAM;SACP;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAE9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAEnC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAElC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClD,IAAI,IAAA,sBAAY,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE;oBAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;iBAChC;aACF;SACF;IACH,CAAC;IAED,WAAW,CAAC,CAAC,KAAK,CAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,SAAS,CAAC,CAAC,KAAK,EAAE,GAAG,OAAO,CAAwB;QAClD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAE7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;SACjD;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC1B,CAAC;CACF;AAnDD,sBAmDC"}
|
package/build/Relay.d.ts
CHANGED
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
import { Emitter } from '@welshman/lib';
|
|
2
|
+
import type { Repository } from './Repository';
|
|
2
3
|
import type { Filter } from './Filters';
|
|
3
4
|
import type { Rumor } from './Events';
|
|
4
|
-
export declare const DAY = 86400;
|
|
5
|
-
export type Message = [string, ...any[]];
|
|
6
5
|
export declare class Relay<E extends Rumor> extends Emitter {
|
|
7
|
-
|
|
8
|
-
eventsByAddress: Map<string, E>;
|
|
9
|
-
eventsByTag: Map<string, E[]>;
|
|
10
|
-
eventsByDay: Map<number, E[]>;
|
|
11
|
-
eventsByAuthor: Map<string, E[]>;
|
|
6
|
+
readonly repository: Repository<E>;
|
|
12
7
|
subs: Map<string, Filter[]>;
|
|
13
|
-
|
|
14
|
-
dump(): E[];
|
|
15
|
-
load(events: E[], chunkSize?: number): Promise<void>;
|
|
8
|
+
constructor(repository: Repository<E>);
|
|
16
9
|
send(type: string, ...message: any[]): void;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_isDeleted(event: E): boolean;
|
|
21
|
-
_addEvent(event: E, duplicate?: E): void;
|
|
22
|
-
_updateIndex<K>(m: Map<K, E[]>, k: K, e: E, duplicate?: E): void;
|
|
10
|
+
handleEVENT([json]: [string]): void;
|
|
11
|
+
handleCLOSE([subId]: [string]): void;
|
|
12
|
+
handleREQ([subId, ...filters]: [string, ...Filter[]]): void;
|
|
23
13
|
}
|
package/build/Relay.mjs
CHANGED
|
@@ -1,41 +1,19 @@
|
|
|
1
|
-
import { Emitter
|
|
2
|
-
import { matchFilters
|
|
3
|
-
import { encodeAddress, addressFromEvent } from "./Address.mjs";
|
|
4
|
-
import { isReplaceable } from "./Events.mjs";
|
|
5
|
-
export const DAY = 86400;
|
|
6
|
-
const getDay = (ts) => Math.floor(ts / DAY);
|
|
1
|
+
import { Emitter } from '@welshman/lib';
|
|
2
|
+
import { matchFilters } from "./Filters.mjs";
|
|
7
3
|
export class Relay extends Emitter {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(
|
|
10
|
-
this.
|
|
11
|
-
this.eventsByAddress = new Map();
|
|
12
|
-
this.eventsByTag = new Map();
|
|
13
|
-
this.eventsByDay = new Map();
|
|
14
|
-
this.eventsByAuthor = new Map();
|
|
4
|
+
constructor(repository) {
|
|
5
|
+
super();
|
|
6
|
+
this.repository = repository;
|
|
15
7
|
this.subs = new Map();
|
|
16
|
-
this.deletes = new Map();
|
|
17
|
-
}
|
|
18
|
-
dump() {
|
|
19
|
-
return Array.from(this.eventsById.values());
|
|
20
|
-
}
|
|
21
|
-
async load(events, chunkSize = 1000) {
|
|
22
|
-
for (const eventsChunk of chunk(chunkSize, events)) {
|
|
23
|
-
for (const event of eventsChunk) {
|
|
24
|
-
this._addEvent(event);
|
|
25
|
-
}
|
|
26
|
-
if (eventsChunk.length === chunkSize) {
|
|
27
|
-
await sleep(1);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
8
|
}
|
|
31
9
|
send(type, ...message) {
|
|
32
10
|
switch (type) {
|
|
33
|
-
case 'EVENT': return this.
|
|
34
|
-
case 'CLOSE': return this.
|
|
35
|
-
case 'REQ': return this.
|
|
11
|
+
case 'EVENT': return this.handleEVENT(message);
|
|
12
|
+
case 'CLOSE': return this.handleCLOSE(message);
|
|
13
|
+
case 'REQ': return this.handleREQ(message);
|
|
36
14
|
}
|
|
37
15
|
}
|
|
38
|
-
|
|
16
|
+
handleEVENT([json]) {
|
|
39
17
|
let event;
|
|
40
18
|
try {
|
|
41
19
|
event = JSON.parse(json);
|
|
@@ -43,19 +21,10 @@ export class Relay extends Emitter {
|
|
|
43
21
|
catch (e) {
|
|
44
22
|
return;
|
|
45
23
|
}
|
|
46
|
-
|
|
47
|
-
if (duplicateById) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const hasAddress = isReplaceable(event);
|
|
51
|
-
const address = encodeAddress(addressFromEvent(event));
|
|
52
|
-
const duplicateByAddress = hasAddress ? this.eventsByAddress.get(address) : undefined;
|
|
53
|
-
if (duplicateByAddress && duplicateByAddress.created_at >= event.created_at) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
this._addEvent(event, duplicateByAddress);
|
|
24
|
+
this.repository.publish(event);
|
|
57
25
|
this.emit('OK', event.id, true, "");
|
|
58
|
-
if (!this.
|
|
26
|
+
if (!this.repository.isDeleted(event)) {
|
|
27
|
+
const json = JSON.stringify(event);
|
|
59
28
|
for (const [subId, filters] of this.subs.entries()) {
|
|
60
29
|
if (matchFilters(filters, event)) {
|
|
61
30
|
this.emit('EVENT', subId, json);
|
|
@@ -63,87 +32,15 @@ export class Relay extends Emitter {
|
|
|
63
32
|
}
|
|
64
33
|
}
|
|
65
34
|
}
|
|
66
|
-
|
|
35
|
+
handleCLOSE([subId]) {
|
|
67
36
|
this.subs.delete(subId);
|
|
68
37
|
}
|
|
69
|
-
|
|
38
|
+
handleREQ([subId, ...filters]) {
|
|
70
39
|
this.subs.set(subId, filters);
|
|
71
|
-
const
|
|
72
|
-
for (let filter of filters) {
|
|
73
|
-
let events = this.eventsById.values();
|
|
74
|
-
if (filter.ids) {
|
|
75
|
-
filter = omit(['ids'], filter);
|
|
76
|
-
events = filter.ids.map(id => this.eventsById.get(id)).filter(identity);
|
|
77
|
-
}
|
|
78
|
-
else if (filter.authors) {
|
|
79
|
-
filter = omit(['authors'], filter);
|
|
80
|
-
events = uniq(filter.authors.flatMap(pubkey => this.eventsByAuthor.get(pubkey) || []));
|
|
81
|
-
}
|
|
82
|
-
else if (filter.since || filter.until) {
|
|
83
|
-
const sinceDay = getDay(filter.since || 0);
|
|
84
|
-
const untilDay = getDay(filter.since || now());
|
|
85
|
-
filter = omit(['since', 'until'], filter);
|
|
86
|
-
events = uniq(Array.from(range(sinceDay, untilDay))
|
|
87
|
-
.flatMap((day) => this.eventsByDay.get(day) || []));
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
for (const [k, values] of Object.entries(filter)) {
|
|
91
|
-
if (!k.startsWith('#') || k.length !== 2) {
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
filter = omit([k], filter);
|
|
95
|
-
events = uniq(values.flatMap(v => this.eventsByTag.get(`${k[1]}:${v}`) || []));
|
|
96
|
-
break;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
for (const event of events) {
|
|
100
|
-
if (!this._isDeleted(event) && matchFilter(filter, event)) {
|
|
101
|
-
result.add(event);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
for (const event of result) {
|
|
40
|
+
for (const event of this.repository.query(filters)) {
|
|
106
41
|
this.emit('EVENT', subId, JSON.stringify(event));
|
|
107
42
|
}
|
|
108
43
|
this.emit('EOSE', subId);
|
|
109
44
|
}
|
|
110
|
-
_isDeleted(event) {
|
|
111
|
-
const idDeletedAt = this.deletes.get(event.id) || 0;
|
|
112
|
-
if (idDeletedAt > event.created_at) {
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
if (isReplaceable(event)) {
|
|
116
|
-
const address = encodeAddress(addressFromEvent(event));
|
|
117
|
-
const addressDeletedAt = this.deletes.get(address) || 0;
|
|
118
|
-
if (addressDeletedAt > event.created_at) {
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
_addEvent(event, duplicate) {
|
|
125
|
-
this.eventsById.set(event.id, event);
|
|
126
|
-
if (isReplaceable(event)) {
|
|
127
|
-
this.eventsByAddress.set(encodeAddress(addressFromEvent(event)), event);
|
|
128
|
-
}
|
|
129
|
-
this._updateIndex(this.eventsByDay, getDay(event.created_at), event, duplicate);
|
|
130
|
-
this._updateIndex(this.eventsByAuthor, event.pubkey, event, duplicate);
|
|
131
|
-
for (const tag of event.tags) {
|
|
132
|
-
if (tag[0].length === 1) {
|
|
133
|
-
this._updateIndex(this.eventsByTag, tag.slice(0, 2).join(':'), event, duplicate);
|
|
134
|
-
if (event.kind === 5) {
|
|
135
|
-
this.deletes.set(tag[1], Math.max(event.created_at, this.deletes.get(tag[1]) || 0));
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
_updateIndex(m, k, e, duplicate) {
|
|
141
|
-
let a = m.get(k) || [];
|
|
142
|
-
if (duplicate) {
|
|
143
|
-
a = a.filter((x) => x !== duplicate);
|
|
144
|
-
}
|
|
145
|
-
a.push(e);
|
|
146
|
-
m.set(k, a);
|
|
147
|
-
}
|
|
148
45
|
}
|
|
149
46
|
//# sourceMappingURL=Relay.mjs.map
|
package/build/Relay.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Relay.mjs","sourceRoot":"","sources":["../Relay.ts"],"names":[],"mappings":"OAAO,EAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"Relay.mjs","sourceRoot":"","sources":["../Relay.ts"],"names":[],"mappings":"OAAO,EAAC,OAAO,EAAC,MAAM,eAAe;OAC9B,EAAC,YAAY,EAAC;AAKrB,MAAM,OAAO,KAAuB,SAAQ,OAAO;IAGjD,YAAqB,UAAyB;QAC5C,KAAK,EAAE,CAAA;QADY,eAAU,GAAV,UAAU,CAAe;QAF9C,SAAI,GAAG,IAAI,GAAG,EAAoB,CAAA;IAIlC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,GAAG,OAAc;QAClC,QAAO,IAAI,EAAE;YACX,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAmB,CAAC,CAAA;YAC1D,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,OAAmB,CAAC,CAAA;YAC1D,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAgC,CAAC,CAAA;SACpE;IACH,CAAC;IAED,WAAW,CAAC,CAAC,IAAI,CAAW;QAC1B,IAAI,KAAQ,CAAA;QACZ,IAAI;YACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;SACzB;QAAC,OAAO,CAAC,EAAE;YACV,OAAM;SACP;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAE9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAEnC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAElC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClD,IAAI,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;oBAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;iBAChC;aACF;SACF;IACH,CAAC;IAED,WAAW,CAAC,CAAC,KAAK,CAAW;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,SAAS,CAAC,CAAC,KAAK,EAAE,GAAG,OAAO,CAAwB;QAClD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAE7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;SACjD;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC1B,CAAC;CACF"}
|
package/build/Relays.cjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizeRelayUrl = exports.isShareableRelayUrl = void 0;
|
|
3
|
+
exports.normalizeRelayUrl = exports.isShareableRelayUrl = exports.BOGUS_RELAY_URL = exports.LOCAL_RELAY_URL = void 0;
|
|
4
4
|
const lib_1 = require("@welshman/lib");
|
|
5
|
+
exports.LOCAL_RELAY_URL = "local://welshman.relay";
|
|
6
|
+
exports.BOGUS_RELAY_URL = "bogus://welshman.relay";
|
|
5
7
|
const isShareableRelayUrl = (url) => {
|
|
6
8
|
var _a;
|
|
7
9
|
return Boolean(typeof url === 'string' &&
|
package/build/Relays.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Relays.cjs","sourceRoot":"","sources":["../Relays.ts"],"names":[],"mappings":";;;AAAA,uCAAyD;
|
|
1
|
+
{"version":3,"file":"Relays.cjs","sourceRoot":"","sources":["../Relays.ts"],"names":[],"mappings":";;;AAAA,uCAAyD;AAE5C,QAAA,eAAe,GAAG,wBAAwB,CAAA;AAE1C,QAAA,eAAe,GAAG,wBAAwB,CAAA;AAEhD,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE;;IACjD,OAAA,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,+CAA+C;QAC/C,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC5B,2DAA2D;QAC3D,CAAA,MAAA,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,0CAAE,MAAM,MAAK,CAAC;QACjC,6DAA6D;QAC7D,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAClB,uCAAuC;QACvC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3B,+BAA+B;QAC/B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACzC,mCAAmC;QACnC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC9B,CAAA;CAAA,CAAA;AAfU,QAAA,mBAAmB,uBAe7B;AAMI,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAC,aAAa,GAAG,KAAK,KAA2B,EAAE,EAAE,EAAE;;IACpG,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA,MAAA,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,0CAAG,CAAC,CAAC,KAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;IAElF,+BAA+B;IAC/B,GAAG,GAAG,IAAA,kBAAY,EAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAC,CAAC,CAAA;IAEtE,qDAAqD;IACrD,GAAG,GAAG,IAAA,mBAAa,EAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IAEtC,+DAA+D;IAC/D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACtB,GAAG,IAAI,GAAG,CAAA;KACX;IAED,OAAO,MAAM,GAAG,GAAG,CAAA;AACrB,CAAC,CAAA;AAfY,QAAA,iBAAiB,qBAe7B"}
|
package/build/Relays.d.ts
CHANGED
package/build/Relays.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { normalizeUrl, stripProtocol } from '@welshman/lib';
|
|
2
|
+
export const LOCAL_RELAY_URL = "local://welshman.relay";
|
|
3
|
+
export const BOGUS_RELAY_URL = "bogus://welshman.relay";
|
|
2
4
|
export const isShareableRelayUrl = (url) => {
|
|
3
5
|
var _a;
|
|
4
6
|
return Boolean(typeof url === 'string' &&
|